Plan2026/HojaDeRura.md
2026-03-15 15:52:58 +00:00

15 KiB

Hoja de Ruta - Despliegue infraestructura Sirio

Servidor: sirio.vpn9.com.es CPU: AMD EPYC 4465P (12c/24t) RAM: 128 GB Disco: 4x 1.92 TB NVMe Fecha inicio: marzo 2026


Inventario de VMs

# VM Hostname URL panel CPU RAM Disco Pool NVMe
- Host PVE sirio.vpn9.com.es :8006 (directo) - ~4 GB overhead boot mirror disco1+disco2
1 Forgejo vega.vpn9.com.es git.vpn9.com.es existente existente existente -
2 Bastion polar.vpn9.com.es - (solo SSH) 1 vCPU 1 GB 20 GB pool-b
3 WG Hub A orion.vpn9.com.es wg.vpn9.com.es 1 vCPU 512 MB 10 GB pool-b
4 Authentik atlas.vpn9.com.es auth.vpn9.com.es 1-2 vCPU 2-3 GB 20 GB pool-b
5 Netbox nova.vpn9.com.es netbox.vpn9.com.es 1-2 vCPU 2-3 GB 20 GB pool-b
6 Monitoring rigel.vpn9.com.es grafana.vpn9.com.es 4 vCPU 8-12 GB 200-500 GB pool-a
7 Wazuh altair.vpn9.com.es wazuh.vpn9.com.es 4 vCPU 12 GB 100 GB pool-c
8 Servicios deneb.vpn9.com.es ansible.vpn9.com.es / status.vpn9.com.es 1-2 vCPU 2-3 GB 20 GB pool-d
9 Zammad antares.vpn9.com.es tickets.vpn9.com.es 2-3 vCPU 4-6 GB 50 GB pool-c
10 ICSManager castor.vpn9.com.es ics.vpn9.com.es 1-2 vCPU 2-3 GB 20 GB pool-d
11 WildDuck pollux.vpn9.com.es correo.vpn9.com.es 1-2 vCPU 2-3 GB 30-50 GB pool-d
12 PMG spica.vpn9.com.es pmg.vpn9.com.es 1-2 vCPU 2-3 GB 30 GB pool-d
13 PDM mira.vpn9.com.es pdm.vpn9.com.es 1 vCPU 1-2 GB 20 GB pool-d
14 Outline lyra.vpn9.com.es docs.vpn9.com.es 1 vCPU 1-2 GB 20 GB pool-c
15 WG Hub B betel.vpn9.com.es - 1 vCPU 512 MB 10 GB pool-c

Distribucion de pools NVMe

Disco 1 (1.92TB)     Disco 2 (1.92TB)     Disco 3 (1.92TB)     Disco 4 (1.92TB)
┌──────────────┐     ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│ Boot 100GB   │◄─mirror─►│ Boot 100GB   │     │              │     │              │
├──────────────┤     ├──────────────┤     │              │     │              │
│              │     │              │     │              │     │              │
│   pool-a     │     │   pool-b     │     │   pool-c     │     │   pool-d     │
│   ~1.8 TB    │     │   ~1.8 TB    │     │   ~1.9 TB    │     │   ~1.9 TB    │
│              │     │              │     │              │     │              │
│ Monitoring   │     │ Bastion      │     │ Wazuh        │     │ Servicios    │
│ (200-500GB)  │     │ WG Hub A     │     │ Zammad       │     │ ICSManager   │
│              │     │ Authentik    │     │ Outline      │     │ WildDuck     │
│              │     │ Netbox       │     │ WG Hub B     │     │ PMG          │
│              │     │              │     │              │     │ PDM          │
└──────────────┘     └──────────────┘     └──────────────┘     └──────────────┘

Criterio: Monitoring en pool-a solo (ocupa mucho disco). Resto repartido por criticidad: si muere un disco, solo 1/4 de los servicios se cae, el resto sigue. Se restaura desde PBS.


Fase 0: Base del servidor (dia 1)

0.1 Instalar Proxmox VE

  • Instalar PVE en sirio
  • Configurar boot ZFS mirror (disco1 + disco2, particion 100GB)
  • Crear pools ZFS independientes:
    zpool create pool-a /dev/nvme0n1p3
    zpool create pool-b /dev/nvme1n1p3
    zpool create pool-c /dev/nvme2n1
    zpool create pool-d /dev/nvme3n1
    
  • Optimizar ZFS en los 4 pools:
    for pool in pool-a pool-b pool-c pool-d; do
      zfs set recordsize=1M $pool
      zfs set compression=lz4 $pool
      zfs set atime=off $pool
    done
    

