Usage
Prerequisites
- A recent Podman version with Quadlet support (Podman 4.4+; check with
podman --version). systemd(used both as the rootless user’ssystemd --userinstance and, optionally, system-wide).
1. Configure your environment
Copy the example environment file and fill in your own values:
cp .env.example .env
$EDITOR .envAt minimum, review and change the database/Elasticsearch credentials (POSTGRES_PASS, ELASTICSEARCH_PASS),
ZAMMAD_FQDN, TZ, and the backup schedule (BACKUP_TIME, HOLD_DAYS). Everything under “PROXY / EXTERNAL
ACCESS” and “Cloudflare Tunnel” in .env.example is optional and commented out by default.
2. Install the Quadlet unit files
For a rootless setup (recommended — this is what these units are designed for), copy every .container,
.network, and .pod file, plus your .env, into your user’s Quadlet directory:
mkdir -p ~/.config/containers/systemd/
cp *.container *.network *.pod .env ~/.config/containers/systemd/Note
EnvironmentFile=.env is a relative path in each unit — keep .env alongside the unit files (in the same
Quadlet directory) so Podman can find it.
For a root/system-wide setup instead, use /etc/containers/systemd/ and drop --user from every command
below.
3. Load and start the units
systemctl --user daemon-reload
systemctl --user start zammad-pod.servicePodman’s Quadlet generator turns zammad.pod into zammad-pod.service and each *.container file into a
matching *.service unit. Starting the pod service brings up the network, the pod itself, and — thanks to
the After=/Requires=/PartOf= relationships declared in each container file — the rest of the stack in
the right order (PostgreSQL/Redis/Memcached first, then zammad-init, then the Rails server, websocket,
scheduler, and nginx).
4. Persist across reboots and logins
Enable the units so they start automatically, and allow your user’s systemd instance to keep running after you log out:
systemctl --user enable zammad-pod.service zammad-network.service
loginctl enable-linger "$USER"5. Access Zammad
Once everything is up, Zammad is reachable at http://localhost:8080 (or whatever host you exposed
NGINX_PORT/the pod’s PublishPort on). The first request runs Zammad’s setup wizard.
Checking status and logs
systemctl --user status zammad-railsserver.service
journalctl --user -u zammad-railsserver.service -fOptional: exposing Zammad externally
.env.example has commented-out variables for a reverse proxy (VIRTUAL_HOST, LETSENCRYPT_HOST,
LETSENCRYPT_EMAIL) and for a Cloudflare Tunnel (CLOUDFLARE_TUNNEL_TOKEN). Uncomment and fill in whichever
approach you use to put Zammad behind a real domain.