Docker Self-Hosting
Run OpenSEO locally with Docker Compose using the published GHCR image.
Run OpenSEO locally with Docker.
In Docker mode, OpenSEO uses AUTH_MODE=local_noauth (no auth checks, local admin user admin@localhost). Only expose it behind your own auth-protected reverse proxy, tunnel, or private network. For internet-facing self-hosting, use Cloudflare instead.
The default compose.yaml uses the published GHCR image:
ghcr.io/every-app/open-seo:latest
Prerequisites
- Docker Desktop (or Docker Engine + Docker Compose)
- A DataForSEO API key
Quickstart
Clone the repo, then:
git clone https://github.com/every-app/open-seo.git
cd open-seo
cp .env.example .env
docker compose up -dSet DATAFORSEO_API_KEY in .env, then open http://localhost:<PORT> (default 3001).
Docker Compose passes .env values into the container, and compose.yaml enables CLOUDFLARE_INCLUDE_PROCESS_ENV=true so the Cloudflare Vite runtime can read them as Worker bindings during local self-hosting.
Optional env values:
PORT(defaults to3001)ALLOWED_HOST(single reverse-proxy hostname to allow in Vite preview)AUTH_MODE=local_noauth(already set in compose)OPEN_SEO_IMAGE(defaults toghcr.io/every-app/open-seo:latest)
If you are putting Docker behind a reverse proxy or a temporary tunnel, remember that Docker self-hosting runs with app auth disabled. Only expose it behind your own auth-protected reverse proxy, tunnel, or private network, and add the public hostname before restarting:
ALLOWED_HOST=yourdomain.com docker compose up -dYou can also persist it in .env.
Telemetry
OpenSEO collects anonymized telemetry for core usage events: heartbeats with aggregate counts (installs, users, projects, feature usage) tied to a random install ID, sent every 5 minutes during the first two hours after install, then at most once daily. No URLs, keywords, prompts, emails, or IP-derived location are collected, and idle installs send nothing.
To disable it, set OPENSEO_TELEMETRY_DISABLED=1 (or DO_NOT_TRACK=1) in .env, then run docker compose up -d --force-recreate open-seo.
Pin to a specific image tag
Set OPEN_SEO_IMAGE in .env and restart:
OPEN_SEO_IMAGE=ghcr.io/every-app/open-seo:v1.2.3
docker compose up -dBuild your own image locally
If you are testing local code changes, build and run a local tag:
docker build -f Dockerfile.selfhost -t open-seo:local .
OPEN_SEO_IMAGE=open-seo:local docker compose up -dCommon commands
Restart service after env changes:
docker compose up -d open-seoPull latest published image and restart:
docker compose pull && docker compose up -dStop:
docker compose downStop and remove volumes:
docker compose down -vTroubleshooting environment variables
To confirm Docker Compose is using the expected environment variables:
docker compose configCheck that AUTH_MODE=local_noauth, and that DATAFORSEO_API_KEY is the base64 encoded value of your DataForSEO email and API password in this format: email:password.
If you changed .env, recreate the container so Compose reapplies it:
docker compose up -d --force-recreate open-seo