Podman
Run the OpenAEON gateway in a rootless Podman container. Uses the same image as Docker (build from the repo Dockerfile).Requirements
- Podman (rootless)
- Sudo for one-time setup (create user, build image)
Quick start
1. One-time setup (from repo root; creates user, builds image, installs launch script):~openaeon/.openaeon/openaeon.json (sets gateway.mode="local") so the gateway can start without running the wizard.
By default the container is not installed as a systemd service, you start it manually (see below). For a production-style setup with auto-start and restarts, install it as a systemd Quadlet user service instead:
OPENAEON_PODMAN_QUADLET=1; use --container to install only the container and launch script.)
2. Start gateway (manual, for quick smoke testing):
http://127.0.0.1:18789/ and use the token from ~openaeon/.openaeon/.env (or the value printed by setup).
Systemd (Quadlet, optional)
If you ran./setup-podman.sh --quadlet (or OPENAEON_PODMAN_QUADLET=1), a Podman Quadlet unit is installed so the gateway runs as a systemd user service for the openaeon user. The service is enabled and started at the end of setup.
- Start:
sudo systemctl --machine openaeon@ --user start openaeon.service - Stop:
sudo systemctl --machine openaeon@ --user stop openaeon.service - Status:
sudo systemctl --machine openaeon@ --user status openaeon.service - Logs:
sudo journalctl --machine openaeon@ --user -u openaeon.service -f
~openaeon/.config/containers/systemd/openaeon.container. To change ports or env, edit that file (or the .env it sources), then sudo systemctl --machine openaeon@ --user daemon-reload and restart the service. On boot, the service starts automatically if lingering is enabled for openaeon (setup does this when loginctl is available).
To add quadlet after an initial setup that did not use it, re-run: ./setup-podman.sh --quadlet.
The openaeon user (non-login)
setup-podman.sh creates a dedicated system user openaeon:
-
Shell:
nologin— no interactive login; reduces attack surface. -
Home: e.g.
/home/openaeon— holds~/.openaeon(config, workspace) and the launch scriptrun-openaeon-podman.sh. -
Rootless Podman: The user must have a subuid and subgid range. Many distros assign these automatically when the user is created. If setup prints a warning, add lines to
/etc/subuidand/etc/subgid:Then start the gateway as that user (e.g. from cron or systemd): -
Config: Only
openaeonand root can access/home/openaeon/.openaeon. To edit config: use the Control UI once the gateway is running, orsudo -u openaeon $EDITOR /home/openaeon/.openaeon/openaeon.json.
Environment and config
- Token: Stored in
~openaeon/.openaeon/.envasOPENAEON_GATEWAY_TOKEN.setup-podman.shandrun-openaeon-podman.shgenerate it if missing (usesopenssl,python3, orod). - Optional: In that
.envyou can set provider keys (e.g.GROQ_API_KEY,OLLAMA_API_KEY) and other OpenAEON env vars. - Host ports: By default the script maps
18789(gateway) and18790(bridge). Override the host port mapping withOPENAEON_PODMAN_GATEWAY_HOST_PORTandOPENAEON_PODMAN_BRIDGE_HOST_PORTwhen launching. - Gateway bind: By default,
run-openaeon-podman.shstarts the gateway with--bind loopbackfor safe local access. To expose on LAN, setOPENAEON_GATEWAY_BIND=lanand configuregateway.controlUi.allowedOrigins(or explicitly enable host-header fallback) inopenaeon.json. - Paths: Host config and workspace default to
~openaeon/.openaeonand~openaeon/.openaeon/workspace. Override the host paths used by the launch script withOPENAEON_CONFIG_DIRandOPENAEON_WORKSPACE_DIR.
Useful commands
- Logs: With quadlet:
sudo journalctl --machine openaeon@ --user -u openaeon.service -f. With script:sudo -u openaeon podman logs -f openaeon - Stop: With quadlet:
sudo systemctl --machine openaeon@ --user stop openaeon.service. With script:sudo -u openaeon podman stop openaeon - Start again: With quadlet:
sudo systemctl --machine openaeon@ --user start openaeon.service. With script: re-run the launch script orpodman start openaeon - Remove container:
sudo -u openaeon podman rm -f openaeon— config and workspace on the host are kept
Troubleshooting
- Permission denied (EACCES) on config or auth-profiles: The container defaults to
--userns=keep-idand runs as the same uid/gid as the host user running the script. Ensure your hostOPENAEON_CONFIG_DIRandOPENAEON_WORKSPACE_DIRare owned by that user. - Gateway start blocked (missing
gateway.mode=local): Ensure~openaeon/.openaeon/openaeon.jsonexists and setsgateway.mode="local".setup-podman.shcreates this file if missing. - Rootless Podman fails for user openaeon: Check
/etc/subuidand/etc/subgidcontain a line foropenaeon(e.g.openaeon:100000:65536). Add it if missing and restart. - Container name in use: The launch script uses
podman run --replace, so the existing container is replaced when you start again. To clean up manually:podman rm -f openaeon. - Script not found when running as openaeon: Ensure
setup-podman.shwas run so thatrun-openaeon-podman.shis copied to openaeon’s home (e.g./home/openaeon/run-openaeon-podman.sh). - Quadlet service not found or fails to start: Run
sudo systemctl --machine openaeon@ --user daemon-reloadafter editing the.containerfile. Quadlet requires cgroups v2:podman info --format '{{.Host.CgroupsVersion}}'should show2.
Optional: run as your own user
To run the gateway as your normal user (no dedicated openaeon user): build the image, create~/.openaeon/.env with OPENAEON_GATEWAY_TOKEN, and run the container with --userns=keep-id and mounts to your ~/.openaeon. The launch script is designed for the openaeon-user flow; for a single-user setup you can instead run the podman run command from the script manually, pointing config and workspace to your home. Recommended for most users: use setup-podman.sh and run as the openaeon user so config and process are isolated.