Adds deploy/portainer/federated-test.stack.yml: a Docker Swarm-compatible Compose file (version 3.9) for Portainer that boots a federated-tier Mosaic gateway alongside Postgres 17 (pgvector) and Valkey 8.
Gateway image is digest-pinned to fed-v0.1.0-m1 (sha256:9b72e202a...) per the immutable-image policy verified in DEPLOY-01.
Traefik HTTPS labels parameterised via STACK_NAME and HOST_FQDN so the same template deploys both mos-test-1.woltje.com (DEPLOY-03) and mos-test-2.woltje.com (DEPLOY-04).
Adds deploy/portainer/README.md with deployment instructions, required env vars table, external resource prerequisites, and per-instance mapping.
## Summary
- Adds `deploy/portainer/federated-test.stack.yml`: a Docker Swarm-compatible Compose file (version 3.9) for Portainer that boots a federated-tier Mosaic gateway alongside Postgres 17 (pgvector) and Valkey 8.
- Gateway image is digest-pinned to `fed-v0.1.0-m1` (`sha256:9b72e202a...`) per the immutable-image policy verified in DEPLOY-01.
- Traefik HTTPS labels parameterised via `STACK_NAME` and `HOST_FQDN` so the same template deploys both `mos-test-1.woltje.com` (DEPLOY-03) and `mos-test-2.woltje.com` (DEPLOY-04).
- Adds `deploy/portainer/README.md` with deployment instructions, required env vars table, external resource prerequisites, and per-instance mapping.
## Changes
- `deploy/portainer/federated-test.stack.yml` — Swarm stack template (new)
- `deploy/portainer/README.md` — operator guide (new)
## Required env vars per stack
| Variable | Description |
|---|---|
| `STACK_NAME` | Unique Traefik router/service name (e.g. `mos-test-1`) |
| `HOST_FQDN` | FQDN to serve (e.g. `mos-test-1.woltje.com`) |
| `POSTGRES_PASSWORD` | Database password — set per stack in Portainer |
| `BETTER_AUTH_SECRET` | 32-char random string for BetterAuth |
| `BETTER_AUTH_URL` | Public gateway base URL |
## Notes
- No Step-CA or federation grant config — those are M2-02/M2-04+ scope.
- This template boots a vanilla M1-baseline gateway in federated tier.
- `traefik-public` overlay network and `letsencrypt` cert resolver must exist on the Swarm before deploying.
## Test plan
- [ ] Deploy to `mos-test-1.woltje.com` via Portainer (DEPLOY-03)
- [ ] Deploy to `mos-test-2.woltje.com` via Portainer (DEPLOY-04)
- [ ] Confirm `GET /health` returns 200 on both instances
- [ ] Confirm Traefik routes HTTPS traffic correctly with valid TLS cert
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
deploy/portainer/federated-test.stack.yml: a Docker Swarm-compatible Compose file (version 3.9) for Portainer that boots a federated-tier Mosaic gateway alongside Postgres 17 (pgvector) and Valkey 8.fed-v0.1.0-m1(sha256:9b72e202a...) per the immutable-image policy verified in DEPLOY-01.STACK_NAMEandHOST_FQDNso the same template deploys bothmos-test-1.woltje.com(DEPLOY-03) andmos-test-2.woltje.com(DEPLOY-04).deploy/portainer/README.mdwith deployment instructions, required env vars table, external resource prerequisites, and per-instance mapping.Changes
deploy/portainer/federated-test.stack.yml— Swarm stack template (new)deploy/portainer/README.md— operator guide (new)Required env vars per stack
STACK_NAMEmos-test-1)HOST_FQDNmos-test-1.woltje.com)POSTGRES_PASSWORDBETTER_AUTH_SECRETBETTER_AUTH_URLNotes
traefik-publicoverlay network andletsencryptcert resolver must exist on the Swarm before deploying.Test plan
mos-test-1.woltje.comvia Portainer (DEPLOY-03)mos-test-2.woltje.comvia Portainer (DEPLOY-04)GET /healthreturns 200 on both instances🤖 Generated with Claude Code
560e33e313toc7d0663de6