0.2 Hardening inmediato

  • Firewall PVE: activar, policy_out: DROP, policy_in: DROP
  • Reglas firewall: permitir SSH (22), PVE web (8006), WireGuard (51820) solo desde IPs conocidas
  • SSH: solo key david@ansible, PasswordAuthentication no
  • Verificar sshd_config.d no tiene drop-ins peligrosos
  • Instalar check_malware.sh (version actualizada con checks 1-21)

0.3 WireGuard en el host

  • Instalar WireGuard en el host PVE
  • Configurar peer temporal hacia hub WG existente
  • Verificar conectividad privada con el resto de la infra
  • Registrar sirio en DNS interno (Technitium cuando exista, /etc/hosts mientras tanto)

Fase 1: Fundamentos (semana 1)

1.1 VM Forgejo (vega)

  • Migrar o conectar Forgejo existente
  • Crear repos para:
    • infra-ansible (playbooks y roles)
    • infra-configs (backup de configs, capa 6.3)
    • infra-docs (documentacion operativa)
  • Verificar acceso por WG

1.2 VM Bastion (polar)

  • Crear VM: 1 vCPU, 1 GB RAM, 20 GB disco en pool-b
  • Debian 12 minimal
  • SSH hardened (solo key david@ansible)
  • Instalar Claude Code:
    curl -fsSL https://claude.ai/install.sh | bash
    
  • Crear /root/CLAUDE.md con contexto de la infra
  • Este es el punto de entrada SSH para tecnicos, nunca SSH directo al host PVE

1.3 VM WG Hub A (orion)

  • Crear VM: 1 vCPU, 512 MB RAM, 10 GB disco en pool-b
  • Debian 12 minimal + WireGuard
  • Configurar como hub central WG (reemplaza el peer temporal del host)
  • nftables con politica restrictiva:
    Puerto 25: BLOQUEADO siempre
    Puertos 465/587: whitelist SMTP
    Puertos 80/443/53/123: permitidos
    Resto: DROP + log
    
  • NAT CGNAT (100.64.0.0/10) para VMs de clientes
  • Instalar wgdashboard
  • URL: wg.vpn9.com.es (via Traefik, solo VPN)

Fase 2: Identidad e inventario (semana 1-2)

2.1 VM Authentik (atlas)

  • Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-b
  • Desplegar Authentik (Docker)
  • Configurar como proveedor OIDC/SAML central
  • Crear usuarios del equipo tecnico
  • URL: auth.vpn9.com.es
  • Integrar con Grafana, Netbox, Zammad, Outline, Forgejo (cuando se desplieguen)

2.2 VM Netbox (nova)

  • Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-b
  • Desplegar Netbox (Docker)
  • Configurar IPAM:
    • Prefijo WG: 10.9.0.0/16
    • Prefijo CGNAT: 100.64.0.0/10 (un /24 por cliente)
    • IPv6 WG: fdab::/48
  • Registrar todas las VMs ya desplegadas (sirio, vega, polar, orion, atlas, nova)
  • URL: netbox.vpn9.com.es
  • Integrar con Authentik (SSO)

Fase 3: Observabilidad (semana 2-3)

3.1 VM Monitoring (rigel)

  • Crear VM: 4 vCPU, 8-12 GB RAM, 200-500 GB disco en pool-a
  • Desplegar stack de monitoring (Docker):
    • VictoriaMetrics (metricas, retencion 1 año)
    • vmagent (scrape de metricas)
    • Grafana (dashboards)
    • Loki (logs, retencion 30 dias)
    • Alertmanager (alertas → Zammad cuando exista, email mientras tanto)
  • URL: grafana.vpn9.com.es
  • Integrar con Authentik (SSO)
  • Instalar en TODAS las VMs existentes:
    # En cada VM
    apt install prometheus-node-exporter
    # + Grafana Alloy para logs a Loki
    
  • Crear dashboards basicos: host PVE, VMs, discos ZFS

