Mealie on a VPS: Self-Hosted Recipe Manager with Import, Meal Planning, and Grocery Lists
Mealie is a self-hosted recipe manager with a clean, mobile-friendly web interface — import recipes from any URL (it scrapes recipe schemas automatically), organize with tags and categories, plan weekly meals on a visual calendar, generate shopping lists from planned meals, and share with household members with per-user accounts. It replaces paid recipe apps (Paprika at $5, Whisk, Plan to Eat at $4.99/month) with a self-hosted alternative you control.
What Mealie Provides
- Recipe import: Paste any recipe URL — Mealie scrapes the structured recipe data (ingredients, instructions, nutrition)
- Organization: Tags, categories, cuisines, difficulty, cook time — filter and search your collection
- Meal planner: Weekly/monthly calendar view — drag recipes to days
- Shopping list: Auto-generate from meal plan, combine quantities, check off while shopping
- Cookbooks: Group recipes into themed collections (weeknight dinners, holiday, quick & easy)
- Multi-user: Household member accounts with shared recipe library
- API: Full REST API for automation and integrations
Step 1: Docker Compose Setup
<code">mkdir -p /opt/mealie && cd /opt/mealie nano docker-compose.yml
<code">version: '3.8'
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: always
ports:
- "127.0.0.1:9000:9000"
environment:
ALLOW_SIGNUP: "false" # Disable open registration
DEFAULT_EMAIL: admin@yourdomain.com
DEFAULT_PASSWORD: ${ADMIN_PASSWORD}
BASE_URL: https://recipes.yourdomain.com
TZ: America/New_York
# Database
DB_ENGINE: sqlite # SQLite (default) — or postgres
# For PostgreSQL (recommended for larger libraries):
# DB_ENGINE: postgres
# POSTGRES_USER: mealie
# POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
# POSTGRES_SERVER: mealie-db
# POSTGRES_DB: mealie
volumes:
- mealie_data:/app/data
volumes:
mealie_data:
<code">echo "ADMIN_PASSWORD=StrongMealiePassword!" > .env chmod 600 .env docker compose up -d docker compose logs -f mealie
Step 2: Nginx Reverse Proxy
<code">sudo nano /etc/nginx/sites-available/mealie
<code">server {
listen 80;
server_name recipes.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name recipes.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/recipes.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/recipes.yourdomain.com/privkey.pem;
client_max_body_size 50M; # For recipe image uploads
location / {
proxy_pass http://127.0.0.1:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
<code">sudo ln -s /etc/nginx/sites-available/mealie /etc/nginx/sites-enabled/ sudo certbot --nginx -d recipes.yourdomain.com sudo systemctl reload nginx
Step 3: Import Recipes
<code"># Method 1: Import by URL (most common)
# Mealie → + → Import Recipe from URL
# Paste: https://www.seriouseats.com/carbonara-recipe
# Mealie scrapes: title, ingredients, instructions, cooking time, servings, photos
# Method 2: Create manually
# + → Create Recipe → fill in form
# Method 3: Import from other apps
# Mealie supports import from:
# - Paprika (.paprikarecipes)
# - Chowdown
# - Copy Me That
# - Nextcloud Cookbook
# Method 4: Bulk import via API
API_KEY="your_mealie_api_key" # Profile → API Tokens → Create
curl -X POST https://recipes.yourdomain.com/api/recipes/create-url \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.allrecipes.com/recipe/10813/best-chocolate-chip-cookies/"}'
Step 4: Meal Planning
- Meal Planner → select week
- Click a day → Add Recipe → search your library
- Or: drag recipes from library to calendar days
- Add multiple meals per day (breakfast, lunch, dinner)
- Shopping List → Generate from Meal Plan → select date range
- Mealie combines all ingredients, merges duplicates (e.g., “2 eggs” + “3 eggs” → “5 eggs”)
Step 5: Multi-User Household Setup
<code"># Create household member accounts: # Admin → Manage Users → + New User # Name, email, password, group (shared recipe library) # Group settings: # A "group" is a shared recipe library — all members see the same recipes # Create one group per household # Permissions: # Admin: manage users, change group settings # Member: create/edit recipes, manage meal plan, shopping lists
Step 6: Shopping List Integration
<code"># Get shopping list via API (for integration with smart home or other apps):
curl https://recipes.yourdomain.com/api/groups/shopping/lists \
-H "Authorization: Bearer $API_KEY" | python3 -m json.tool
# Add item to shopping list:
curl -X POST https://recipes.yourdomain.com/api/groups/shopping/items \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"shoppingListId": "LIST_UUID", "note": "Extra virgin olive oil", "quantity": 1}'
# Mark item as checked:
curl -X PUT https://recipes.yourdomain.com/api/groups/shopping/items/ITEM_UUID \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"checked": true}'
Step 7: Backup
<code"># Backup via Mealie admin panel: # Admin → Backups → Create Backup # Downloads a .zip with all recipes, images, and settings # Or via API: curl -X GET https://recipes.yourdomain.com/api/backups/available \ -H "Authorization: Bearer $API_KEY" # Scheduled backup with Restic: # restic backup /var/lib/docker/volumes/mealie_mealie_data --tag mealie
Getting Started
Mealie uses 100–200 MB RAM — it runs alongside other services on any Ubuntu VPS at VPS.DO. The SQLite default is suitable for households with 500–2,000 recipes. For larger collections or multiple households sharing one Mealie instance, switch to PostgreSQL. The mobile-friendly web interface works well for in-kitchen use on a phone without installing a native app.
Conclusion
Self-hosted Mealie provides a complete recipe management experience — URL import with automatic ingredient parsing, organized recipe library, weekly meal planning with a visual calendar, and shopping list generation — without subscription fees or data sharing. For households with recipe collections scattered across browser bookmarks, cooking apps, and handwritten cards, Mealie provides a single organized library accessible from any device on your network or from anywhere via your VPS domain.