You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- 'DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:?is required. For a new install set it in .env to the output of: openssl rand -hex 24. An install created before it was required uses the password postgres - set POSTGRES_PASSWORD=postgres to keep its data.}@db:5432/${POSTGRES_DB:-simstudio}'
# TRUSTED_ORIGINS: comma-separated public origins to trust for auth in
# addition to NEXT_PUBLIC_APP_URL. Use when serving from multiple domains
# (apex + www, alias hostnames, reverse-proxy IPs). Empty by default.
- TRUSTED_ORIGINS=${TRUSTED_ORIGINS:-}
# AUTH_TRUSTED_PROXIES: comma-separated reverse-proxy IPs or CIDR ranges in
# front of the app (ingress, load balancer). Sim and Better Auth walk
# x-forwarded-for right to left, skip these hops, and use the first
# untrusted address as the client IP. Required to look through known
# intermediate proxies in a multi-hop chain. Empty by default.
- AUTH_TRUSTED_PROXIES=${AUTH_TRUSTED_PROXIES:-}
# Required. Compose aborts with this message rather than starting the app
# with an empty secret, which would silently corrupt stored credentials.
- 'BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET:?is required. Create a .env file next to docker-compose.prod.yml and set it to the output of: openssl rand -hex 32}'
- 'ENCRYPTION_KEY=${ENCRYPTION_KEY:?is required. Set it in .env to the output of: openssl rand -hex 32. It cannot be changed later without losing stored credentials.}'
- 'INTERNAL_API_SECRET=${INTERNAL_API_SECRET:?is required. Set it in .env to the output of: openssl rand -hex 32}'
- API_ENCRYPTION_KEY=${API_ENCRYPTION_KEY:-}
# Authenticates the cron service against the background job endpoints.
- 'DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:?is required. For a new install set it in .env to the output of: openssl rand -hex 24. An install created before it was required uses the password postgres - set POSTGRES_PASSWORD=postgres to keep its data.}@db:5432/${POSTGRES_DB:-simstudio}'
- 'DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:?is required. For a new install set it in .env to the output of: openssl rand -hex 24. An install created before it was required uses the password postgres - set POSTGRES_PASSWORD=postgres to keep its data.}@db:5432/${POSTGRES_DB:-simstudio}'
depends_on:
db:
condition: service_healthy
command: ['bun', 'run', 'db:migrate']
restart: 'no'
# Backs pub/sub (live Chat task-status and table events) and the shared caches.
# The app falls back to PostgreSQL for storage when REDIS_URL is unset, but the
# pub/sub channels have no fallback — without Redis, live status never streams.
# Not published to the host: only the app and realtime containers need it, and
# binding 6379 would collide with a Redis already running locally.
redis:
image: redis:7-alpine
restart: unless-stopped
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 5s
retries: 5
# Runs the background jobs the Helm chart schedules as Kubernetes CronJobs:
# scheduled workflows, polling triggers, connector syncs, the transactional
# outbox, subscription renewal, and data drains. Without it none of those run.
# Schedules live in docker/crontab and mirror helm/sim/values.yaml cronjobs.jobs.
cron:
# Deliberately NOT pinned to SIM_VERSION: the scheduler only makes HTTP calls
# and shares no database schema with the app, so it does not need to move in
# lockstep — and no cron tag exists for releases that predate it.
# on-failure, not unless-stopped: with no CRON_SECRET the container exits 0
# after explaining why, and stays stopped instead of crash-looping. Upgrades
# from a compose file that predates this service therefore still come up.
restart: on-failure
environment:
- SIM_URL=http://simstudio:3000
- CRON_SECRET=${CRON_SECRET:-}
- TZ=${TZ:-UTC}
depends_on:
simstudio:
condition: service_healthy
# Not published to the host: app, realtime and migrations reach it over the
# Compose network as db:5432. A host `ports:` mapping binds every interface and
# Docker's own iptables rules bypass host firewalls, so it would put the
# database on the network. For host access (psql, a desktop client), use
# `docker compose exec db psql -U postgres simstudio`, or pass a second -f
# file that publishes '127.0.0.1:5432:5432' (-f disables override files).
db:
image: pgvector/pgvector:pg17
restart: unless-stopped
environment:
- POSTGRES_USER=${POSTGRES_USER:-postgres}
# Postgres applies this only when it creates the data volume; later
# changes are ignored. An install created before this was required got
# the password `postgres` — set exactly that to keep it working.
- 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?is required. For a new install set it in .env to the output of: openssl rand -hex 24. An install created before it was required uses the password postgres - set POSTGRES_PASSWORD=postgres to keep its data.}'