Skip to content

Podman (rootless + Quadlet)

Podman is the bridge between "one Docker host" and "full Kubernetes". It runs the exact same OCI image as the other wrappers — rootless, with systemd-native lifecycle management via Quadlet.

Two deployment shapes

flowchart LR
    IMG[["moe-sovereign/orchestrator"]]:::art

    IMG --> Q["Quadlet unit<br/>single container<br/>(for edge/LXC)"]
    IMG --> KP["podman kube play<br/>Pod manifest<br/>(for multi-container bundles)"]

    Q -- systemd user --> SYS1[systemd]
    KP -- podman pod --> POD[Pod]

    classDef art fill:#eef2ff,stroke:#6366f1,font-weight:bold;
  • Quadlet (deploy/podman/systemd/moe-orchestrator.container) is the right choice when you want systemd-native lifecycle for a single orchestrator container — used by the LXC wrapper.
  • podman kube play (deploy/podman/kube.yaml) is the right choice when you want to bundle orchestrator + mcp + admin as a Pod that can later be lifted into Kubernetes without a rewrite.

Rootless execution

# Create a dedicated user (same UID the image expects)
sudo useradd -u 1001 -m moe
sudo loginctl enable-linger moe

# Pull and start
sudo -u moe podman pull ghcr.io/moe-sovereign/orchestrator:latest
sudo -u moe podman run -d --name moe \
    --user 1001 --read-only --tmpfs /tmp:rw \
    -p 8000:8000 \
    -v /home/moe/moe/logs:/app/logs:Z \
    -e MOE_PROFILE=team \
    ghcr.io/moe-sovereign/orchestrator:latest

No sudo docker and no privileged flags: Podman's user-namespace mapping handles everything.

Lifting a pod into Kubernetes

The Pod YAML at deploy/podman/kube.yaml is a valid Kubernetes manifest. The same file can be applied directly:

# Local: run as rootless Podman pod
podman kube play deploy/podman/kube.yaml

# Later, same YAML on k8s
kubectl apply -f deploy/podman/kube.yaml

This is the "compose → k8s bridge" that makes moving between tiers painless.

Why prefer Quadlet over podman generate systemd?

podman generate systemd is deprecated as of Podman 4.4. Quadlet is the successor: you drop a .container file into ~/.config/containers/systemd/, reload systemd, and a matching .service unit is auto-generated. See the LXC page for the full unit file.