Skip to content

Mealie Mealie

Description / nameInput element
Container Registry
Container Configuration Root Path
Timezone
User ID
Group ID
Mealie Host Port
Mealie /config Path

Build Status Last Commit

Intuitive self-hosted recipe management app designed to be the best recipe management experience on the web.

Port 9000
Registry ghcr.io/daemonless/mealie
Daemonless daemonless/mealie
Source mealie-recipes/mealie
Website mealie.io

Version Tags

Tag Description Best For
latest Upstream Binary. Built from official release. Most users — recommended.

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.

Deployment

services:
  mealie:
    image: "ghcr.io/daemonless/mealie:latest"
    container_name: mealie
    environment:
      - BASE_URL=http://localhost:9000  # The base URL for the application (e.g. https://mealie.example.com)
      - PUID=1000  # User ID for the application process
      - PGID=1000  # Group ID for the application process
      - TZ=UTC  # Timezone for the container
    volumes:
      - "/path/to/containers/mealie:/config"
    ports:
      - "9000:9000"
    restart: unless-stopped
1
2
3
4
5
6
7
8
podman run -d --name mealie \
  -p 9000:9000 \
  -e BASE_URL=http://localhost:9000 \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=UTC \
  -v /path/to/containers/mealie:/config \
  ghcr.io/daemonless/mealie:latest
- name: Deploy mealie
  containers.podman.podman_container:
    name: mealie
    image: "ghcr.io/daemonless/mealie:latest"
    state: started
    restart_policy: always
    env:
      BASE_URL: "http://localhost:9000"
      PUID: "1000"
      PGID: "1000"
      TZ: "UTC"
    ports:
      - "9000:9000"
    volumes:
      - "/path/to/containers/mealie:/config"
1
2
3
4
5
6
7
# .env

DIRECTOR_PROJECT=mealie
BASE_URL=http://localhost:9000
PUID=1000
PGID=1000
TZ=UTC
# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  mealie:
    name: mealie
    options:
      - container: 'boot args:--pull'
      - expose: '9000:9000 proto:tcp'
    oci:
      user: root
      environment:
        - BASE_URL: !ENV '${BASE_URL}'
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
    volumes:
      - MEALIE_CONFIG_PATH: /config
volumes:
  MEALIE_CONFIG_PATH:
    device: '/path/to/containers/mealie'
1
2
3
4
5
6
# Makejail

ARG tag=latest

OPTION overwrite=force
OPTION from=ghcr.io/daemonless/mealie:${tag}
appjail oci run -Pd \
  -o overwrite=force \
  -o container="args:--pull" \
  -o virtualnet=":<random> default" \
  -o nat \
  -o expose="9000:9000 proto:tcp" \
  -e BASE_URL=http://localhost:9000 \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=UTC \
  -o fstab="/path/to/containers/mealie /config <pseudofs>" \
  ghcr.io/daemonless/mealie:latest mealie

Access at: http://localhost:9000

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
BASE_URL http://localhost:9000 The base URL for the application (e.g. https://mealie.example.com)
PUID 1000 User ID for the application process
PGID 1000 Group ID for the application process
TZ UTC Timezone for the container

Volumes

Path Description
/config Data directory (database, images)

Ports

Port Protocol Description
9000 TCP Web UI

Using PostgreSQL

By default, Mealie uses SQLite. For better performance with multiple users, use PostgreSQL:

services:
  mealie:
    image: ghcr.io/daemonless/mealie:latest
    container_name: mealie
    environment:
      - BASE_URL=http://localhost:9000
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - DB_ENGINE=postgres
      - POSTGRES_USER=mealie
      - POSTGRES_PASSWORD=changeme
      - POSTGRES_SERVER=localhost
      - POSTGRES_PORT=5432
      - POSTGRES_DB=mealie
    volumes:
      - "/path/to/containers/mealie:/config"
    ports:
      - "9000:9000"
    depends_on:
      - postgres
    network_mode: host
    restart: unless-stopped

  postgres:
    image: ghcr.io/daemonless/postgres:latest
    container_name: mealie-postgres
    environment:
      - POSTGRES_USER=mealie
      - POSTGRES_PASSWORD=changeme
      - POSTGRES_DB=mealie
    volumes:
      - "/path/to/containers/mealie-postgres:/config"
    network_mode: host
    restart: unless-stopped

Note: With network_mode: host, use localhost for POSTGRES_SERVER.

Migrating from Linux

SQLite: No issues, just copy your data.

PostgreSQL: You cannot copy the postgres data directory between Linux and FreeBSD due to locale incompatibilities. Use pg_dump/pg_restore instead:

1
2
3
4
5
# On Linux
podman exec mealie-postgres pg_dump -U mealie mealie > mealie.sql

# On FreeBSD (start fresh postgres first, then restore)
cat mealie.sql | podman exec -i mealie-postgres psql -U mealie -d mealie

See daemonless/postgres README for details.

Implementation Details

  • Architectures: amd64
  • User: bsd (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).

Need help? Join our Discord community.