Zammad
Recently, I spent several weeks searching for a suitable open-source helpdesk platform to use for Closyt. There are several options you could use to accomplish this task, ITFlow, FreeScout, FrappeDesk, UVDesk, LibreDesk, Peppermint.sh, to name a few. I needed a helpdesk that I could easily re-deploy, manage, and integrate with my current stack. I had a couple of requirements up front:
- Containerized
- Low resource usage
- Customer Portal
- Multiple Channels
- Customer Accounts
- OIDC Integration
After much research and trial and error, I ultimately chose Zammad. While many others were close, I did not like the setup process for some of them, or they lacked certain features while excelling in others. Zammad had everything I needed, and thankfully, one of the easier setup processes among the more mature applications I tried.
Assumptions
You know how to use docker, docker compose and/or portainer. You know a bit about computer networking and docker networks. You know what a reverse proxy is or how to expose your site to the internet (if you choose to do so).
Setup
To set up Zammad, I configured it using the below docker-compose.yml, a slightly modified version of the one they provide. In this, I have disabled Elasticsearch and the DB Backup services since I am not using Zammad for a large team, and I have my own backup process in place for my Docker stacks. You will want to setup all of your environment variables for your use-case; Zammad has a lot of configuration options.
x-shared:
zammad-service: &zammad-service
environment: &zammad-environment
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:-zammad}
POSTGRESQL_PORT: ${POSTGRES_PORT:-5432}
POSTGRESQL_OPTIONS: ${POSTGRESQL_OPTIONS:-?pool=50}
POSTGRESQL_DB_CREATE:
REDIS_URL: ${REDIS_URL:-redis://zammad-redis:6379}
# Backup settings
BACKUP_DIR: "-/var/tmp/zammad"
BACKUP_TIME: "-03:00"
HOLD_DAYS: "10"
TZ: "America/New_York"
image: ${IMAGE_REPO:-ghcr.io/zammad/zammad}:${VERSION:-6.5.2-22}
restart: ${RESTART:-always}
volumes:
- zammad-storage:/opt/zammad/storage
depends_on:
- zammad-memcached
- zammad-postgresql
- zammad-redis
services:
zammad-backup:
profiles:
- do-not-start
zammad-elasticsearch:
profiles:
- do-not-start
zammad-init:
<<: *zammad-service
command: ["zammad-init"]
depends_on:
- zammad-postgresql
restart: on-failure
user: 0:0
zammad-memcached:
command: memcached -m 256M
image: memcached:${MEMCACHE_VERSION:-1.6.39-alpine}
restart: ${RESTART:-always}
zammad-nginx:
<<: *zammad-service
command: ["zammad-nginx"]
ports:
- "90:8080"
depends_on:
- zammad-railsserver
zammad-postgresql:
environment:
POSTGRES_DB: ${POSTGRES_DB:-zammad_production}
POSTGRES_USER: ${POSTGRES_USER:-zammad}
POSTGRES_PASSWORD: ${POSTGRES_PASS:-zammad}
image: postgres:${POSTGRES_VERSION:-17.6-alpine}
restart: ${RESTART:-always}
volumes:
- postgresql-data:/var/lib/postgresql/data
zammad-railsserver:
<<: *zammad-service
command: ["zammad-railsserver"]
zammad-redis:
image: redis:${REDIS_VERSION:-7.4.6-alpine}
restart: ${RESTART:-always}
volumes:
- redis-data:/data
zammad-scheduler:
<<: *zammad-service
command: ["zammad-scheduler"]
zammad-websocket:
<<: *zammad-service
command: ["zammad-websocket"]
volumes:
postgresql-data:
driver: local
redis-data:
driver: local
zammad-storage:
driver: localAfter deploying this via Portainer, you can access Zammad at the host where it was deployed and complete the initial setup. Complete the setup and then you should be ready to start using Zammad! Once you log-in you will be able to configure the application more to suit your needs like setting up email integration and adding additional users.
I really like Zammad due to it's ease of setup using docker-compose but also how mature it is as a product. Zammad is very powerful and there is a lot that you can do with it. The only downside is there is no easy way to submit a ticket, but you could easily build something to handle that using their API. Users can submit tickets, but they would need to create an account in Zammad first before doing so, instead of creating the ticket first. Otherwise the program suits my needs perfectly and I can't wait to see what else I can do with it.