Intuitive self-hosted recipe management app designed to be the best recipe management experience on the web.
| Port | 9000 |
| Registry | ghcr.io/daemonless/mealie |
| Source | https://github.com/mealie-recipes/mealie |
| Website | https://mealie.io/ |
| Tag | Description | Best For |
|---|---|---|
latest |
Upstream Binary. Built from official release. | Most users. Matches Linux Docker behavior. |
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.
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.env:
# .env
DIRECTOR_PROJECT=mealie
BASE_URL=http://localhost:9000
PUID=1000
PGID=1000
TZ=UTC
appjail-director.yml:
# 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
volumes:
mealie:
device: '/path/to/containers/mealie'Makejail:
# Makejail
ARG tag=latest
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/mealie:${tag}
Note: Exposing ports in AppJail means that your service can be reached from remote hosts. If that is not your intention, do not expose the ports and communicate with the service using the IPv4 address assigned by the virtual network.
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:latestappjail 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 mealieNote: Exposing ports in AppJail means that your service can be reached from remote hosts. If that is not your intention, do not expose the ports and communicate with the service using the IPv4 address assigned by the virtual network.
- 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"Access at: http://localhost:9000
| 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 |
| Path | Description |
|---|---|
/config |
Data directory (database, images) |
| Port | Protocol | Description |
|---|---|---|
9000 |
TCP | Web UI |
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:@MEALIE_PORT@
- PUID=@PUID@
- PGID=@PGID@
- TZ=@TZ@
- DB_ENGINE=postgres
- POSTGRES_USER=mealie
- POSTGRES_PASSWORD=changeme
- POSTGRES_SERVER=localhost
- POSTGRES_PORT=5432
- POSTGRES_DB=mealie
volumes:
- "@CONTAINER_CONFIG_ROOT@/@MEALIE_CONFIG_PATH@:/config"
ports:
- "@MEALIE_PORT@: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:
- "@CONTAINER_CONFIG_ROOT@/mealie-postgres:/config"
network_mode: host
restart: unless-stoppedNote: With network_mode: host, use localhost for POSTGRES_SERVER.
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:
# 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 mealieSee daemonless/postgres README for details.
Architectures: amd64
User: bsd (UID/GID via PUID/PGID, defaults to 1000:1000)
Base: FreeBSD 15.1-latest
Need help? Join our Discord community.