Tandoor Recipes в Docker Compose: готовый файл
Семейный архив рецептов рано или поздно перерастает заметки в блокноте и закладки в браузере: нужен поиск по ингредиентам, расчёт КБЖУ на порцию, список покупок и общий доступ для всей семьи. Mealie закрывает базовые сценарии, но если вам нужны книги рецептов, гибкие теги, учёт питательной ценности и более развитое планирование меню — присмотритесь к Tandoor Recipes. Ниже — рабочий docker-compose.yml, который поднимает Tandoor со своей PostgreSQL за 10 минут на вашем VPS.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему Tandoor, а не Mealie
Обе системы — self-hosted менеджеры рецептов с открытым кодом, и обе неплохо справляются с базовой задачей: хранить рецепт, добавить в список покупок, спланировать меню на неделю. Разница проявляется на объёме и в деталях.
| Критерий | Tandoor Recipes | Mealie |
|---|---|---|
| КБЖУ и нутриенты | Подробный расчёт по ингредиентам, единицы измерения | Базовый, менее гибкий |
| Книги рецептов | Есть — можно группировать в отдельные "книги" | Нет отдельной сущности, только теги |
| Импорт рецептов | Парсер с сотнями сайтов, ручной ввод, PDF | Похожий парсер, чуть уже список источников |
| Планировщик меню | Календарь + автогенерация списка покупок | Есть, попроще интерфейс |
| Мультипользовательский доступ | Пространства (spaces) с разными правами | Группы и роли пользователей |
| База данных | PostgreSQL (обязательна) | SQLite из коробки или Postgres |
| Кривая освоения | Выше — больше настроек и разделов в UI | Ниже, интерфейс компактнее |
Если вам достаточно списка рецептов и меню на неделю — Mealie быстрее развернуть, у нас есть отдельный разбор: как установить и настроить Mealie на VPS. Если же вы ведёте питание с расчётом калорий, собираете тематические книги (десерты, выпечка, диета) или админите доступ нескольким семьям/друзьям на одном сервере — Tandoor удобнее именно за счёт этой детализации.
Минус у Tandoor один, но заметный: PostgreSQL обязателен, SQLite-режима нет, поэтому и compose-файл на один контейнер длиннее, чем у Mealie.
Что потребуется от сервера
Tandoor — не тяжёлое приложение, но Django-бэкенд, Postgres, Redis для очередей (используется для фоновых задач вроде импорта рецептов) и статика съедают больше памяти, чем кажется на первый взгляд.
- CPU: 1-2 vCPU достаточно для семейного использования и небольшой группы (до 10-15 активных пользователей).
- RAM: минимум 2 ГБ, комфортно — 4 ГБ, особенно если параллельно крутится Traefik/Nginx Proxy Manager и другие сервисы на том же хосте.
- Диск: 10-20 ГБ под систему + контейнеры, плюс место под фото рецептов — на каждую сотню рецептов с фотографиями закладывайте 1-2 ГБ.
- ОС: Ubuntu 24.04 LTS или Debian 12 — на обеих Docker ставится одинаково просто, инструкция здесь: установка Docker с нуля на Ubuntu 24.04.
Для локации подойдёт любой из трёх регионов — RU, US или UK: сервис не чувствителен к задержкам, важнее удобство оплаты и близость к тем, кто будет пользоваться сервисом. Если рецептами пользуется семья в России, логичнее взять RU-локацию — быстрее отдаёт фотографии и интерфейс.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГотовый docker-compose.yml
Создайте директорию проекта и файл окружения:
mkdir -p ~/tandoor && cd ~/tandoor
mkdir -p postgresql mediafiles staticfiles
Файл .env — сюда выносим пароли и секреты, чтобы не хардкодить их в compose:
cat > .env <<'EOF'
POSTGRES_PASSWORD=замените_на_свой_сложный_пароль
SECRET_KEY=замените_на_случайную_строку_50_символов
TANDOOR_PORT=8085
TIMEZONE=Europe/Moscow
EOF
Секрет проще всего сгенерировать командой:
openssl rand -base64 48
Сам docker-compose.yml:
services:
db_recipes:
image: postgres:16-alpine
restart: unless-stopped
volumes:
- ./postgresql:/var/lib/postgresql/data
environment:
- POSTGRES_USER=tandoor
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=tandoor
healthcheck:
test: ["CMD-SHELL", "pg_isready -U tandoor"]
interval: 10s
timeout: 5s
retries: 5
web_recipes:
image: vabene1111/recipes:latest
restart: unless-stopped
depends_on:
db_recipes:
condition: service_healthy
ports:
- "${TANDOOR_PORT}:80"
volumes:
- ./staticfiles:/opt/recipes/staticfiles
- ./mediafiles:/opt/recipes/mediafiles
environment:
- SECRET_KEY=${SECRET_KEY}
- TIMEZONE=${TIMEZONE}
- DB_ENGINE=django.db.backends.postgresql
- POSTGRES_HOST=db_recipes
- POSTGRES_PORT=5432
- POSTGRES_USER=tandoor
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=tandoor
- ALLOWED_HOSTS=*
- GUNICORN_MEDIA=1
- REVERSE_PROXY_AUTH=0
Запускаем:
docker compose up -d
docker compose logs -f web_recipes
При первом старте контейнер сам прогонит миграции Django и соберёт статику — это может занять минуту-полторы. Дождитесь строки о запуске gunicorn, затем открывайте http://ваш-ip:8085 — увидите форму создания первого пользователя (он же станет администратором).
Настройка после установки
Первое, что стоит сделать после входа под админом — создать пространство (Space). Tandoor устроен так, что каждое пространство изолирует рецепты, книги и пользователей друг от друга: удобно, если сервер будет обслуживать не одну семью, а несколько независимых групп.
Дальше — базовая настройка:
- Единицы измерения. В разделе Data откройте Units и проверьте, что нужные вам единицы (граммы, мл, штуки, щепотка) присутствуют — по умолчанию их набор уже достаточно полный, но для нацкухонь иногда не хватает специфичных.
- Импорт существующих рецептов. Tandoor умеет парсить структурированные данные (schema.org/Recipe) с сотен кулинарных сайтов — просто вставьте URL в разделе Import. Для сайтов без разметки остаётся ручной ввод или вставка текста с последующей разбивкой на ингредиенты.
- КБЖУ. Заполните пищевую ценность для базовых ингредиентов один раз (Data → Food → выбрать продукт → Nutrition) — дальше Tandoor будет автоматически считать калорийность порции в рецептах, где эти продукты использованы.
- Книги рецептов. В разделе Books создайте тематические подборки — например, "Завтраки", "На случай гостей", "Диета 1800 ккал". Рецепт может входить сразу в несколько книг.
Список покупок собирается из недельного плана меню автоматически и группируется по категориям продуктов — это удобнее, чем вручную вычёркивать позиции из бумажного списка.
HTTPS и домен
По умолчанию Tandoor слушает HTTP на порту из .env — этого достаточно для локальной проверки, но для постоянного использования (особенно с мобильного, вне домашней сети) нужен HTTPS. Проще всего повесить перед контейнером reverse-proxy, который сам получит и обновит сертификат Let's Encrypt.
Если ещё не определились с инструментом — у нас есть сравнение: Traefik или Nginx Proxy Manager — что выбрать для сервера. Кратко: NPM удобнее для одного-двух сервисов через веб-интерфейс без единой строчки конфига, Traefik — если сервисов на сервере уже десяток и хочется автоматики через docker-labels.
Пример для Traefik — добавьте к сервису web_recipes labels и подключите его к внешней сети прокси:
labels:
- "traefik.enable=true"
- "traefik.http.routers.tandoor.rule=Host(`recipes.вашдомен.ru`)"
- "traefik.http.routers.tandoor.entrypoints=websecure"
- "traefik.http.routers.tandoor.tls.certresolver=letsencrypt"
- "traefik.http.services.tandoor.loadbalancer.server.port=80"
networks:
- proxy
- default
networks:
proxy:
external: true
После подключения домена не забудьте убрать проброс ports наружу у web_recipes (оставьте только для отладки) и переключить ALLOWED_HOSTS в .env/environment на конкретный домен вместо *.
Бэкапы
Данные Tandoor живут в двух местах: база PostgreSQL (рецепты, пользователи, планы меню) и папка mediafiles (фотографии блюд). Бэкапить нужно оба.
Дамп базы вручную:
docker compose exec db_recipes pg_dump -U tandoor tandoor > tandoor_$(date +%F).sql
Простой скрипт для cron — дамп базы плюс архив медиафайлов раз в сутки с хранением недели:
#!/bin/bash
BACKUP_DIR=~/tandoor/backups
mkdir -p "$BACKUP_DIR"
cd ~/tandoor
docker compose exec -T db_recipes pg_dump -U tandoor tandoor | gzip > "$BACKUP_DIR/db_$(date +%F).sql.gz"
tar czf "$BACKUP_DIR/media_$(date +%F).tar.gz" mediafiles
find "$BACKUP_DIR" -type f -mtime +7 -delete
Добавьте в crontab (crontab -e):
0 3 * * * /home/youruser/tandoor/backup.sh >> /var/log/tandoor-backup.log 2>&1
Если хотите более серьёзную схему с версионированием и дедупликацией вместо простых gzip-архивов — посмотрите готовый вариант на BorgBackup: BorgBackup в Docker Compose, его несложно направить на те же директории postgresql и mediafiles.
Обновление и обслуживание
Tandoor развивается активно, релизы выходят регулярно — обновление образа стандартное:
docker compose pull
docker compose up -d
docker compose logs -f web_recipes
Миграции базы применяются автоматически при старте контейнера, откатывать вручную ничего не нужно — но перед крупным обновлением (смена мажорной версии в тегах образа) всё равно сделайте дамп базы, это минута времени против риска потерять годовой архив рецептов.
Если не хотите следить за обновлениями руками, Watchtower умеет проверять и подтягивать новые образы по расписанию — как его настроить, есть отдельная статья: автообновление Watchtower на сервере. Для домашнего/семейного сервиса это разумный компромисс между свежестью версии и риском внезапного breaking change — просто держите бэкапы актуальными на случай отката.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли перенести рецепты из Mealie в Tandoor?
Прямого импорта между двумя системами нет. Рабочий путь — экспортировать рецепты из Mealie в формате JSON/Markdown и завести в Tandoor через раздел Import вручную или через API; для полусотни рецептов это час работы, для нескольких сотен стоит написать небольшой скрипт под конкретный формат экспорта.
Нужен ли обязательно Redis?
В официальном compose-файле Tandoor Redis используется для фоновых задач (например, массовый импорт по расписанию) и кеша сессий. Для личного/семейного использования на 1-2 vCPU можно обойтись без него — приложение и без Redis работает стабильно, просто часть фоновых операций выполняется синхронно, чуть медленнее на больших импортах.
Работает ли на Raspberry Pi/ARM?
Официальный образ vabene1111/recipes собирается под arm64, так что на ARM-серверах и Raspberry Pi 4+ Tandoor запускается штатно — но производительность парсинга и генерации миниатюр фотографий будет заметно ниже, чем на x86 VPS.
Как ограничить доступ снаружи, если сервис только для семьи?
Проще всего не пробрасывать порт наружу вовсе и поднять WireGuard между устройствами семьи и сервером, либо закрыть reverse-proxy базовой авторизацией (Traefik/NPM это умеют) поверх штатной авторизации самого Tandoor.
Что будет с фотографиями рецептов при обновлении образа?
Ничего — они хранятся в volume mediafiles, который не пересоздаётся при docker compose pull && up -d. Потерять их можно только явной командой docker compose down -v или ручным удалением директории, так что при обычном обновлении можно не переживать.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →