Skip to content

Container platform rationale

Why Docker Compose here

Aux runs “real” multi-service apps that upstream ships as containers. Compose gives:

  • Declarative restarts (unless-stopped / always)
  • Named networks so Nextcloud’s app/db/redis are not on the default bridge soup
  • Bind mounts under /home/ty/... for data you can back up with ordinary tools

Portainer exists for visibility and emergency UI; it is not a substitute for compose files in git or home directories.

Isolation boundaries

Each stack tends to get its own bridge network (e.g. nextcloud_default, n8n_default, radicale_default, per-Puter instanceN_default). That limits accidental cross-talk and makes docker network inspect a useful debugging tool.

HeyPuter goes further: four full stacks, not one shared monolith. The tradeoff is disk and operational repetition; the win is blast-radius control and the ability to give different people/environments different desktops (and optional Ollama only where needed).

Image pinning vs :latest

Most utility images historically tracked latest tags; HeyPuter is explicitly pinned (26.05.2) because upstream main has produced crash-loops. Treat pin discipline as a production control, not pedantry. Fleet upgrades go through ~/puter/upgrade-instances.sh, then nginx restart because nginx resolves upstream IPs at start time.

Proxy awareness

Apps behind Caddy must understand HTTPS at the edge:

  • Nextcloud: OVERWRITEPROTOCOL=https, trusted proxies
  • n8n: N8N_PROXY_HOPS=1
  • Puter: trust_proxy and correct subdomain offset for puterN.cadenceworks.tech

Misaligned proxy headers show up as redirect loops, wrong cookie security, or broken asset URLs — not as “Docker is down.”

What we deliberately do not run (yet)

No Loki/Grafana/Prometheus stack is mandated in baseline docs. Logging is journald + docker json-file. That keeps the host lean; it also means incident response starts with journalctl and docker logs, not a fancy dashboard.

Northeast Systems · Aux Server · Infra Server