Files
Trey t 81e454d86d
Backend CI / Test (push) Has been cancelled
Backend CI / Contract Tests (push) Has been cancelled
Backend CI / Lint (push) Has been cancelled
Backend CI / Secret Scanning (push) Has been cancelled
Backend CI / Build (push) Has been cancelled
Add admin-create registration + live email-verified flag
Registration now goes through POST /api/auth/register, which admin-creates the
Kratos identity (unverified email, NO auto-sent code). Kratos self-service
registration never returns the verification flow id, so the client could never
submit the user's code to the right flow; admin creation lets the client own a
single verification flow instead. Also surface the live Kratos verified flag
and fix Apple audience + team IDs.

- kratos.Client.CreateIdentity via admin API; ErrIdentityExists / ErrInvalidCredentials
- AuthService.Register + AuthHandler.Register + public POST /api/auth/register/
- CurrentUser overrides stale user_profile.verified with the live Kratos flag;
  UserRepository.MarkVerified mirrors it back
- configmap: additional_id_token_audiences allows the .dev bundle id_token
- fix Apple/APNs team id V3PF3M6B6U -> X86BR9WTLD in .env.example + dev init

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:46:30 -05:00
..

honeyDue — K3s Dev Deployment

Single-node K3s dev environment that replicates the production setup with all services running locally.

Architecture: 1-node K3s, in-cluster PostgreSQL + Redis + MinIO (S3-compatible), Let's Encrypt TLS.

Domains: devapi.myhoneydue.com, devadmin.myhoneydue.com


Quick Start

cd honeyDueAPI-go/deploy-k3s-dev

# 1. Fill in config
cp config.yaml.example config.yaml
# Edit config.yaml — fill in ALL empty values

# 2. Create secret files (see secrets/README.md)
echo "your-postgres-password" > secrets/postgres_password.txt
openssl rand -base64 48 > secrets/secret_key.txt
echo "your-smtp-password" > secrets/email_host_password.txt
echo "your-fcm-key" > secrets/fcm_server_key.txt
openssl rand -base64 24 > secrets/minio_root_password.txt
cp /path/to/AuthKey.p8 secrets/apns_auth_key.p8

# 3. Install K3s → Create secrets → Deploy
./scripts/01-setup-k3s.sh
./scripts/02-setup-secrets.sh
./scripts/03-deploy.sh

# 4. Point DNS at the server IP, then verify
./scripts/04-verify.sh
curl https://devapi.myhoneydue.com/api/health/

Prod vs Dev

Component Prod (deploy-k3s/) Dev (deploy-k3s-dev/)
Nodes 3x CX33 (HA etcd) 1 node (any VPS)
PostgreSQL Neon (managed) In-cluster container
File storage Backblaze B2 MinIO (S3-compatible)
Redis In-cluster In-cluster (identical)
TLS Cloudflare origin cert Let's Encrypt (or Cloudflare)
Replicas api=3, worker=2 All 1
HPA/PDB Enabled Not deployed
Network policies Same Same + postgres/minio rules
Security contexts Same Same (except postgres)
Deploy workflow Same scripts Same scripts
Docker images Same Same

TLS Modes

Let's Encrypt (default): Traefik auto-provisions certs. Set tls.letsencrypt_email in config.yaml.

Cloudflare: Same as prod. Set tls.mode: cloudflare, add origin cert files to secrets/.

Storage Note

MinIO provides the same S3-compatible API as Backblaze B2. The Go API uses the same env vars (B2_KEY_ID, B2_APP_KEY, B2_BUCKET_NAME, B2_ENDPOINT) — it connects to MinIO instead of B2 without code changes.

An additional env var STORAGE_USE_SSL=false is set since MinIO runs in-cluster over HTTP. If the Go storage service hardcodes HTTPS, it may need a small change to respect this flag.

Monitoring

stern -n honeydue .                    # All logs
kubectl logs -n honeydue deploy/api -f # API logs
kubectl top pods -n honeydue           # Resource usage

Rollback

./scripts/rollback.sh