- ADR: ADR 0026
- Title: Dedicated PostgreSQL VM baseline
- Status: merged
- Branch:
codex/adr-0025-postgres-vm - Worktree:
../proxmox-host_server-postgres-vm - Owner: codex
- Depends On: none
- Conflicts With: none
- Shared Surfaces:
postgres,playbooks/postgres-vm.yml,roles/postgres_vm,roles/proxmox_tailscale_proxy,roles/hetzner_dns_record
- add a dedicated PostgreSQL guest to the Proxmox inventory
- converge a secure PostgreSQL baseline on that guest
- enforce a guest-local firewall and explicit
pg_hba.confpolicy - expose PostgreSQL only through the Proxmox host Tailscale interface
- publish a tailnet-only DNS name for PostgreSQL access
- document provisioning, access, and verification
- database replication
- PITR or WAL archiving
- public publication of PostgreSQL
- HTTPS reverse proxying for PostgreSQL on the NGINX VM
- application schema deployment
- monitoring or exporter rollout for PostgreSQL
inventory/hosts.ymlinventory/host_vars/proxmox-host.ymlplaybooks/postgres-vm.ymlplaybooks/database-dns.ymlroles/postgres_vmroles/hetzner_dns_recorddocs/runbooks/configure-postgres-vm.mddocs/adr/0026-dedicated-postgresql-vm-baseline.mdworkstreams.yaml
- VM
150running aspostgreson10.10.10.50 postgresqlservice enabled on the guestnftablesenforcing deny-by-default inbound policy on the guest- TCP
5432proxied from the Proxmox host Tailscale IP to the PostgreSQL VM database.example.comresolving to the Proxmox host Tailscale IPv4- local peer administration available through
opsandpostgres
ansible-playbook -i /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/inventory/hosts.yml /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/playbooks/site.yml --syntax-checkansible-playbook -i /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/inventory/hosts.yml /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/playbooks/postgres-vm.yml --syntax-checkansible-playbook -i /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/inventory/hosts.yml /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/playbooks/database-dns.yml --syntax-checkssh -i /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/.local/ssh/hetzner_llm_agents_ed25519 -o IdentitiesOnly=yes ops@100.118.189.95 'sudo qm config 150'ssh -i /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/.local/ssh/hetzner_llm_agents_ed25519 -o IdentitiesOnly=yes ops@100.118.189.95 'ssh -o StrictHostKeyChecking=no ops@10.10.10.50 sudo systemctl status postgresql nftables --no-pager'ssh -i /Users/live/Documents/GITHUB_PROJECTS/proxmox-host_server/.local/ssh/hetzner_llm_agents_ed25519 -o IdentitiesOnly=yes ops@100.118.189.95 'ssh -o StrictHostKeyChecking=no ops@10.10.10.50 sudo -u postgres psql -Atqc \"SHOW listen_addresses\"'psql "host=database.example.com port=5432 dbname=postgres user=ops sslmode=prefer"
- guest provisioning inventory includes the PostgreSQL VM
- the PostgreSQL convergence playbook is idempotent
- the guest firewall and authentication policy are documented
- live verification confirms that PostgreSQL is reachable only through Tailscale
- protected integration files remain untouched
database.example.comis a Tailscale-only endpoint, not a public website- do not add NGINX HTTPS publication for PostgreSQL itself
- this workstream was merged to
mainduring integration because0025was already taken by the compose ADR series - live apply completed on
2026-03-22and the mergedmainline now reflects that state