Self-host Zammad
A full ticketing helpdesk under AGPL-3.0, owned by the Zammad Foundation and developed by Zammad GmbH: email, web form, chat widget, SMS, Telegram, WhatsApp and Facebook channels plus CTI phone integrations, with SLAs, time accounting, a knowledge base, core workflows and LDAP. The whole codebase is AGPL-3.0; Zammad GmbH sells hosting and support packages, not a paid edition.
Key facts
Pick Zammad when you are replacing a Zendesk-style ticket desk and want every feature without a licence key: email (including Google and Microsoft 365 mailboxes), web form, chat, SMS, Telegram, WhatsApp and Facebook channels, CTI phone integrations, SLAs with calendars, time accounting, a knowledge base, core workflows, and LDAP, SAML and OpenID Connect sign-in. The whole codebase is AGPL-3.0, owned by the Zammad Foundation and developed by Zammad GmbH, which sells hosting and support rather than a paid edition. The official `zammad-docker-compose` stack runs Rails, PostgreSQL, Redis, Memcached, Elasticsearch and nginx. If most of your support is live chat and messaging apps, Chatwoot fits better; for a small shared email inbox, FreeScout is much lighter.
What you need
- Any VPS with at least 4096 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- About an afternoon — budget time for troubleshooting
Paid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# Zammad — official zammad-docker-compose stack (Zammad 7.2.0, PostgreSQL, Elasticsearch, Redis, Memcached, nginx), per docs.zammad.org/en/latest/install/docker-compose.html
sudo sysctl -w vm.max_map_count=262144 # required by Elasticsearch; persist it in /etc/sysctl.conf
git clone --branch v17.4.0 https://github.com/zammad/zammad-docker-compose.git
cd zammad-docker-compose
cp .env.dist .env # set POSTGRES_PASS (default: zammad) before the first start
docker compose up -d
# first boot runs DB migrations; on a 2 vCPU box they outlast the railsserver healthcheck and compose exits "unhealthy" — wait ~5 min, then run docker compose up -d again
# open http://SERVER_IP:8080 — the Getting Started wizard creates the first administrator
# for HTTPS load scenarios/add-nginx-proxy-manager.yml or add-cloudflare-tunnel.yml (see the .env comments)What you take on
Zammad's docs are specific about sizing and about the parts of the Docker stack you own:
An alternative to
Head-to-head
More self-hosted tools
Chatwoot
FreeScout
Formbricks
Healthchecks
Common questions
First start fails with "dependency failed to start: container zammad-docker-compose-zammad-railsserver-1 is unhealthy". Is the install broken?
Usually not. On a small server the first boot runs database migrations for longer than the railsserver health check allows (a 120-second start period, then three 30-second retries), so Compose gives up and never starts nginx. Wait a few minutes for the migrations to finish, then run docker compose up -d again. On our 2 vCPU / 8 GB test server (2026-09-28), a second docker compose up -d about four minutes later brought the web UI up (HTTP 200).