Service: Mealie (recipes + meal planning)
VM: Food •192.168.5.83
URL:https://mealie.kalymoon.com
Port (direct):http://192.168.5.83:9925
Timezone:America/New_York
Mealie is the home recipe vault for Kalymoon:
Docker runs the app. The host filesystem stores the data.
This is intentional and backup-friendly.
App: Docker container
Data: /home/jen/mealie/data (bind mount)
⚠️ Rule of the realm: the container is disposable — the data folder is sacred.
docker run -d \
--name mealie \
-p 9925:9000 \
-v /home/jen/mealie/data:/app/data \
-e BASE_URL=https://mealie.kalymoon.com \
-e TZ=America/New_York \
--restart unless-stopped \
ghcr.io/mealie-recipes/mealie:latest
✅ Correct storage method: bind mount
❌ Avoid: Docker named volumes (can make Mealie look “empty”)
/home/jen/mealie/data
Contains:
mealie.db → primary database (critical)If kalyssa loses admin after a restore/rollback:
docker run --rm -v /home/jen/mealie/data:/app/data nouchka/sqlite3 /app/data/mealie.db \
"UPDATE users SET admin=1, can_manage=1, can_invite=1, can_organize=1 WHERE username='kalyssa';"
Restart:
docker restart mealie
chris)If the database was rolled back, new users created after the snapshot must be re-added.
Preferred method: UI → Settings → Admin → Users → Create User
Mealie ships with an orange default accent. Change it in the UI:
Suggested palette:
#9B08C0#C1FCF5#0F0F1A#E0E6F1If you want, I can give you a “copy/paste” set of exact values for every theme slot Mealie exposes in your version.
tar czf ~/mealie-backup-$(date +%F-%H%M).tar.gz /home/jen/mealie/data
Create:
nano ~/backup_mealie.sh
Paste:
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/home/jen/backups/mealie"
DATA_DIR="/home/jen/mealie/data"
KEEP=7
mkdir -p "$BACKUP_DIR"
TS="$(date +%F-%H%M)"
tar czf "$BACKUP_DIR/mealie-$TS.tar.gz" "$DATA_DIR"
cp "$DATA_DIR/mealie.db" "$BACKUP_DIR/mealie-db-$TS.db"
# keep last N archives
ls -tp "$BACKUP_DIR" | grep -E '^mealie-.*\.tar\.gz$' | tail -n +$((KEEP+1)) | xargs -r -I{} rm -- "$BACKUP_DIR/{}"
echo "✅ Mealie backup complete: $TS"
Enable:
chmod +x ~/backup_mealie.sh
Schedule (daily 3:00 AM):
crontab -e
Add:
0 3 * * * /home/jen/backup_mealie.sh
sqlite3 /home/jen/mealie/data/mealie.db "SELECT COUNT(*) FROM recipes;"
docker inspect mealie --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'
Expected:
/home/jen/mealie/data -> /app/data
This almost always means the container is pointed at the wrong data location.
✅ Correct:
/home/jen/mealie/data:/app/data❌ Risky:
mealie-data:/app/datarecipebot) for scraper imports“The vault persists. Containers are temporary.” 🔮