How to Run Open-SEO in a Docker Container: Complete Self-Hosting Guide
Run Open-SEO locally using Docker Compose with a single command after configuring your environment variables and building the image.
Open-SEO provides a streamlined Docker self-hosting workflow that packages the entire application stack—backend, database, and worker—into portable containers. This guide walks through running Open-SEO in a Docker container using the official Dockerfile.selfhost and compose.yaml configuration from the every-app/open-seo repository.
Prerequisites
Before starting, ensure you have:
- Docker Engine 20.10+ with Docker Compose v2
- A DataForSEO API key (required for SEO functionality)
- Git to clone the repository
Step 1: Configure Environment Variables
Open-SEO requires specific environment variables to run in Docker mode. The repository includes an .env.example file that serves as a template.
Copy and customize the environment file:
cp .env.example .env
Edit .env to set at minimum:
DATAFORSEO_API_KEY=your-key-here
AUTH_MODE=local_noauth
The AUTH_MODE=local_noauth setting disables authentication checks and creates a default admin user at admin@localhost. Optional variables include:
OPENSEO_TELEMETRY_DISABLED— set to1to opt out of telemetryALLOWED_HOST— specify when running behind a reverse proxy
See .env.example in the repository root for the complete variable reference.
Step 2: Build the Docker Image
The Dockerfile.selfhost at the repository root builds a production-ready image that compiles the TypeScript application and bundles the worker processes.
Build the image with a local tag:
docker build -f Dockerfile.selfhost -t open-seo:local .
This step compiles the application and creates a tagged image named open-seo:local. Rebuild this image whenever you modify the source code.
Step 3: Start the Container Stack
The compose.yaml file defines two services:
open-seo— the main application containerpostgres— a throw-away PostgreSQL instance for local development
Launch both services in detached mode:
docker compose up -d
The first startup may take 1–2 minutes while the image builds and initializes. The web UI becomes available at http://localhost:3001 once complete.
Verify the Deployment
Confirm the container is healthy using the built-in health endpoint:
curl http://localhost:3001/api/health
The src/routes/api/health.ts endpoint returns a JSON payload verifying that the container configuration is correct and the database is reachable. Alternatively, monitor startup logs:
docker compose logs -f open-seo
Advanced Configuration
Use a Custom Image Tag
Override the default image when testing custom builds:
OPEN_SEO_IMAGE=open-seo:local docker compose up -d
This pattern appears in the documentation at line 58 of docs/SELF_HOSTING_DOCKER.md.
Run Behind a Reverse Proxy
Specify the allowed host for production deployments:
ALLOWED_HOST=mydomain.com docker compose up -d
Disable Telemetry
Recreate the container with telemetry disabled:
OPENSEO_TELEMETRY_DISABLED=1 docker compose up -d --force-recreate open-seo
Stop and Clean Up
Stop all containers while preserving data volumes:
docker compose down
Add -v to remove volumes and reset the database:
docker compose down -v
Key Files Reference
| File | Purpose |
|---|---|
Dockerfile.selfhost |
Production image build definition |
compose.yaml |
Multi-service orchestration with PostgreSQL |
docs/SELF_HOSTING_DOCKER.md |
Official step-by-step guide (lines 25, 58, 66, 87) |
.github/workflows/docker-image.yml |
CI pipeline for automated builds |
src/routes/api/health.ts |
Container health verification endpoint (line 7) |
.env.example |
Environment variable template |
Summary
- Configuration: Copy
.env.exampleto.envand setDATAFORSEO_API_KEY - Build: Run
docker build -f Dockerfile.selfhost -t open-seo:local . - Deploy: Execute
docker compose up -dto start the stack - Access: Open
http://localhost:3001after the health check passes - Customize: Override
OPEN_SEO_IMAGEorALLOWED_HOSTfor advanced scenarios
Frequently Asked Questions
What port does Open-SEO use in Docker?
Open-SEO serves the web UI on port 3001 by default. Map this port in compose.yaml if you need to expose it on a different host port.
Does Open-SEO require a database when running in Docker?
Yes. The compose.yaml includes a throw-away PostgreSQL container that automatically starts alongside the main application. Data persists in a Docker volume between restarts unless you run docker compose down -v.
Can I disable authentication in the Docker container?
Yes. The AUTH_MODE=local_noauth setting (enabled by default in Docker mode) bypasses authentication and creates an admin user at admin@localhost. This is intentional for local development only—production deployments should configure proper authentication.
How do I update Open-SEO when running in Docker?
Pull the latest code, rebuild the image with docker build -f Dockerfile.selfhost -t open-seo:local ., then restart with docker compose up -d --force-recreate open-seo. The --force-recreate flag ensures the new image is used.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →