MAATRIX / Блог / Как установить и настроить Tandoor Recipes на VPS

Как установить и настроить Tandoor Recipes на VPS

MAATRIX

Если вы уже пробовали Mealie и уперлись в то, что там неудобно вести подробный учёт КБЖУ или раскладывать рецепты по «книгам» — семейная, праздничная, спортивное питание — то Tandoor Recipes закрывает именно эти пробелы. Это тоже self-hosted менеджер рецептов, но с более глубокой моделью данных: нутриенты на ингредиент и на порцию, произвольные книги, общий доступ по ролям, планировщик меню со списком покупок. Ниже — рабочий способ поднять его на VPS через Docker Compose, с доменом, HTTPS и бэкапами.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Чем Tandoor отличается от Mealie и когда он оправдан

Mealie проще в установке и достаточно для базового «храню рецепты + список покупок». Tandoor берёт больше функциональности ценой чуть более сложной установки (отдельный контейнер под воркер и планировщик задач, обязательный Postgres, а не SQLite «из коробки»):

  • КБЖУ на уровне ингредиента. Можно задать граммовку, привязать нутриенты к продукту один раз и дальше калорийность блюда считается автоматически при пересчёте порций.
  • Книги рецептов (books). Рецепты раскладываются по произвольным коллекциям — не просто теги, а отдельные сущности со своей обложкой и порядком.
  • Пространства (spaces) и роли. Если сервером пользуется несколько семей или вы делаете общий доступ друзьям — Tandoor разруливает это нативно, без костылей с отдельными инсталляциями.
  • Импорт из других систем. Есть парсеры под десятки сайтов с рецептами и импорт из Mealie/Paprika/Nextcloud Cookbook — миграция не с нуля.

Если вам хватает простого списка рецептов без нутриентов — сравните оба варианта в статье про установку Mealie на VPS перед тем, как тратить время на более тяжёлый стек Tandoor.

Требования к серверу

Tandoor — это Django-приложение (gunicorn), Postgres, Redis для кэша и очередей, плюс отдельный контейнер-планировщик для фоновых задач (пересчёт нутриентов, чистка старых файлов, плановые бэкапы). На один-два домохозяйства этого достаточно:

РесурсМинимумКомфортно
CPU1 vCPU2 vCPU
RAM1 GB2 GB
Диск10 GB SSD20+ GB SSD (с ростом библиотеки фото)
ОСUbuntu 22.04/24.04Ubuntu 24.04

Основной аппетит по диску даёт папка с фотографиями блюд и импортированными PDF — на 500-1000 рецептов с картинками закладывайте 5-10 GB сверху. Если параллельно крутите ещё пару сервисов на том же VPS (Nextcloud, домашний DNS), берите план от 4 GB RAM с запасом.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Подготовка: Docker и Docker Compose

Если Docker ещё не стоит — ставим стандартно:

sudo apt update && sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER

Перелогиньтесь (или newgrp docker), проверьте docker compose version. Если вы ставите Docker впервые на этой машине — у нас есть подробный разбор установки Docker с нуля со всеми нюансами systemd и прав.

Установка Tandoor через Docker Compose

Официальный и самый предсказуемый способ — брать docker-compose.yml из репозитория проекта, а не собирать конфиг вручную: там уже прописаны зависимости между контейнерами (db → web → worker/scheduler) и правильные healthcheck'и.

mkdir -p /opt/tandoor && cd /opt/tandoor
curl -LO https://raw.githubusercontent.com/TandoorRecipes/recipes/develop/docker-compose.yml
curl -LO https://raw.githubusercontent.com/TandoorRecipes/recipes/develop/.env.template
mv .env.template .env

Проверьте на GitHub-странице проекта актуальную ветку и имя файла окружения перед копированием — в развивающемся проекте названия временами меняются между релизами, слепо копировать команды из старых гайдов (включая этот) не стоит.

Откройте .env и задайте обязательные параметры:

SECRET_KEY=сгенерируйте-длинную-случайную-строку
POSTGRES_PASSWORD=сложный-пароль-для-бд
DB_ENGINE=django.db.backends.postgresql
ALLOWED_HOSTS=*
TIMEZONE=Europe/Moscow
TANDOOR_PORT=8080

SECRET_KEY сгенерируйте отдельно, не оставляйте значение из шаблона:

openssl rand -base64 48

ALLOWED_HOSTS=* подходит для первого запуска и локальной проверки; после того как повесите домен — замените на конкретное имя (recipes.example.com), это базовая гигиена, а не опция для галочки.

