diff --git a/README.md b/README.md new file mode 100644 index 0000000..186b5b9 --- /dev/null +++ b/README.md @@ -0,0 +1,282 @@ +# 🍽️ 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](https://docs.docker.com/get-docker/) +- [Docker Compose](https://docs.docker.com/compose/) +- 2 GB de RAM mínimo +- 5 GB de disco disponible + +--- + +## 🚀 Instalación paso a paso + +### 1. Clonar el repositorio + +```bash +git clone https://git.consultoria-as.com/consultoria-as/cocina-con-alma.git +cd cocina-con-alma +``` + +### 2. Configurar variables de entorno + +```bash +cp .env.example .env +nano .env # o vim +``` + +Editá al menos estas variables: + +```env +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`: +> ```bash +> openssl rand -hex 32 +> ``` + +### 3. Levantar los servicios por primera vez + +```bash +docker compose up -d +``` + +La primera vez tarda varios minutos porque descarga imágenes y Tandoor ejecuta migraciones. + +### 4. Crear el usuario administrador + +```bash +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 + +```bash +# 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`: + +```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 + +```bash +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 + +```bash +# 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 + +```bash +# 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 + +```bash +# 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 + +```bash +docker logs cocinaconalma-web_recipes-1 --tail 50 +``` + +Esperar a que aparezca "Booting worker" — la primera vez tarda. + +### Olvidé la contraseña de admin + +```bash +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](https://github.com/TandoorRecipes/recipes) — MIT License +- Las recetas de ejemplo son ilustrativas. + +--- + +**Desarrollado para el negocio de viandas de mamá** ❤️