Introduction

If you've got a homelab running Proxmox VE, there's a good chance you're already hosting a few apps for your family — maybe Plex for movies, maybe Pi-hole for ad blocking. Mealie fits right into that same shelf. It's a self-hosted recipe manager that lets you import recipes from almost any cooking website with one click, build a weekly meal plan, and generate a shopping list without touching a phone app that mines your data.

This guide walks you through installing Mealie inside its own Linux container (LXC) on Proxmox VE. You don't need any Docker experience or networking background — we'll explain each piece as we go. By the end you'll have a working Mealie instance reachable from any device on your home network.

What You Will Learn

Here's what this tutorial covers, start to finish:

  • Creating a lightweight Debian 12 LXC container in Proxmox VE for running Docker workloads
  • Enabling the container features Docker actually needs to work inside an unprivileged LXC
  • Installing Docker Engine the same way Docker's own documentation recommends
  • Deploying Mealie with Docker Compose and setting up your first account
  • Fixing the handful of errors that trip up almost everyone the first time

What Is This Feature?

Mealie is an open-source recipe manager. You paste in a URL from a cooking blog and it scrapes out the ingredients, instructions, and photo automatically — no retyping a recipe by hand while your dinner burns. It also handles meal planning, a shared shopping list, and a searchable recipe book that your whole household can access from a browser or phone.

To run it, we're going to use an LXC container. An LXC (Linux Container) is a lightweight way to run an isolated Linux environment on your Proxmox host. Unlike a full virtual machine, it shares the host's kernel, so it starts in a couple of seconds and uses a fraction of the RAM and disk a VM would need for the same job.

Mealie itself ships as a Docker image, not something you install with apt. Docker is a tool for packaging an application together with everything it needs to run, so it behaves the same way regardless of what's underneath it. That means we'll install Docker inside the LXC container first, and then let Docker run Mealie for us.

You'll sometimes see Mealie installed through the Proxmox VE Community Scripts project instead, which offers a single command that builds the container and installs everything automatically. That's a fine shortcut once you've done it manually once. This tutorial goes the manual route on purpose — it's a bit slower, but you end up actually understanding what's running on your server instead of trusting a script you've never read.

Why Would You Use It?

Recipe apps on your phone are fine until the company behind them gets bought, adds a subscription tier, or just shuts down. That's happened more than once in this space. Running Mealie yourself means your recipe collection lives on your own hardware and nobody can paywall it later.

It's also just genuinely useful for a household. Everyone can add recipes from their own device, the meal planner shows what's for dinner across the week, and the grocery list updates automatically when you plan a meal. None of that requires the app maker's servers to be up.

Running it in an LXC container instead of a full VM keeps resource usage low. Mealie is not a heavy application — a container with 2 CPU cores and 2 GB of RAM handles a family's recipe collection without breaking a sweat, and it leaves the rest of your Proxmox host free for other projects.

Prerequisites

Before you start, make sure you have:

  • A working Proxmox VE host — this guide was written against Proxmox VE 8.x, but the steps also work on 9.x
  • At least 8 GB of free disk space on the storage you plan to use for the container
  • A Debian 12 (Bookworm) container template downloaded, or access to download one from the Proxmox web interface
  • Basic comfort typing commands into a terminal — you don't need to know what they do yet, we'll explain each one
  • Root or admin access to your Proxmox VE web interface

You don't need a domain name or SSL certificate for this tutorial. We'll access Mealie over your local network using its container IP address, which is the simplest way to get it running the first time.

Step-by-Step Tutorial

We'll build this in three stages: create the container, install Docker inside it, then deploy Mealie.

Step 1: Create the LXC Container

In the Proxmox web interface, click Create CT in the top right corner. Work through the wizard with these settings:

  • Hostname: something like mealie
  • Template: debian-12-standard
  • Disk: 8 GB is enough for a personal recipe collection; go to 16 GB if you plan to import hundreds of recipes with photos
  • CPU: 2 cores
  • Memory: 2048 MB, with 512 MB of swap
  • Network: DHCP is fine to start, or assign a static IP if that's how you manage your other containers

Leave the container as Unprivileged — there's no need to run Mealie as a privileged container, and unprivileged is the safer default. Finish the wizard but don't start the container yet.

Step 2: Enable Nesting

Docker needs a couple of kernel features that Proxmox doesn't turn on by default for unprivileged containers. Open a shell on your Proxmox host (not inside the container) and run:

pct set 115 --features nesting=1,keyctl=1

Replace 115 with your container's actual ID, which you'll see in the left sidebar. Nesting allows the container to run its own containers (which is exactly what Docker does), and keyctl gives it access to the kernel keyring that some Docker components expect. Skip this step and Docker will install fine but fail the moment you try to start a container inside it.

Step 3: Start the Container and Update It

Start the container from the web interface, then open its console. Run:

apt update && apt upgrade -y

This pulls the latest package lists and applies any pending updates on the fresh Debian install. It usually takes a minute or two on a fresh template.

Step 4: Install Docker Engine

Install the packages Docker's setup script needs, then add Docker's official repository:

apt install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

Now add the repository itself and install Docker:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Confirm it installed correctly:

docker --version

You should see something like Docker version 27.x. If that prints without an error, Docker is running and ready.

Step 5: Write the Mealie Compose File

Create a folder to keep things tidy, then create the compose file:

mkdir -p /opt/mealie
cd /opt/mealie
nano docker-compose.yml

Paste in the following:

