# Despliegue — testing.crm.aduanasoft.com (entorno de pruebas) Guía para publicar el CRM Agente de Carga en el servidor de pruebas. El estándar Aduanasoft es desplegar vía **Jenkins (CI/CD)**; este runbook manual es para el levantamiento inicial o cuando el pipeline aún no está conectado. > **Servidor:** `deploy@216.250.125.140:3232` · **DNS:** `testing.crm.aduanasoft.com` → `216.250.125.140` ## 0. Reglas de seguridad (no negociables) - `ENVIRONMENT=production` y `DEV_LOCAL_AUTH=false`. En `development` el RBAC auto-bootstrapea **super_admin** a cualquiera y se activa el login local — inaceptable en un dominio público. - Los secretos (DB, S3, `SECRET_KEY`, Keycloak) los captura **el operador en el servidor**, nunca se versionan ni se comparten por chat. - Las **migraciones** las ejecuta el operador/CI, no de forma automática. No correr migraciones contra producción. ## 1. Acceso por llave (una vez) Autoriza la llave pública del operador en el servidor (desde una máquina que ya entre): ```bash ssh -p 3232 deploy@216.250.125.140 \ "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" ``` ## 2. Código y entorno ```bash ssh -p 3232 deploy@216.250.125.140 git clone https://git.aduanasoft.com/ADUANASOFT/CRM_AGENTES_CARGA.git cd CRM_AGENTES_CARGA git checkout feature/crm-cumplimiento-pdf # o la rama/tag liberado cp deploy/env.testing.example .env $EDITOR .env # rellenar TODOS los CHANGE_ME ``` ## 3. Build de producción (importante) El `docker-compose.yml` del repo está orientado a desarrollo (vite dev + `--reload`). Para un sitio público hay que servir la **build** de producción: - **Frontend:** `npm ci && npm run build` (adapter-node) y arrancar con `node build` escuchando en `5173`, con `ORIGIN=https://testing.crm.aduanasoft.com`. - **Backend:** `uvicorn main:app --host 0.0.0.0 --port 8000` **sin** `--reload`. - Publica los puertos SOLO en loopback (override): ```yaml # docker-compose.testing.yml (ejemplo de override) services: backend: ports: ["127.0.0.1:8000:8000"] command: ["uvicorn","main:app","--host","0.0.0.0","--port","8000"] frontend: ports: ["127.0.0.1:5173:5173"] command: ["node","build"] ``` ```bash docker compose -f docker-compose.yml -f docker-compose.testing.yml up -d --build ``` ## 4. Migraciones y datos base ```bash docker compose exec backend alembic upgrade head # Catálogo de permisos + roles por carril (Ventas/Operaciones/Facturación/Consulta): docker compose exec backend python -c "from api.v1.modules.core.permissions.service import PermissionService; from core.database import CoreSessionLocal; PermissionService(CoreSessionLocal()).sync_permissions()" ``` > En producción NO se usa el auto-bootstrap de dev: asigna los roles a los usuarios > reales desde el módulo de Roles y permisos. ## 5. Nginx + TLS ```bash sudo cp deploy/nginx/testing.crm.aduanasoft.com.conf /etc/nginx/sites-available/ sudo ln -s /etc/nginx/sites-available/testing.crm.aduanasoft.com.conf /etc/nginx/sites-enabled/ sudo mkdir -p /var/www/certbot sudo certbot certonly --webroot -w /var/www/certbot -d testing.crm.aduanasoft.com sudo nginx -t && sudo systemctl reload nginx ``` ## 6. Smoke test ```bash curl -fsS https://testing.crm.aduanasoft.com/api/health && echo OK # Abre la app y valida login (Keycloak), listar clientes, y un flujo end-to-end. ``` ## Notas - App y API van en el **mismo origen** (`/` y `/api/`) para no requerir CORS entre hosts. - MinIO: si el navegador debe abrir URLs prefirmadas, `S3_ENDPOINT_URL` debe resolver a un host accesible públicamente (o publicar MinIO detrás de nginx en otro subdominio). Revisar según la política de red del entorno de pruebas.