Поднимаем стек:

docker compose up -d
docker compose ps

Через минуту-две (Postgres должен успеть проинициализироваться, а web — прогнать миграции) сервис откликнется на http://IP_сервера:8080. Первая учётная запись создаётся прямо в веб-интерфейсе при первом заходе — форма регистрации администратора, без отдельной команды createsuperuser, как это принято у некоторых других self-hosted проектов.

Первая настройка: пространство, книги, КБЖУ

После регистрации администратора зайдите в Settings → Spaces и проверьте лимиты пространства (по умолчанию не ограничены — это нормально для личного сервера, но при мультипользовательской установке стоит выставить квоты на пользователя).

Для нутриентов:

  1. Settings → Food — включите отображение полей нутриентов в карточке ингредиента.
  2. При добавлении продукта заполните калории, белки, жиры, углеводы на 100 г — дальше Tandoor сам пересчитывает итог блюда при изменении граммовки в рецепте.
  3. В Meal Plan нутриенты по дню суммируются автоматически по всем запланированным приёмам пищи — удобно, если ведёте расчёт калорийности для семьи, а не только для одного человека.

Книги создаются в разделе Books: заводите отдельную книгу под тип кухни, повод (праздничный стол) или диету, и уже потом раскидываете туда рецепты через тег «add to book» на странице рецепта. Импорт существующей библиотеки — Import → Source поддерживает пакетный импорт по URL-списку и загрузку файлов (в том числе экспорт из Mealie в формате JSON, если мигрируете).

Обратный прокси, HTTPS и бэкапы

Открывать 8080-й порт напрямую в интернет не стоит — заведите домен и TLS через reverse-proxy. Проще всего через Caddy с автоматическим сертификатом:

recipes.example.com {
    reverse_proxy localhost:8080
}

Если сомневаетесь между Caddy и nginx — мы разбирали разницу в статье Caddy или nginx: что выбрать для сервера. После того как HTTPS заработал, вернитесь в .env и сузьте ALLOWED_HOSTS до реального домена, перезапустив стек (docker compose up -d подхватит изменения).

Бэкап — это дамп базы плюс папка с медиафайлами (фото рецептов), обе части нужны вместе:

# дамп базы
docker compose exec db pg_dump -U tandoor tandoor > /opt/tandoor-backups/db-$(date +%F).sql

# медиафайлы (путь зависит от того, как смонтирован volume в вашем docker-compose.yml)
docker run --rm -v tandoor_mediafiles:/data -v /opt/tandoor-backups:/backup \
  alpine tar czf /backup/media-$(date +%F).tar.gz -C /data .

Заверните это в cron и храните копии вне сервера (S3-совместимое хранилище, другой VPS). Общие грабли и разбор частых ошибок при бэкапе Docker-томов — в статье про бэкап Docker volume на сервере. Если решите переехать на более мощный тариф — процесс переноса самого стека описан в материале как перенести Docker-проект на другой сервер: по сути это тот же дамп базы плюс копирование volume, только на другую машину.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Tandoor тяжелее Mealie по ресурсам?

Да, заметно: обязательный Postgres вместо SQLite, отдельный контейнер под фоновые задачи и Redis добавляют накладные расходы. На 1 GB RAM Tandoor будет работать на грани, комфортный минимум — 2 GB.

Можно ли обойтись без Redis?

По умолчанию compose-файл проекта включает Redis для кэша и очереди задач планировщика — отключать его не рекомендуется, это скорее сломает импорт по расписанию и фоновый пересчёт, чем сэкономит заметные ресурсы.

Как обновить Tandoor на новую версию?

Скачайте свежий docker-compose.yml (или обновите тег образа, если фиксировали версию вручную), затем docker compose pull && docker compose up -d. Перед обновлением обязательно снимите дамп базы — миграции между мажорными версиями иногда необратимы.

Поддерживается ли многопользовательский доступ с разными правами?

Да, через Spaces и роли (admin/user/guest) внутри пространства — можно дать гостю доступ только на просмотр, не открывая редактирование.

Что делать, если после docker compose up -d контейнер web постоянно перезапускается?

Чаще всего причина — не готова база на момент подключения или неверный POSTGRES_PASSWORD в .env. Проверьте docker compose logs web и docker compose logs db, убедитесь, что пароль в обоих местах (сервис db и переменная подключения web) совпадает дословно.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →