🍽️ 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
- Docker
- Docker Compose
- 2 GB de RAM mínimo
- 5 GB de disco disponible
🚀 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)
- Entrar a
http://IP:8080e iniciar sesión - Recetas → Crear o importar recetas nuevas
- Plan (calendario) → Arrastrar recetas a los días de la semana
- Foods → Registrar ingredientes y precios para control de stock
- 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
admindespué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"
- Verificar que
TANDOOR_API_TOKENesté configurado en.env - Recrear el contenedor:
docker compose up -d --force-recreate menu_publico - 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:
- Tandoor Recipes — MIT License
- Las recetas de ejemplo son ilustrativas.
Desarrollado para el negocio de viandas de mamá ❤️