# DH Inspección V2 — Despliegue A1 Estos comandos se ejecutan únicamente en `dhv2.korexlabs.com`. ## 1. Verificación previa ```bash cd /var/www/dhv2.korexlabs.com docker compose ps docker compose config >/dev/null && echo "Compose actual OK" curl -fsS http://127.0.0.1:3101/api/v3/health ``` ## 2. Backup previo ```bash cd /var/www/dhv2.korexlabs.com PHASEA1_STAMP="$(date +%Y%m%d_%H%M%S)" PHASEA1_BACKUP_DIR="/var/www/dh-backup/dhv2-pre-phase-a1-${PHASEA1_STAMP}" mkdir -p "$PHASEA1_BACKUP_DIR" docker compose exec -T db sh -lc \ 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' \ > "$PHASEA1_BACKUP_DIR/database.dump" tar -czf "$PHASEA1_BACKUP_DIR/source.tar.gz" \ --exclude='./api-v3/node_modules' \ --exclude='./api-v3/dist' \ --exclude='./web-v2/node_modules' \ --exclude='./web-v2/dist' \ . install -m 600 .env "$PHASEA1_BACKUP_DIR/.env" cp /etc/nginx/sites-available/dhv2.korexlabs.com \ "$PHASEA1_BACKUP_DIR/nginx-site.conf" cd "$PHASEA1_BACKUP_DIR" sha256sum database.dump source.tar.gz .env nginx-site.conf > SHA256SUMS ``` Conservar el valor mostrado por: ```bash echo "$PHASEA1_BACKUP_DIR" ``` ## 3. Reemplazo de archivos Subir `DH_V2_FASE_A1_SOURCE.zip` a: ```text /var/www/dhv2.korexlabs.com ``` Después: ```bash cd /var/www/dhv2.korexlabs.com unzip -oq DH_V2_FASE_A1_SOURCE.zip chmod 600 .env docker compose config >/dev/null && echo "Compose A1 OK" ``` ## 4. Build y migraciones ```bash cd /var/www/dhv2.korexlabs.com docker compose --profile tools build api migrate docker compose up -d db docker compose --profile tools run --rm migrate docker compose --profile tools run --rm migrate npm run migration:show docker compose up -d --no-deps api ``` La migración debe informar cinco migraciones aplicadas y luego: ```text Pending migrations: no ``` ## 5. Verificación de esquema y seeds ```bash cd /var/www/dhv2.korexlabs.com docker compose exec -T db sh -lc \ 'psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -v ON_ERROR_STOP=1' <<'SQL' SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name IN ( 'users', 'roles', 'permissions', 'user_roles', 'role_permissions', 'auth_sessions', 'audit_events' ) ORDER BY table_name; SELECT (SELECT count(*) FROM roles) AS roles, (SELECT count(*) FROM permissions) AS permissions, (SELECT count(*) FROM role_permissions) AS role_permissions; SELECT role.code, array_agg(permission.code ORDER BY permission.code) AS permissions FROM roles role LEFT JOIN role_permissions mapping ON mapping.role_id = role.id LEFT JOIN permissions permission ON permission.id = mapping.permission_id GROUP BY role.code ORDER BY role.code; SQL ``` Valores iniciales esperados: ```text roles = 5 permissions = 9 role_permissions = 21 ``` ## 6. Verificación del usuario runtime ```bash cd /var/www/dhv2.korexlabs.com docker compose exec -T db sh -lc \ 'PGPASSWORD="$APP_DB_PASSWORD" psql -U "$APP_DB_USER" -d "$POSTGRES_DB" -v ON_ERROR_STOP=1 -c "SELECT count(*) FROM roles"' ``` Este comando debe funcionar sin convertir a `dhv2_app` en owner o superusuario. ## 7. Verificación final ```bash cd /var/www/dhv2.korexlabs.com docker compose ps docker compose logs --tail=100 api curl -fsS http://127.0.0.1:3101/api/v3/health curl -fsS https://dhv2.korexlabs.com/api/v3/health ``` ## 8. Rollback seguro del código Si el build o el arranque de la API falla, se puede restaurar el código anterior sin eliminar las tablas nuevas: ```bash cd /var/www/dhv2.korexlabs.com tar -xzf "$PHASEA1_BACKUP_DIR/source.tar.gz" \ -C /var/www/dhv2.korexlabs.com install -m 600 "$PHASEA1_BACKUP_DIR/.env" \ /var/www/dhv2.korexlabs.com/.env docker compose build api docker compose up -d --no-deps api curl -fsS http://127.0.0.1:3101/api/v3/health ``` No revertir migraciones ni restaurar la base si ya se crearon usuarios o sesiones. Ese rollback de datos debe decidirse usando el backup previo.