Railway

Deploy Zammad

Helpdesk software that turns customer emails into tracked tickets

Deploy Zammad

zammad-scheduler

gridalpha/zammad-railway

Just deployed

zammad-railsserver

gridalpha/zammad-railway

Just deployed

/var/lib/postgresql/data

Just deployed

Just deployed

/data

Just deployed

zammad-websocket

gridalpha/zammad-railway

Just deployed

Just deployed

/usr/share/elasticsearch/data

zammad-storage

Bucket

Just deployed

Zammad logo

Deploy and Host Zammad on Railway

Zammad is an open-source helpdesk that pulls email, web forms, phone notes, chat and messenger conversations into one shared agent inbox. Teams use it to replace a shared mailbox or a paid ticketing suite with something they control: full-text search across every conversation, SLAs and escalation timers, trigger and scheduler automation, a knowledge base, per-group permissions and a REST API. Developed in the open since 2016 under AGPL-3.0, it is a common pick for teams wanting Zendesk-style workflows without per-agent billing.

Self-host Zammad on Railway with the production topology its maintainers run, already wired together. The template splits Zammad into its four documented roles — a reverse proxy owning the public domain, a Rails application server, a websocket server for live updates and a background scheduler — and puts PostgreSQL, Redis, memcached and Elasticsearch behind them on the private network. Attachments go to an object-storage bucket rather than a disk, so the application tier stays stateless.

Diagram of the eight Zammad services deployed on Railway

Getting Started with Zammad on Railway

Set ZAMMAD_ADMIN_EMAIL and ZAMMAD_ADMIN_PASSWORD before deploying — those two values are all the template asks for. The first boot creates the schema, seeds Zammad's default groups, roles and states, builds the Elasticsearch index, then creates that administrator through Zammad's own setup wizard. The wizard is closed by the time the public URL answers, so nobody who finds it can claim the admin account.

Open the public URL of the zammad-nginx service and sign in. You land on the agent dashboard. Click + in the lower-left corner to open a ticket, type a customer email address into the Customer field and choose Create new Customer to add them inline, then write the first article and press Create. Search a word from that article in the top-left box: a hit proves Elasticsearch is indexing, and the activity stream updating without a refresh proves the websocket service is reachable. Drag a file onto a note to confirm attachments reach the bucket. Then open Administration → Channels → Email to connect your mailbox and Manage → Groups to model your queues.

Zammad agent dashboard with a live activity stream of ticket events

Zammad ticket thread with a customer note and an attached log file

Zammad Open Tickets overview listing two tickets by customer

Zammad admin storage settings with Simple Storage S3 selected

About Hosting Zammad

Zammad is a full service desk, not a shared inbox with tags. A ticket carries state, priority, owner, group, tags, links, time accounting and a complete audit history; agents work it through overviews they define themselves, while triggers and scheduled jobs act on it automatically. Support archives hold some of the most sensitive data an organisation has, and Zammad's licence lets you keep it on infrastructure you control.

Key capabilities:

  • Email, web form, phone, chat, Telegram, WhatsApp and Microsoft 365 channels
  • SLAs with escalation timers, business calendars and per-group targets
  • Triggers, macros, scheduled jobs and a Core Workflow automation engine
  • Customer-facing knowledge base with drafts, translations and public links
  • Fine-grained roles, per-group permissions, LDAP/SAML/OIDC sign-on, REST API

The service split mirrors how Zammad runs in production. zammad-nginx terminates traffic, serves the compiled frontend and splits /ws from the application, which is why it is the only service with a public domain. zammad-railsserver runs Puma and owns schema migrations. zammad-websocket holds the connections that push live updates to open tabs. zammad-scheduler runs delayed jobs, escalations, email fetching and indexing away from request traffic. PostgreSQL stores ticket data, Redis the websocket sessions, memcached the Rails cache, Elasticsearch the search index.

Why Deploy Zammad on Railway

Railway removes the server work Zammad's install guide assumes:

  • All eight services provisioned and connected in one deploy
  • Managed PostgreSQL and Redis with backups and no tuning
  • Object storage for attachments, so no disk to size or outgrow
  • Private networking between roles; only the proxy is exposed
  • Free TLS on a generated domain, or bring your own
  • Scale any role independently as ticket volume grows