3.2 VM Wazuh (altair)

  • Crear VM: 4 vCPU, 12 GB RAM, 100 GB disco en pool-c
  • Desplegar Wazuh Manager + Dashboard (Docker o paquetes)
  • URL: wazuh.vpn9.com.es
  • Instalar Wazuh Agent en TODAS las VMs existentes + host PVE
  • Configurar FIM (File Integrity Monitoring):
    • /etc/pam.d/
    • /etc/ssh/sshd_config.d/
    • /etc/ld.so.preload
    • /usr/bin/ (binarios nuevos)
    • /usr/lib/systemd/system/ (services nuevos)
  • Configurar alerta nivel ≥10 → email (→ Zammad cuando exista)

3.3 Instalar agentes en todo lo existente

  • Por cada VM ya desplegada (polar, orion, atlas, nova, rigel, altair):
    • node_exporter
    • Grafana Alloy (logs → Loki)
    • Wazuh Agent
    • Verificar que aparece en Grafana y Wazuh Dashboard

Fase 4: Servicios operativos (semana 3-4)

4.1 VM Servicios (deneb)

  • Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-d
  • Desplegar (Docker):
    • Semaphore (UI para Ansible)
    • Uptime Kuma (status page)
    • Technitium (DNS interno)
    • Traefik (reverse proxy central)
  • Configurar Traefik:
    • Certs Let's Encrypt para *.vpn9.com.es
    • Middleware ipAllowList (solo IPs WG)
    • Catch-all: pagina "acceso solo por VPN" para peticiones externas
    • Routers para todos los servicios ya desplegados
  • URLs: ansible.vpn9.com.es, status.vpn9.com.es
  • Configurar Technitium como DNS interno:
    • Zona vpn9.com.es con todos los hostnames
    • Todas las VMs apuntan a Technitium como DNS
  • Semaphore: conectar a Forgejo (repos ansible), configurar inventario desde Netbox
  • Uptime Kuma: añadir checks de todos los servicios desplegados

4.2 VM Zammad (antares)

  • Crear VM: 2-3 vCPU, 4-6 GB RAM, 50 GB disco en pool-c
  • Desplegar Zammad (Docker)
  • URL: tickets.vpn9.com.es
  • Integrar con Authentik (SSO)
  • Configurar Alertmanager → Zammad (webhook, crea tickets de alertas)
  • Configurar Wazuh → Zammad (alertas nivel ≥10)
  • Crear colas: infraestructura, clientes, seguridad

4.3 Traefik: pagina VPN para accesos externos

  • Contenedor nginx con pagina estatica de instrucciones
  • Traefik catch-all redirige ahi si la IP no es WG
  • Pagina muestra: como instalar WireGuard, a quien contactar

Fase 5: Migracion de servicios existentes (semana 4+)

5.1 VM ICSManager (castor)

  • Crear VM: 1-2 vCPU, 2-3 GB RAM, 20 GB disco en pool-d
  • Migrar ICSManager (Docker: app + PostgreSQL, todo dentro, caja negra)
  • URL: ics.vpn9.com.es
  • Verificar integracion con Netbox (inventario de clientes)

5.2 VM WildDuck (pollux)

  • Crear VM: 1-2 vCPU, 2-3 GB RAM, 30-50 GB disco en pool-d
  • Migrar WildDuck (Docker: WildDuck + MongoDB + Redis, todo dentro)
  • URL: correo.vpn9.com.es
  • Verificar tokens SMTP de los PVE (notificaciones)
  • No migrar hasta tener PMG listo o al menos planificado

5.3 VM PMG (spica)

  • Crear VM: 1-2 vCPU, 2-3 GB RAM, 30 GB disco en pool-d
  • Instalar Proxmox Mail Gateway
  • Configurar como relay MX delante de WildDuck:
    Internet → PMG (spica) → WildDuck (pollux)
    
  • Configurar: SpamAssassin, ClamAV, greylisting, SPF/DKIM/DMARC
  • URL: pmg.vpn9.com.es
  • Redirigir MX del dominio a PMG

5.4 VM PDM (mira)

  • Crear VM: 1 vCPU, 1-2 GB RAM, 20 GB disco en pool-d
  • Instalar Proxmox Datacenter Manager
  • Conectar todos los clusters PVE
  • URL: pdm.vpn9.com.es

5.5 VM Outline (lyra)

  • Crear VM: 1 vCPU, 1-2 GB RAM, 20 GB disco en pool-c
  • Desplegar Outline (Docker: app + PostgreSQL + Redis)
  • URL: docs.vpn9.com.es
  • Integrar con Authentik (SSO)
  • Migrar documentacion operativa aqui

