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
| Layer | Component | Role |
|---|---|---|
| OS | AlmaLinux 9 | Enterprise-grade, RHEL-compatible base for containerized deployments |
| Container Runtime | Docker Engine + Compose | Orchestrates Tandoor Recipes and its dependencies |
| Application | Tandoor Recipes (Django) | Core web application and API backend |
| Database | PostgreSQL 15 | Stores recipes, users, ingredients, and configuration data |
| Reverse Proxy | Nginx | Manages HTTPS, routing, caching, and compression |
| TLS | Let’s Encrypt / PKI | Provides 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/Capability | Tandoor Recipes (Self-hosted) | Paprika (App) | Cookpad (Cloud) | AnyList (Cloud) |
|---|---|---|---|---|
| Hosting | Self-hosted / Docker | Mobile only | Cloud-based | Cloud-based |
| Cost | Free, open-source | Paid | Free/Paid | Subscription |
| Multi-user support | ✅ Yes | ❌ No | ✅ Limited | ✅ Limited |
| Nutrition analysis | ✅ Yes | ❌ No | ❌ No | ❌ No |
| Meal planning | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
| Privacy | Full data control | Cloud sync | Cloud only | Cloud 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_dumpor cron jobs. - Automate SSL renewals with Certbot or Traefik ACME integration.
- Restrict file permissions and ensure
mediaandstaticdirectories 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.

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

Choose a plan with at least 2 vCPUs, 4 GB RAM, and 20 GB SSD storage.
Under Operating System, choose AlmaLinux 9 (64-bit).

Click Create Instance.

When deployment finishes, copy your instance IP address from the “Resources” section.
Your server is now ready.

Step 2: Connect to Your Instance
Connect to your AlmaLinux 9 server via SSH.
Linux/macOS:
ssh root@your_server_ip
Windows (PuTTY):
- Open PuTTY
- Enter your server IP
- Login as root
Step 3: Install Docker and Dependencies
Run all commands exactly as they appeared in your history.
Update the System
dnf update

Add Docker Repository
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Install Docker Engine + Plugins
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Enable and Start Docker
systemctl enable docker
systemctl start docker
Check Docker Compose
docker compose version

Step 4: Deploy Tandoor Recipes using Docker Compose
Create Tandoor Directory
mkdir -p /opt/tandoor
cd /opt/tandoor

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:

Generate Secret Key (already used)
python3 -c "import secrets; print(secrets.token_urlsafe(50))"

Start Tandoor
docker compose up -d

Verify Containers
docker ps
You should see tandoor_db and tandoor_web running.

Step 5: Install and Configure Nginx
Install Nginx
dnf install nginx

Enable and Start Nginx
systemctl enable nginx
systemctl start nginx

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;
}

Test Nginx
nginx -t

Step 6: Install Certbot and Enable HTTPS
Install Certbot
dnf install epel-release
dnf install certbot python3-certbot-nginx


Obtain SSL Certificate
certbot --nginx -d almalinux-tutorials.shape.host
This automatically enables HTTPS and reloads Nginx.

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).


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.