## Summary - Add `authentik` database (blumeops-pg cluster) to borgmatic pg_dump backups - Add `immich` database (immich-pg cluster) to borgmatic pg_dump backups - For immich-pg: new borgmatic managed role with `pg_read_all_data`, ExternalSecret, Tailscale LoadBalancer service, and Caddy L4 TCP proxy on port 5433 - Update backup docs to reflect all four CNPG databases + mealie SQLite ## Deploy plan Deploy order matters — k8s resources must exist before ansible can route to them: 1. **ArgoCD (databases app):** sync to pick up immich-pg borgmatic role, ExternalSecret, and Tailscale service ``` argocd app set blumeops-pg --revision feature/borgmatic-all-pg-backups argocd app sync blumeops-pg ``` 2. **Wait** for `immich-pg-tailscale` service to get a Tailscale IP and `immich-pg.tail8d86e.ts.net` to resolve 3. **Ansible (caddy):** deploy Caddy L4 route for port 5433 ``` mise run provision-indri -- --tags caddy ``` 4. **Ansible (borgmatic):** deploy updated config and .pgpass ``` mise run provision-indri -- --tags borgmatic ``` 5. **Verify:** trigger a manual borgmatic run and check all four pg_dump streams succeed ``` borgmatic --verbosity 1 2>&1 | grep -E '(Dumping|ERROR)' ``` ## Test plan - [x] `kubectl kustomize` builds cleanly - [x] `ansible --check --diff` for borgmatic and caddy show expected changes - [ ] ArgoCD sync succeeds for databases app - [ ] `immich-pg.tail8d86e.ts.net` resolves - [ ] `pg.ops.eblu.me:5433` accepts connections - [ ] `borgmatic --verbosity 1` dumps all four databases without errors Reviewed-on: #314
110 lines
3.7 KiB
YAML
110 lines
3.7 KiB
YAML
---
|
|
# Caddy reverse proxy configuration
|
|
# Caddy is built from ~/code/3rd/caddy with Gandi DNS and Layer 4 plugins
|
|
|
|
caddy_repo_dir: /Users/erichblume/code/3rd/caddy
|
|
caddy_binary: "{{ caddy_repo_dir }}/bin/caddy"
|
|
caddy_config_dir: /Users/erichblume/.config/caddy
|
|
caddy_data_dir: /Users/erichblume/.local/share/caddy
|
|
caddy_log_dir: /Users/erichblume/Library/Logs
|
|
|
|
# Gandi API token file (written by ansible, chmod 0600)
|
|
# Caddy reads this file for ACME DNS-01 challenges
|
|
caddy_gandi_token_file: /Users/erichblume/.config/caddy/gandi-token
|
|
|
|
# Domain configuration
|
|
caddy_domain: ops.eblu.me
|
|
|
|
# HTTPS port (443 is standard)
|
|
caddy_https_port: 443
|
|
|
|
# Services to proxy
|
|
# Format: { name: "service", host: "hostname", backend: "url" }
|
|
caddy_services:
|
|
# Indri-local services
|
|
- name: forge
|
|
host: "forge.{{ caddy_domain }}"
|
|
backend: "http://localhost:3001"
|
|
- name: registry
|
|
host: "registry.{{ caddy_domain }}"
|
|
backend: "http://localhost:5050"
|
|
- name: jellyfin
|
|
host: "jellyfin.{{ caddy_domain }}"
|
|
backend: "http://localhost:8096"
|
|
|
|
# K8s services (via Tailscale Ingress)
|
|
# Caddy proxies to existing Tailscale endpoints - traffic stays local
|
|
- name: grafana
|
|
host: "grafana.{{ caddy_domain }}"
|
|
backend: "https://grafana.tail8d86e.ts.net"
|
|
- name: argocd
|
|
host: "argocd.{{ caddy_domain }}"
|
|
backend: "https://argocd.tail8d86e.ts.net"
|
|
- name: prometheus
|
|
host: "prometheus.{{ caddy_domain }}"
|
|
backend: "https://prometheus.tail8d86e.ts.net"
|
|
- name: loki
|
|
host: "loki.{{ caddy_domain }}"
|
|
backend: "https://loki.tail8d86e.ts.net"
|
|
- name: miniflux
|
|
host: "feed.{{ caddy_domain }}"
|
|
backend: "https://feed.tail8d86e.ts.net"
|
|
- name: devpi
|
|
host: "pypi.{{ caddy_domain }}"
|
|
backend: "https://pypi.tail8d86e.ts.net"
|
|
- name: kiwix
|
|
host: "kiwix.{{ caddy_domain }}"
|
|
backend: "https://kiwix.tail8d86e.ts.net"
|
|
- name: torrent
|
|
host: "torrent.{{ caddy_domain }}"
|
|
backend: "https://torrent.tail8d86e.ts.net"
|
|
- name: teslamate
|
|
host: "tesla.{{ caddy_domain }}"
|
|
backend: "https://tesla.tail8d86e.ts.net"
|
|
- name: immich
|
|
host: "photos.{{ caddy_domain }}"
|
|
backend: "https://photos.tail8d86e.ts.net"
|
|
- name: navidrome
|
|
host: "dj.{{ caddy_domain }}"
|
|
backend: "https://dj.tail8d86e.ts.net"
|
|
- name: homepage
|
|
host: "go.{{ caddy_domain }}"
|
|
backend: "https://go.tail8d86e.ts.net"
|
|
- name: docs
|
|
host: "docs.{{ caddy_domain }}"
|
|
backend: "https://docs.tail8d86e.ts.net"
|
|
- name: cv
|
|
host: "cv.{{ caddy_domain }}"
|
|
backend: "https://cv.tail8d86e.ts.net"
|
|
- name: nvr
|
|
host: "nvr.{{ caddy_domain }}"
|
|
backend: "https://nvr.tail8d86e.ts.net"
|
|
- name: authentik
|
|
host: "authentik.{{ caddy_domain }}"
|
|
backend: "https://authentik.tail8d86e.ts.net"
|
|
- name: ntfy
|
|
host: "ntfy.{{ caddy_domain }}"
|
|
backend: "https://ntfy.tail8d86e.ts.net"
|
|
- name: ollama
|
|
host: "ollama.{{ caddy_domain }}"
|
|
backend: "https://ollama.tail8d86e.ts.net"
|
|
- name: mealie
|
|
host: "meals.{{ caddy_domain }}"
|
|
backend: "https://meals.tail8d86e.ts.net"
|
|
- name: sifaka
|
|
host: "nas.{{ caddy_domain }}"
|
|
backend: "http://sifaka:5000"
|
|
|
|
# Layer 4 (TCP) services
|
|
# Format: { port: external_port, backend: "host:port" }
|
|
caddy_tcp_services:
|
|
- port: 2222
|
|
backend: "localhost:2200" # Forgejo SSH
|
|
- port: 5432
|
|
backend: "pg.tail8d86e.ts.net:5432" # PostgreSQL (blumeops-pg)
|
|
- port: 5433
|
|
backend: "immich-pg.tail8d86e.ts.net:5432" # PostgreSQL (immich-pg)
|
|
- port: "{{ sifaka_node_exporter_port }}"
|
|
backend: "sifaka:{{ sifaka_node_exporter_port }}" # Sifaka node_exporter
|
|
- port: "{{ sifaka_smartctl_exporter_port }}"
|
|
backend: "sifaka:{{ sifaka_smartctl_exporter_port }}" # Sifaka smartctl_exporter
|