Appearance
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_proxyand correct subdomain offset forputerN.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.