5.6 VM WG Hub B (betel)

  • Crear VM: 1 vCPU, 512 MB RAM, 10 GB disco en pool-c
  • Clon de la config de orion (WG Hub A)
  • Configurar keepalived HA con orion
  • Peer de failover: si orion cae, betel toma el relevo

Fase 6: Backup y contingencia (en paralelo desde fase 3)

6.1 Backup de las VMs de sirio

  • Configurar PBS1 (existente) para backupear todas las VMs de sirio
  • Schedule: diario, retencion 7 dias minimo
  • Verificar restauracion de al menos 1 VM como test

6.2 Backup de configs a git (capa 6.3)

  • Crear playbook backup-configs.yml en Semaphore:
    Recoger: /etc/pve/, /etc/proxmox-backup/, WG configs, ZFS properties
    Commit + push a repo infra-configs en Forgejo
    Schedule: diario 06:00
    

6.3 Replica ZFS a oficina (capa 6.4)

  • Configurar zfs send/recv incremental cada 4h
  • VMs a replicar: rigel (monitoring), altair (wazuh), deneb (servicios)
  • Destino: servidor Xeon 96GB en oficina via WireGuard
  • Documentar procedimiento de activacion en caso de perdida de sirio

6.4 Test de contingencia

  • Simular perdida de 1 pool NVMe: restaurar VMs desde PBS
  • Medir tiempo de restauracion
  • Documentar en Outline

Fase 7: Agentes IA (mes 2-4)

7.1 Claude Code en bastion (dia 1 de fase 1)

  • Ya instalado en polar (bastion) en fase 1.2
  • Crear CLAUDE.md con contexto completo de la infra

7.2 Agente triaje de alertas (mes 2)

  • Crear workflow en n8n (dentro de deneb):
    • Trigger: webhook desde Alertmanager
    • Consulta: VictoriaMetrics + Loki + Netbox
    • Analisis: Claude API (Sonnet)
    • Accion: crear ticket en Zammad con diagnostico
  • Coste estimado: ~$15-30/mes

7.3 Agente capacity planning (mes 3)

  • Workflow n8n: cron semanal lunes 08:00
  • Genera informe en Outline con predicciones de espacio

7.4 Agente seguridad Wazuh (mes 3-4)

  • Workflow n8n: webhook desde Wazuh (alertas nivel ≥10)
  • Analisis con Claude API (Opus)
  • Clasifica: falso positivo / incidente real / indeterminado

Checklist por VM (aplicar a cada VM al desplegarla)

Antes de pasar a la siguiente VM, verificar:

  • node_exporter instalado y scrapeado por VictoriaMetrics
  • Grafana Alloy instalado y enviando logs a Loki
  • Wazuh Agent instalado y reportando al manager
  • Registrada en Netbox (hostname, IP, rol, cliente: interno)
  • Añadida a Uptime Kuma (check HTTP o TCP)
  • Firewall de la VM configurado (solo puertos necesarios)
  • DNS registrado en Technitium (hostname.vpn9.com.es)
  • Router Traefik configurado (si tiene panel web)
  • Backup PBS verificado (al menos 1 backup exitoso)

Resumen de recursos

Total VMs:          15 (+ host PVE)
Total vCPU:         ~24-32
Total RAM:          ~44-58 GB (de 128 GB disponibles)
Total disco:        ~580-920 GB (de 7.68 TB disponibles)
Margen RAM:         ~70-84 GB libres
Margen disco:       ~6.8-7.1 TB libres
Coste API Claude:   ~$30-60/mes

Documentos de referencia

Documento Contenido
decision-logs.md Capa 1: Monitoring y logs centralizados
decision-incidentes.md Capa 2: Seguridad y respuesta a incidentes
decision-automatizacion.md Capa 3: Ansible + Semaphore + CI/CD
decision-red.md Capa 4: WireGuard, CGNAT, VM model, PDM, PMG
decision-almacenamiento.md Capa 6: Backup 3 capas, config backup, replica oficina
decision-observabilidad.md Capa 7: Dashboards, SLOs, capacity planning
decision-ia-agentes.md Capa 8: Claude Code + agentes automatizados
guia-deteccion-xmrig.md IOCs y procedimiento de deteccion de malware
check_malware.sh Script de verificacion de malware (ejecutar en todos los servidores)
articulos-seguridad-lecciones.md 177 articulos para blog (29 bloques)