Tandoor Recipes on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx + SSL)

Tandoor Recipes is an open-source self-hosted recipe management system designed to help individuals and teams store, organize, plan, and share recipes in a private and efficient way. It supports meal planning, shopping lists, nutritional information, and recipe imports from popular websites, all accessible from a clean, modern web interface.

Running Tandoor Recipes on AlmaLinux 9, a RHEL-compatible enterprise-grade operating system, provides a secure, stable, and long-term supported environment for production. With Docker Compose, PostgreSQL, Nginx, and SSL encryption, AlmaLinux 9 offers an ideal foundation for a reliable and private recipe platform that runs seamlessly in homes, offices, or cloud environments.


Architecture Overview

LayerComponentRole
OSAlmaLinux 9Enterprise-grade, RHEL-compatible base for containerized deployments
Container RuntimeDocker Engine + ComposeOrchestrates Tandoor Recipes and its dependencies
ApplicationTandoor Recipes (Django)Core web application and API backend
DatabasePostgreSQL 15Stores recipes, users, ingredients, and configuration data
Reverse ProxyNginxManages HTTPS, routing, caching, and compression
TLSLet’s Encrypt / PKIProvides HTTPS for secure user access

Why Use Tandoor Recipes?

  • All-in-one recipe platform – store, edit, and share recipes privately.
  • Import from websites – automatically parse recipes from external sources.
  • Meal planning & shopping lists – plan weekly meals and export grocery items.
  • Nutrition tracking – calculate and display nutritional values per portion.
  • Multi-user collaboration – perfect for families or professional kitchens.
  • Image and tag support – organize recipes visually with categories and images.
  • Self-hosted and secure – full data ownership with zero cloud dependency.

Tandoor Recipes vs Other Recipe Platforms

Feature/CapabilityTandoor Recipes (Self-hosted)Paprika (App)Cookpad (Cloud)AnyList (Cloud)
HostingSelf-hosted / DockerMobile onlyCloud-basedCloud-based
CostFree, open-sourcePaidFree/PaidSubscription
Multi-user support✅ Yes❌ No✅ Limited✅ Limited
Nutrition analysis✅ Yes❌ No❌ No❌ No
Meal planning✅ Yes✅ Yes✅ Yes✅ Yes
PrivacyFull data controlCloud syncCloud onlyCloud only

Tandoor Recipes stands out as a powerful open-source alternative to cloud-based recipe apps — offering complete privacy, flexibility, and extensibility for both home and professional environments.


Security & Best Practices

  • Deploy behind Nginx or Traefik with HTTPS enabled.
  • Store PostgreSQL credentials and secret keys in Docker secrets or .env securely.
  • Keep SELinux enforcing and open only ports 80/443 via firewalld.
  • Limit PostgreSQL to internal Docker network access only.
  • Regularly update AlmaLinux, Docker, and container images.
  • Set up automated PostgreSQL backups using pg_dump or cron jobs.
  • Automate SSL renewals with Certbot or Traefik ACME integration.
  • Restrict file permissions and ensure media and static directories persist.

Typical Use Cases

  • Home chefs managing personal or family recipe collections.
  • Professional kitchens tracking standardized recipes and inventory.
  • Food bloggers centralizing content for sharing and backup.
  • Meal prep enthusiasts planning weekly dishes with grocery lists.
  • Nutritionists and trainers managing meal plans for clients.

Deploying Tandoor Recipes on AlmaLinux 9 with Docker Compose and PostgreSQL gives you a private, scalable, and feature-rich recipe management system that ensures data privacy, collaboration, and convenience — all powered by open-source technology.


Step 1: Set Up a Server Instance

Before installing Tandoor, you’ll need a fresh AlmaLinux 9 server. To get one quickly and reliably, you can use Shape.Host Cloud VPS.

Log in to your Shape.Host dashboard.

Click Create → Instance.

Shape.host Resources dashboard with Create > Instance highlighted.

Select your server location (closest to your users for best performance).

Shape.host instance form with the data center location selector highlighted.

Choose a plan with at least 2 vCPUs, 4 GB RAM, and 20 GB SSD storage.

Under Operating System, choose AlmaLinux 9 (64-bit).

Shape.host instance form with the operating system image selector highlighted.

Click Create Instance.

Shape.host instance form with the Create Instance button highlighted.

