Skip to main content

Zammad Stack (Docker)

Zammad is the helpdesk used by the contact form integration. It runs as a Docker Compose stack on GSM16 and is exposed publicly via the Cloudflare tunnel at https://zammad.id86.net.

Host & Location

ItemValue
HostGSM16 (195.85.19.185)
Compose dir/opt/docker-data/apps/zammad/
Compose filedocker-compose.yml
Overridedocker-compose.override.yml
Env file.env
Public URLhttps://zammad.id86.net
Local port8080

Stack Services

Zammad 7.1.1-0012 runs as 9 containers (image ghcr.io/zammad/zammad:7.1.1-0012 for the app services):

ServiceImagePurpose
zammad-nginxzammad 7.1.1Web entry point (port 8080)
zammad-railsserverzammad 7.1.1Rails application server
zammad-websocketzammad 7.1.1Realtime websocket server
zammad-schedulerzammad 7.1.1Background jobs (DelayedJob, IMAP fetch)
zammad-backupzammad 7.1.1Automated backups
zammad-postgresqlpostgres 17.10Primary database (zammad_production)
zammad-redisredis 8.8Cache + websocket session store
zammad-elasticsearchelasticsearch 9.4.2Search index
zammad-memcachedmemcached 1.6.42Rails cache store

Quick Control (bash aliases)

Defined in ~/.bash_aliases/Docker/zammad.sh:

AliasAction
z_onStart the stack (up -d)
z_offStop the stack (down, preserves data volumes)
z_statusContainer status (ps)

Manual equivalents:

sudo docker compose -f /opt/docker-data/apps/zammad/docker-compose.yml up -d
sudo docker compose -f /opt/docker-data/apps/zammad/docker-compose.yml down
sudo docker compose -f /opt/docker-data/apps/zammad/docker-compose.yml ps

z_off uses down (not down -v), so all data volumes persist across stop/start cycles.

Networking

  • Containers join the project network zammad_default.
  • zammad-nginx is additionally attached to the external app-network (shared with cloudflared) so the tunnel can resolve it:
    • Attached via docker-compose.override.yml (zammad-nginx-external-network) and/or the manual command:
      sudo docker network connect --alias zammad-nginx app-network zammad-zammad-nginx-1
    • The zammad-nginx alias is required — the tunnel ingress resolves http://zammad-nginx:8080.

Tunnel Ingress

/opt/docker-data/tunnel/config/config.yml:

ingress:
- hostname: zammad.id86.net
service: http://zammad-nginx:8080

Data & Volumes

All persistent data lives in named Docker volumes (safe across z_off/z_on):

VolumeBacks
postgresql-dataPostgreSQL database
redis-dataRedis
elasticsearch-dataElasticsearch index
zammad-storageUploaded attachments
zammad-backupBackup dumps

Backup

The zammad-backup container performs automated backups on start and on the BACKUP_TIME schedule (default 03:00), writing to /var/tmp/zammad (volume zammad-backup). Backup retention is controlled by HOLD_DAYS (default 10).

Environment Variables (.env)

VariableDefaultPurpose
ZAMMAD_FQDNzammad.id86.netPublic hostname
TZEtc/UTCTimezone
NGINX_EXPOSE_PORT8080Host port for nginx
RESTARTunless-stoppedContainer restart policy
POSTGRES_PASSPostgreSQL password
ELASTICSEARCH_JAVA_OPTS-Xms384m -Xmx384mES JVM heap
ZAMMAD_WEB_CONCURRENCY2Rails web processes

Rails Console

Admin operations are performed through the Rails console:

sudo docker exec zammad-zammad-railsserver-1 /opt/zammad/bin/rails r 'puts User.pluck(:id, :login)'

Used for tasks such as creating groups, granting access, inspecting records, and cleanup. See Zammad Integration for the concrete commands used.