# taller-wox.fitlabs.dev Portal + API para el **Bootcamp Agentic AI con watsonx Orchestrate** de FactorIT. - **Landing público:** `/` - **Registro + descargas:** `/register`, `/descargas?token=…`, `/download/{file}?token=…` - **API del taller** (consumida por agentes de watsonx Orchestrate): - `POST /api/historical-procedures` - `POST /api/available-procedures` - `GET /api/member-insights` - `GET /api/schedule` - `POST /api/reports/generate-report` - **Admin** (HTTP Basic): `/admin/leads.json`, `/admin/leads.csv`, `/admin/stats` ## Local dev ```bash python3.11 -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env uvicorn app.main:app --reload --port 8000 ``` Visitar `http://localhost:8000/`. Tests: ```bash pytest -v ``` ## Deploy en Coolify 1. Crear nueva aplicación → tipo **Dockerfile** → source Gitea → repo `farentsen/taller-wox`. 2. FQDN: `taller-wox.fitlabs.dev`. HTTPS automático con Let's Encrypt. 3. **Volúmenes persistentes:** - `/app/leads.db` (bind file) - `/app/app/data/reports_output` (bind dir) - `/app/material` (bind dir) 4. **Variables de entorno:** - `SECRET_KEY` (string aleatorio largo) - `ADMIN_USER=admin` - `ADMIN_PASS=fit2026` - `BASE_URL=https://taller-wox.fitlabs.dev` - `TOKEN_EXPIRY_HOURS=24` 5. Subir los 2 ZIPs (`taller-wox-tecnico.zip`, `taller-wox-funcional.zip`) al volumen `/app/material/` vía SFTP o el file manager de Coolify (sin redeploy). 6. Deploy → Coolify buildea + arranca. ## Estructura ``` app/ main.py FastAPI bootstrap config.py env vars db.py SQLite security.py tokens + basic auth frontend.py / · /register · /descargas · /download benefits_api.py endpoints 1-4 reports_api.py endpoint 5 admin.py /admin/* data/ datasets de los endpoints templates/ jinja2 static/ CSS, JS, imágenes material/ ZIPs descargables (volumen persistente en prod) tests/ pytest Dockerfile ``` ## Spec y diseño - Spec: `SPEC_taller_wox_fitlabs.md` - Diseño: `docs/superpowers/specs/2026-05-12-taller-wox-design.md` - Plan: `docs/superpowers/plans/2026-05-12-taller-wox.md`