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

+8
View File
@@ -0,0 +1,8 @@
BASE_URL=CHANGE_ME
SECRET_KEY_BASE=CHANGE_ME
HTTP_PORT=CHANGE_ME
HTTPS_PORT=CHANGE_ME
SMTP_USER_NAME=CHANGE_ME
SMTP_USER_PWD=CHANGE_ME
POSTGRES_PASSWORD=CHANGE_ME
TOTP_VAULT_KEY=CHANGE_ME
+6
View File
@@ -0,0 +1,6 @@
checkout: ~/Server/Plausible/
repo: https://github.com/plausible/community-edition
ref: tag v3.0.1
commit: 20385b05aa8e5645c88fc1a526360608e0fba324
compose.yml here is the local, modified copy of the upstream file.
+131
View File
@@ -0,0 +1,131 @@
networks:
nginx-bridge:
external: true
services:
plausible_db:
image: postgres:16-alpine
container_name: plausible_db
hostname: plausible_db
networks: [nginx-bridge]
labels:
com.centurylinklabs.watchtower.enable: "true"
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
start_period: 1m
restart: always
tty: true
plausible_events_db:
image: clickhouse/clickhouse-server:24.12-alpine
container_name: plausible_events_db
hostname: plausible_events_db
networks: [nginx-bridge]
labels:
com.centurylinklabs.watchtower.enable: "true"
volumes:
- event-data:/var/lib/clickhouse
- event-logs:/var/log/clickhouse-server
- ./clickhouse/logs.xml:/etc/clickhouse-server/config.d/logs.xml:ro
# This makes ClickHouse bind to IPv4 only, since Docker doesn't enable IPv6 in bridge networks by default.
# Fixes "Listen [::]:9000 failed: Address family for hostname not supported" warnings.
- ./clickhouse/ipv4-only.xml:/etc/clickhouse-server/config.d/ipv4-only.xml:ro
# This makes ClickHouse consume less resources, which is useful for small setups.
# https://clickhouse.com/docs/en/operations/tips#using-less-than-16gb-of-ram
#- ./clickhouse/low-resources.xml:/etc/clickhouse-server/config.d/low-resources.xml:ro
ulimits:
nofile:
soft: 262144
hard: 262144
environment:
- CLICKHOUSE_SKIP_USER_SETUP=1
healthcheck:
test:
[
"CMD-SHELL",
"wget --no-verbose --tries=1 -O - http://127.0.0.1:8123/ping || exit 1",
]
start_period: 1m
restart: always
tty: true
plausible:
image: ghcr.io/plausible/community-edition:v3.2.1
container_name: plausible
hostname: plausible
networks: [nginx-bridge]
#ports:
#- ${HTTP_PORT}:8000
#- ${HTTPS_PORT}:443
command: sh -c "/entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
depends_on:
plausible_db:
condition: service_healthy
plausible_events_db:
condition: service_healthy
labels:
com.centurylinklabs.watchtower.enable: "true"
volumes:
- plausible-data:/var/lib/plausible
ulimits:
nofile:
soft: 65535
hard: 65535
extra_hosts:
# Pin the relay to the WireGuard address. Docker containers do NOT read the host
# /etc/hosts, and the public *.gbrown.org wildcard still returns Cloudflare AAAA
# records alongside the UniFi A record -- so without this, delivery depends on
# resolver address-ordering. The name (not the IP) is used so the wildcard cert
# still validates by hostname.
- "smtp.usesend.gbrown.org:192.168.2.2"
environment:
- TMPDIR=/var/lib/plausible/tmp
# required: https://github.com/plausible/community-edition/wiki/configuration#required
- BASE_URL=${BASE_URL}
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
# optional: https://github.com/plausible/community-edition/wiki/configuration#optional
# registration: https://github.com/plausible/community-edition/wiki/configuration#registration
- TOTP_VAULT_KEY=${TOTP_VAULT_KEY}
- DISABLE_REGISTRATION=invite_only
- ENABLE_EMAIL_VERIFICATION=true
# web: https://github.com/plausible/community-edition/wiki/configuration#web
- HTTP_PORT=${HTTP_PORT}
- HTTPS_PORT=${HTTPS_PORT}
# databases: https://github.com/plausible/community-edition/wiki/configuration#database
- DATABASE_URL
- CLICKHOUSE_DATABASE_URL
# Google: https://github.com/plausible/community-edition/wiki/configuration#google
- GOOGLE_CLIENT_ID
- GOOGLE_CLIENT_SECRET
# geolocation: https://github.com/plausible/community-edition/wiki/configuration#ip-geolocation
- IP_GEOLOCATION_DB
- GEONAMES_SOURCE_FILE
- MAXMIND_LICENSE_KEY
- MAXMIND_EDITION
# email: https://github.com/plausible/community-edition/wiki/configuration#email
- MAILER_ADAPTER
- [email protected]
- MAILER_NAME=Gib's Plausible Analytics
- SMTP_HOST_ADDR=smtp.usesend.gbrown.org
- SMTP_HOST_PORT=587
- SMTP_USER_NAME=${SMTP_USER_NAME}
- SMTP_USER_PWD=${SMTP_USER_PWD}
- SMTP_HOST_SSL_ENABLED=false
- POSTMARK_API_KEY
- MAILGUN_API_KEY
- MAILGUN_DOMAIN
- MAILGUN_BASE_URI
- MANDRILL_API_KEY
- SENDGRID_API_KEY
restart: always
tty: true
volumes:
db-data:
event-data:
event-logs:
plausible-data:
@@ -0,0 +1,18 @@
[Unit]
Description=Podman Compose: Plausible
After=network-online.target podman.socket
Wants=network-online.target
[Service]
Type=oneshot
WorkingDirectory=%h/Server/Plausible
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