Secrets Management¶
All secrets are managed by OpenBao (self-hosted Vault fork).
Accessing OpenBao¶
URL: https://openbao.heezy.info
This is internal-only — DNS resolves to 192.168.1.25 (SWAG) via dnsmasq. It never touches Cloudflare.
Prerequisite: DNS¶
Your machine must use 192.168.1.29 as its DNS server or openbao.heezy.info won't resolve.
macOS: System Settings → Network → active interface → Details → DNS → add 192.168.1.29
Verify: dig openbao.heezy.info should return 192.168.1.25
Logging In¶
OpenBao uses AppRole for machine auth. For human UI access, generate a short-lived token:
curl -sk -X POST https://openbao.heezy.info/v1/auth/approle/login \
-H 'Content-Type: application/json' \
-d '{"role_id":"6d28d688-4a65-d8b5-87bb-f1a9e34d692d","secret_id":"bffc8c5b-d8f6-1597-3465-b2234d23b29c"}' \
| python3 -c "import sys,json; print(json.load(sys.stdin)['auth']['client_token'])"
In the UI: select Token as the auth method, paste the token. Expires in 1 hour — generate a new one when it expires. The MCP agent can also generate one on demand.
Architecture¶
Browser → https://openbao.heezy.info
→ dnsmasq: openbao.heezy.info → 192.168.1.25 (SWAG MetalLB VIP)
→ SWAG terminates TLS, proxies → openbao.openbao.svc.cluster.local:8200
→ OpenBao pod in openbao namespace
- K8s namespace:
openbao - Service:
openbaoClusterIP +openbao-lbLoadBalancer (192.168.1.32) - SWAG proxy conf:
openbao.subdomain.confinswag-proxy-confsConfigMap (heezy namespace) - Auto-unseal: CronJob
openbao-unsealruns every 5 min — checks seal status and unseals automatically
Secret Layout¶
- KV engine:
secret/(KV v2) - Auth: AppRole (machine auth), Token (human/UI access)
- ESO policy:
eso-readonly— read/list onsecret/data/*for External Secrets Operator
Key Paths¶
| Path | Contents |
|---|---|
production/heezy/terraform/fortigate/secret |
FortiGate API credentials |
production/heezy/ssh/mcp-admin-private-key |
MCP admin SSH private key |
all/heezy/aws/ecr-credentials |
AWS ECR access keys |
all/heezy/ubuntu/cloud-init-credentials |
Ubuntu VM default credentials |
production/heezy/postgres-credentials |
Postgres credentials |
production/heezy/receipts/aws-credentials |
Textract IAM creds |
production/heezy/gmail/oauth-credentials |
Gmail OAuth tokens |
production/heezy/gitea/runner-pat |
Gitea runner PAT |
production/heezy/cloudflare/pages-token |
Cloudflare Pages deploy token |
Grafana¶
Grafana runs on shared-lgtm (192.168.1.10) as a Docker Compose service, not in k8s.
- URL: https://grafana.heezy.info
- Username:
admin - Password: Set via
GF_SECURITY_ADMIN_PASSWORDin/opt/lgtm/docker-compose.yml
If you're locked out, reset via:
ssh mcp-admin@192.168.1.10
sudo docker exec grafana /usr/share/grafana/bin/grafana cli admin reset-admin-password <newpassword>
Troubleshooting¶
Can't reach openbao.heezy.info:
- Confirm DNS: dig openbao.heezy.info should return 192.168.1.25
- Set DNS to 192.168.1.29 if not
Token expired: - Generate a new one with the curl command above
OpenBao sealed:
The unseal CronJob recovers it automatically within 5 minutes.