FigJam Diagram: Aja Recipes — Family Recipe Tracker (expires 2026-04-13)
Family recipe tracking application. Node.js backend with a PostgreSQL database. Runs at 2 replicas by default with HPA scaling to 10 on CPU/memory pressure.
| Internal URL | https://recipes.k3s.internal.strommen.systems |
| Namespace | aja-recipes |
| Image | harbor.k3s.internal.strommen.systems/production/aja-recipes:sha-b979c74 |
| Port | :3000 |
| Auth | None (internal-only, no Authentik forwardAuth) |
HPA is configured on the aja-recipes Deployment:
| Min replicas | 2 |
| Max replicas | 10 |
| CPU target | 70% utilization |
| Memory target | 80% utilization |
Note: Uses
RollingUpdatestrategy (unlike most cluster apps which useRecreate). Safe because the app is stateless — PostgreSQL handles all state.
PostgreSQL DB recipes with schema recipes:
| Table | Purpose |
|---|---|
recipes.recipes |
Recipe records — name, description, instructions, ingredients (JSONB), prep/cook time, servings |
recipes.users |
User accounts — email (unique), created_at |
| Secret | Keys | Purpose |
|---|---|---|
postgres-secret |
password |
PostgreSQL password for user recipes |
Bootstrap:
PW="$(openssl rand -base64 32)"
kubectl create secret generic postgres-secret \
--namespace aja-recipes \
--from-literal=password="${PW}"
No Prometheus ServiceMonitor — the app does not expose
/metrics. CPU/memory is monitored via kube-metrics-server (used by HPA). Pod resource graphs available in Grafana via node-exporter.
| Schedule | Daily 3:20 AM UTC |
| Method | pg_dump → gzip → s3://k3s-homelab-backups-855878721457/postgres-backups/aja-recipes/ |
| Retention | 7 days |
| Manifest | kubernetes/apps/aja-recipes/postgres-backup-cronjob.yaml |
kubernetes/apps/aja-recipes/
namespace.yaml — Namespace definition
deployment.yaml — ConfigMap (init.sql), PostgreSQL StatefulSet + Services,
aja-recipes Deployment, HPA, Ingress
postgres-backup-cronjob.yaml — Daily PostgreSQL backup to S3 (3:20 AM UTC)