services:
  mealie:
    image: ghcr.io/mealie-recipes/mealie:latest
    container_name: mealie
    restart: always
    ports:
      - "9000:9000"
    volumes:
      - mealie-data:/app/data/
    environment:
      ALLOW_SIGNUP: "true"
      TZ: "America/New_York"
      BASE_URL: "http://192.168.1.50:9000"

volumes:
  mealie-data:

Change TZ to your own time zone (this affects timestamps on recipes and meal plans) and set BASE_URL to whatever IP or hostname you'll actually use to reach it. Save the file and exit the editor.

Step 6: Launch Mealie

docker compose up -d

Docker pulls the Mealie image — around 300 MB on a fresh install — and starts the container in the background. Check that it's running:

docker ps

You should see a container named mealie with a status of "Up." Open a browser on any device on your network and go to http://<container-ip>:9000. You'll land on Mealie's setup screen, where you create your first user account and household.

Commands Explained

pct set 115 --features nesting=1,keyctl=1 changes the configuration of container ID 115 to enable two kernel-level features it needs to run Docker safely inside an unprivileged container. You only run this once, from the Proxmox host itself.

install -m 0755 -d /etc/apt/keyrings creates the directory where Docker's GPG signing key gets stored, with permissions that let any user read it but only root write to it. This is part of Docker's own official install instructions, not something specific to Proxmox.

docker compose up -d reads the docker-compose.yml file in the current directory and starts every service it defines — in our case, just Mealie — in detached mode, meaning it keeps running after you close the terminal.

docker ps lists every container Docker is currently running on this machine, along with its status, so you can quickly confirm Mealie started correctly instead of guessing.

Common Errors

A few things go wrong often enough that they're worth calling out before you hit them.

ErrorCauseFix
"Cannot connect to the Docker daemon"Nesting wasn't enabled before Docker was installedRun the pct set command from Step 2, then restart the container
Page won't load in the browserWrong IP address, or the container's firewall is blocking port 9000Confirm the container's IP with ip a inside the container, and check Proxmox's firewall rules if you've enabled one
"OSError: [Errno 30] Read-only file system"The named volume wasn't created properly, usually from running compose commands from the wrong directoryMake sure you're in /opt/mealie when you run docker compose commands
Recipe images never loadThe BASE_URL in the compose file doesn't match the address you're actually browsing toUpdate BASE_URL, run docker compose up -d again, and clear your browser cache

Troubleshooting

If Mealie's page loads but recipe imports keep failing, it's almost always the target website blocking automated requests rather than anything wrong with your setup — some cooking blogs actively fight scrapers. Try a different recipe URL to confirm before you assume something's broken.

If the container won't start Docker at all, check the container's log from the Proxmox host with:

pct exec 115 -- journalctl -u docker -n 50

This shows the last 50 lines of Docker's own service log, which usually names the exact permission or kernel feature it's missing. Nine times out of ten it traces back to nesting not being enabled.

If you changed BASE_URL after already creating your account, log out and back in — Mealie caches some URLs in the browser session and a stale one causes broken images or redirect loops.

Best Practices

Pin the Mealie image to a specific version tag instead of latest once you have a stable setup — something like ghcr.io/mealie-recipes/mealie:v2.1.0. That way an update to the image doesn't change your running instance until you decide to bump the version yourself.

Back up the mealie-data Docker volume, not just the LXC container. A Proxmox VE backup job on the container will capture it as part of the container's disk, which is usually enough, but if you ever move Mealie to a different container, you'll want that volume on its own.

Give the container a static IP once you're happy with it. DHCP is fine for testing, but a moving IP address becomes annoying the moment you bookmark the page on three different phones.

I'd also skip running Mealie as a privileged container — there's no feature in Mealie that needs it, and unprivileged containers limit the damage if something inside ever gets compromised.

If you eventually want to reach Mealie from outside your house, put a reverse proxy like Nginx Proxy Manager or Caddy in front of it rather than forwarding port 9000 straight through your router. That gets you a real domain name and HTTPS without exposing Mealie's raw port to the internet.

Frequently Asked Questions

Does Mealie need a lot of resources?
No. Two CPU cores and 2 GB of RAM is comfortable for a household's recipe collection. You can go lower, but imports and searches will feel sluggish.

Can I access Mealie from outside my home network?
Yes, but you'll want a reverse proxy with HTTPS in front of it rather than exposing port 9000 directly to the internet. That's outside the scope of this tutorial.

Do I need a privileged container to run Docker?
No. Enabling nesting and keyctl on an unprivileged container is enough for Docker to run normally.

Will Mealie work on Proxmox VE 9.x?
Yes, the container creation and pct set commands work the same way on both 8.x and 9.x.

Can I import my existing recipes from another app?
Mealie supports importing from a handful of formats, including generic JSON and Paprika exports, through its settings page after setup.

What happens if I stop or delete the container by accident?
As long as the mealie-data volume survives, your recipes are safe — you can recreate the container, run docker compose up -d again, and everything comes back. Deleting the volume itself is the only thing that actually loses data.

Is Mealie free?
Yes, Mealie is open source and free to run. There's no subscription tier or paid version hiding behind a feature you'll eventually need.

Conclusion

You've now got a working Mealie instance running in its own lightweight container, completely separate from anything else on your Proxmox host. From here, the next natural steps are setting up a reverse proxy if you want a real domain name, and adding the container to your regular Proxmox backup schedule so your recipe collection is as safe as the rest of your homelab.