## Summary - Deploy Mealie (self-hosted recipe manager) on minikube-indri via ArgoCD - Build container from source via forge mirror (`mirrors/mealie`) — multi-stage Dockerfile with Node.js frontend + Python/uv backend - Add Caddy proxy entry for `meals.ops.eblu.me` - Part of a larger meal planning pipeline: Mealie stores categorized recipes, a planner script selects balanced meals, and Ollama generates unified cooking timelines ## Status - [x] Mirror mealie repo on forge - [x] Dockerfile (from-source build) - [x] ArgoCD app + k8s manifests - [x] Caddy proxy entry - [x] Service docs, routing table, app registry - [ ] Local Dagger build test - [ ] Container build + push to registry - [ ] Update kustomization.yaml with real image tag - [ ] Deploy and verify - [ ] Provision Caddy ## Test plan - Build container locally via `dagger call build --src=. --container-name=mealie` - Trigger CI build via `mise run container-build-and-release mealie` - Deploy from branch: `argocd app set mealie --revision deploy-mealie && argocd app sync mealie` - Verify Mealie UI at `https://meals.ops.eblu.me` - Verify API docs at `https://meals.ops.eblu.me/docs` Reviewed-on: #299
2.3 KiB
| title | modified | tags | ||
|---|---|---|---|---|
| Mealie | 2026-03-16 |
|
Mealie
Self-hosted recipe manager with a REST API. Part of the meal planning pipeline: Mealie stores categorized recipes, a planner script selects balanced meals, and ollama generates a unified cooking timeline.
Quick Reference
| Property | Value |
|---|---|
| URL | https://meals.ops.eblu.me |
| Tailscale URL | https://meals.tail8d86e.ts.net |
| Namespace | mealie |
| Image | registry.ops.eblu.me/blumeops/mealie (built from source) |
| Database | SQLite (local, at /app/data/) |
| API Docs | https://meals.ops.eblu.me/docs |
| Upstream | https://github.com/mealie-recipes/mealie |
| Manifests | argocd/manifests/mealie/ |
Features
- Full REST API (FastAPI) for recipe CRUD, filtering by tag/category
- Structured recipe data: ingredients (quantity/unit/food), step-by-step instructions
- Built-in meal planning and shopping lists
- Recipe import from URLs
- API token auth for automation
- OIDC login via authentik (confidential client)
Authentication
OIDC via authentik using a confidential client. Client secret stored in 1Password (Authentik (blumeops) / mealie-client-secret) and delivered via ExternalSecret. All Authentik users can log in; members of the admins group get Mealie admin privileges via OIDC_ADMIN_GROUP.
Storage
- 2Gi PVC at
/app/data/viastandardstorageClassName (minikube-hostpath) - SQLite database (sufficient for single-user)
- Recipe images and assets stored alongside the database
Backup
SQLite database backed up via borgmatic's before_backup hook. Borgmatic runs kubectl exec to create a safe .backup copy (via Python's sqlite3 module), then kubectl cp to the host. The dump lands in ~/.local/share/borgmatic/k8s-dumps/mealie.db and is included in both local (sifaka) and offsite (BorgBase) backups.
Networking
| Endpoint | Reachable from |
|---|---|
https://meals.ops.eblu.me |
Tailnet clients (via Caddy) |
https://meals.tail8d86e.ts.net |
Tailnet clients |
http://mealie.mealie.svc.cluster.local:9000 |
In-cluster |