Проверен полностью8 703

Еда и кулинария

Tandoor

Tandoor хранит домашние рецепты с ингредиентами, шагами приготовления и фотографиями, планирует блюда в календаре и превращает меню в общие списки покупок. Рецепт запускает Tandoor с PostgreSQL, постоянными медиафайлами и пересоздаваемой статикой; внешние AI-сервисы и хранилища необязательны и не настроены.

Вместо Paprika Recipe ManagerВместо Recipe KeeperВместо AnyListLicenseRef-AGPL-3.0-with-Commons-ClauseВерсия 2.7.2

Обзор

Tandoor

Tandoor хранит домашние рецепты с ингредиентами, шагами приготовления, фотографиями и книгами рецептов, планирует меню в календаре и ведёт общие списки покупок. Он подходит семье, которая хочет готовить по общей коллекции на своём сервере. Приложение заменяет часть возможностей Paprika Recipe Manager, Recipe Keeper и AnyList, но не включает их платные клиенты и облачные сервисы. По сравнению с Mealie это другой подход к организации рецептов, меню и покупок, с другой лицензией.

Tandoor — source-available, а не одобренное OSI открытое ПО. Его лицензия — GNU AGPL v3 с ограничением продажи Commons Clause. Личное и внутреннее использование разрешено, однако лицензия не предоставляет право продавать ПО и услуги, ценность которых существенно основана на нём, включая хостинг и связанные консультации или поддержку. До предложения услуг изучите саму лицензию. Файлы рецепта установки — MIT; исходные уведомление и лицензия логотипа сохранены в assets/NOTICE и assets/LICENSE.

Рецепт использует официальный образ Tandoor 2.7.2, PostgreSQL 18.6 и помощник Alpine 3.22.2 для инициализации и архивов. Образ включает Nginx и Gunicorn; приложение работает от UID/GID 65534. Инициализация готовит только корни томов медиа и статики. База и медиа постоянны, а статика пересоздаётся из закреплённого образа при запуске. Внешние AI-провайдеры, хранилища, социальный вход и SMTP не настроены.

Веб-интерфейс поддерживает русский и английский. Официальный список связанных проектов содержит сторонний клиент kitshn для Android и iOS; здесь он не устанавливается и не проверяется. Настольного клиента в рецепте нет. Untare обозначен upstream как прекративший развитие и не рекомендуется как основной мобильный вариант.

Локальный вход по имени и паролю использует браузерный API аутентификации. Встроенные провайдеры django-allauth поддерживают OIDC и SAML; также существует режим заголовка пользователя от прокси. Все три режима выключены в рецепте. Встроенный второй фактор в этой сборке не включён. Если нужен MFA, используйте правильно настроенный провайдер личности; не включайте remote-user за прокси, принимающим заголовок личности от посетителя.

В оценке безопасности зафиксированы предупреждения. Первый посетитель /setup/ может создать владельца: завершите настройку через loopback или SSH-туннель до открытия прокси и доступа из сети. Обычная регистрация явно выключена. Допускайте доверенные аккаунты, ограничивайте доступ импорта к чувствительным внутренним сервисам, защищайте тома и шифруйте внешние архивы.

Изображения отдаёт Nginx без проверки прав на каждый файл. Приватность рецепта защищает API рецепта, но не делает известный URL фотографии приватным. Не храните чувствительные фотографии. Рецепты, участники семьи, меню и секреты интеграций находятся в PostgreSQL и резервных копиях; архив медиа и .env тоже чувствительны.

