2026-07-19 00:02:29 -04:00

114 lines
3.4 KiB
Markdown

---
title: "Docker Self-Hosting"
description: "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](/docs/self-hosting/cloudflare) instead.
The default `compose.yaml` uses the published GHCR image:
- `ghcr.io/every-app/open-seo:latest`
## Prerequisites
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) (or Docker Engine + Docker Compose)
- A [DataForSEO API key](/docs/self-hosting#dataforseo-api-key-setup)
## Quickstart
Clone the repo, then:
```bash
git clone https://github.com/every-app/open-seo.git
cd open-seo
cp .env.example .env
docker compose up -d
```
Set `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 to `3001`)
- `ALLOWED_HOST` (single reverse-proxy hostname to allow in Vite preview)
- `AUTH_MODE=local_noauth` (already set in compose)
- `OPEN_SEO_IMAGE` (defaults to `ghcr.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:
```bash
ALLOWED_HOST=yourdomain.com docker compose up -d
```
You 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:
```bash
OPEN_SEO_IMAGE=ghcr.io/every-app/open-seo:v1.2.3
docker compose up -d
```
## Build your own image locally
If you are testing local code changes, build and run a local tag:
```bash
docker build -f Dockerfile.selfhost -t open-seo:local .
OPEN_SEO_IMAGE=open-seo:local docker compose up -d
```
## Common commands
Restart service after env changes:
```bash
docker compose up -d open-seo
```
Pull latest published image and restart:
```bash
docker compose pull && docker compose up -d
```
Stop:
```bash
docker compose down
```
Stop and remove volumes:
```bash
docker compose down -v
```
## Troubleshooting environment variables
To confirm Docker Compose is using the expected environment variables:
```bash
docker compose config
```
Check 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:
```bash
docker compose up -d --force-recreate open-seo
```