Files
SKEEN-Proyecto/infra/provision

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-<slug>.service.
templates/nginx-vhost.tmpl Plantilla del vhost nginx (dominio + puerto LAN + bloqueo WACRM).

Uso rápido

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 (<slug>) 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/<slug>-frontend; la marca sale del API /brand, no del build.