Skip to content

Instantly share code, notes, and snippets.

@zsdonny
Created March 26, 2026 12:15
Show Gist options
  • Select an option

  • Save zsdonny/a0661e3b17547437a0faca8bebaf1521 to your computer and use it in GitHub Desktop.

Select an option

Save zsdonny/a0661e3b17547437a0faca8bebaf1521 to your computer and use it in GitHub Desktop.
mathbou/docker-cgwire single file/no bind compose example
# ============================================
# Project
# ============================================
COMPOSE_PROJECT_NAME=cgwire
TZ=UTC
# ============================================
# Versions
# ============================================
KITSU_VERSION=latest
ZOU_VERSION=latest
DB_VERSION=16
INDEXER_VERSION=v1.6
# ============================================
# Kitsu
# ============================================
KITSU_PORT=80
DOMAIN_NAME=localhost
# ============================================
# Admin
# ============================================
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=changeme
# ============================================
# Database (PostgreSQL)
# ============================================
DB_HOST=db
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=your_db_password_here
DB_DATABASE=zoudb
DB_DATA_PATH=/var/lib/postgresql/data
# ============================================
# Redis
# ============================================
KV_HOST=redis
KV_PORT=6379
# ============================================
# Indexer (Meilisearch)
# ============================================
INDEXER_HOST=indexer
INDEXER_PORT=7700
INDEXER_KEY=your_meilisearch_master_key_here
# ============================================
# Zou
# ============================================
SECRET_KEY=your_secret_key_here
PREVIEW_FOLDER=/opt/zou/previews
TMP_DIR=/tmp/zou
ENABLE_JOB_QUEUE=True
# ============================================
# Mail (optional)
# ============================================
MAIL_SERVER=
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_DEFAULT_SENDER=
MAIL_USE_TLS=True
x-base: &base
restart: always
networks:
- internal
# CHANGED: env_file -> environment with explicit variable pass-through
x-env: &env
environment:
- DB_HOST=${DB_HOST:-db}
- DB_PORT=${DB_PORT:-5432}
- DB_USERNAME=${DB_USERNAME:-postgres}
- DB_PASSWORD=${DB_PASSWORD:?}
- DB_DATABASE=${DB_DATABASE:-zoudb}
- KV_HOST=${KV_HOST:?}
- KV_PORT=${KV_PORT:-6379}
- SECRET_KEY=${SECRET_KEY:?}
- PREVIEW_FOLDER=${PREVIEW_FOLDER:?}
- TMP_DIR=${TMP_DIR:-/tmp/zou}
- INDEXER_HOST=${INDEXER_HOST:-indexer}
- INDEXER_PORT=${INDEXER_PORT:-7700}
- INDEXER_KEY=${INDEXER_KEY:?}
- ENABLE_JOB_QUEUE=${ENABLE_JOB_QUEUE:-True}
x-backend-volumes: &backend_volumes
volumes:
- 'previews:${PREVIEW_FOLDER:?}'
- 'tmp:${TMP_DIR:-/tmp/zou}'
services:
kitsu:
<<: [*base, *env]
container_name: ${COMPOSE_PROJECT_NAME:?}-kitsu
image: registry.gitlab.com/mathbou/docker-cgwire/kitsu:${KITSU_VERSION:-latest}
depends_on:
- zou-app
- zou-event
- zou-jobs
# ADDED: expose for external Caddy
ports:
- "${KITSU_PORT:-80}:80"
zou-app:
<<: [*base, *env, *backend_volumes]
container_name: ${COMPOSE_PROJECT_NAME:?}-zou-app
image: registry.gitlab.com/mathbou/docker-cgwire/zou:${ZOU_VERSION:-latest}
depends_on:
- db
- indexer
command: "gunicorn --error-logfile - --access-logfile - -w 3 -k gevent -b :5000 zou.app:app"
healthcheck:
test: "curl -s -f http://localhost:5000 | grep -q '\"api\":\"Zou\"'"
zou-event:
<<: [*base, *env]
container_name: ${COMPOSE_PROJECT_NAME:?}-zou-event
image: registry.gitlab.com/mathbou/docker-cgwire/zou:${ZOU_VERSION:-latest}
depends_on:
- redis
command: "gunicorn --error-logfile - --access-logfile - -w 1 -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -b :5001 zou.event_stream:app"
healthcheck:
test: "curl -s -f http://localhost:5001 | grep -q '\"api\":\"Zou\"'"
zou-jobs:
<<: [*base, *env, *backend_volumes]
container_name: ${COMPOSE_PROJECT_NAME:?}-zou-jobs
image: registry.gitlab.com/mathbou/docker-cgwire/zou:${ZOU_VERSION:-latest}
command: "rq worker -c zou.job_settings"
healthcheck:
test: "rq info -u redis://${KV_HOST:?}:${KV_PORT:-6379}/3 -W | grep -v -q '0 workers'"
db:
<<: *base
container_name: ${COMPOSE_PROJECT_NAME:?}-db-${DB_VERSION:?}
image: postgres:${DB_VERSION:?}-alpine
volumes:
- 'db:${DB_DATA_PATH:?}'
# REMOVED: ./db/pg_ctl.conf bind mount
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD:?}
healthcheck:
test: "pg_isready -d zoudb -U postgres"
redis:
<<: *base
container_name: ${COMPOSE_PROJECT_NAME:?}-redis
image: redis:alpine
volumes:
- 'redis:/data'
indexer:
<<: *base
container_name: ${COMPOSE_PROJECT_NAME:?}-indexer-${INDEXER_VERSION:?}
image: getmeili/meilisearch:${INDEXER_VERSION:?}
volumes:
- 'indexer:/meili_data'
environment:
- MEILI_MASTER_KEY=${INDEXER_KEY:?}
healthcheck:
test: "curl -s -f http://localhost:${INDEXER_PORT:-7700}/health | grep -q '{\"status\":\"available\"}'"
volumes:
db:
name: ${COMPOSE_PROJECT_NAME:?}-db-${DB_VERSION:?}
redis:
name: ${COMPOSE_PROJECT_NAME:?}-redis
previews:
name: ${COMPOSE_PROJECT_NAME:?}-previews
tmp:
name: ${COMPOSE_PROJECT_NAME:?}-tmp
indexer:
name: ${COMPOSE_PROJECT_NAME:?}-indexer-${INDEXER_VERSION:?}
networks:
internal:
name: ${COMPOSE_PROJECT_NAME:?}-internal
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment