Shower App

Django web app for Adelaide / Heidi / Addie’s baby shower — guest splash with a “what did you bring?” form, raffle picker, contest-prize ranking via QR-coded /prizes/<token>/ URLs, and an /host/ operator console with drag-rank assignment solving via scipy.

Quick Reference

PropertyValue
Public URLshower.eblu.me (guest surface only — via flyio-proxy)
Private URLshower.ops.eblu.me (admin + /host/ console — Caddy on indri)
Clusterringtail k3s, namespace shower
Containerregistry.ops.eblu.me/blumeops/shower (built from containers/shower/default.nix)
App sourceforge.eblu.me/eblume/adelaide-baby-shower-app (wheel on Forgejo PyPI)
DatabaseSQLite on a local-path PVC (shower-data, RWO 2 Gi)
Media (prize photos)NFS RWX PVC shower-mediasifaka:/volume1/shower
SecretsShower (blumeops) 1Password item → DJANGO_SECRET_KEY

Routing

Internet → shower.eblu.me  (Fly nginx, guest-only 403s on /admin/ /host/)
            │
            ▼
        Caddy on indri (shower.ops.eblu.me — full surface)
            │
            ▼
        Tailscale ProxyGroup → k3s Service → Deployment

Backups

  • SQLite dumped via kubectl exec to indri’s borgmatic_k8s_dump_dir on every 2 a.m. run (mealie-pattern entry in borgmatic_k8s_sqlite_dumps)
  • Media picked up via /Volumes/shower (sifaka SMB mount on indri) in the main borgmatic_source_directories list

Both archive to sifaka + BorgBase.