tools profile. These instructions target the repository’s compose.yaml; do not mix them with a different Compose override.
Prerequisites
Deploy with Docker Compose
1
Clone and configure the repository
.env before starting. Set FRONTEND_URL, BACKEND_URL, NEXT_PUBLIC_BACKEND_URL, and MINIO_PUBLIC_URL to your public HTTPS URL. Replace every CHANGE_ME value with a unique random value. Keep DISABLE_REGISTRATION=false only while creating the first account; set it to true afterwards for an invite-only instance. Set NEXT_PUBLIC_DISABLE_REGISTRATION to the same value because it is a frontend build argument.2
Start and wait for healthy services
3
Configure HTTPS and bootstrap the first admin
Proxy your HTTPS domain to The command prints a one-time password. Sign in with
127.0.0.1:5000. Proxy /storage/ to the exact configured bucket at 127.0.0.1:9000/<MINIO_BUCKET>/; keep the MinIO console and Temporal UI private. Uploaded media URLs are public to anyone who obtains the URL. See the reverse-proxy example in the repository’s self-hosting guide.Create the first administrator explicitly:admin@setup.local, then complete the /setup screen immediately.4
Verify publishing health
Environment variables
Copy.env.example to .env and edit that file. Do not put secrets directly in compose.yaml.
OAuth credentials are required only for the platforms you use. Email, OpenAI, billing, and external storage are optional. See .env.example for the full annotated reference.
Port conflicts
The default host ports are5000 for the application, 9000 for MinIO, and 8080 for the optional Temporal UI. If a port is already in use, set POSTSIDER_HOST_PORT, MINIO_HOST_PORT, or TEMPORAL_UI_HOST_PORT in .env and update your reverse proxy.
Stack architecture
The Compose stack runs these services:
All published ports bind to
127.0.0.1 only. Internal services are reachable only inside Docker networks and must never be published. The app container’s healthcheck also probes the orchestrator workers, so a dead worker marks the container unhealthy and docker compose up --wait times out - that is intended.
Updating PostSider
Back up before every upgrade (see Backups below). Migrations are forward-only; a failed migration is not automatically rolled back.prisma db push on a production database, and do not use docker compose pull as the update path - the application is built from the checked-out source.
Backups
Back up the application PostgreSQL database, Temporal PostgreSQL database, MinIO media, and.env. Encrypt the backup (for example with age or gpg) because .env contains plaintext credentials. Preserve the exact encryption key used by the deployment so stored provider credentials remain decryptable.
minio-data volume directly. Keep an offsite copy and test a restore drill regularly. The temporal-es-data volume is a rebuildable visibility store; it does not hold primary data.
Restore
- Stop
postsider,temporal, and the workers before restoring data. - Restore the application database:
- Restore the Temporal database:
docker compose exec -T temporal-postgres psql -U temporal < temporal-postgres.sql. - Restore the MinIO bucket or
minio-datavolume with your backup tool. - Restore the exact
.env, especiallyENCRYPTION_KEY, database passwords, bucket name, and public URLs. - Start the pinned release, inspect
docker compose logs postsider, and let migrations finish. - Verify
/api/health,/health/workers, media retrieval, and a test publish before reopening the service.

