Skip to content

Self-host Mealie

updated Sep 2026prices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →

A self-hosted recipe manager and meal planner with a URL importer that scrapes recipes into clean, ad-free cards. Plan weeks and generate shopping lists.

Key facts

CategoryRecipes
LicenseAGPL-3.0
StackPython, Vue
Min RAM1024 MB
Official imageyes
Measured idle RAM202 MB
Difficulty
Our recommendation

Pick Mealie when a household wants recipes scraped from URLs into clean cards, a weekly meal plan and a shopping list, all behind one login: it is AGPL-licensed, a Python/FastAPI backend with a Vue frontend in a single image, and SQLite in `/app/data` is the documented default for "1-20 Users". PostgreSQL is optional and unlocks fuzzy search. The official compose sets a `1000M` memory limit — Python "can pre-allocate larger amounts of memory than is necessary" — which is what our 1 GB floor tracks. Tandoor is the catalog's alternative if you want PostgreSQL full-text and trigram search as standard and Dropbox/Nextcloud file sync, at the cost of running the database yourself.

What you need

  • Any VPS with at least 1024 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install with Docker Compose

Save this as compose.yml and run docker compose up -d:

# Mealie — the official SQLite compose (docs → Installation → SQLite), pinned to the current release
services:
  mealie:
    image: ghcr.io/mealie-recipes/mealie:v3.27.0   # upstream pins the release tag; check the badge on the docs page for the newest
    container_name: mealie
    restart: always
    ports:
        - "9925:9000"
    deploy:
      resources:
        limits:
          memory: 1000M
    volumes:
      - mealie-data:/app/data/
    environment:
      ALLOW_SIGNUP: "false"
      PUID: 1000
      PGID: 1000
      TZ: America/Anchorage   # your timezone
      BASE_URL: https://mealie.yourdomain.com   # the URL you will open Mealie on
volumes:
  mealie-data:
# docker compose up -d  →  http://SERVER_IP:9925 — default login changeme@example.com / MyPassword, change it at once

What you take on

Mealie's installation checklist is short, and each item on it maps to a real first-week problem:

non-negotiableThe first login is changeme@example.com / MyPassword — change it immediately. ALLOW_SIGNUP defaults to false since v1.4.0, so further users come from invitations, which need SMTP_* configured (SMTP_HOST, SMTP_PORT default 587, SMTP_FROM_EMAIL). Five failed passwords lock an account for 24 hours by default (SECURITY_MAX_LOGIN_ATTEMPTS, SECURITY_USER_LOCKOUT_TIME).
non-negotiableSet BASE_URL to the public address (default http://localhost:8080); it is used for notification links and the OIDC callback. Since v3.26.0 the server refuses to fetch from private/internal addresses — recipe imports, webhooks and recipe actions only reach the public internet unless you list hosts or CIDRs in HTTP_ALLOW_LIST.
non-negotiableUpstream pins the image to a version (ghcr.io/mealie-recipes/mealie:v3.27.0 as of September 2026) and tells you to check the release badge rather than trust latest, which our snippet uses. Do not put SQLite on network storage — upstream says use PostgreSQL there — and v0.5.x installs "CANNOT upgrade to the latest version automatically".
non-negotiableThe built-in backup lives in Settings > Admin > Backups and a restore "is a destructive action and will delete all data in the database"; with PostgreSQL a restore needs a superuser account. For SQLite everything is under /app/data/, but upstream is explicit that the app's own data-safety work "is not a backup" — copy it off the server. 32-bit ARM is unsupported.
non-negotiableThe 1 GB floor is the memory: 1000M limit from upstream's own compose files; Mealie publishes no separate minimum-RAM requirement.

Head-to-head

More self-hosted tools

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.