Platform Support
pgcli drives Podman containers on both Linux and macOS. The difference is how containers get networking:
- Linux runs Podman natively, so containers share the host network stack
(
--network host) and reach each other over127.0.0.1. This is the zero-overhead path and the only one that supports cross-host topologies. - macOS runs Podman inside a
podman machineVM. Host networking there binds to the VM’s loopback, which the Mac cannot see, so pgcli instead joins a shared bridge network (pgcli-net) and publishes each port — the Mac reaches it on127.0.0.1:<port>via gvproxy, and containers reach each other by container name over the bridge. This works for a single host (dev/test); it is not the cross-host HA path.
The table below is the current support matrix. “macOS (single-host)” means fully usable for one machine; features that must advertise a routable address across machines, or that depend on Linux-only container internals, stay Linux only.
Support matrix
| Component / feature | Linux | macOS |
|---|---|---|
Instance lifecycle — pg create / start / stop / restart / destroy / status |
✅ | ✅ single-host |
pg psql / pg exec |
✅ | ✅ |
SQL command reference (pg exec, admin queries) |
✅ | ✅ |
Logs — pg logs |
✅ | ✅ |
Namespace isolation (pg.yaml namespace) |
✅ | ✅ |
Data import / export — pg import / pg export |
✅ | ✅ |
Clone — pg clone (streamed pg_dump | pg_restore) |
✅ | ✅ |
Extensions — pg extension install / list |
✅ | ✅ |
Backup / restore — pg backup / pg restore (pgBackRest) |
✅ | ✅ single-host |
Physical replica — pg replica |
✅ | ✅ single-host |
Failover — pg failover (replica promotion) |
✅ | ✅ single-host |
Auto-start on boot — pg autostart |
✅ systemd user unit | ✅ launchd (after login) |
| Addon — PgBouncer | ✅ incl. cross-host pools | ✅ single-host dev/test |
| Addon — PgDog | ✅ | ✅ single-host dev/test |
| Addon — etcd | ✅ incl. cross-host clusters | ❌ Linux only |
| Addon — HAProxy | ✅ | ❌ Linux only |
| Addon — MinIO | ✅ host network | ✅ bridge, published ports |
| Addon — silo | ✅ host network | ✅ bridge, published ports |
| Addon — rustfs | ✅ host network | ⚠️ code-complete bridge path, untested — treated as Linux only |
Client — pg mc (MinIO client) |
✅ host network | ✅ bridge (see below) |
HA — Patroni (pg ha) |
✅ incl. cross-host | ❌ Linux only |
Legend: ✅ supported · ✅ note supported with the stated caveat · ⚠️ present but unverified on that platform · ❌ not supported.
Instance features
Everything built on the managed PostgreSQL instance works on both platforms —
lifecycle commands, pg psql / pg exec, logs, namespaces, import/export,
clone, extensions, backup/restore (pgBackRest), physical replicas, and failover.
The macOS bridge path (published ports + container-name DNS) was proven by the
instance and replica/backup paths first; the proxy addons reuse it.
On macOS these are single-host: cross-host replicas and pools that span
machines are a Linux --network host + LAN-addresses feature.
Auto-start on boot
Both platforms are supported, via different services:
- Linux — a systemd user unit.
- macOS — a launchd LaunchAgent. LaunchAgents run at user login, not at system boot, because rootless podman cannot start before someone logs in. Expect containers to come up after you log in, not before. See Auto-start on Boot.
Addons
Addon networking differs per component:
- PgBouncer and PgDog —
pure proxies, supported on macOS for single-host dev/test. On macOS they join
pgcli-netand publish their ports. Client connections are still127.0.0.1:<port>. See each page’s Platform support section for the backend-address caveat (a remote/backend host must be reachable from the Mac, not127.0.0.1). - etcd — Linux only. Members run on host networking and advertise their client/peer URLs into the raft membership list as permanent cluster state; retrofitting the macOS bridge + container-name model would rewrite that state. Kept Linux-only until that is designed in.
- Patroni (
pg ha) — Linux only. Members rely on podman host networking; both root and rootless podman are supported. Thepodman machineVM’s uid mapping does not align with host networking. The commands fail fast on macOS with a clear message. See Patroni HA. - HAProxy — Linux only. It fronts Patroni members over host networking, which the podman machine VM does not provide to containers; the manager fails fast on macOS.
- MinIO — both platforms. Object storage,
standalone or as a distributed erasure-coded cluster across hosts. On Linux it
serves over host networking; on macOS it joins
pgcli-netwith its API and console ports published, so the Mac reaches both on127.0.0.1:<port>(the same path the proxy addons use). The public image is dual-arch (amd64 + arm64). - silo — both platforms. Pigsty’s MinIO fork, so
it shares MinIO’s networking story exactly: host networking on Linux, the
pgcli-netbridge with published ports on macOS. The public image is dual-arch (amd64 + arm64). - rustfs — Linux only, in practice. pgcli runs a
custom wrapper image (
ghcr.io/mars-base/pgcli/pgcli-rustfs) whose entrypoint chowns the bind-mounted data/cert directories to rustfs’s fixed uid 10001 from inside the container, before dropping to the unprivileged user. The wrapper image is built dual-arch, and the Go manager has the same macOS bridge path (published ports) as MinIO/silo, so macOS is expected to work — but this addon’s e2e coverage has only run on Linux, so treat it as Linux only until it is exercised on a Mac. pg mc(MinIO client) — both platforms. It runs themcbinary from a throwaway container, with your~/.mc/config.jsonmounted as its own default config path and local file operands (forcp/mirror/diff) mounted at their real paths — on macOS that means under the home directory, the only tree the podman machine shares. On Linux it uses host networking, so a127.0.0.1alias reaches a local addon instance; on macOS the container sits on the bridge, where a127.0.0.1alias is the container’s own loopback — point aliases athost.containers.internal:<port>for a local Mac addon, or a routable address for a remote store.
Confirming your platform
pg start prints the detected platform in its banner, so you can confirm which
path you are on: