Skip to content

Usage

Prerequisites

  • A recent Podman version with Quadlet support (Podman 4.4+; check with podman --version).
  • systemd (used both as the rootless user’s systemd --user instance and, optionally, system-wide).

1. Configure your environment

Copy the example environment file and fill in your own values:

cp .env.example .env
$EDITOR .env

At 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.service

Podman’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 -f

Optional: 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.

Last updated on