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
| Item | Value |
|---|---|
| Host | GSM16 (195.85.19.185) |
| Compose dir | /opt/docker-data/apps/zammad/ |
| Compose file | docker-compose.yml |
| Override | docker-compose.override.yml |
| Env file | .env |
| Public URL | https://zammad.id86.net |
| Local port | 8080 |
Stack Services
Zammad 7.1.1-0012 runs as 9 containers (image ghcr.io/zammad/zammad:7.1.1-0012 for the app services):
| Service | Image | Purpose |
|---|---|---|
zammad-nginx | zammad 7.1.1 | Web entry point (port 8080) |
zammad-railsserver | zammad 7.1.1 | Rails application server |
zammad-websocket | zammad 7.1.1 | Realtime websocket server |
zammad-scheduler | zammad 7.1.1 | Background jobs (DelayedJob, IMAP fetch) |
zammad-backup | zammad 7.1.1 | Automated backups |
zammad-postgresql | postgres 17.10 | Primary database (zammad_production) |
zammad-redis | redis 8.8 | Cache + websocket session store |
zammad-elasticsearch | elasticsearch 9.4.2 | Search index |
zammad-memcached | memcached 1.6.42 | Rails cache store |
Quick Control (bash aliases)
Defined in ~/.bash_aliases/Docker/zammad.sh:
| Alias | Action |
|---|---|
z_on | Start the stack (up -d) |
z_off | Stop the stack (down, preserves data volumes) |
z_status | Container 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-nginxis additionally attached to the externalapp-network(shared withcloudflared) 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-nginxalias is required — the tunnel ingress resolveshttp://zammad-nginx:8080.
- Attached via
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):
| Volume | Backs |
|---|---|
postgresql-data | PostgreSQL database |
redis-data | Redis |
elasticsearch-data | Elasticsearch index |
zammad-storage | Uploaded attachments |
zammad-backup | Backup 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)
| Variable | Default | Purpose |
|---|---|---|
ZAMMAD_FQDN | zammad.id86.net | Public hostname |
TZ | Etc/UTC | Timezone |
NGINX_EXPOSE_PORT | 8080 | Host port for nginx |
RESTART | unless-stopped | Container restart policy |
POSTGRES_PASS | — | PostgreSQL password |
ELASTICSEARCH_JAVA_OPTS | -Xms384m -Xmx384m | ES JVM heap |
ZAMMAD_WEB_CONCURRENCY | 2 | Rails 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.
Related
- Contact Form → Zammad Integration — how submissions become tickets
- Cloudflare Tunnels — tunnel ingress used to expose the stack