- deploy/nginx/testing.crm.aduanasoft.com.conf: reverse proxy TLS, app (:5173) y API (:8000) en el mismo origen, headers de seguridad, límite 30 MB de subida. - deploy/env.testing.example: plantilla de entorno SIN secretos, con banderas de seguridad (ENVIRONMENT=production, DEV_LOCAL_AUTH=false) y URLs del dominio. - deploy/README.md: runbook (acceso por llave, build de producción, migraciones, nginx+certbot, smoke test). Los secretos y las migraciones los ejecuta el operador. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
85 lines
3.7 KiB
Markdown
85 lines
3.7 KiB
Markdown
# 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 '<TU_LLAVE_PUBLICA>' >> ~/.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.
|