Snapshot both servers: the VPS catalog moves to server/vps, the home server joins as server/home

The catalog in server/containers had drifted from the VPS. Eleven compose
files and twelve units no longer matched what runs, and two running
services, Gbrown_Agent and BillTracker, were missing. server/vps is now a
copy of the live files, and panama-server reads from it.

server/home holds the home server's services in the same shape. They still
run under Docker, so the podman units there are drafts for a later move, and
nothing installs from that tree. PostHog, Sentry and Plausible are checkouts
of upstream repositories. Only their local files are kept, next to an
UPSTREAM file naming the repository and the exact commit.

Every secret in both trees is a ${VAR} reference named in .env.example, or
CHANGE_ME in files that are not compose files. The live servers still hold
some of those values inline, so a live file can differ from its copy on
those lines alone. Existing .env.example files keep their comments, with new
keys appended at the end.

The ignore rules and the secrets contract now cover both trees, plus the
volume/ and volumes/ directories the home server uses.
This commit is contained in:
Gabriel Brown committed 2026-10-06 10:52:47 -04:00
1 parent a664cf68f5
commit 913a57f8a6
146 files changed
+5258 -354

No files matched your search

+99
View File
@@ -0,0 +1,99 @@
services:
web: &id001
restart: unless-stopped
environment:
TRUST_ALL_PROXIES: 'true'
MULTI_ORG_ENABLED: 'true'
# SSO: the "GitLab" login button is really Authentik. NPM on the VPS maps GitLab's
# /oauth/* and /api/v4/user paths on auth.gbrown.org to Authentik, the same shim
# Infisical uses. GitLab login needs no license here; only Google is gated.
SOCIAL_AUTH_GITLAB_API_URL: https://auth.gbrown.org
SOCIAL_AUTH_GITLAB_KEY: ${POSTHOG_GITLAB_LOGIN_KEY:?set POSTHOG_GITLAB_LOGIN_KEY in .env}
SOCIAL_AUTH_GITLAB_SECRET: ${POSTHOG_GITLAB_LOGIN_SECRET:?set POSTHOG_GITLAB_LOGIN_SECRET in .env}
PERSONHOG_ADDR: personhog-router:50052
PERSISTED_FEATURE_FLAGS: sql-editor-vim-mode,cdp-hog-sources,customer-analytics-roadmap,marketing-analytics,web-experiments,dashboard-widgets,twig,tracing,metrics
EMAIL_ENABLED: 'true'
EMAIL_HOST: smtp.usesend.gbrown.org
EMAIL_PORT: '587'
EMAIL_HOST_USER: usesend
EMAIL_HOST_PASSWORD: ${USESEND_API_KEY:?set USESEND_API_KEY in .env}
EMAIL_USE_TLS: 'true'
EMAIL_USE_SSL: 'false'
EMAIL_DEFAULT_FROM: PostHog <[email protected]>
EMAIL_REPLY_TO: [email protected]
worker:
<<: *id001
# compose/worker applies compose/local-patches.py, then runs upstream's
# command. `command` is replaced on merge (not appended), so it is safe here.
command: /compose/worker
volumes:
- ./compose:/compose
temporal-django-worker: *id001
# Every long-running service restarts regardless of exit code. Upstream ships
# `on-failure` (or `no`), which never retries a clean exit, and these services
# exit 0 on purpose: capture shuts down gracefully when it loses Kafka
# (2026-09-27, down 3 days), hypercache-server exits 0 when it beats redis7 at
# boot. web/worker/temporal-django-worker get this via the anchor above.
# kafka-init and asyncmigrationscheck are one-shots and must stay `no`.
browserless:
restart: unless-stopped
capture:
restart: unless-stopped
capture-logs:
restart: unless-stopped
clickhouse:
restart: unless-stopped
cymbal:
restart: unless-stopped
cymbal-resolution:
restart: unless-stopped
db:
restart: unless-stopped
elasticsearch:
restart: unless-stopped
feature-flags:
restart: unless-stopped
hypercache-server:
restart: unless-stopped
ingestion-error-tracking:
restart: unless-stopped
ingestion-general:
restart: unless-stopped
ingestion-logs:
restart: unless-stopped
ingestion-sessionreplay:
restart: unless-stopped
ingestion-traces:
restart: unless-stopped
kafka:
restart: unless-stopped
livestream:
restart: unless-stopped
objectstorage:
restart: unless-stopped
personhog-replica:
restart: unless-stopped
personhog-router:
restart: unless-stopped
plugins:
restart: unless-stopped
property-defs-rs:
restart: unless-stopped
recording-api:
restart: unless-stopped
redis7:
restart: unless-stopped
replay-capture:
restart: unless-stopped
seaweedfs:
restart: unless-stopped
temporal:
restart: unless-stopped
temporal-admin-tools:
restart: unless-stopped
temporal-ui:
restart: unless-stopped
valkey:
restart: unless-stopped
zookeeper:
restart: unless-stopped