Skip to content

Run Arcane on Podman

Use Arcane with rootless Podman through Compose or a systemd Quadlet.

This page sets up Arcane on Podman through its Docker-compatible API socket. With a rootless user’s socket, Arcane and every container it creates stay rootless. Arcane detects Podman on its own and adds a Podman section; see Podman Overview.

Terminal window
systemctl --user enable --now podman.socket
loginctl enable-linger "$USER"

Lingering starts your user’s systemd manager at boot, without an interactive login. The socket is at /run/user/<UID>/podman/podman.sock, or %t/podman/podman.sock in a user systemd unit (%t is the user’s runtime directory).

Use Compose, or a Quadlet so systemd starts Arcane at boot and restarts it if it exits.

Follow the Installation guide, then replace the Docker socket mount with your rootless Podman socket:

services:
arcane:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /run/user/<UID>/podman/podman.sock:/var/run/docker.sock

Replace <UID> with your numeric user ID (id -u). On Windows 11 with Podman Desktop, mount /run/podman/podman.sock (the socket inside the Podman VM) instead.

Starting and stopping Quadlets, and Podman auto-update before 6.2, need systemd over D-Bus. Mount the bus and run Arcane as a user allowed to use it; everything else works without this.

  • Rootless: mount the session bus at /run/user/<UID>/bus. keep-id maps your UID into the container unchanged, since the bus rejects subordinate IDs. Arcane starts as root, then switches to PUID/PGID to own the socket and bus.
  • Rootful: units are system services only root can manage, so mount the system bus and run Arcane as root.
services:
arcane:
user: '0:0'
userns_mode: keep-id
volumes:
- /run/user/<UID>/podman/podman.sock:/var/run/docker.sock
- /run/user/<UID>/bus:/run/user/<UID>/bus
- arcane-data:/app/data
environment:
- DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
- PUID=<UID>
- PGID=<GID>

Run arcane-cli podman status to check the Podman version, whether Arcane runs rootless, and whether systemd is reachable. If not, the reason also shows on each Quadlet’s page and Podman → Auto Update. When DOCKER_HOST points to a Podman engine on another machine, Arcane won’t use its local bus; run an Arcane Agent there instead.

A Quadlet restarts Arcane itself. To also restart the containers Arcane manages that use restart: always or restart: unless-stopped, enable Podman’s restart service:

Terminal window
systemctl --user enable --now podman-restart.service

Arcane doesn’t redeploy stopped Compose projects when it starts, so set a restart policy in each project’s Compose file.

Terminal window
podman info --format '{{.Host.Security.Rootless}}'
systemctl --user is-active podman.socket arcane.service podman-auto-update.timer
podman inspect arcane --format '{{.State.Health.Status}}'

Expect true (rootless), every unit active, and the container healthy.

With Compose, update as on Docker. With a Quadlet, AutoUpdate=registry makes Podman check the image tag daily and restart arcane.service when it changes, rolling back if the new one isn’t healthy. Arcane’s own update action is off here, since recreating the container would take it out of systemd’s control. To check or apply now:

Terminal window
podman auto-update --dry-run
systemctl --user start podman-auto-update.service

If you pin Image to a version tag, change it in the Quadlet and restart the service. Arcane’s updater also skips other Quadlet containers; update them with Podman auto-update.

Only root can bind ports below 1024. To let rootless containers publish HTTP and HTTPS, lower the threshold for every unprivileged user:

Terminal window
echo 'net.ipv4.ip_unprivileged_port_start=80' |
sudo tee /etc/sysctl.d/99-rootless-ports.conf
sudo sysctl --system

This isn’t needed for Arcane’s own port, 3552.