# infra/provision — provisioning de instancias white-label Levanta una clínica/spa nueva de SKEEN en la VPS con un comando, sin tocar las instancias existentes (`skeen_odoo` y `clinica2_odoo`). Un solo código (`/root/skeen-odoo/addons`), N bases de datos. ## Archivos | Archivo | Para qué | |---|---| | `provision_clinica.py` | Script principal. Crea DB+rol, secretos, conf, unit, inicializa módulos, post-instala, renombra el menú raíz, arma el vhost nginx y despliega el frontend. | | `postinstall_clinica.py` | Post-instalación vía ORM de Odoo: marca, empresa, admin del frontend y siembra de glosario/sucursal/settings **solo si existen**. Opcionalmente datos demo. | | `demo_limpiar.py` | Borra los datos demo de una instancia (para no entregar basura a un cliente). | | `templates/odoo.conf.tmpl` | Plantilla de `odoo.conf` con secretos/puerto/DB propios. | | `templates/service.tmpl` | Plantilla del unit systemd `odoo-.service`. | | `templates/nginx-vhost.tmpl` | Plantilla del vhost nginx (dominio + puerto LAN + bloqueo WACRM). | ## Uso rápido ```bash cd /root/skeen-proyecto/infra/provision # 1) Simular (no ejecuta nada) — SIEMPRE hacerlo primero ./provision_clinica.py --slug spa-bella --nombre "Spa Bella" \ --dominio spa.consultoria-as.com --puerto 8071 --db spa_bella_odoo \ --pack spa --demo --dry-run # 2) Ejecutar de verdad (coordinado, en horario de bajo uso) ./provision_clinica.py --slug spa-bella --nombre "Spa Bella" \ --dominio spa.consultoria-as.com --puerto 8071 --db spa_bella_odoo \ --pack spa --demo ``` Guía completa: `../../docs/nueva-instancia.md`. ## Decisiones de diseño relevantes - **Rol PostgreSQL propio por instancia.** El rol `skeen` es compartido y su password (`skeen_dev_2026`) no se puede cambiar sin romper las dos instancias existentes. Para cumplir "secretos propios" el script crea un rol nuevo (``) con password aleatoria y una DB cuyo owner es ese rol. `--db-role skeen` reproduce el procedimiento manual anterior (rol compartido). - **Dry-run por defecto recomendado.** `--dry-run` valida colisiones reales (puerto, DB, unit, vhost, dirs) pero no escribe ni ejecuta nada. - **Post-instalación tolerante.** Los modelos `skeen.sucursal`, `skeen.service.category`, `skeen.clinic.settings` y el glosario están en desarrollo por otro cambio; el post-install los detecta en runtime y deja `TODO` en la salida para lo que aún no exista. Nunca aborta por eso. - **Frontend compartido.** El bundle se compila una vez desde `/root/skeen-frontend` y se copia con `rsync` a cada `/var/www/-frontend`; la marca sale del API `/brand`, no del build.