Files
codeandClaude Fable 5 8ab413804a normalize all stacks to conventions
- VOL_PATH always defaults to /data; vscode/opencode VOL_PROJECTS nests it
- TZ defaults to America/Vancouver (was UTC in etherpad, ntfy, redis)
- compose section order fixed (volumes before environment, command after networks)
- all default secrets are the literal ChangeThisPassword (grep-friendly,
  users must change them); removed a real key from ollama sample.env
- sample.env synced with compose: missing vars added with defaults, dead vars removed
- invoiceninja_dev/openarchiver_dev: app services had no environment block,
  wired all sample.env vars through so the stacks actually work
- opencode: sample.env OLLAMA_HOST renamed to OLLAMA_HOST_URL to match compose
- TZ values unquoted consistently

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 06:24:54 +00:00

238 lines
8.7 KiB
YAML

services:
zammad-postgresql:
image: postgres:${POSTGRES_VERSION:-17.5-alpine}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/postgresql:/var/lib/postgresql/data
environment:
- POSTGRES_DB=${POSTGRES_DB:-zammad_production}
- POSTGRES_USER=${POSTGRES_USER:-zammad}
- POSTGRES_PASSWORD=${POSTGRES_PASS:-ChangeThisPassword}
networks:
- internal
zammad-redis:
image: redis:${REDIS_VERSION:-7.4.5-alpine}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/redis:/data
networks:
- internal
zammad-memcached:
image: memcached:${MEMCACHE_VERSION:-1.6.39-alpine}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/memcached:/data
networks:
- internal
command: memcached -m 256M
zammad-elasticsearch:
image: elasticsearch:${ELASTICSEARCH_VERSION:-8.19.2}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/elasticsearch:/usr/share/elasticsearch/data
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- ES_JAVA_OPTS=${ELASTICSEARCH_JAVA_OPTS:--Xms1g -Xmx1g}
networks:
- internal
zammad-init:
image: ${ZAMMAD_IMAGE:-ghcr.io/zammad/zammad:latest}
restart: on-failure
volumes:
- ${VOL_PATH:-/data}/zammad/storage:/opt/zammad/storage
environment:
- TZ=${TZ:-America/Vancouver}
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS:-zammad-memcached:11211}
- POSTGRESQL_DB=${POSTGRES_DB:-zammad_production}
- POSTGRESQL_HOST=${POSTGRES_HOST:-zammad-postgresql}
- POSTGRESQL_USER=${POSTGRES_USER:-zammad}
- POSTGRESQL_PASS=${POSTGRES_PASS:-ChangeThisPassword}
- POSTGRESQL_PORT=${POSTGRES_PORT:-5432}
- POSTGRESQL_OPTIONS=${POSTGRESQL_OPTIONS:-?pool=50}
- POSTGRESQL_DB_CREATE=${POSTGRESQL_DB_CREATE:-true}
- REDIS_URL=${REDIS_URL:-redis://zammad-redis:6379}
- ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED:-true}
- ELASTICSEARCH_SCHEMA=http
- ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST:-zammad-elasticsearch}
- ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT:-9200}
- NGINX_PORT=${NGINX_PORT:-8080}
- NGINX_SERVER_NAME=${NGINX_SERVER_NAME:-_}
- NGINX_SERVER_SCHEME=$scheme
networks:
- internal
depends_on:
- zammad-postgresql
- zammad-redis
- zammad-memcached
- zammad-elasticsearch
command: ["zammad-init"]
user: 0:0
zammad-railsserver:
image: ${ZAMMAD_IMAGE:-ghcr.io/zammad/zammad:latest}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/storage:/opt/zammad/storage
environment:
- TZ=${TZ:-America/Vancouver}
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS:-zammad-memcached:11211}
- POSTGRESQL_DB=${POSTGRES_DB:-zammad_production}
- POSTGRESQL_HOST=${POSTGRES_HOST:-zammad-postgresql}
- POSTGRESQL_USER=${POSTGRES_USER:-zammad}
- POSTGRESQL_PASS=${POSTGRES_PASS:-ChangeThisPassword}
- POSTGRESQL_PORT=${POSTGRES_PORT:-5432}
- POSTGRESQL_OPTIONS=${POSTGRESQL_OPTIONS:-?pool=50}
- REDIS_URL=${REDIS_URL:-redis://zammad-redis:6379}
- ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED:-true}
- ELASTICSEARCH_SCHEMA=http
- ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST:-zammad-elasticsearch}
- ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT:-9200}
- NGINX_PORT=${NGINX_PORT:-8080}
- NGINX_SERVER_NAME=${NGINX_SERVER_NAME:-_}
- RAILS_TRUSTED_PROXIES=${RAILS_TRUSTED_PROXIES:-"['127.0.0.1', '::1']"}
networks:
- internal
depends_on:
- zammad-postgresql
- zammad-redis
- zammad-memcached
- zammad-elasticsearch
command: ["zammad-railsserver"]
zammad-scheduler:
image: ${ZAMMAD_IMAGE:-ghcr.io/zammad/zammad:latest}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/storage:/opt/zammad/storage
environment:
- TZ=${TZ:-America/Vancouver}
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS:-zammad-memcached:11211}
- POSTGRESQL_DB=${POSTGRES_DB:-zammad_production}
- POSTGRESQL_HOST=${POSTGRES_HOST:-zammad-postgresql}
- POSTGRESQL_USER=${POSTGRES_USER:-zammad}
- POSTGRESQL_PASS=${POSTGRES_PASS:-ChangeThisPassword}
- POSTGRESQL_PORT=${POSTGRES_PORT:-5432}
- POSTGRESQL_OPTIONS=${POSTGRESQL_OPTIONS:-?pool=50}
- REDIS_URL=${REDIS_URL:-redis://zammad-redis:6379}
- ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED:-true}
- ELASTICSEARCH_SCHEMA=http
- ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST:-zammad-elasticsearch}
- ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT:-9200}
- NGINX_PORT=${NGINX_PORT:-8080}
- NGINX_SERVER_NAME=${NGINX_SERVER_NAME:-_}
networks:
- internal
depends_on:
- zammad-postgresql
- zammad-redis
- zammad-memcached
- zammad-elasticsearch
command: ["zammad-scheduler"]
zammad-websocket:
image: ${ZAMMAD_IMAGE:-ghcr.io/zammad/zammad:latest}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/storage:/opt/zammad/storage
environment:
- TZ=${TZ:-America/Vancouver}
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS:-zammad-memcached:11211}
- POSTGRESQL_DB=${POSTGRES_DB:-zammad_production}
- POSTGRESQL_HOST=${POSTGRES_HOST:-zammad-postgresql}
- POSTGRESQL_USER=${POSTGRES_USER:-zammad}
- POSTGRESQL_PASS=${POSTGRES_PASS:-ChangeThisPassword}
- POSTGRESQL_PORT=${POSTGRES_PORT:-5432}
- POSTGRESQL_OPTIONS=${POSTGRESQL_OPTIONS:-?pool=50}
- REDIS_URL=${REDIS_URL:-redis://zammad-redis:6379}
- ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED:-true}
- ELASTICSEARCH_SCHEMA=http
- ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST:-zammad-elasticsearch}
- ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT:-9200}
- NGINX_PORT=${NGINX_PORT:-8080}
- NGINX_SERVER_NAME=${NGINX_SERVER_NAME:-_}
networks:
- internal
depends_on:
- zammad-postgresql
- zammad-redis
- zammad-memcached
- zammad-elasticsearch
command: ["zammad-websocket"]
zammad-backup:
image: ${ZAMMAD_IMAGE:-ghcr.io/zammad/zammad:latest}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/backup:/var/tmp/zammad
- ${VOL_PATH:-/data}/zammad/storage:/opt/zammad/storage:ro
environment:
- TZ=${TZ:-America/Vancouver}
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS:-zammad-memcached:11211}
- POSTGRESQL_DB=${POSTGRES_DB:-zammad_production}
- POSTGRESQL_HOST=${POSTGRES_HOST:-zammad-postgresql}
- POSTGRESQL_USER=${POSTGRES_USER:-zammad}
- POSTGRESQL_PASS=${POSTGRES_PASS:-ChangeThisPassword}
- POSTGRESQL_PORT=${POSTGRES_PORT:-5432}
- POSTGRESQL_OPTIONS=${POSTGRESQL_OPTIONS:-?pool=50}
- REDIS_URL=${REDIS_URL:-redis://zammad-redis:6379}
- ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED:-true}
- ELASTICSEARCH_SCHEMA=http
- ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST:-zammad-elasticsearch}
- ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT:-9200}
- BACKUP_DIR=/var/tmp/zammad
- BACKUP_TIME=${BACKUP_TIME:-03:00}
- HOLD_DAYS=${HOLD_DAYS:-10}
- NGINX_PORT=${NGINX_PORT:-8080}
- NGINX_SERVER_NAME=${NGINX_SERVER_NAME:-_}
networks:
- internal
depends_on:
- zammad-postgresql
- zammad-redis
- zammad-memcached
- zammad-elasticsearch
command: ["zammad-backup"]
user: 0:0
zammad-nginx:
image: ${ZAMMAD_IMAGE:-ghcr.io/zammad/zammad:latest}
restart: ${ZAMMAD_RESTART:-always}
volumes:
- ${VOL_PATH:-/data}/zammad/storage:/opt/zammad/storage
environment:
- TZ=${TZ:-America/Vancouver}
- MEMCACHE_SERVERS=${MEMCACHE_SERVERS:-zammad-memcached:11211}
- POSTGRESQL_DB=${POSTGRES_DB:-zammad_production}
- POSTGRESQL_HOST=${POSTGRES_HOST:-zammad-postgresql}
- POSTGRESQL_USER=${POSTGRES_USER:-zammad}
- POSTGRESQL_PASS=${POSTGRES_PASS:-ChangeThisPassword}
- POSTGRESQL_PORT=${POSTGRES_PORT:-5432}
- POSTGRESQL_OPTIONS=${POSTGRESQL_OPTIONS:-?pool=50}
- REDIS_URL=${REDIS_URL:-redis://zammad-redis:6379}
- ELASTICSEARCH_ENABLED=${ELASTICSEARCH_ENABLED:-true}
- ELASTICSEARCH_SCHEMA=http
- ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST:-zammad-elasticsearch}
- ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT:-9200}
- NGINX_PORT=${NGINX_PORT:-8080}
- NGINX_SERVER_NAME=${NGINX_SERVER_NAME:-_}
- NGINX_SERVER_SCHEME=$scheme
- RAILS_TRUSTED_PROXIES=${RAILS_TRUSTED_PROXIES:-"['127.0.0.1', '::1']"}
ports:
- "${ZAMMAD_PORT:-8080}:${NGINX_PORT:-8080}"
networks:
- proxy
- internal
depends_on:
- zammad-railsserver
command: ["zammad-nginx"]
networks:
proxy:
external: true
internal: