🍽️ Cocina con Alma

Gestor de recetas y menú semanal público para negocios de comida / viandas.

Combina Tandoor Recipes (gestión interna de recetas, inventario y planificación) con una página pública donde los clientes pueden ver el menú de la semana desde sus celulares.


🏗️ Arquitectura

Servicio Puerto Descripción
Tandoor Recipes 8080 Panel de administración para recetas, ingredientes, inventario y meal plan
Menú Público 80 Página web responsive con el menú semanal para clientes
PostgreSQL Base de datos persistente para Tandoor
┌─────────────────┐      ┌─────────────────┐      ┌─────────────────┐
│   Clientes      │      │   Tu madre      │      │   PostgreSQL    │
│  (navegador)    │      │  (navegador)    │      │   (datos)       │
│                 │      │                 │      │                 │
│  Puerto 80      │      │  Puerto 8080    │      │  Puerto 5432    │
│  Menú público   │      │  Tandoor Admin  │      │  (interno)      │
└────────┬────────┘      └────────┬────────┘      └─────────────────┘
         │                        │
         └────────┬───────────────┘
                  │
         ┌────────┴────────┐
         │  Docker Compose │
         └─────────────────┘

📋 Requisitos


🚀 Instalación paso a paso

1. Clonar el repositorio

git clone https://git.consultoria-as.com/consultoria-as/cocina-con-alma.git
cd cocina-con-alma

2. Configurar variables de entorno

cp .env.example .env
nano .env  # o vim

Editá al menos estas variables:

SECRET_KEY=una_clave_larga_y_aleatoria_de_50_caracteres
POSTGRES_PASSWORD=contraseña_segura_para_postgres
TANDOOR_API_TOKEN=dejar_vacio_por_ahora

💡 Para generar SECRET_KEY:

openssl rand -hex 32

3. Levantar los servicios por primera vez

docker compose up -d

La primera vez tarda varios minutos porque descarga imágenes y Tandoor ejecuta migraciones.

4. Crear el usuario administrador

docker exec -i cocinaconalma-web_recipes-1 \
  /opt/recipes/venv/bin/python manage.py shell << 'EOF'
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.create_superuser(
    "admin", "admin@cocina.com", "Alma2024!"
)
print("Usuario creado:", user.username)
EOF

5. Crear el espacio de trabajo (space) y obtener token de API

# Crear space y asignar grupo admin
docker exec -i cocinaconalma-web_recipes-1 \
  /opt/recipes/venv/bin/python manage.py shell << 'EOF'
from cookbook.models import Space, UserSpace
from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model

User = get_user_model()
user = User.objects.get(username="admin")

space = Space.objects.create(name="Cocina con Alma", created_by=user)
us = UserSpace.objects.create(user=user, space=space)
us.groups.add(Group.objects.get(name='admin'))
us.save()

user.userspace_active = us
user.save()

# Crear token de API para el menú público
from rest_framework.authtoken.models import Token
token, _ = Token.objects.get_or_create(user=user)
print(f"TANDOOR_API_TOKEN={token.key}")
EOF

Copiá el token impreso y pegalo en tu archivo .env:

TANDOOR_API_TOKEN=el_token_que_te_dio_el_comando_anterior

6. Recrear el contenedor del menú público para que lea el token

docker compose up -d --force-recreate menu_publico

7. Acceder

Uso URL
Panel de administración (Tandoor) http://IP_DEL_SERVIDOR:8080
Menú público para clientes http://IP_DEL_SERVIDOR

Credenciales por defecto:

  • Usuario: admin
  • Contraseña: Alma2024! (cambiarla en producción)

📝 Uso diario

Para tu madre (panel de Tandoor)

  1. Entrar a http://IP:8080 e iniciar sesión
  2. Recetas → Crear o importar recetas nuevas
  3. Plan (calendario) → Arrastrar recetas a los días de la semana
  4. Foods → Registrar ingredientes y precios para control de stock
  5. Shopping → Generar lista de compras automática desde el meal plan

Para los clientes

Simplemente acceden a http://IP_DEL_SERVIDOR y ven el menú de los próximos 7 días. No necesitan iniciar sesión.


🗄️ Acceso directo a la base de datos

# Entrar a PostgreSQL
docker exec -it cocinaconalma-db_recipes-1 \
  psql -U djangouser -d djangodb

# Consultas útiles
\dt                              # listar tablas
SELECT * FROM cookbook_recipe;   # ver recetas
SELECT * FROM cookbook_food;     # ver ingredientes
SELECT * FROM cookbook_mealplan; # ver menú semanal
\q                               # salir

🔧 Archivos modificados de Tandoor

Este proyecto usa la imagen oficial de Tandoor pero monta dos archivos modificados:

Archivo Cambio
tandoor/settings.py Agrega TokenAuthentication de DRF para que la app Flask se conecte vía API
tandoor/scope_middleware.py Extiende el middleware de espacios para que también funcione con tokens de API

Estos cambios son necesarios porque Tandoor, por defecto, solo expone la API REST para sesiones web y OAuth2. La app Flask necesita un token fijo para leer el menú semanal sin intervención humana.


📁 Estructura del proyecto

cocina-con-alma/
├── docker-compose.yml          # Orquestación de servicios
├── .env                        # Variables de entorno (NO subir a git)
├── .env.example                # Plantilla de variables
├── .gitignore
├── README.md                   # Este archivo
├── menu-publico/               # App Flask - menú público
│   ├── Dockerfile
│   ├── requirements.txt
│   ├── app.py                  # Lógica de conexión a Tandoor
│   └── templates/
│       └── index.html          # Página del menú semanal
└── tandoor/                    # Parches a Tandoor
    ├── settings.py
    └── scope_middleware.py

⚠️ Notas de seguridad

  • Nunca commitear el archivo .env (ya está en .gitignore)
  • Cambiar la contraseña por defecto de admin después de la primera instalación
  • El token de API tiene acceso de lectura a todo Tandoor. No exponerlo públicamente
  • Para producción, considerar:
    • HTTPS (usar reverse proxy como Nginx o Traefik)
    • Firewall: solo exponer puertos 80 y 8080 si es necesario
    • Backups automáticos de tandoor/postgresql/

🔄 Backup y restauración

Backup

# Backup de la base de datos
docker exec cocinaconalma-db_recipes-1 pg_dump -U djangouser djangodb > backup_$(date +%Y%m%d).sql

# Backup de archivos subidos (imágenes de recetas)
docker cp cocinaconalma-web_recipes-1:/opt/recipes/mediafiles ./mediafiles_backup

Restauración

# Restaurar base de datos
docker exec -i cocinaconalma-db_recipes-1 psql -U djangouser -d djangodb < backup_20240101.sql

🐛 Solución de problemas

El menú público muestra "Error de API"

  1. Verificar que TANDOOR_API_TOKEN esté configurado en .env
  2. Recrear el contenedor: docker compose up -d --force-recreate menu_publico
  3. Revisar logs: docker logs cocinaconalma-menu_publico-1

Tandoor no responde en el puerto 8080

docker logs cocinaconalma-web_recipes-1 --tail 50

Esperar a que aparezca "Booting worker" — la primera vez tarda.

Olvidé la contraseña de admin

docker exec -it cocinaconalma-web_recipes-1 \
  /opt/recipes/venv/bin/python manage.py changepassword admin

📄 Licencia

Este proyecto integra software de terceros:


Desarrollado para el negocio de viandas de mamá ❤️

Description
Cocina con Alma - Gestor de recetas y menu publico
Readme 45 KiB
Languages
Python 87.9%
HTML 11.6%
Dockerfile 0.5%