2026-01-19 09:49:52 -08:00
|
|
|
# Database Manifests
|
|
|
|
|
|
|
|
|
|
PostgreSQL clusters managed by CloudNativePG operator.
|
|
|
|
|
|
|
|
|
|
## blumeops-pg
|
|
|
|
|
|
|
|
|
|
Single-instance PostgreSQL cluster for blumeops services.
|
|
|
|
|
|
|
|
|
|
### Configuration
|
|
|
|
|
|
|
|
|
|
- **Instances**: 1 (single-node for minikube)
|
|
|
|
|
- **Storage**: 10Gi on `standard` storage class
|
|
|
|
|
- **Initial database**: `miniflux` owned by `miniflux` user
|
|
|
|
|
|
|
|
|
|
### Users/Roles
|
|
|
|
|
|
2026-01-19 18:00:32 -08:00
|
|
|
| User | Role | Purpose | Password Source |
|
|
|
|
|
|-----------|----------------|----------------------------------|---------------------------------------|
|
|
|
|
|
| postgres | superuser | CNPG internal (avoid using) | `blumeops-pg-superuser` secret |
|
|
|
|
|
| miniflux | app owner | Owns miniflux database | `blumeops-pg-app` secret |
|
|
|
|
|
| eblume | superuser | Admin access (matches brew pg) | `blumeops-pg-eblume` secret (manual) |
|
|
|
|
|
| borgmatic | pg_read_all_data | Backup access for borgmatic | `blumeops-pg-borgmatic` secret (manual) |
|
2026-01-19 09:49:52 -08:00
|
|
|
|
|
|
|
|
### Manual Secret Setup
|
|
|
|
|
|
2026-01-19 18:00:32 -08:00
|
|
|
Before deploying, create the password secrets:
|
2026-01-19 09:49:52 -08:00
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Create namespace first
|
|
|
|
|
kubectl create namespace databases
|
|
|
|
|
|
|
|
|
|
# Apply eblume password from 1Password
|
|
|
|
|
op inject -i argocd/manifests/databases/secret-eblume.yaml.tpl | kubectl apply -f -
|
2026-01-19 18:00:32 -08:00
|
|
|
|
|
|
|
|
# Apply borgmatic password from 1Password
|
|
|
|
|
op inject -i argocd/manifests/databases/secret-borgmatic.yaml.tpl | kubectl apply -f -
|
2026-01-19 09:49:52 -08:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The `miniflux` user password is auto-generated by CloudNativePG and stored in `blumeops-pg-app`.
|
|
|
|
|
|
|
|
|
|
### Connection Information
|
|
|
|
|
|
|
|
|
|
After the cluster is healthy:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Connect via Tailscale (temporary hostname during migration)
|
|
|
|
|
psql -h k8s-pg.tail8d86e.ts.net -U eblume -W -d miniflux
|
|
|
|
|
|
|
|
|
|
# Or with password from 1Password
|
|
|
|
|
PGPASSWORD=$(op --vault blumeops item get guxu3j7ajhjyey6xxl2ovsl2ui --fields password --reveal) \
|
|
|
|
|
psql -h k8s-pg.tail8d86e.ts.net -U eblume -d miniflux
|
|
|
|
|
|
|
|
|
|
# Get miniflux app credentials (for applications)
|
|
|
|
|
kubectl -n databases get secret blumeops-pg-app -o jsonpath='{.data.uri}' | base64 -d
|
|
|
|
|
|
|
|
|
|
# Get postgres superuser credentials (emergency only)
|
|
|
|
|
kubectl -n databases get secret blumeops-pg-superuser -o jsonpath='{.data.password}' | base64 -d
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Connecting via kubectl port-forward
|
|
|
|
|
|
|
|
|
|
Alternative if Tailscale service is unavailable:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Terminal 1: Port-forward to the primary
|
|
|
|
|
kubectl -n databases port-forward svc/blumeops-pg-rw 5432:5432
|
|
|
|
|
|
|
|
|
|
# Terminal 2: Connect as eblume
|
|
|
|
|
PGPASSWORD=$(op --vault blumeops item get guxu3j7ajhjyey6xxl2ovsl2ui --fields password --reveal) \
|
|
|
|
|
psql -h localhost -U eblume -d miniflux
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Status
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Check cluster health
|
|
|
|
|
kubectl -n databases get cluster blumeops-pg
|
|
|
|
|
|
|
|
|
|
# Check pods
|
|
|
|
|
kubectl -n databases get pods -l cnpg.io/cluster=blumeops-pg
|
|
|
|
|
|
|
|
|
|
# Check managed roles status
|
|
|
|
|
kubectl -n databases get cluster blumeops-pg -o jsonpath='{.status.managedRolesStatus}' | jq
|
|
|
|
|
|
|
|
|
|
# Operator logs
|
|
|
|
|
kubectl -n databases logs -l cnpg.io/cluster=blumeops-pg
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Tailscale Exposure
|
|
|
|
|
|
|
|
|
|
### Current: Temporary Service
|
|
|
|
|
|
|
|
|
|
`k8s-pg.tail8d86e.ts.net` - LoadBalancer service for testing during migration.
|
|
|
|
|
|
|
|
|
|
### Phase 4: Production Service
|
|
|
|
|
|
|
|
|
|
After miniflux migrates to k8s, the `pg.tail8d86e.ts.net` Tailscale service will switch
|
|
|
|
|
from brew PostgreSQL (indri) to this k8s cluster. At that point:
|
|
|
|
|
1. Delete `service-tailscale.yaml` (the `k8s-pg` service)
|
|
|
|
|
2. Update/create a service with `tailscale.com/hostname: "pg"`
|
|
|
|
|
3. Verify the orphaned `k8s-pg` device is removed from tailnet
|