---
title: "Deploy Zammad"
description: "Helpdesk software that turns customer emails into tracked tickets"
category: "Other"
url: https://railway.com/deploy/zammad
---

# Deploy Zammad

Helpdesk software that turns customer emails into tracked tickets

**[Deploy Zammad on Railway](https://railway.com/template/zammad)**

- **Creator:** A3A
- **Category:** Other

## Template content

### zammad-scheduler https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/zammad.svg

- **Source:** https://github.com/gridalpha/zammad-railway

### zammad-railsserver https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/zammad.svg

- **Source:** https://github.com/gridalpha/zammad-railway

### Postgres https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18

### memcached https://cdn.worldvectorlogo.com/logos/memcached.svg

- **Image:** memcached:1.6-alpine
- **Start command:** `memcached -m 256M -l ::,0.0.0.0 -p 11211`

### Redis https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/redis.svg

- **Image:** redis:8.2
- **Start command:** `/bin/sh -c "rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH"`

### zammad-nginx https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/zammad.svg

- **Source:** https://github.com/gridalpha/zammad-railway
- **Health check:** /
- **Public domain:** Yes

### zammad-websocket https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/zammad.svg

- **Source:** https://github.com/gridalpha/zammad-railway

### elasticsearch https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/elasticsearch.svg

- **Source:** https://github.com/gridalpha/zammad-railway
- **Health check:** /

## Buckets

- **zammad-storage**

## Documentation

![Zammad logo](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQDaDIpuM8AicYX1exfvw0ExcbbQEXER2RfrQmYy0oiTXg4Tx-BXISgGwAr&s=10)

# 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](https://res.cloudinary.com/rroe4rtk/image/upload/v1788075589/zammad-architecture.png)

## 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](https://res.cloudinary.com/rroe4rtk/image/upload/v1788075591/zammad-dashboard.png)

![Zammad ticket thread with a customer note and an attached log file](https://res.cloudinary.com/rroe4rtk/image/upload/v1788075592/zammad-ticket-attachment.png)

![Zammad Open Tickets overview listing two tickets by customer](https://res.cloudinary.com/rroe4rtk/image/upload/v1788075593/zammad-ticket-overview.png)

![Zammad admin storage settings with Simple Storage S3 selected](https://res.cloudinary.com/rroe4rtk/image/upload/v1788075594/zammad-admin-storage.png)

## 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

- **Zammad** — `ghcr.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.6** — `memcached:1.6-alpine`, the Rails cache
- **Elasticsearch 9.5.2** — `elasticsearch:9.5.2`, the search index
- **Object storage bucket** — attachments, shared by app and scheduler

### Environment Variables Reference

| Variable | Purpose |
|---|---|
| `ZAMMAD_ADMIN_EMAIL` | Administrator login created on first boot |
| `ZAMMAD_ADMIN_PASSWORD` | Password for that administrator |
| `ZAMMAD_ALLOW_SIGNUP` | Customer self-registration; `false` by default |
| `ZAMMAD_FQDN` | Public hostname used in links and live-update origins |
| `ELASTICSEARCH_ENABLED` | Set `false` to fall back to database search |
| `NGINX_CLIENT_MAX_BODY_SIZE` | Maximum attachment upload size |
| `ZAMMAD_IMAGE_TAG` | Pin every Zammad role to one tag |

### Deployment Dependencies

- Source: [zammad/zammad](https://github.com/zammad/zammad)
- Reference stack: [zammad-docker-compose](https://github.com/zammad/zammad-docker-compose)
- Docs: [docs.zammad.org](https://docs.zammad.org/)

## Hardware Requirements for Self-Hosting Zammad

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 2 cores | 4–6 cores |
| RAM | 6 GB + 4 GB for Elasticsearch | 8–12 GB |
| Storage | 5 GB search index | 10 GB+ as the archive grows |
| Runtime | Ruby 3.4, PostgreSQL 14+, Elasticsearch 8–9 | In 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.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/zammad