В upstream 2.7.2 есть известная ошибка перенаправления настройки (#4907): повторное открытие /setup/ после создания владельца возвращает HTTP 500. Для обычного доступа используйте /account/login/. Рецепт не патчит аутентификацию upstream и не считает эту ошибку успешной проверкой защиты: smoke-тест проверяет действующую конфигурацию закрытой регистрации.

Сценарий восстановления на amd64 создаёт владельца через штатную CSRF-форму, проверяет вход, сохраняет приватный рецепт с ингредиентом, инструкциями, тегом и изображением, удаляет все три тома и проверяет восстановленные данные и хеш сохранённой фотографии. arm64, сроки меню, синхронизация покупок, импорт URL, провайдеры личности, почта, AI и мобильные клиенты не проверялись. В снимке безопасности сохранены пять CRITICAL-находок в пакетах закреплённых образов.

Ориентир ресурсов — от 1 CPU, 1 ГиБ RAM и 5 ГиБ диска; 2 ГиБ RAM оставляют больше места для PostgreSQL и двух воркеров Gunicorn. Это ориентиры установки, а не гарантия нагрузочного теста. Домашний и VPS-уровни поддерживаются после безопасного создания владельца; надёжный уровень остаётся частичным, поскольку внешний мониторинг, лимиты ресурсов и расписание резервирования настраивает оператор.

Источники: Docker, параметры, аутентификация, провайдер SAML и изменения 2.7.2.

Отслеживание обновлений

Это сохранённые результаты отдельных проверок, а не данные в реальном времени. Неизвестный статус означает, что проверка ещё не выполнялась.

Новые релизы

Сравнение версии рецепта с последним известным релизом upstream. Это номер версии, а не разбор изменений.

Актуальная версия 2.7.229 окт. 2026 г., 20:43 UTC

Критические уязвимости

Результат отдельного сканирования Docker-образов, а не проверки Compose.

Найдено: 5 · trivy29 окт. 2026 г., 20:43 UTC
Показать бюллетени (4)

Несовместимые обновления

Новый major находится сравнением номеров версий. Вердикт о совместимости заносится вручную после чтения release notes и порядка миграции.

Не провереноПроверка не выполнялась

compose.yaml

Изменения upstream Compose относительно проверенного рецепта.

Upstream Compose не отслеживаетсяПроверка не выполнялась

Устаревшие Docker-образы

Проверка закреплённых тегов образов на наличие новых версий.

Все образы актуальны29 окт. 2026 г., 20:43 UTC

От наблюдения к действию

План обновления

Рецепт уже закрепляет последний известный релиз. Ниже показаны сохранённые основания для этой версии.

2.7.22.7.2
  1. Открыть основания релиза

    Открыть релиз на GitHub ↗ Ссылка нужна для ревизии и сама по себе не доказывает совместимость.

  2. Проверить границу версий

    Номера версий не пересекают major-границу совместимости. Вердикт о совместимости не записан.

  3. Подготовить смену тегов образов

    Смена тегов образов сейчас не планируется.

  4. Следовать документированной схеме миграции

    Смена тега и перезапуск. Шаги конкретного релиза всё равно берутся из release notes и инструкции по установке.

  5. Защитить точку отката

    Смена версии сейчас не планируется. Рецепт содержит процедуру backup. Restore проверен.

  6. Проверить обновлённый рецепт

    Точная проверка уровня «Проверен полностью» для этой версии записана 2026-10-29.

Прочитать порядок обновления в инструкции по установке ↓

Характеристики

Безопасность и публикация

Уровни установки

Статус показывает, насколько опубликованный рецепт покрывает требования каждого уровня.

Готово

Для дома

Минимальная конфигурация для локальной сети или доступа через VPN.

  • Один сервер
  • Локальный доступ
  • Минимум компонентов

Рецепт закрывает все требования этого уровня.

Готово

Для VPS

Публичная установка с защищённым доступом и резервными копиями.

  • Домен
  • HTTPS через reverse proxy
  • Backup вне сервера

Рецепт закрывает все требования этого уровня.

Частично

Надёжная

Конфигурация для предсказуемой эксплуатации и наблюдаемости.

  • Отдельная БД
  • Healthcheck
  • Внешний мониторинг
  • Лимиты CPU и памяти

Нужно добавить вручную: внешний мониторинг, лимиты cpu и памяти.

Собрать под свой сервер

Генератор конфигурации

Ответьте на пять вопросов и скачайте готовый комплект Tandoor.

Работает локально
01 Есть домен?
02 Какой reverse proxy?
03 Архитектура сервера
04 Где хранить данные?

Укажите абсолютный путь для отдельного диска, например /srv/tandoor.

05 Требуется VPN-доступ?

Комплект готов к сборке

Архив создаётся в браузере. Ответы никуда не отправляются.

Те же файлы одним shell-скриптом, обычными heredoc, чтобы всё читалось до запуска. Скрипт проверяет Docker, архитектуру, память, диск и нужные порты и без --apply ничего не пишет.

Скриншоты

Быстрый запуск

Сначала прочитайте полную инструкцию: в ней описаны доступ извне, backup и расположение данных.

Подготовить настройкиcp .env.example .env
Запуститьdocker compose up -d
Проверить состояниеdocker compose ps

Пошаговая инструкция

Установка и обслуживание Tandoor

Ubuntu и Debian

Подойдут Ubuntu 24.04/26.04 LTS или Debian 12/13 с Docker Engine и Compose от v2.24, установленными по инструкции Docker. Выполняйте команды из каталога рецепта. Установите openssl; Python 3 и curl нужны для smoke-теста. Доступ к Docker даёт административный контроль над хостом.

cp .env.example .env
chmod 600 .env
openssl rand -hex 32  # TANDOOR_SECRET_KEY
openssl rand -hex 24  # TANDOOR_DB_PASSWORD

Вставьте разные сгенерированные значения в .env. Entrypoint веб-приложения отклоняет шаблонные секреты и ключ короче 50 символов до запуска HTTP. Пароль владельца создаётся в штатной форме настройки. Оставьте порт на loopback до создания владельца.

docker compose --env-file .env config --quiet
docker compose --env-file .env pull
docker compose --env-file .env up -d --wait --wait-timeout 600
docker compose ps --all

VPS и первый владелец

Оставьте публичный прокси закрытым. Откройте туннель со своего компьютера:

ssh -L 8089:127.0.0.1:8089 user@server

Откройте http://localhost:8089/setup/, создайте владельца с уникальным паролем, затем используйте http://localhost:8089/account/login/. Настройка создаёт начальное пространство. Начальный email шаблонный; для подтверждения настоящего адреса и почтового сброса пароля сначала настройте SMTP. Обычная публичная регистрация выключена. Не возвращайтесь на /setup/: в upstream 2.7.2 после создания пользователя там есть ошибка перенаправления. До открытия HTTPS настройте firewall, обновления ОС и зашифрованные внешние копии.

Доверенная локальная сеть или VPN

Первую настройку выполните через туннель. Затем замените 127.0.0.1 в пробросе веб-порта на частный адрес сервера. Добавьте адрес в TANDOOR_ALLOWED_HOSTS, а в TANDOOR_CSRF_TRUSTED_ORIGINS укажите точный origin, например http://192.168.1.10:8089. Пересоздайте сервисы и разрешите доступ только доверенным клиентам или VPN. Обычный HTTP передаёт учётные и домашние данные без шифрования.

Домен и HTTPS

Направьте recipes.example.com на сервер. Оставьте приложение на loopback, задайте TANDOOR_ALLOWED_HOSTS=localhost,127.0.0.1,recipes.example.com и TANDOOR_CSRF_TRUSTED_ORIGINS=https://recipes.example.com, затем выполните docker compose up -d --wait --wait-timeout 600. Передавайте исходный Host и X-Forwarded-Proto. Tandoor доверяет заголовку протокола, поэтому не допускайте недоверенный прямой доступ к backend. Оставляйте remote-user выключенным, если нет доверенного аутентифицирующего прокси, удаляющего подставленные клиентом заголовки личности.

Caddy, Nginx и Traefik

proxy/Caddyfile получает HTTPS-сертификат и направляет домен на loopback. Для proxy/nginx.conf укажите пути сертификатов; до перезагрузки выполните nginx -t. proxy/traefik.yaml — динамическая конфигурация file provider для существующего Traefik с его certificate resolver. Примеры предполагают прокси на Docker-хосте. Контейнерному прокси нужна контролируемая общая сеть или доступный адрес хоста: его loopback указывает на него самого. Отдельный прокси статики и медиа не нужен: официальный образ уже включает Nginx.

Данные и все параметры

Создаются три тома проекта: database в /var/lib/postgresql, media в /opt/recipes/mediafiles и static в /opt/recipes/staticfiles. PostgreSQL хранит рецепты, пользователей, пространства, меню, покупки и настройки интеграций. Изображения и пользовательские файлы находятся в media. Статика создаётся при каждом запуске и не является пользовательскими данными. Инициализатор назначает корням media/static UID/GID 65534; приложение работает без root. Не меняйте UID и владельцев томов вслепую.

Переменная Назначение
TANDOOR_VERSION Закреплённая версия приложения 2.7.2.
TANDOOR_PORT Веб-порт loopback, 8089.
TANDOOR_SECRET_KEY Случайный Django-секрет от 50 символов; храните вместе с архивами.
TANDOOR_DB_PASSWORD Уникальный пароль PostgreSQL, заданный до первого запуска; правка только .env не меняет пароль существующей роли БД.
TANDOOR_ALLOWED_HOSTS Имена и IP через запятую, без схем и портов; сохраняйте loopback для healthcheck.
TANDOOR_CSRF_TRUSTED_ORIGINS Точные origin через запятую, со схемой и нестандартным портом, без wildcard.
TZ IANA-часовой пояс приложения, стандартно UTC.

Скрипты также принимают FOSSARY_ENV_FILE, COMPOSE_PROJECT_NAME и TANDOOR_BACKUP_DIR, по умолчанию .env, проект tandoor и backups/. Если запускали docker compose -p с другим именем, экспортируйте тот же COMPOSE_PROJECT_NAME для резервирования и восстановления. SMTP, AI, внешние хранилища и провайдеры личности не настроены; рецепт не требует их ключей.

Резервирование

bash backup.sh

Дождитесь окончания инициализации. Скрипт останавливает приложение, делает дамп PostgreSQL и сохраняет полный том media, .env и Compose. Приложение запускается обратно только если работало до копирования. Архивы имеют приватные права и уникальные имена; шифруйте внешнюю копию и репетируйте восстановление. Экспорт рецептов не сохраняет аккаунты, меню, покупки и все настройки. Статика пересоздаётся и в архив не входит.

Восстановление — заменяет текущие данные

Используйте доверенные архивы и совпадающие версии приложения, базы и секреты. На новой машине подготовьте конфигурацию без запуска приложения:

docker compose up -d --wait database
docker compose create --no-deps tandoor initialize
bash restore.sh /absolute/path/tandoor-<timestamp>.tar

Восстановление проверяет состав архива, делает страховочную копию, останавливает запись, пересоздаёт базу приложения, заменяет media и ждёт healthcheck. Архивный .env автоматически не активируется. Проверьте вход, инструкции рецептов, фотографии, меню и покупки до открытия доступа. При сбое оставьте запись остановленной и изучите журналы до новой попытки. Для другой машины также исправьте параметры host/origin.

Обновление

Прочитайте release notes и описание параметров. Сохраните старые .env, Compose и проверенный архив, остановите приложение, выберите изученный закреплённый TANDOOR_VERSION и перезапустите:

bash backup.sh
docker compose stop tandoor
# Измените TANDOOR_VERSION в .env; сохраняйте мажорную версию PostgreSQL.
docker compose pull tandoor
docker compose up -d --wait --wait-timeout 600
docker compose logs --tail=100 tandoor

При запуске мигрирует PostgreSQL и пересоздаётся статика. Проверьте рецепты, медиа, права, меню и покупки. Для мажорного обновления PostgreSQL нужен отдельный план экспорта и импорта; не используйте каталог данных с другой мажорной версией образа.

Откат

  1. Закройте внешний доступ и остановите tandoor.
  2. Верните предыдущие .env и Compose, сохраняя совпадающий секрет и мажорную версию базы; укажите старый TANDOOR_VERSION.
  3. Загрузите прежний образ, запустите только БД и выполните docker compose create --no-deps tandoor initialize. Не запускайте старое приложение поверх новой схемы.
  4. Выполните bash restore.sh /path/to/pre-upgrade.tar. Страховочная копия сохранит текущее состояние до замены старой базой и media; статика пересоздастся.
  5. Проверьте вход, рецепты, фотографии, меню и покупки до открытия прокси. Одна смена образа не отменяет миграции.

Остановка и удаление

docker compose down сохраняет тома. После проверки внешней копии docker compose down --volumes --remove-orphans уничтожает базу, все загрузки и статику. .env и локальные архивы удаляйте отдельно, когда они больше не нужны.

Сообщить о проблеме с рецептом

Рассказать, как прошло на вашем сервере

Откроется предзаполненный issue на GitHub. Нужен аккаунт GitHub; после отправки сообщение будет публичным.

Диагностика

Диагностика Tandoor

Начните с docker compose ps --all, docker compose logs --tail=200 tandoor database initialize, docker compose --env-file .env config --quiet и curl -i http://127.0.0.1:8089/accounts/login/. Не публикуйте секреты, сессионные cookie и домашние данные.

  • Приложение перезапускается до HTTP: замените оба шаблонных секрета. TANDOOR_SECRET_KEY должен иметь от 50 символов. При восстановлении существующей установки сохраняйте её ключ.
  • PostgreSQL отклоняет пароль: инициализированная роль сохраняет свой пароль. Верните прежнее значение .env или осознанно смените пароль роли; удаление томов уничтожает данные.
  • Нет прав на media/static: проверьте инициализатор и тома. Рецепт работает от UID/GID 65534 и готовит корни томов до запуска. Восстановите подходящего владельца, а не права записи для всех. Статика пересоздаётся, её не нужно копировать из старого образа.
  • HTTP 400 или ошибка CSRF: TANDOOR_ALLOWED_HOSTS принимает имена/IP без схемы и порта, TANDOOR_CSRF_TRUSTED_ORIGINS — полные origin. Укажите настоящий адрес, схему и нестандартный порт, передавайте Host/protocol и пересоздайте приложение. Доступ к backend оставляйте только через доверенные пути.
  • HTTP 500 на /setup/ после создания владельца: это upstream #4907, сохраняющийся в 2.7.2. Используйте /account/login/; не удаляйте базу и не создавайте владельца заново. Обычный headless-вход и API рецептов работают независимо от старого перенаправления.
  • Забыли пароль владельца, SMTP не настроен: выполните штатную Django-команду docker compose exec tandoor /opt/recipes/venv/bin/python manage.py changepassword <username>. Она запрашивает пароль интерактивно; не помещайте его в историю команд. До использования подтверждения email и почтового сброса настройте SMTP.
  • После восстановления пропали фотографии: восстановите PostgreSQL и полный архив media вместе, с соответствующими секретом и версией. Проверьте журналы приложения/Nginx и владельцев файлов. Не путайте пересоздаваемую статику с пользовательскими медиа.
  • Приватная фотография открывается без входа: Nginx отдаёт медиа напрямую. Рецепт не обещает приватные URL изображений; удаляйте чувствительные загрузки вместо надежды на флаг приватности рецепта как защиту файлов.
  • Нет AI-импорта, внешнего хранилища или провайдера личности: они намеренно не настроены и не нужны для обычного хранения рецептов, меню и покупок. До включения прочитайте официальные инструкции интеграции.
  • Обновление не удалось: закройте доступ, сохраните прежнюю конфигурацию и восстановите архив до обновления с совпадающим образом. Не запускайте старое приложение поверх новой схемы и не подключайте другую мажорную версию PostgreSQL к существующему каталогу.

Источники: Docker, параметры, аутентификация и upstream issues.

Официальные источники

Последний релиз: 2026-10-27 · GitHub Stars: 8 703 · данные проверены 29 окт. 2026 г., 20:43 UTC

Отказ от ответственности

Fossary — независимый информационный каталог, не связанный с разработчиками представленных приложений. Мы собираем сведения из открытых источников и проверяем опубликованные рецепты, но не разрабатываем, не распространяем и не контролируем эти приложения.

Публикация карточки или статус проверки не являются требованием, навязыванием либо персональной рекомендацией использовать приложение. Вы самостоятельно решаете, подходит ли оно вам, и используете его на свой риск. Мы не гарантируем безопасность, доступность или пригодность приложения и, в пределах, допускаемых законом, не отвечаем за вызванные им потери или ущерб. До установки проверьте лицензию, настройки безопасности, обработку данных и резервное копирование.