docker.recipes

Tandoor Recipe Manager

intermediate

Tandoor application for managing recipes, meal planning, and shopping lists.

Overview

Tandoor Recipe Manager is a modern, web-based recipe management platform built with Django that transforms how home cooks and professional chefs organize their culinary workflows. Originally developed to address the limitations of traditional recipe storage methods, Tandoor offers comprehensive meal planning, shopping list generation, nutritional analysis, and recipe scaling capabilities. The platform supports recipe imports from over 500+ websites and provides a collaborative environment where multiple users can share and organize recipes within households or cooking groups. This deployment combines Tandoor's Django application with PostgreSQL for robust recipe data storage and NGINX for optimized static file serving and reverse proxy functionality. PostgreSQL's advanced JSON support perfectly complements Tandoor's complex recipe data structures, including ingredients, instructions, nutritional information, and user ratings, while maintaining ACID compliance for data integrity. NGINX handles the efficient delivery of recipe images, documents, and static assets while providing a production-ready web server layer that can handle concurrent users browsing recipes and meal plans. Home cooking enthusiasts, meal prep professionals, and families seeking organized kitchen management will find this stack invaluable for centralizing recipe collections, planning weekly meals, and generating automated shopping lists. The combination delivers enterprise-grade reliability for recipe data with the performance needed to handle large recipe collections, multiple simultaneous users, and media-heavy content like recipe photos and cooking videos.

Key Features

  • Recipe import support from 500+ cooking websites including AllRecipes, Food Network, and Serious Eats with automatic ingredient parsing
  • Advanced meal planning calendar with drag-and-drop recipe scheduling and automatic shopping list generation
  • PostgreSQL-powered recipe scaling and nutritional calculation with precise ingredient ratio mathematics
  • Multi-user recipe sharing with customizable permissions for family members and cooking groups
  • NGINX-optimized recipe image and document storage with efficient caching for faster page loads
  • Recipe rating and review system with PostgreSQL full-text search across ingredients and instructions
  • Automated shopping list consolidation that combines ingredients across multiple planned meals
  • Recipe versioning and modification tracking using PostgreSQL's transaction logging capabilities

Common Use Cases

  • 1Family meal planning with shared recipe collections and coordinated shopping lists across household members
  • 2Professional meal prep businesses managing client recipes, nutritional requirements, and bulk ingredient purchasing
  • 3Cooking enthusiasts digitizing and organizing large physical recipe collections with searchable metadata
  • 4Diet-conscious individuals tracking nutritional information and scaling recipes for specific caloric goals
  • 5Cooking content creators managing recipe development workflows and sharing test recipes with beta users
  • 6Restaurant R&D teams collaborating on menu development and recipe standardization processes
  • 7Cooking clubs and community groups sharing seasonal recipes and organizing group meal planning events

Prerequisites

  • Minimum 2GB RAM to handle PostgreSQL recipe database and NGINX concurrent connections during peak usage
  • Port 8080 available for NGINX web interface access and recipe browsing
  • Docker host with at least 10GB free storage for recipe images, documents, and PostgreSQL data growth
  • Basic understanding of Django application management for creating superuser accounts and user administration
  • NGINX reverse proxy configuration knowledge for customizing static file serving and caching policies
  • PostgreSQL backup strategy familiarity to protect recipe collections and user data

For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms

docker-compose.yml

docker-compose.yml
1services:
2 tandoor:
3 image: vabene1111/recipes:latest
4 container_name: tandoor
5 environment:
6 - SECRET_KEY=${SECRET_KEY}
7 - DB_ENGINE=django.db.backends.postgresql
8 - POSTGRES_HOST=postgres
9 - POSTGRES_PORT=5432
10 - POSTGRES_USER=${POSTGRES_USER}
11 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
12 - POSTGRES_DB=tandoor
13 - ENABLE_SIGNUP=1
14 volumes:
15 - tandoor_static:/opt/recipes/staticfiles
16 - tandoor_media:/opt/recipes/mediafiles
17 depends_on:
18 - postgres
19 networks:
20 - tandoor-network
21
22 nginx:
23 image: nginx:alpine
24 container_name: tandoor-nginx
25 volumes:
26 - tandoor_static:/static:ro
27 - tandoor_media:/media:ro
28 - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
29 ports:
30 - "8080:80"
31 depends_on:
32 - tandoor
33 networks:
34 - tandoor-network
35
36 postgres:
37 image: postgres:16-alpine
38 container_name: tandoor-db
39 environment:
40 - POSTGRES_USER=${POSTGRES_USER}
41 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
42 - POSTGRES_DB=tandoor
43 volumes:
44 - postgres_data:/var/lib/postgresql/data
45 networks:
46 - tandoor-network
47
48volumes:
49 tandoor_static:
50 tandoor_media:
51 postgres_data:
52
53networks:
54 tandoor-network:
55 driver: bridge

.env Template

.env
1# Tandoor
2SECRET_KEY=your-secret-key-at-least-50-chars
3POSTGRES_USER=tandoor
4POSTGRES_PASSWORD=tandoor_password

Usage Notes

  1. 1UI at http://localhost:8080
  2. 2Create nginx.conf for reverse proxy
  3. 3Create superuser via manage.py
  4. 4Import from various recipe sites
  5. 5Multiple user support

Individual Services(3 services)

Copy individual services to mix and match with your existing compose files.

tandoor
tandoor:
  image: vabene1111/recipes:latest
  container_name: tandoor
  environment:
    - SECRET_KEY=${SECRET_KEY}
    - DB_ENGINE=django.db.backends.postgresql
    - POSTGRES_HOST=postgres
    - POSTGRES_PORT=5432
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=tandoor
    - ENABLE_SIGNUP=1
  volumes:
    - tandoor_static:/opt/recipes/staticfiles
    - tandoor_media:/opt/recipes/mediafiles
  depends_on:
    - postgres
  networks:
    - tandoor-network
nginx
nginx:
  image: nginx:alpine
  container_name: tandoor-nginx
  volumes:
    - tandoor_static:/static:ro
    - tandoor_media:/media:ro
    - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
  ports:
    - "8080:80"
  depends_on:
    - tandoor
  networks:
    - tandoor-network
postgres
postgres:
  image: postgres:16-alpine
  container_name: tandoor-db
  environment:
    - POSTGRES_USER=${POSTGRES_USER}
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    - POSTGRES_DB=tandoor
  volumes:
    - postgres_data:/var/lib/postgresql/data
  networks:
    - tandoor-network

Quick Start

terminal
1# 1. Create the compose file
2cat > docker-compose.yml << 'EOF'
3services:
4 tandoor:
5 image: vabene1111/recipes:latest
6 container_name: tandoor
7 environment:
8 - SECRET_KEY=${SECRET_KEY}
9 - DB_ENGINE=django.db.backends.postgresql
10 - POSTGRES_HOST=postgres
11 - POSTGRES_PORT=5432
12 - POSTGRES_USER=${POSTGRES_USER}
13 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
14 - POSTGRES_DB=tandoor
15 - ENABLE_SIGNUP=1
16 volumes:
17 - tandoor_static:/opt/recipes/staticfiles
18 - tandoor_media:/opt/recipes/mediafiles
19 depends_on:
20 - postgres
21 networks:
22 - tandoor-network
23
24 nginx:
25 image: nginx:alpine
26 container_name: tandoor-nginx
27 volumes:
28 - tandoor_static:/static:ro
29 - tandoor_media:/media:ro
30 - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
31 ports:
32 - "8080:80"
33 depends_on:
34 - tandoor
35 networks:
36 - tandoor-network
37
38 postgres:
39 image: postgres:16-alpine
40 container_name: tandoor-db
41 environment:
42 - POSTGRES_USER=${POSTGRES_USER}
43 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
44 - POSTGRES_DB=tandoor
45 volumes:
46 - postgres_data:/var/lib/postgresql/data
47 networks:
48 - tandoor-network
49
50volumes:
51 tandoor_static:
52 tandoor_media:
53 postgres_data:
54
55networks:
56 tandoor-network:
57 driver: bridge
58EOF
59
60# 2. Create the .env file
61cat > .env << 'EOF'
62# Tandoor
63SECRET_KEY=your-secret-key-at-least-50-chars
64POSTGRES_USER=tandoor
65POSTGRES_PASSWORD=tandoor_password
66EOF
67
68# 3. Start the services
69docker compose up -d
70
71# 4. View logs
72docker compose logs -f

One-Liner

Run this command to download and set up the recipe in one step:

terminal
1curl -fsSL https://docker.recipes/api/recipes/tandoor-recipes/run | bash

Troubleshooting

  • Tandoor static files not loading: Verify NGINX volume mounts for tandoor_static and tandoor_media are properly configured in nginx.conf
  • Recipe import failing from websites: Check Tandoor container logs for SSL certificate issues and ensure outbound HTTPS connectivity
  • PostgreSQL connection refused errors: Confirm POSTGRES_HOST environment variable matches the postgres service name in docker-compose
  • NGINX 502 Bad Gateway when accessing recipes: Ensure Tandoor container is fully initialized by checking Django migration completion in logs
  • Recipe images not displaying: Verify tandoor_media volume permissions and check that NGINX has read access to media files
  • Slow recipe search performance: Monitor PostgreSQL container memory usage and consider increasing shared_buffers for better full-text search performance

Community Notes

Loading...
Loading notes...

Download Recipe Kit

Get all files in a ready-to-deploy package

Includes docker-compose.yml, .env template, README, and license

Ad Space