Mealie в Docker Compose: готовый файл
Рецепты в закладках браузера, скриншотах и пятнадцати вкладках с блогами — знакомая картина, если готовите регулярно. Mealie решает это одним self-hosted сервисом: парсит рецепт по ссылке, строит меню на неделю и сам собирает список покупок. Ниже — рабочий docker-compose.yml, который можно поднять за 10 минут на своём VPS, без танцев с зависимостями и без чужого облака, которое видит содержимое вашего холодильника.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что Mealie умеет и почему его стоит держать на своём сервере
Mealie — открытый (MIT) менеджер рецептов на FastAPI + Vue, заточенный именно под домашнее использование: один сервис закрывает хранение рецептов, планирование меню и списки покупок, вместо трёх разных приложений.
Из практического:
- Импорт по URL — вставляете ссылку на рецепт с почти любого кулинарного сайта, Mealie сам парсит ингредиенты, шаги и фото через встроенный scraper (на базе
recipe-scrapers). - Импорт из фото/скана — можно сфотографировать рецепт из бумажной книги и распознать текст (нужен OCR-бэкенд, ниже разберём).
- Планировщик меню — календарь на неделю/месяц, куда перетаскиваются рецепты.
- Список покупок — генерируется автоматически из выбранных на неделю рецептов, с группировкой по категориям и вычётом того, что уже есть под рукой.
- Мультипользовательность — семья или соседи по квартире заходят под своими логинами в один инстанс.
Почему свой сервер, а не приложение из стора: данные (в том числе фото еды и привычки питания) остаются у вас, нет платной подписки за "премиум"-фичи, и один и тот же Mealie доступен и с телефона, и с планшета на кухне, и с ноутбука — через обычный браузер по вашему домену. Ресурсы сервису нужны скромные: для семьи из 2-5 человек хватает 1 vCPU и 1-2 ГБ RAM, PostgreSQL и фото рецептов добавят места на диск, поэтому диск стоит брать с запасом — от 20 ГБ, если планируете хранить оригиналы фотографий блюд.
Готовый docker-compose.yml
Mealie может работать на встроенном SQLite (проще, для одного пользователя или маленькой семьи) или на PostgreSQL (надёжнее при нескольких активных пользователях и регулярных бэкапах через pg_dump). Ниже — сразу вариант с PostgreSQL, он больше подходит для боевого сервера.
Создайте рабочую директорию и файл:
mkdir -p /opt/mealie/{data,pg-data}
cd /opt/mealie
nano docker-compose.yml
Содержимое docker-compose.yml:
services:
mealie-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: mealie
POSTGRES_PASSWORD: CHANGE_ME_STRONG_PASSWORD
POSTGRES_DB: mealie
volumes:
- ./pg-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U mealie"]
interval: 10s
timeout: 5s
retries: 5
mealie:
image: ghcr.io/mealie-recipes/mealie:v2
restart: unless-stopped
depends_on:
mealie-db:
condition: service_healthy
ports:
- "127.0.0.1:9925:9000"
volumes:
- ./data:/app/data
environment:
TZ: Europe/Moscow
BASE_URL: https://mealie.example.com
ALLOW_SIGNUP: "false"
DB_ENGINE: postgres
POSTGRES_USER: mealie
POSTGRES_PASSWORD: CHANGE_ME_STRONG_PASSWORD
POSTGRES_SERVER: mealie-db
POSTGRES_PORT: 5432
POSTGRES_DB: mealie
MAX_WORKERS: 1
WEB_CONCURRENCY: 1
Пара моментов, о которых легко забыть:
- Пароль в двух местах — у
mealie-dbи уmealieон должен совпадать буквально. Разъедутся — сервис не поднимется, в логах будет ошибка аутентификации к БД. - Порт наружу закрыт сознательно —
127.0.0.1:9925:9000пробрасывает Mealie только на localhost. Наружу его отдаёт reverse proxy по HTTPS (раздел ниже), а порт 9925 можно поменять на любой свободный. - BASE_URL обязателен, если сервис будет за прокси — без него ссылки на изображения и API-запросы из веб-интерфейса иногда ломаются.
- Тег образа
v2тянет актуальный патч мажорной второй ветки — перед продакшн-запуском стоит явно проверить в реестре образов, какая версия сейчас за этим тегом, и при желании зафиксировать точный тег (v2.x.y), чтобы обновления не прилетали без вашего ведома.
Если хочется совсем минимальный вариант без PostgreSQL (SQLite, один сервис), достаточно убрать блок mealie-db и переменные DB_ENGINE/POSTGRES_* — Mealie по умолчанию создаст SQLite-базу прямо в /app/data.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверЗапуск и первичная настройка
Поднимаем стек:
docker compose up -d
docker compose logs -f mealie
Дождитесь строки о старте Uvicorn/Gunicorn без ошибок подключения к БД, затем откройте http://ваш-IP:9925 (или домен, если reverse proxy уже настроен). Учётные данные администратора по умолчанию:
Email: changeme@example.com
Password: MyPassword
Первым делом — заходите под этими данными и сразу меняете email и пароль в разделе профиля. Оставлять дефолтные креды даже на пару часов не стоит: Mealie смотрит в интернет, и сканеры находят открытые панели быстро.
Дальше в настройках группы (Group Settings) имеет смысл сразу:
- отключить публичную регистрацию, если
ALLOW_SIGNUPпочему-то включили; - завести отдельных пользователей для каждого члена семьи вместо одного общего логина — так понятно, кто что добавил в список покупок;
- настроить единицы измерения (метрические/имперские) — это глобальная настройка группы, задать её стоит сразу, чтобы потом не переписывать рецепты.
Импорт рецептов: по ссылке, из фото и из других приложений
Самый быстрый способ наполнить базу — импорт по URL. В разделе "Рецепты" → "Создать" → "Импорт по ссылке" вставляете адрес страницы, Mealie обращается к сайту, парсит микроразметку (schema.org/Recipe, которую используют почти все крупные кулинарные ресурсы) и заполняет карточку: ингредиенты, шаги, время готовки, фото. Проверить и подправить результат вручную всё равно стоит — парсер иногда путает единицы измерения или не различает шаги, разбитые нестандартной вёрсткой.
Импорт из фото/скана требует OCR-модуля — Mealie умеет отправлять изображение на распознавание текста через сторонний сервис (например, самостоятельно поднятый Tesseract-совместимый бэкенд) и предзаполнять форму рецепта текстом. Настраивается это отдельно в конфиге группы и без готового OCR-сервера не заработает "из коробки" — если распознавание фото не критично, этот шаг можно смело пропустить и вводить рецепты из бумажных книг вручную.
Если раньше пользовались другим менеджером рецептов, посмотрите в настройках миграции (Group → Migrations) — Mealie умеет импортировать данные из некоторых популярных форматов экспорта. Список поддерживаемых источников меняется от версии к версии, поэтому перед миграцией стоит свериться с документацией конкретно вашей версии образа, а не полагаться на память.
Планирование меню и автоматический список покупок
Практическая польза Mealie начинается не с базы рецептов, а с планировщика. Логика простая:
- Открываете раздел "Планировщик меню" (Meal Plan).
- Перетаскиваете рецепты на нужные дни недели — можно на завтрак/обед/ужин отдельно, если такая детализация нужна.
- Нажимаете "Создать список покупок из плана" — Mealie проходит по всем ингредиентам выбранных рецептов, суммирует одинаковые позиции (например, лук из трёх разных рецептов схлопнется в одну строку) и раскладывает по категориям магазина.
- Список покупок открывается как отдельная страница/PWA-виджет на телефоне — вычёркиваете купленное прямо в магазине, изменения синхронизируются у всех, у кого есть доступ к этому списку.
Отдельно полезна функция "Что приготовить из того, что есть" — если вести учёт продуктов в разделе Foods/Pantry (это отдельная, не обязательная фича), Mealie может подсказывать рецепты, для которых почти все ингредиенты уже есть в доме. Ведение инвентаря продуктов вручную требует дисциплины и подходит не всем — часто проще ограничиться связкой "меню → список покупок" без детального учёта остатков.
HTTPS через reverse proxy, бэкапы и автообновление
Без HTTPS панель Mealie отдаёт логин и пароль открытым текстом при заходе не с localhost — для сервиса, доступного из интернета, это неприемлемо. Проще всего поднять Traefik или Nginx Proxy Manager перед контейнером Mealie — контейнер уже слушает только 127.0.0.1:9925, так что reverse proxy останется единственной точкой входа снаружи. Как именно завести Traefik перед docker-контейнерами, подробно разобрано в статье Traefik как reverse proxy для Docker — оттуда можно взять готовые labels и подключить их к сервису mealie в этом же compose-файле.
Бэкапы — обязательный пункт, если не хотите потерять годами собранную коллекцию рецептов из-за упавшего диска. Бэкапить нужно два места: том ./data (фото, вложения) и базу PostgreSQL. Для базы:
docker compose exec mealie-db pg_dump -U mealie mealie | gzip > /opt/mealie/backups/mealie-$(date +%F).sql.gz
Добавьте это в cron раз в сутки и храните копии не только на самом сервере, но и снаружи — например, через restic в объектное хранилище. Готовая схема с шифрованием и ретеншеном разобрана в статье Restic в Docker Compose: готовый файл.
Автообновление образа Mealie через Watchtower — вариант скорее для тестового стенда, чем для продакшена: мажорные версии иногда меняют переменные окружения или структуру базы, и слепое авто-обновление может однажды сломать вход. Если всё же используете автообновление на других сервисах, стоит заранее знать про типичные грабли — они разобраны в статье Автообновление Watchtower на сервере: частые ошибки и решения. Для Mealie надёжнее обновлять образ руками: смотреть changelog конкретного релиза, снимать бэкап базы и только потом делать docker compose pull && docker compose up -d.
Если поднимаете этот стек не в первый раз и хотите общий чек-лист production-настройки Docker Compose на VPS — от firewall до ограничения ресурсов контейнеров, — он есть в статье Docker Compose для продакшена на Ubuntu 24.04: пошаговая установка.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Мешает ли отсутствие GPU или мощного CPU работе Mealie?
Нет, сервис не использует нейросети для основной работы — парсинг рецептов и планировщик легко тянет 1 vCPU. GPU нужен только если самостоятельно подключаете тяжёлые OCR/AI-модули сверху, что не входит в базовую поставку.
Можно ли перейти с SQLite на PostgreSQL позже, без потери данных?
Прямой миграции "на лету" между движками БД нет, есть только экспорт/импорт данных группы через встроенные функции резервного копирования Mealie — экспортируете данные из SQLite-инстанса, поднимаете новый на PostgreSQL и импортируете обратно.
Сколько человек может одновременно пользоваться одним инстансом?
Технических ограничений на число пользователей в группе нет — упирается только в ресурсы сервера. Для семьи из 5-10 человек 1-2 vCPU и 2 ГБ RAM достаточно с запасом.
Нужен ли отдельный домен для Mealie или хватит поддомена?
Хватит поддомена вида mealie.вашдомен.ru — это даже удобнее, чем отдельный домен: проще выпускать сертификат Let's Encrypt через тот же reverse proxy, что и для других self-hosted сервисов на одном VPS.
Что будет, если забыть пароль администратора?
Пароль можно сбросить напрямую через переменные окружения при следующем запуске контейнера или через CLI-команду сброса пароля внутри контейнера — точный набор шагов зависит от версии, поэтому стоит свериться с документацией установленного релиза перед тем, как что-то менять руками в базе.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →