Skip to content

HeyPuter Fleet

Overview

Four independent self-hosted HeyPuter instances run as Docker Compose stacks on auxserver-prod. Each stack is a full Puter deployment (desktop OS, API, file storage, optional local LLM).

FieldValue
Imageghcr.io/heyputer/puter:26.05.2 (pinned)
Instances4 (instance1instance4)
Live path~/puter/instanceN
Desktop URLhttps://puterN.cadenceworks.tech (N=1..4)
Local ports4101–4104 (nginx → Caddy)
TLSCaddy (/etc/caddy/Caddyfile)
Internal proxynginx per instance (HTTP only)

Full operator guide: [~/puter/README.md](file:///home/ty/puter/README.md)

Use the apex domain (puterN.cadenceworks.tech) for the OS desktop — not site.puterN.* (user static hosting).

Instance Matrix

InstanceCompose pathHost portApex domainOllama
1~/puter/instance1/4101puter1.cadenceworks.techenabled
2~/puter/instance2/4102puter2.cadenceworks.techenabled
3~/puter/instance3/4103puter3.cadenceworks.techdisabled
4~/puter/instance4/4104puter4.cadenceworks.techdisabled

Architecture

Browser → Caddy :443 → localhost:410N → nginx :80 → puter:4100
                                              └─ s3.* → rustfs :9000

Each instance stack: valkey, mariadb, dynamo, s3 (+ s3-init), puter, nginx. Ollama is optional (docker compose --profile ai up -d) on instances 1–2 only.

Docker Compose

Paths: ~/puter/instance1/docker-compose.ymlinstance4/docker-compose.yml

Fleet upgrade script: ~/puter/upgrade-instances.sh

bash
# Pin image across all instances (default tag: 26.05.2)
bash ~/puter/upgrade-instances.sh

# Override base directory or tag
PUTER_IMAGE_TAG=26.05.2 PUTER_BASE_DIR=~/puter bash ~/puter/upgrade-instances.sh

After any puter container recreate, restart nginx in that instance:

bash
cd ~/puter/instanceN && docker compose restart nginx

Environment Variables

Secrets are in instanceN/.env and instanceN/puter/config/config.json. Do not copy values into docs.

Variable / filePurpose
HTTP_PORTHost port for nginx (4101–4104)
MARIADB_*MariaDB credentials — must match config.jsondatabase
S3_*RustFS credentials — must match config.jsons3.s3Config
config.jsonDomains, JWT secrets, redis/dynamo/s3 endpoints, trust_proxy, subdomain_offset

Key Configuration

  • Image pin: 26.05.2 — avoid :main and 26.06.2
  • trust_proxy: 2 — Cloudflare + Caddy proxy chain
  • subdomain_offset: 3 — three-level domain (puterN.cadenceworks.tech)
  • Caddy sets X-Forwarded-Proto: https and X-Forwarded-Port: 443
  • Persistent data: ~/puter/instanceN/puter/data/ (mariadb, valkey, dynamo, s3, ollama)
  • TLS terminates at Caddy; compose nginx HTTPS is disabled

Subdomains (per instance N)

HostnamePurpose
puterN.cadenceworks.techDesktop OS (apex)
api.puterN.cadenceworks.techREST / WebSocket API
site.puterN.cadenceworks.techUser static hosting
host.puterN.cadenceworks.techAlt static hosting
app.puterN.cadenceworks.techPrivate app hosting
dev.puterN.cadenceworks.techAlt private app hosting
s3.puterN.cadenceworks.techBrowser-facing S3 (presigned URLs)

Verification

bash
curl -sI http://127.0.0.1:410N/
# or via Hermes
ssh aux 'bash scripts/puter-verify.sh'

Northeast Systems · Aux Server · Infra Server