Skip to content
AutoSEO

Self-hosting guide

Self-host AutoSEO in minutes

AutoSEO is a single Next.js app plus PostgreSQL, shipped as a Docker image. Run it on any Linux server — free, with every feature, under the MIT license.

curl -fsSL https://autoseo.codext.de/install | bash

Rather not run a server? AutoSEO Cloud gives you a private, managed instance for $50/month.

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:

Install
curl -fsSL https://autoseo.codext.de/install | bash

The installer:

  1. downloads deploy/docker-compose.yml and deploy/Caddyfile from the repository into /opt/autoseo (change it with --dir),
  2. installs Docker if it is missing (it asks first),
  3. asks for your domain and checks that its DNS points at the server,
  4. generates a random Postgres password and writes .env (mode 600),
  5. pulls the prebuilt image ghcr.io/codextde/autoseo and starts the app, PostgreSQL and Caddy for automatic HTTPS,
  6. 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:

Installer 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 -- --help

With --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.

Manual install
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 code

The 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:

  1. Create a new resource → Docker Compose and point it at github.com/codextde/autoseo (build pack: Docker Compose, file docker-compose.yml at the repository root).
  2. Set the domain of the app service (e.g. https://seo.example.com) and add the environment variable DOMAIN=seo.example.com. Coolify generates the Postgres password automatically.
  3. 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.

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:

Install a local agent
curl -fsSL https://seo.example.com/install.sh | AUTOSEO_AGENT_TOKEN=… bash -s -- --host https://seo.example.com

Agents 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 -d in /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. Losing secret.key makes stored provider credentials unreadable.
Backup
# 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.

VariablePurpose
AUTOSEO_OWNER_EMAILSkips the setup code: the first boot creates this user as instance admin and workspace owner
AUTOSEO_OWNER_NAMEDisplay name for that owner
AUTOSEO_WORKSPACE_NAMEName of the first workspace (default “My Workspace”)
AUTOSEO_SMTP_URLDefault mail server until Admin → Email is configured, e.g. smtp://user:pass@host:587
AUTOSEO_MAIL_FROMSender for the default mail server, e.g. AutoSEO <noreply@example.com>
AUTOSEO_VERSIONImage tag to run (default latest)
APP_PORTLoopback 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.

Star the project

Follow releases and help others discover AutoSEO.

Star on GitHub

Skip the server work

A private, managed instance with updates, SSL and email set up for you.

Start for $50/month