When deployment finishes, copy your instance IP address from the “Resources” section.

Your server is now ready.

Shape.host Resources dashboard with the server IP address highlighted.

Step 2: Connect to Your Instance

Connect to your AlmaLinux 9 server via SSH.

Linux/macOS:

ssh root@your_server_ip

Windows (PuTTY):

  1. Open PuTTY
  2. Enter your server IP
  3. Login as root

Step 3: Install Docker and Dependencies

Run all commands exactly as they appeared in your history.

Update the System

dnf update
Terminal showing DNF/YUM package management commands and output.

Add Docker Repository

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Terminal showing dnf commands or output during Add Docker Repository.

Install Docker Engine + Plugins

dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Terminal showing DNF/YUM package management commands and output.

Enable and Start Docker

systemctl enable docker
systemctl start docker

Check Docker Compose

docker compose version
Terminal showing systemd service management commands or output.

Step 4: Deploy Tandoor Recipes using Docker Compose

Create Tandoor Directory

mkdir -p /opt/tandoor
cd /opt/tandoor
Terminal showing the installed Docker Compose version.

Create Docker Compose File

nano docker-compose.yml

Paste the content you used:

version: "3.8"
services:
  db:
    image: postgres:15
    container_name: tandoor_db
    restart: always
    environment:
      POSTGRES_USER: tandoor
      POSTGRES_PASSWORD: strongpassword
      POSTGRES_DB: tandoor
    volumes:
      - db_data:/var/lib/postgresql/data

  web:
    image: vabene1111/recipes
    container_name: tandoor_web
    restart: always
    depends_on:
      - db
    environment:
      DB_ENGINE: django.db.backends.postgresql
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      POSTGRES_USER: tandoor
      POSTGRES_PASSWORD: strongpassword
      POSTGRES_DB: tandoor
      SECRET_KEY: yKWuPr9xR-uxHN55uhBqfFwSXKOtD3aBhnEJZsnJLwrpacQSxy3m94fodlINYbkk198
      ALLOWED_HOSTS: '*'
      DEBUG: 0
    ports:
      - "8080:80"
    volumes:
      - staticfiles:/opt/recipes/staticfiles
      - mediafiles:/opt/recipes/mediafiles

volumes:
  db_data:
  staticfiles:
Terminal showing the GNU nano editor and configuration text.

Generate Secret Key (already used)

python3 -c "import secrets; print(secrets.token_urlsafe(50))"
Terminal showing python3 commands or output.

Start Tandoor

docker compose up -d
Terminal showing container image download progress.

Verify Containers

docker ps

You should see tandoor_db and tandoor_web running.

Terminal showing the Docker container listing.

Step 5: Install and Configure Nginx

Install Nginx

dnf install nginx
Terminal showing DNF/YUM package management commands and output.

Enable and Start Nginx

systemctl enable nginx
systemctl start nginx
Terminal showing systemd service management commands or output.

Create Nginx Configuration

nano /etc/nginx/conf.d/tandoor.conf

Paste your config:

server {
    listen 80;
    server_name almalinux-tutorials.shape.host;

    location / {
        proxy_pass http://127.0.0.1:8080/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_read_timeout 600;
        proxy_connect_timeout 600;
    }

    client_max_body_size 64M;
}
Terminal showing web server configuration text.

Test Nginx

nginx -t
Terminal showing Nginx configuration test output.

Step 6: Install Certbot and Enable HTTPS

Install Certbot

dnf install epel-release
dnf install certbot python3-certbot-nginx
Terminal showing DNF/YUM package management commands and output.
Terminal showing DNF/YUM package management commands and output.

Obtain SSL Certificate

certbot --nginx -d almalinux-tutorials.shape.host

This automatically enables HTTPS and reloads Nginx.

Terminal showing Certbot certificate commands and messages.

Step 7: Verify Tandoor Installation

Open your browser and visit:

https://almalinux-tutorials.shape.host

You should see the Tandoor Recipes web interface.
Login or create your admin user (Tandoor automatically creates the first user on first login).

Tandoor Recipes initial account setup form.
Tandoor Recipes welcome page and recipe navigation.

For optimal performance and scalability, consider hosting all your deployments on Shape.Host Cloud VPS — offering fast NVMe storage, secure infrastructure, and powerful server plans perfect for Docker-based applications like Tandoor Recipes.