Common Use Cases

  • Replacing a shared support@ mailbox with tracked tickets, SLAs and reporting
  • Running an internal IT service desk with per-department groups and escalations
  • Consolidating email, web form and messenger enquiries into one workflow

Dependencies for Zammad

  • Zammadghcr.io/zammad/zammad:latest, four services off one image
  • PostgreSQL 18 — tickets, users, settings and audit history
  • Redis 8 — websocket session store and Action Cable pub/sub
  • memcached 1.6memcached:1.6-alpine, the Rails cache
  • Elasticsearch 9.5.2elasticsearch:9.5.2, the search index
  • Object storage bucket — attachments, shared by app and scheduler

Environment Variables Reference

VariablePurpose
ZAMMAD_ADMIN_EMAILAdministrator login created on first boot
ZAMMAD_ADMIN_PASSWORDPassword for that administrator
ZAMMAD_ALLOW_SIGNUPCustomer self-registration; false by default
ZAMMAD_FQDNPublic hostname used in links and live-update origins
ELASTICSEARCH_ENABLEDSet false to fall back to database search
NGINX_CLIENT_MAX_BODY_SIZEMaximum attachment upload size
ZAMMAD_IMAGE_TAGPin every Zammad role to one tag

Deployment Dependencies

Hardware Requirements for Self-Hosting Zammad

ResourceMinimumRecommended
CPU2 cores4–6 cores
RAM6 GB + 4 GB for Elasticsearch8–12 GB
Storage5 GB search index10 GB+ as the archive grows
RuntimeRuby 3.4, PostgreSQL 14+, Elasticsearch 8–9In the images

Zammad's docs give 2 cores and 6 GB as the floor for a small team, roughly 6 cores for 40 agents. Ticket data lives in PostgreSQL and attachments in the bucket, so the only disk that grows is the search index.

Self-Hosting Zammad

Zammad ships as a multi-container stack. Outside Railway its compose project is the quickest route:

git clone https://github.com/zammad/zammad-docker-compose.git
cd zammad-docker-compose
docker compose up -d

That starts the same roles plus its own datastores on http://localhost:8080. To run one role from the published image against datastores you already have, pass the role as the container command:

docker run -d --name zammad-railsserver \
  -e POSTGRESQL_HOST=postgres -e POSTGRESQL_USER=zammad \
  -e POSTGRESQL_PASS=changeme -e POSTGRESQL_DB=zammad_production \
  -e REDIS_URL=redis://redis:6379 \
  -e MEMCACHE_SERVERS=memcached:11211 \
  -e ELASTICSEARCH_HOST=elasticsearch \
  ghcr.io/zammad/zammad:latest zammad-railsserver

Packaged .deb and .rpm builds and a Helm chart are published too.

How Much Does Zammad Cost to Self-Host?

Zammad is free and open source under AGPL-3.0 — no agent limit, no feature gating, no licence key. Its own hosted plans run €7–€25 per agent per month, so a five-agent team pays €420–€1,500 a year for the managed version. Running it here costs only the Railway resources the eight services use, which does not change as you add agents.

FAQ

What is Zammad? An open-source helpdesk that turns email, web forms, phone calls and messenger conversations into tracked tickets with owners, states, SLAs and a searchable history. Written in Ruby on Rails, licensed under AGPL-3.0.

How do I log in to Zammad after deploying it on Railway? Use the values you set in ZAMMAD_ADMIN_EMAIL and ZAMMAD_ADMIN_PASSWORD. The administrator is created during startup, so no setup wizard sits waiting on the public URL.

Why does self-hosted Zammad need Elasticsearch, Redis and memcached? Elasticsearch indexes titles, article bodies and attachment contents so agents can search the whole archive; without it Zammad falls back to slower database queries. Redis stores websocket sessions so live updates survive a restart, and memcached keeps settings and rendered fragments out of the database.

Can I receive and send email with self-hosted Zammad? Yes, but you supply the mailbox. Under Administration → Channels → Email, add your IMAP or Microsoft 365 account for inbound mail and an SMTP relay for outbound. No mail credentials are bundled, so nothing is silently swallowed before you configure them.

Where are ticket attachments stored in this Zammad template? In the object-storage bucket, selected as Simple Storage (S3) under Administration → System → Storage. Zammad streams files through its own API, so they stay private and no service keeps local state. Database storage is one dropdown away.


Template Content

More templates in this category

View Template
Rocky Linux
Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
44
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
51