Skip to main content
PostSider OSS runs on your own infrastructure. The bundled Compose stack includes the application, PostgreSQL, Redis, MinIO object storage, Temporal, and Elasticsearch for Temporal visibility. The optional Temporal UI is available through the 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

Edit .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.
Generate secrets with openssl rand -hex 48. Use separate values for JWT_SECRET, ENCRYPTION_KEY, database passwords, and MinIO credentials. ENCRYPTION_KEY is required by the OSS Compose deployment and must be backed up with the database.
2

Start and wait for healthy services

3

Configure HTTPS and bootstrap the first admin

Proxy your HTTPS domain to 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:
The command prints a one-time password. Sign in with admin@setup.local, then complete the /setup screen immediately.
4

Verify publishing health

The worker endpoint must report running and healthy workers. A healthy dashboard alone does not prove scheduled publishing is working.

Environment variables

Copy .env.example to .env and edit that file. Do not put secrets directly in compose.yaml.
JWT_SECRET, ENCRYPTION_KEY, POSTGRES_PASSWORD, TEMPORAL_POSTGRES_PASSWORD, MINIO_ACCESS_KEY, and MINIO_SECRET_KEY must contain unique non-template values. The OSS application refuses to start otherwise.
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 are 5000 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.
Run the health checks again after the update:
If the new release fails to start, roll back by returning to the previous tag, restoring the pre-upgrade database backup, and rebuilding:
Do not use 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.
Back up the MinIO bucket with the S3-compatible client, or back up the 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

  1. Stop postsider, temporal, and the workers before restoring data.
  2. Restore the application database:
  3. Restore the Temporal database: docker compose exec -T temporal-postgres psql -U temporal < temporal-postgres.sql.
  4. Restore the MinIO bucket or minio-data volume with your backup tool.
  5. Restore the exact .env, especially ENCRYPTION_KEY, database passwords, bucket name, and public URLs.
  6. Start the pinned release, inspect docker compose logs postsider, and let migrations finish.
  7. Verify /api/health, /health/workers, media retrieval, and a test publish before reopening the service.