Requirements
- A Linux server (VPS or bare metal) with 2 vCPU and 2–4 GB RAM — enough for small teams. Scale up for heavy site audits or large keyword and backlink jobs.
- Docker with the Compose v2 plugin (the installer can install it for you).
- A domain (for example
seo.example.com) whose DNS A record points at the server, and ports 80 and 443 open — used for automatic HTTPS.
Option A: One-line installer
The fastest way to a production instance. Run this on your server:
curl -fsSL https://autoseo.codext.de/install | bashThe installer:
- downloads
deploy/docker-compose.ymlanddeploy/Caddyfilefrom the repository into/opt/autoseo(change it with--dir), - installs Docker if it is missing (it asks first),
- asks for your domain and checks that its DNS points at the server,
- generates a random Postgres password and writes
.env(mode600), - pulls the prebuilt image
ghcr.io/codextde/autoseoand starts the app, PostgreSQL and Caddy for automatic HTTPS, - waits until the app is healthy and prints your first-run setup code.
Re-running the script is safe — it keeps your existing .env. Useful flags:
# Non-interactive installcurl -fsSL https://autoseo.codext.de/install | bash -s -- --domain seo.example.com --yes# Use your own reverse proxy instead of the bundled Caddycurl -fsSL https://autoseo.codext.de/install | bash -s -- --no-proxy# Pin an image tag, or show all optionscurl -fsSL https://autoseo.codext.de/install | bash -s -- --version v1.4.0curl -fsSL https://autoseo.codext.de/install | bash -s -- --helpWith --no-proxy, the app is published on 127.0.0.1:3000 for Traefik, nginx or a Cloudflare Tunnel to forward to — terminate TLS there, since sessions use secure cookies.
Option B: Docker Compose
The same setup without the script, if you want to review every step. It uses the prebuilt image — no build and no repository checkout needed.
mkdir -p /opt/autoseo && cd /opt/autoseocurl -fsSLO https://raw.githubusercontent.com/codextde/autoseo/main/deploy/docker-compose.ymlcurl -fsSLO https://raw.githubusercontent.com/codextde/autoseo/main/deploy/Caddyfilecurl -fsSL https://raw.githubusercontent.com/codextde/autoseo/main/deploy/.env.example -o .env# Set DOMAIN and POSTGRES_PASSWORD (e.g. openssl rand -hex 24)nano .env && chmod 600 .envdocker compose pulldocker compose up -ddocker compose logs -f app # shows the setup codeThe compose file runs three services: app, postgres and caddy. Caddy is enabled by COMPOSE_PROFILES=proxy in .env; set it to empty to skip Caddy and point your own proxy at 127.0.0.1:3000.
Option C: Coolify
Already running a Coolify server? Deploy AutoSEO straight from the repository:
- Create a new resource → Docker Compose and point it at github.com/codextde/autoseo (build pack: Docker Compose, file
docker-compose.ymlat the repository root). - Set the domain of the
appservice (e.g.https://seo.example.com) and add the environment variableDOMAIN=seo.example.com. Coolify generates the Postgres password automatically. - Deploy. Migrations run at boot and the setup code is printed to the logs.
If all traffic reaches Coolify through Cloudflare's proxy, enable Admin → Authentication → Behind Cloudflare after setup so rate limits use the real client IP.
First-run setup
On first boot the app runs its database migrations and prints a one-time setup code to its logs (a new code on every restart until setup is done). The installer shows it for you; otherwise run docker compose logs app.
╔════════════════════════════════════════╗║ AutoSEO first-run setup ║║ Open https://seo.example.com/setup ║║ Setup code: 1234-5678 ║╚════════════════════════════════════════╝Open /setup, enter the code, name your workspace and create the owner account — you are signed in immediately. Optionally restrict sign-ins to your company's email domains.
Configure email, AI and DataForSEO
Everything beyond DOMAIN is stored in the database and configured in the admin panel at /admin:
- Email (Admin → Email): SMTP or Amazon SES, sender address and a test email. Needed for invitations and magic links.
- AI providers (Admin → AI Providers): connect local Claude Code / Codex agents (below) or add API keys for Anthropic, OpenAI, OpenRouter, Perplexity, Gemini, xAI, Mistral or DeepSeek.
- DataForSEO (Admin → Data Providers): keyword research, SERPs, backlinks and tracking of Google AI Overviews, AI Mode and Copilot. Pay-as-you-go, billed by DataForSEO.
- Google OAuth (Admin → Data Providers): Search Console, GA4 and Google Sheets export.
Also worth a look: Authentication (invite-only mode, allowed email domains, session length), Roles & Permissions, and Limits & Budgets for daily and monthly spend caps.
Local agents (Claude Code / Codex)
AutoSEO can run all AI work on your own Claude Code or Codex subscription. Open Settings → Local Agents → Install agent in your instance, copy the one-liner for macOS/Linux or Windows, and run it on a machine that has claude and/or codex installed:
curl -fsSL https://seo.example.com/install.sh | AUTOSEO_AGENT_TOKEN=… bash -s -- --host https://seo.example.comAgents connect over outbound HTTPS only (no open ports), start automatically, run each job in a fresh CLI session and update themselves — with signed releases — whenever you update AutoSEO.
Updating
- Installer:
curl -fsSL https://autoseo.codext.de/install | bash -s -- --update - Docker Compose:
docker compose pull && docker compose up -din/opt/autoseo - Coolify: redeploy the resource
Database migrations run automatically at boot, and connected local agents update themselves.
Backups
Two Docker volumes hold everything that matters — back up both, and store copies off the server:
autoseo-pg— the PostgreSQL database.autoseo-data— uploads, caches, the encryption key for stored secrets (secret.key) and the agent release signing key. Losingsecret.keymakes stored provider credentials unreadable.
# Database dumpdocker compose exec postgres pg_dump -U autoseo -d autoseo -Fc -f /tmp/autoseo.dumpdocker compose cp postgres:/tmp/autoseo.dump ./autoseo-$(date +%F).dump# Data volumedocker run --rm -v autoseo_autoseo-data:/data -v "$PWD":/backup alpine \ tar czf /backup/autoseo-data-$(date +%F).tar.gz -C /data .Run these in /opt/autoseo. Docker Compose prefixes volume names with the project name (autoseo_ for the default install directory) — check yours with docker volume ls.
Optional environment variables
Only DOMAIN is required. These optional bootstrap variables pre-configure an instance for scripted deployments; they are listed (commented out) in .env. Settings made in the admin panel always take precedence.
| Variable | Purpose |
|---|---|
AUTOSEO_OWNER_EMAIL | Skips the setup code: the first boot creates this user as instance admin and workspace owner |
AUTOSEO_OWNER_NAME | Display name for that owner |
AUTOSEO_WORKSPACE_NAME | Name of the first workspace (default “My Workspace”) |
AUTOSEO_SMTP_URL | Default mail server until Admin → Email is configured, e.g. smtp://user:pass@host:587 |
AUTOSEO_MAIL_FROM | Sender for the default mail server, e.g. AutoSEO <noreply@example.com> |
AUTOSEO_VERSION | Image tag to run (default latest) |
APP_PORT | Loopback port the app is published on (default 3000) |
Help & managed hosting
The complete guide — including reverse-proxy examples for Traefik and nginx and a troubleshooting section — lives in docs/SELF_HOSTING.md. Questions or bugs? Open a discussion or an issue on GitHub.
Skip the server work
A private, managed instance with updates, SSL and email set up for you.
Start for $50/month