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

+14
View File
@@ -0,0 +1,14 @@
INSTANCE_NAME=CHANGE_ME
INSTANCE_SECRET=CHANGE_ME
POSTGRES_URL=CHANGE_ME
CONVEX_CLOUD_ORIGIN=CHANGE_ME
CONVEX_SITE_ORIGIN=CHANGE_ME
DISABLE_BEACON=CHANGE_ME
REDACT_LOGS_TO_CLIENT=CHANGE_ME
DO_NOT_REQUIRE_SSL=CHANGE_ME
MCP_SECRET=CHANGE_ME
CONVEX_BACKEND_IMAGE=CHANGE_ME
CONVEX_DASHBOARD_IMAGE=CHANGE_ME
MCP_PUBLIC_URL=CHANGE_ME
NEXT_PUBLIC_CONVEX_URL=CHANGE_ME
NEXT_PUBLIC_SITE_URL=CHANGE_ME
+69
View File
@@ -0,0 +1,69 @@
name: bill-tracker
networks:
nginx-bridge:
external: true
services:
bill-tracker-next:
image: git.gbrown.org/gib/bill-tracker-next:latest
container_name: bill-tracker-next
hostname: bill-tracker-next
domainname: billtracker.gbrown.org
networks: [nginx-bridge]
environment:
NODE_ENV: production
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-https://billtracker.gbrown.org}
NEXT_PUBLIC_CONVEX_URL: ${NEXT_PUBLIC_CONVEX_URL:-https://api.billtracker.gbrown.org}
restart: unless-stopped
bill-tracker-mcp:
image: git.gbrown.org/gib/bill-tracker-mcp:latest
container_name: bill-tracker-mcp
hostname: bill-tracker-mcp
domainname: mcp.billtracker.gbrown.org
networks: [nginx-bridge]
volumes: [./data/mcp:/data:Z]
environment:
NODE_ENV: production
MCP_PUBLIC_URL: ${MCP_PUBLIC_URL:-https://mcp.billtracker.gbrown.org}
MCP_SECRET: ${MCP_SECRET:?Set MCP_SECRET in the VPS .env}
BILL_TRACKER_CONVEX_URL: ${NEXT_PUBLIC_CONVEX_URL:-https://api.billtracker.gbrown.org}
restart: unless-stopped
bill-tracker-backend:
image: ${CONVEX_BACKEND_IMAGE:-ghcr.io/get-convex/convex-backend@sha256:1f2044e3eac463ac78973b136c0baf72d4ada602611d853d6f99f280e29e0a98}
container_name: bill-tracker-backend
hostname: bill-tracker-backend
domainname: api.billtracker.gbrown.org
networks: [nginx-bridge]
volumes: [./data/convex:/convex/data:Z]
environment:
INSTANCE_NAME: ${INSTANCE_NAME:-bill_tracker}
INSTANCE_SECRET: ${INSTANCE_SECRET:?Set INSTANCE_SECRET in the VPS .env}
POSTGRES_URL: ${POSTGRES_URL:?Set POSTGRES_URL in the VPS .env}
CONVEX_CLOUD_ORIGIN: https://api.billtracker.gbrown.org
CONVEX_SITE_ORIGIN: https://convex.billtracker.gbrown.org
DISABLE_BEACON: 'true'
REDACT_LOGS_TO_CLIENT: 'true'
DO_NOT_REQUIRE_SSL: 'true'
restart: unless-stopped
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3210/version']
interval: 5s
start_period: 10s
stop_grace_period: 10s
stop_signal: SIGINT
bill-tracker-dashboard:
image: ${CONVEX_DASHBOARD_IMAGE:-ghcr.io/get-convex/convex-dashboard@sha256:284a2638e0c1a4ec0c2327d8219776f3a426ca5824b81686ae4d9454dc0ce8ed}
container_name: bill-tracker-dashboard
hostname: bill-tracker-dashboard
domainname: dashboard.billtracker.gbrown.org
networks: [nginx-bridge]
environment:
NEXT_PUBLIC_DEPLOYMENT_URL: https://api.billtracker.gbrown.org
depends_on:
bill-tracker-backend:
condition: service_healthy
restart: unless-stopped
@@ -0,0 +1,21 @@
[Unit]
Description=Podman Compose: Bill Tracker
RequiresMountsFor=/home/gib/Media
After=network-online.target podman.socket podman-postgresql.service
Wants=network-online.target podman-postgresql.service
StartLimitIntervalSec=300
StartLimitBurst=3
[Service]
Type=oneshot
WorkingDirectory=%h/Server/BillTracker
ExecStart=/usr/bin/podman compose up -d
ExecStop=/usr/bin/podman compose down
RemainAfterExit=yes
TimeoutStartSec=900
TimeoutStopSec=90
Restart=on-failure
RestartSec=30
[Install]
WantedBy=default.target