# Infraestructura **Temporal**: Tadan vive en el servidor de abaku hasta tener servidor propio. | | | |---|---| | Servidor | abaku · `ssh abaku` · 195.26.247.222 · AlmaLinux 9 · nginx · PHP 8.1 (php-fpm) | | DNS | tadan.mx en Contabo, comodín `*.tadan.mx` → 195.26.247.222 (no hay que crear subdominios en DNS) | | SELinux | **Enforcing** | ## Sitios | Dominio | Carpeta en servidor | Fuente en repo | |---|---|---| | tadan.mx (www → tadan.mx) | `/srv/abaku/tadan/public` | `web/` + `marca/` | | dev.tadan.mx | `/srv/abaku/tadan/dev` | `dev/` + `marca/` + `docs/` | | my.tadan.mx | `/srv/abaku/tadan/my/public` | `my/` | | cualquier otro `*.tadan.mx` (incl. academy) | — | **404** (atrapa-todo) | - nginx: fuente en el repo `infra/nginx/tadan.conf` → `/etc/nginx/conf.d/tadan.conf`. Nunca editar en el servidor sin pasar el cambio al repo. - **Aislamiento**: el DNS es comodín y el servidor es compartido con abaku. El bloque atrapa-todo `*.tadan.mx` (80 y 443) evita que un subdominio sin sitio caiga en un sitio de abaku (pasó el 11 oct 2026: caía en academy.abaku.mx). No agregar `listen [::]:443`: los sitios de abaku son sólo IPv4 y Tadan se volvería el sitio por defecto en IPv6 para todos. Tras cualquier cambio, probar un subdominio inventado de tadan.mx y un par de dominios de abaku. - academy.tadan.mx: **sin definir** (404) hasta que Fernando decida qué va ahí. - Certificado Let's Encrypt `tadan.mx` (certbot webroot `/var/www/acme`), cubre tadan.mx, www, academy, dev y my. Para agregar un subdominio: `sudo certbot certonly --webroot -w /var/www/acme --cert-name tadan.mx --expand -d tadan.mx -d www.tadan.mx -d academy.tadan.mx -d dev.tadan.mx -d .tadan.mx` - Todos los sitios llevan `noindex` mientras están en borrador. ## PHP - Pool propio `tadan` (`/etc/php-fpm.d/tadan.conf`), usuario `abktadan`, socket `/run/php-fpm/tadan.sock`, `open_basedir=/srv/abaku/tadan:/tmp`, zona horaria America/Mexico_City. - nginx solo manda a PHP `^/api/[a-z_]+\.php$` de tadan.mx. Todo lo demás es estático. ## Base de datos - MariaDB, base **`tadan`**, usuario `tadan`@localhost con permisos SÓLO sobre esa base (nada compartido con abaku). Credenciales en `/srv/abaku/tadan/my/config/db.json` (640 fernando:abktadan, nunca en el repo). - Esquema: `my/scripts/migrations/NNN_*.sql`, se aplican con `php my/scripts/migrate.php` (el despliegue lo corre solo). Nunca editar una migración aplicada: crear la siguiente. - Tablas `tdn_*`: cuentas, usuarios (rol admin|cliente), tokens de acceso, intentos (límite por IP), bitácora, solicitudes (leads de la web), herramientas por cuenta, chat (conversaciones y mensajes). - Las solicitudes de "Simula tu negocio" y el chat se guardan aquí y se ven en my.tadan.mx. (El viejo `data/solicitudes.jsonl` se retiró el 11 oct 2026.) ## my.tadan.mx - Código en `/srv/abaku/tadan/my` (755); sólo `my/public` se sirve por web. `my/config` es 750 (fernando:abktadan): ahí viven `db.json` y, cuando exista, `ia.json` con la llave de Claude PROPIA de Tadan (`{"anthropic_api_key": "…"}`). Sin `ia.json` el chat no usa IA: los mensajes los contesta el equipo en my. - Dependencias con Composer sólo en `my/` (`anthropic-ai/sdk`); `vendor/` no se versiona, el despliegue corre `composer install`. - Sesiones PHP: `/var/lib/php/sessions/tadan` (700 abktadan, SELinux rw). - Logs de PHP: `/var/log/tadan/php-error.log` (carpeta propia porque `/var/log/php-fpm` es de apache y el pool no puede escribir ahí). Rotación en `/etc/logrotate.d/tadan`. - Alta de alguien del equipo: `php my/scripts/crear_admin.php correo "Nombre"` (imprime un enlace de 7 días y un solo uso; nunca contraseñas). - **Permisos**: si una carpeta nueva queda en 700, nginx/PHP no entran (pasó con `my/` al crearla con `umask 077`). ## Desplegar ```bash scripts/deploy.sh # web + marca → tadan.mx ; dev + marca + docs → dev.tadan.mx ```