Zammad

Hosting Feb 3, 2026

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: local

After 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.

Tags

Simplicy

I am a 28 year old Software Developer born and raised in South Florida. I make terminal applications, API's, and desktop applications; mostly with Rust. My free time is split between Programming and DevOps, Gaming/Modding, Sewing, or Breadboarding.