Quadlet (podman + systemd)
Runs the :standalone image variant as systemd-managed podman containers.
Works rootless or rootful; the %h paths below assume rootless.
Install
mkdir -p ~/.config/containers/systemd ~/ircd
cp deploy/standalone/quadlet/*.{network,volume,container} \
~/.config/containers/systemd/
cp deploy/standalone/quadlet/ircd.env.example ~/ircd/ircd.env
chmod 600 ~/ircd/ircd.env
$EDITOR ~/ircd/ircd.env # fill in real values
# Quadlet generates systemd units from those files on the next daemon-reload.
systemctl --user daemon-reload
systemctl --user start ircd.service # pulls postgres + ircd as deps
systemctl --user enable --now ircd.service
For rootful install, drop the files in /etc/containers/systemd/ and use
systemctl (no --user) — also swap %h/ircd/ircd.env for
/etc/ircd/ircd.env.
Files
| File | What it is |
|---|---|
ircd.network |
Shared podman network for the containers |
ircd-postgres.volume |
Persistent Postgres data |
ircd-site-encrypt.volume |
Persistent ACME cert + private key |
ircd-postgres.container |
Postgres 16 with healthcheck |
ircd.container |
The IRC daemon (waits for postgres healthy) |
ircd.env.example |
Sample environment file (copy + edit) |
Operating
# View logs
journalctl --user -u ircd.service -f
journalctl --user -u ircd-postgres.service -f
# Restart after editing ircd.env
systemctl --user restart ircd.service
# Update to a newer image
podman pull registry.example.com/oh_my_ex_oh_ircd:standalone-master
systemctl --user restart ircd.service
Notes on ACME
The standalone image runs site_encrypt in-process, so:
- Port 80 must be reachable from the public internet during the
HTTP-01 challenge (so Let’s Encrypt can fetch
http://$ACME_DOMAINS/.well-known/acme-challenge/...). - Certs and private keys live in the
ircd-site-encrypt-dbnamed volume. Back it up — losing it means re-issuing on next boot, which is rate-limited by Let’s Encrypt. - Renewals happen automatically while the unit is running; nothing to schedule externally.