Commit Graph
10 Commits
Author SHA1 Message Date
Admin 22213a5592 Harden the edge: catch-all server, modern TLS and HSTS
- Unknown hostnames and direct IP access no longer land on the first
  vhost (Gitea): port 80 closes the connection, except for ACME
  challenges, and port 443 refuses the handshake.
- Mozilla intermediate ciphers (forward secrecy only, no CBC), session
  cache, no session tickets, and HSTS with a short max-age for now.
- Set X-Forwarded-For to the client address instead of appending to
  whatever the client sent.
2026-09-24 15:05:44 +02:00
Admin 3e1ee28125 Keep RabbitMQ data on recreate and proxy to unique container names
RabbitMQ stores its data under rabbit@<hostname>, and the hostname
changed with every recreated container, so an image update or an .env
change came up with an empty broker. Pin it to `rabbitmq` and document
how to carry the definitions over on an existing deployment.

Every project shares infra-net, where a generic service name like `api`
resolves to every container that has it, round-robin, across projects.
The edge now proxies to container names (musify-api, infra-zitadel, ...).
2026-09-24 15:05:43 +02:00
Admin 6dcbd9589a Serve the Zitadel login from the Login V2 container
Zitadel v4 redirects every sign-in to /ui/v2/login, which is served by a
separate container (zitadel-login) that this stack didn't run, so logging
in on a fresh instance ended in a 404.

- Add zitadel-login, with its own service account (login-client) whose
  PAT Zitadel writes to a volume only that container mounts.
- Configure the Login V2 base URL (ZITADEL_LOGIN_BASE_URL): its own port
  in dev, same hostname as Zitadel behind the edge in prod.
- Pin zitadel and zitadel-login to v4.19.1 and add healthchecks.
- Run Zitadel as root, as Zitadel's own compose does, so it can write the
  PATs into root-owned mounts (the Linux bind mount and the new volume).
- Route /ui/v2/login on the auth vhost to the login container and drop
  the no-op grpc_set_header.
- Document the extra steps for an instance created before this.
2026-09-24 15:05:42 +02:00
Admin 7d1a3e75d8 Raise musify proxy buffers for the OIDC session cookies
The OIDC callback answers with the session cookies (encrypted tokens),
which don't fit nginx's default 4k response-header buffer.
2026-09-24 15:05:41 +02:00
Admin 78a6688711 Name the first Zitadel org and admin through env vars
Add ZITADEL_ORG_NAME and ZITADEL_ADMIN_{FIRST,LAST,DISPLAY}_NAME (defaults
keep the previous ZITADEL naming for dev); the prod example uses
Iker Demo / admin@ikerdemo.cat.
2026-09-23 18:17:41 +02:00
Admin b97dacba94 Run Zitadel with tlsMode external behind the edge
With tlsMode disabled Zitadel advertises http URLs, so the console calls
http://<domain> and the CSP blocks it. Make it configurable through
ZITADEL_TLS_MODE (default disabled for dev, external in prod).
2026-09-23 18:03:49 +02:00
Admin 24f801cf2f Add shared public edge (nginx + certbot)
One nginx owns host ports 80/443 for every project (Gitea, Musify) and
proxies by container name over infra-net and gitea_gitea; a certbot
service renews the Let's Encrypt certificates.
2026-09-23 16:56:28 +02:00
Admin deefb6d0cd Rewrite docs to not assume a local folder layout
The README previously described this stack as shared by "every project
under Documentos/", which is just this machine's local checkout location,
not something the repo itself should assume. Every project lives in its
own git repository; the path to this repo's checkout is a per-project
setting (ZITADEL_ADMIN_PAT_DIR), not a fixed convention.

Also drops leftover em dashes across the docs and compose comments for
plainer prose.
2026-09-21 21:45:02 +02:00
Admin 58f3c5925b Add README
Explains what lives here vs. in each project, how dev and production
connect to it, and the shared-secret/PAT conventions consuming projects
follow.
2026-09-21 21:11:56 +02:00
Admin c35881f471 Add shared infrastructure base stack
Postgres, Zitadel and SeaweedFS were previously duplicated or fragilely
cross-referenced across the Musify, Ping and docker-manager repos. This
consolidates them into one place: compose.yml is the production shape
(no published ports, joins infra-net), compose.dev.yml is a thin overlay
that publishes ports for local development.
2026-09-21 21:11:26 +02:00