Compare commits
merge into: novox/mesh-catalog:main
novox/mesh-catalog:main
novox/mesh-catalog:fix/resolver-passes-the-dnssec-bit
novox/mesh-catalog:fix/mailu-admin-asks-the-machines-resolver
novox/mesh-catalog:fix/postgres-is-not-named-after-the-seat
novox/mesh-catalog:fix/110-the-resolver-answers-a-container
novox/mesh-catalog:feat/qbittorrent-for-ace
novox/mesh-catalog:feat/servarr-api-provision
novox/mesh-catalog:feat/home-assistant-for-ace
novox/mesh-catalog:feat/tautulli-for-ace
novox/mesh-catalog:feat/bookshelf-for-ace
novox/mesh-catalog:feat/lidarr-for-ace
novox/mesh-catalog:feat/radarr-for-ace
novox/mesh-catalog:feat/sonarr-for-ace
novox/mesh-catalog:feat/jackett-for-ace
novox/mesh-catalog:feat/oidc-client-provision
novox/mesh-catalog:feat/mosquitto-placed
novox/mesh-catalog:feat/nodered-for-ace
novox/mesh-catalog:feat/influxdb-for-ace
novox/mesh-catalog:feat/kometa-for-ace
novox/mesh-catalog:feat/plex-for-ace
novox/mesh-catalog:fix/manifests-publish-software-ports
novox/mesh-catalog:feat/n8n-for-ace
novox/mesh-catalog:feat/baserow-for-ace
novox/mesh-catalog:feat/supabase-for-ace
novox/mesh-catalog:feat/nzbget-for-ace
novox/mesh-catalog:feat/matrix-for-ace
novox/mesh-catalog:feat/bazarr-for-ace
novox/mesh-catalog:feat/redis-for-ace
novox/mesh-catalog:fix/sidecars-dial-the-port-they-were-given
novox/mesh-catalog:feat/grafana-for-ace
novox/mesh-catalog:feat/unifi-for-ace
novox/mesh-catalog:feat/icecast-for-ace
novox/mesh-catalog:feat/ombi-for-ace
novox/mesh-catalog:chore/remove-the-network-checker-module
novox/mesh-catalog:feat/a-network-checker-module
novox/mesh-catalog:feat/modules-name-their-endpoints
novox/mesh-catalog:fix/a-routed-module-listens-from-the-mesh
novox/mesh-catalog:fix/the-resolver-declares-both-protocols
novox/mesh-catalog:fix/sshd-declares-the-daemon-it-owns
novox/mesh-catalog:fix/fail2ban-bans-through-what-every-machine-has
novox/mesh-catalog:fix/fail2ban-declares-the-log-its-own-jail-reads
novox/mesh-catalog:fix/fail2ban-restarts-on-its-log-target
novox/mesh-catalog:fix/fail2ban-declares-where-it-logs
novox/mesh-catalog:feat/the-catalogue-hears-what-it-missed
novox/mesh-catalog:feat/the-catalogue-prepares-its-own-schema
novox/mesh-catalog:fix/the-catalogue-declares-the-event-it-emits
novox/mesh-catalog:feat/a-merge-rebuilds-what-it-changed
novox/mesh-catalog:fix/a-merge-older-than-the-watching-is-history
novox/mesh-catalog:fix/a-merge-announced-is-said
novox/mesh-catalog:fix/the-forge-watches-every-repository
novox/mesh-catalog:feat/the-forge-announces-every-merge
novox/mesh-catalog:feat/nats-serves-the-meshs-certificate
novox/mesh-catalog:fix/nats-declares-its-base
novox/mesh-catalog:feat/amqp-leaves-the-catalogue
novox/mesh-catalog:restore/broker-claim
novox/mesh-catalog:revert/broker-seat-claim
novox/mesh-catalog:fix/broker-seat-must-stay-held
novox/mesh-catalog:fix/go-126-base
novox/mesh-catalog:feat/nats-genesis
novox/mesh-catalog:feat/ssh-client-module
...
pull from: novox/mesh-catalog:feat/supabase-for-ace
novox/mesh-catalog:main
novox/mesh-catalog:fix/resolver-passes-the-dnssec-bit
novox/mesh-catalog:fix/mailu-admin-asks-the-machines-resolver
novox/mesh-catalog:fix/postgres-is-not-named-after-the-seat
novox/mesh-catalog:fix/110-the-resolver-answers-a-container
novox/mesh-catalog:feat/qbittorrent-for-ace
novox/mesh-catalog:feat/servarr-api-provision
novox/mesh-catalog:feat/home-assistant-for-ace
novox/mesh-catalog:feat/tautulli-for-ace
novox/mesh-catalog:feat/bookshelf-for-ace
novox/mesh-catalog:feat/lidarr-for-ace
novox/mesh-catalog:feat/radarr-for-ace
novox/mesh-catalog:feat/sonarr-for-ace
novox/mesh-catalog:feat/jackett-for-ace
novox/mesh-catalog:feat/oidc-client-provision
novox/mesh-catalog:feat/mosquitto-placed
novox/mesh-catalog:feat/nodered-for-ace
novox/mesh-catalog:feat/influxdb-for-ace
novox/mesh-catalog:feat/kometa-for-ace
novox/mesh-catalog:feat/plex-for-ace
novox/mesh-catalog:fix/manifests-publish-software-ports
novox/mesh-catalog:feat/n8n-for-ace
novox/mesh-catalog:feat/baserow-for-ace
novox/mesh-catalog:feat/supabase-for-ace
novox/mesh-catalog:feat/nzbget-for-ace
novox/mesh-catalog:feat/matrix-for-ace
novox/mesh-catalog:feat/bazarr-for-ace
novox/mesh-catalog:feat/redis-for-ace
novox/mesh-catalog:fix/sidecars-dial-the-port-they-were-given
novox/mesh-catalog:feat/grafana-for-ace
novox/mesh-catalog:feat/unifi-for-ace
novox/mesh-catalog:feat/icecast-for-ace
novox/mesh-catalog:feat/ombi-for-ace
novox/mesh-catalog:chore/remove-the-network-checker-module
novox/mesh-catalog:feat/a-network-checker-module
novox/mesh-catalog:feat/modules-name-their-endpoints
novox/mesh-catalog:fix/a-routed-module-listens-from-the-mesh
novox/mesh-catalog:fix/the-resolver-declares-both-protocols
novox/mesh-catalog:fix/sshd-declares-the-daemon-it-owns
novox/mesh-catalog:fix/fail2ban-bans-through-what-every-machine-has
novox/mesh-catalog:fix/fail2ban-declares-the-log-its-own-jail-reads
novox/mesh-catalog:fix/fail2ban-restarts-on-its-log-target
novox/mesh-catalog:fix/fail2ban-declares-where-it-logs
novox/mesh-catalog:feat/the-catalogue-hears-what-it-missed
novox/mesh-catalog:feat/the-catalogue-prepares-its-own-schema
novox/mesh-catalog:fix/the-catalogue-declares-the-event-it-emits
novox/mesh-catalog:feat/a-merge-rebuilds-what-it-changed
novox/mesh-catalog:fix/a-merge-older-than-the-watching-is-history
novox/mesh-catalog:fix/a-merge-announced-is-said
novox/mesh-catalog:fix/the-forge-watches-every-repository
novox/mesh-catalog:feat/the-forge-announces-every-merge
novox/mesh-catalog:feat/nats-serves-the-meshs-certificate
novox/mesh-catalog:fix/nats-declares-its-base
novox/mesh-catalog:feat/amqp-leaves-the-catalogue
novox/mesh-catalog:restore/broker-claim
novox/mesh-catalog:revert/broker-seat-claim
novox/mesh-catalog:fix/broker-seat-must-stay-held
novox/mesh-catalog:fix/go-126-base
novox/mesh-catalog:feat/nats-genesis
novox/mesh-catalog:feat/ssh-client-module
1
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
62cecc8a2b |
supabase: the self-hosted stack as one module, its secrets rendered into files
ace runs Supabase under HAL as upstream's 13-container compose: a 2.2 GB database (1.8 GB of it the dormant `novox` schema, 5.8 M rows in its largest table), Kong at supabase.zurag.be, the pooler on 5433/6543. This is that stack as a catalogue module, same images (the digests ace runs), same container names so an assignment holds the running ones and a take replaces them. The database stays inside the module. Supabase is a Postgres distribution: its own image with pgsodium, pg_graphql, pg_net, vault and timescale preloaded, a superuser (supabase_admin), a dozen reserved roles and a second database (_supabase). A postgres-database grant - one database, one unprivileged role - cannot hold it, so ace's data directory moves as a copy, not a dump/restore. What HAL did by shell and environment the mesh now renders as files: - kong.yml carries the anon/service keys and the dashboard login (owned by kong's uid 100), instead of an entrypoint that eval'd the environment; - GoTrue reads a dotenv file (auth -c), PostgREST a config file, Vector its yml with the Logflare key in it, the database POSTGRES_PASSWORD_FILE and a jwt.sql rendered with the secret (owned by postgres, uid 105). None of these five containers has a secret in its environment. - realtime, storage, meta, functions, analytics, studio and supavisor read their credentials from the environment only; each declares secrets-in-environment with the reason (ADR 0086). - Upstreams are container names (supabase-db, supabase-kong, ...) instead of compose service names, which the mesh does not have. - SITE_URL / API_EXTERNAL_URL / SUPABASE_PUBLIC_URL are https://${bound:route:name} (mesh-controller #149); on ace HAL rendered them as "https://supabase." - broken today. - Vector reads the docker socket, as upstream does, but now includes only this module's containers instead of every container's logs on the machine. Three things compose did that a declaration cannot, done as steps: a run-once seed copies the image's /etc/postgresql-custom into the placed config directory with cp -n (a named volume did that implicitly; never overwrites the pgsodium root key), and two run-once gates wait for the database and for Logflare, which compose expressed as depends_on: service_healthy. The pooler bootstrap (pooler.exs) takes the tenant id and pool sizes from settings.json, the module's one merge:json file, so ace keeps its tenant "zurag"; and it repoints an existing tenant whose database host is not supabase-db - HAL created ace's with host "db", which no longer resolves. Secrets (vault, requires "secret"): postgres, jwt, anon-key, service-role-key, dashboard-user, dashboard, logflare, pooler-vault, key-base-a + key-base-b (concatenated: Phoenix wants 64+ bytes, a minted secret is 40), openai. Three cannot be minted on any machine: anon-key and service-role-key are JWTs signed with jwt, and pooler-vault must be exactly 32 bytes (AES-256-GCM, found in the bed). They are accepted. On ace every secret the data already knows is accepted (all but key-base-a/b). Not carried: Kong's 8443 and Logflare's 4000 on all interfaces (nothing outside the module uses them); realtime's DB_ENC_KEY stays upstream's constant (realtime deletes and re-seeds that tenant from its environment every start, and the key must be exactly 16 bytes). Verified: catalogue tests with MESH_CATALOGUE pointed here on mesh-controller main and #149 (on main the render is refused for "name", never written empty). The #149 resolution with stub providers, turned into a throwaway stack of all 13 pinned digests with dummy secrets and the rendered files at their owners and modes: the database initialised through the rendered scripts (jwt setting applied, _analytics/_supavisor created, roles' password from POSTGRES_PASSWORD_FILE); through Kong: REST 200 with the anon key and 401 without, auth health and settings 200, storage buckets 200, GraphQL 200, pg-meta 200, an edge function 200, Studio 401 without and 200 with the dashboard login, realtime tenant health 200; the pooler in session and transaction mode as postgres.zurag; a tenant set to host "db" was repointed to supabase-db by the bootstrap and connections worked. |
1 changed files with 538 additions and 0 deletions
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user
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.