Mealie on a VPS: Self-Hosted Recipe Manager with Import, Meal Planning, and Grocery Lists

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

  1. Meal Planner → select week
  2. Click a day → Add Recipe → search your library
  3. Or: drag recipes from library to calendar days
  4. Add multiple meals per day (breakfast, lunch, dinner)
  5. Shopping List → Generate from Meal Plan → select date range
  6. 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.

Fast • Reliable • Affordable VPS - DO It Now!

Get top VPS hosting with VPS.DO’s fast, low-cost plans. Try risk-free with our 7-day no-questions-asked refund and start today!