Wetopi Platform — Memoria técnica y ejecutiva de decisiones recientes¶
RKE2, networking, GitOps, Vault y bootstrap para Codex¶
Fecha: 28 de agosto de 2026
Estado: Decisiones consolidadas para implementación
Organización GitHub: wetopi-platform
Audiencia principal: Codex / agentes de implementación / operadores SRE
Objetivo: preservar el contexto técnico y ejecutivo de las últimas decisiones para continuar el proyecto sin reabrir debates ya cerrados.
Índice¶
- Resumen ejecutivo
- Contexto del proyecto
- Decisiones consolidadas
- RKE2 y topología inicial
- Bootstrap externo y
wetopi-ops01 - Organización GitHub y repos
- OpenTofu + Ansible
- Networking de las VMs
- Ceph existente
- CIDRs propuestos
- Cilium + Hubble
- Ingress WAN: IPVS + VRRP + DSR
- Edge nodes
- Traefik + Gateway API
- Sustitución de Consul/Registrator/consul-template
- Egress simple con NATGW Ubuntu
- Selección de egress por site/customer
- Argo CD
- Infisical como Wetopi Vault
- SOPS + age como bootstrap
- Kubernetes Secrets como materialización runtime
- Modelo de acceso de agentes a secrets
- Tool runtimes y aislamiento de credenciales
- Hermes personales y coding agents
- ServiceAccounts, RBAC y namespaces
- Secrets encryption at rest
- Orden de bootstrap actualizado
- Primeras tareas para Codex
- Decisiones aún abiertas
- Criterios de aceptación
- Resumen final para implementación
- PLATFORM-018 — CNI Cilium desde el día uno (sin Canal provisional)
1. Resumen ejecutivo¶
Wetopi está reconstruyendo su plataforma de Managed WordPress Hosting desde Docker Swarm hacia una nueva base RKE2 sobre su cloud privado Proxmox + Ceph.
La nueva plataforma debe ser AI-first y operable tanto por humanos como por agentes.
Las decisiones ya cerradas son:
Kubernetes distribution:
RKE2
CNI:
Cilium
Network observability:
Hubble
GitOps:
Argo CD
Vault / secrets manager:
Infisical self-hosted
Bootstrap secret encryption:
SOPS + age
Infrastructure as Code:
OpenTofu + Ansible
Ingress WAN:
mantener IPVS + VRRP + DSR inicialmente
Proxy edge inicial:
Traefik
HTTP routing:
Gateway API
Egress:
NATGW Ubuntu simples con gateway interno estable y WAN IP cambiable
El cluster inicial se construirá greenfield, en paralelo al Docker Swarm actual. No habrá big-bang.
La plataforma se levantará primero, se validará, y después se migrarán edge nodes, hosting workers y sites de forma progresiva.
2. Contexto del proyecto¶
Wetopi es un Managed WordPress Hosting ejecutado actualmente sobre:
El workload principal son wepod, aproximadamente un contenedor por website, con:
El tráfico WAN actual utiliza:
El descubrimiento de backends se realiza mediante:
La nueva plataforma debe preservar las propiedades valiosas de esta arquitectura, especialmente DSR y la distribución del ancho de banda de salida entre distintos hosts físicos de OVH.
3. Decisiones consolidadas¶
PLATFORM-001 — RKE2¶
RKE2 será la distribución Kubernetes de producción.
PLATFORM-002 — Greenfield¶
El cluster nuevo se construirá en paralelo a Swarm.
PLATFORM-003 — 3 control planes¶
El control plane inicial tendrá tres nodos RKE2 server con embedded etcd.
PLATFORM-004 — 3 platform workers¶
Inicialmente habrá tres workers dedicados a servicios de plataforma.
PLATFORM-005 — Bootstrap externo¶
Kubernetes se construye desde fuera del cluster.
PLATFORM-006 — wetopi-ops01¶
Existirá una VM externa de operaciones, bootstrap y recovery.
PLATFORM-007 — Cilium¶
Cilium será el CNI.
PLATFORM-008 — Hubble¶
Hubble será la base de network observability.
PLATFORM-009 — Argo CD¶
Argo CD será el sistema GitOps.
PLATFORM-010 — Infisical¶
Infisical self-hosted será el Vault operativo de Wetopi.
PLATFORM-011 — SOPS + age¶
SOPS + age se utilizará para bootstrap secrets, no como Vault principal.
PLATFORM-012 — IPVS/DSR¶
Se preserva IPVS + VRRP + DSR inicialmente.
PLATFORM-013 — Traefik¶
Traefik será el proxy edge inicial.
PLATFORM-014 — Gateway API¶
El routing HTTP se expresará con Gateway API.
PLATFORM-015 — Egress simple¶
Se usarán NATGW Ubuntu simples con gateway interno estable y WAN IP cambiable.
PLATFORM-016 — No Istio inicialmente¶
No se desplegará service mesh sin necesidad concreta.
PLATFORM-017 — No BGP como requisito inicial¶
La plataforma no dependerá de BGP para arrancar.
4. RKE2 y topología inicial¶
Se crearán inicialmente:
Total inicial:
Nombres previstos:
Los control planes y workers deben distribuirse entre distintos hosts Proxmox.
Ejemplo:
pve01 -> rke-cp01 + rke-platform01
pve02 -> rke-cp02 + rke-platform02
pve03 -> rke-cp03 + rke-platform03
La distribución real deberá validarse con el inventario.
5. Bootstrap externo y wetopi-ops01¶
La regla es:
Kubernetes no debe depender de servicios internos de Kubernetes para poder crearse o repararse.
Modelo:
Codex trabajará inicialmente desde el laptop del operador.
wetopi-ops01 será la máquina durable de bootstrap y disaster recovery.
Debe tener, como mínimo:
No alojará workloads productivos.
6. Organización GitHub y repos¶
Organización:
Repos iniciales:
wetopi-platform/infrastructure
wetopi-platform/agent-services
wetopi-platform/ai-hub
wetopi-platform/agents
wetopi-platform/docs
No crear repos adicionales sin necesidad real.
7. OpenTofu + Ansible¶
Se selecciona:
OpenTofu:
- crea VMs;
- configura recursos Proxmox;
- modela infraestructura declarativa.
Ansible:
- baseline Ubuntu;
- sysctl;
- paquetes;
- RKE2;
- configuración de hosts;
- operaciones bootstrap.
Git es source of truth.
No se considera válido dejar cambios permanentes solo en shell history.
8. Networking de las VMs¶
Cada VM tendrá inicialmente:
Modelo:
No se introducirán múltiples interfaces salvo necesidad demostrada.
9. Ceph existente¶
La red Ceph actual es:
Es parte de la infraestructura hiperconvergida Proxmox + Ceph.
Decisión:
NO modificar, renumerar ni rediseñar esta red.
Ceph se consumirá desde Kubernetes mediante CSI.
La conectividad exacta entre RKE2 nodes y Ceph debe comprobarse, no asumirse.
10. CIDRs propuestos¶
Propuesta actual:
Node LAN:
pendiente de inventario real
Pod CIDR:
10.64.0.0/14
Service CIDR:
10.68.0.0/16
Ceph:
192.168.96.0/20
EXISTENTE / NO TOCAR
Los CIDRs definitivos deben validarse contra todas las redes Wetopi existentes.
11. Cilium + Hubble¶
Cilium será el CNI base.
Primera versión:
Razón de VXLAN inicial:
- mínima dependencia de underlay;
- no requiere que la red física conozca PodCIDRs;
- simplifica bootstrap;
- una sola NIC por VM.
No activar inicialmente:
- BGP WAN;
- service mesh;
- egress avanzado;
- features experimentales innecesarias.
Hubble se utilizará para flows y correlación de tráfico con pods/namespaces/sites.
12. Ingress WAN: IPVS + VRRP + DSR¶
El frontend actual se conserva inicialmente.
Motivo principal:
DSR permite que cada edge node responda directamente a Internet usando el uplink/bandwidth domain del host físico Proxmox/OVH donde corre.
Esto permite agregar capacidad de salida entre varios hosts físicos.
Esta propiedad no debe perderse durante la migración.
13. Edge nodes¶
Los antiguos WAN proxies evolucionarán a RKE2 edge workers.
Ejemplo:
Labels:
wetopi.io/role=edge
wetopi.io/wan-zone=a
wetopi.io/proxmox-host=pve01
wetopi.io/bandwidth-domain=pve01
Taint:
El proxy se desplegará como DaemonSet cuando tenga sentido mantener una instancia por edge node.
14. Traefik + Gateway API¶
Se elige Traefik inicialmente.
Razones:
- sencillo;
- Kubernetes-native;
- soporte de Gateway API;
- TLS;
- routing dinámico;
- métricas;
- separación clara respecto a Cilium.
Modelo:
Envoy podrá reevaluarse más adelante si aparecen necesidades L7 más avanzadas.
15. Sustitución de Consul/Registrator/consul-template¶
Antes:
Después:
Kubernetes será el service registry del hosting.
16. Egress simple con NATGW Ubuntu¶
No se construirá inicialmente un egress control plane complejo.
Modelo base:
gw100
LAN: 192.168.88.100
WAN: PUBLIC_IP_A
gw101
LAN: 192.168.88.101
WAN: PUBLIC_IP_B
gw102
LAN: 192.168.88.102
WAN: PUBLIC_IP_C
Cada gateway:
Objetivo:
- fácil de operar;
- fácil de cambiar;
- fácil de observar;
- fácil de separar reputación.
17. Selección de egress por site/customer¶
Modelo lógico:
Ejemplo:
La implementación inicial puede usar:
- policy routing;
- automatización ligera;
- helper/DaemonSet que observe labels y mantenga reglas.
No construir todavía un controlador complejo.
Futuro:
puede sustituir el mecanismo sin cambiar el modelo lógico.
Separar desde el inicio:
Los crawlers/agentes no deben compartir IP de salida con customers.
18. Argo CD¶
Se ha decidido usar:
Razones principales:
- excelente Web UI;
- estado Synced/OutOfSync;
- health;
- diffs;
- historial;
- visibilidad para operadores humanos;
- modelo declarativo;
- API/CLI;
- RBAC/SSO/OIDC futuro.
Modelo:
No se utilizará un pipeline CI basado en kubectl apply como mecanismo normal de producción.
Pendiente decidir el layout exacto:
- App of Apps;
- ApplicationSet;
- AppProjects;
- estructura por cluster/environment.
19. Infisical como Wetopi Vault¶
El Vault operativo de Wetopi será:
El requisito real no es solamente almacenar secrets declarativos.
Se necesita un servicio vivo donde humanos y agentes puedan:
- crear credentials;
- guardar username/password;
- guardar API tokens;
- guardar SSH keys;
- recuperar secrets;
- rotarlos;
- listarlos;
- actualizarlos;
- auditarlos;
- compartirlos con servicios.
Ejemplo conceptual:
Infisical será el source of truth operativo de credentials.
20. SOPS + age como bootstrap¶
SOPS NO será el Vault principal.
Se utilizará únicamente para bootstrap.
Modelo:
SOPS protege los secretos necesarios para levantar:
- Infisical;
- integración inicial de Argo CD;
- bootstrap identities;
- recovery material mínimo.
Una vez Infisical funciona, los nuevos credentials se guardan en Infisical, no en Git.
Debe existir al menos una recovery key age fuera del cluster y fuera de Git.
21. Kubernetes Secrets como materialización runtime¶
Modelo:
Infisical es source of truth.
Kubernetes Secret es materialización runtime.
Esto permite:
- cambiar un secret centralmente;
- sincronizarlo al cluster;
- consumirlo con mecanismos nativos de Kubernetes.
22. Modelo de acceso de agentes a secrets¶
La regla principal es:
el agente debe poder USAR un secret sin necesidad de VER su valor cuando sea posible.
Ejemplo:
Hermes
│
│ tool call
▼
platform-tools
│
│ reads secret from Infisical/K8s Secret
▼
Proxmox / Cloudflare / OVH
El LLM no necesita recibir el token.
23. Tool runtimes y aislamiento de credenciales¶
No montar todos los secrets directamente en el proceso LLM.
Agrupar tools por security domain.
Ejemplo:
platform-tools
├── kubernetes
├── proxmox
├── ceph
└── networking
wordpress-tools
├── wordpress
├── mysql
└── backups
marketing-tools
├── intercom
├── analytics
└── ...
Cada runtime recibe únicamente los secrets necesarios.
No crear un sidecar por tool individual.
En ai-hub, las tools deberían declarar sus requirements.
Ejemplo:
Los agentes deben consumir un contrato propio Wetopi, no acoplarse directamente a Infisical.
API conceptual:
24. Hermes personales y coding agents¶
Hermes personales/coding agents necesitarán operar la plataforma.
Podrán:
- llamar tools privilegiadas;
- usar credentials;
- escribir secrets en Vault;
- recuperar credentials autorizados;
- operar GitHub;
- operar Proxmox;
- operar Kubernetes.
Pero:
- no recibir todas las credenciales en env;
- no montar un vault global;
- no dar acceso indiscriminado a todos los paths.
El permiso debe seguir el rol.
Ejemplo conceptual:
Hermes SRE
/platform/*
/infrastructure/*
/agents/hermes-sre/*
Hermes Developer
/development/*
/github/*
/agents/hermes-developer/*
Hermes Marketing
/marketing/*
/agents/hermes-marketing/*
25. ServiceAccounts, RBAC y namespaces¶
Para operar Kubernetes, los agentes dentro del cluster usarán:
No kubeconfig estático ni password.
Ejemplo:
Hermes SRE
-> permisos operacionales amplios
Hermes Developer
-> namespaces dev + deployments
ADK observer
-> readonly
ADK specialist
-> permissions específicas
Namespaces orientativos:
wetopi-platform
wetopi-edge
wetopi-hosting
wetopi-agents-sre
wetopi-agents-development
wetopi-agents-marketing
wetopi-observability
wetopi-security
Los namespaces forman parte de la frontera de secrets y RBAC.
Importante:
quien puede crear Pods en un namespace puede potencialmente montar Secrets de ese namespace.
Por tanto, permisos de workload creation y secret access deben diseñarse conjuntamente.
26. Secrets encryption at rest¶
SOPS protege Git.
Infisical protege el Vault.
Kubernetes Secrets materializados deben protegerse en etcd.
RKE2 deberá tener:
habilitado.
Modelo:
27. Orden de bootstrap actualizado¶
Orden actual recomendado:
1. GitHub organization + repos
2. Inventario Proxmox/redes
3. OpenTofu + Ansible
4. wetopi-ops01
5. 3 x RKE2 control plane
6. 3 x platform workers
7. RKE2 HA + etcd
8. Cilium
9. Hubble
10. Ceph CSI
11. Argo CD
12. SOPS + age bootstrap
13. Infisical
14. Kubernetes Secrets integration/operator
15. Docs
16. Memory Plane
17. Work Ledger
18. AI Hub
19. Hermes
20. ADK Fleet
21. Edge nodes
22. Gateway API + Traefik
23. NATGW
24. first hosting workers
25. first websites
26. progressive migration from Swarm
28. Primeras tareas para Codex¶
Task 1 — Crear repos¶
Crear:
Aplicar:
- README;
- CODEOWNERS;
- branch protection;
- CI mínima;
- convenciones.
Task 2 — Inventario Proxmox¶
Recoger:
- nodos;
- CPU;
- RAM;
- storage;
- bridges;
- VLANs;
- redes;
- IP ranges;
- failure domains;
- bandwidth domains.
No crear aún direccionamiento inventado.
Task 3 — Validar redes¶
Confirmar que:
no colisionan.
Confirmar conectividad RKE2 node -> Ceph 192.168.96.0/20.
Task 4 — Ubuntu template¶
Crear template reproducible Ubuntu 24.04 + cloud-init.
Task 5 — wetopi-ops01¶
Crear/provisionar wetopi-ops01.
Task 6 — Control plane¶
Crear:
Task 7 — Platform workers¶
Crear:
Task 8 — RKE2¶
Configurar:
- embedded etcd;
- HA;
- API endpoint estable;
- secrets encryption;
- snapshots.
Task 9 — Cilium/Hubble¶
Desplegar:
- Cilium VXLAN;
- Hubble;
- networking tests.
Task 10 — Ceph CSI¶
Validar:
- PVC create;
- mount;
- pod restart;
- persistence.
Task 11 — Argo CD¶
Desplegar declarativamente.
Task 12 — SOPS bootstrap¶
Generar:
- age production key;
- age recovery key;
.sops.yaml.
Guardar recovery key fuera del cluster y fuera de Git.
Task 13 — Infisical¶
Desplegar self-hosted.
Configurar:
- persistence;
- backups;
- admin bootstrap;
- projects/environments;
- machine identities mínimas;
- Kubernetes integration.
Task 14 — Vault contract¶
Crear en ai-hub una capa estable:
Los agentes no deben quedar acoplados a la API concreta de Infisical.
29. Decisiones aún abiertas¶
29.1 Node LAN CIDR¶
Pendiente de inventario.
29.2 Endpoint HA de RKE2¶
Propuesta previa:
Debe cerrarse antes del deploy final.
29.3 DSR validation¶
Debe hacerse PoC real con capture.
29.4 Traefik deployment exacto¶
Definir:
- hostNetwork;
- DaemonSet;
- VIP handling;
- health endpoint.
29.5 Egress enforcement exacto¶
Definir implementación inicial de:
29.6 Infisical OSS/licensing¶
Validar exactamente:
- features necesarias en self-hosted;
- machine identities;
- Kubernetes integration;
- audit;
- versioning;
- posibles límites comerciales.
29.7 GitOps layout¶
Definir estructura exacta Argo CD:
- Application;
- AppProject;
- App of Apps o ApplicationSet.
29.8 OIDC¶
Pendiente.
29.9 Backup externo¶
Pendiente destino definitivo de:
- etcd snapshots;
- Infisical DB;
- SOPS recovery material;
- Git.
29.10 Observabilidad central¶
Pendiente arquitectura final.
30. Criterios de aceptación¶
Antes de desplegar Hermes o workloads reales:
Cluster¶
- [ ] pérdida de 1 control plane no interrumpe API;
- [ ] etcd mantiene quorum;
- [ ] snapshot etcd funcional;
- [ ] restore documentado y probado;
- [ ] workers pueden drain/uncordon.
Networking¶
- [ ] pod-to-pod;
- [ ] pod-to-service;
- [ ] DNS;
- [ ] Hubble flows visibles;
- [ ] no collision CIDRs;
- [ ] nodes alcanzan Ceph.
Storage¶
- [ ] PVC;
- [ ] delete/recreate pod;
- [ ] persistencia;
- [ ] failure test básico.
GitOps¶
- [ ] Argo CD reconciles desde Git;
- [ ] manual drift detectable;
- [ ] rollback verificable.
Vault¶
- [ ] agente/tool puede crear secret;
- [ ] servicio puede consumir secret;
- [ ] secret no queda plaintext en Git;
- [ ] access control validado;
- [ ] backup de Infisical probado;
- [ ] recovery bootstrap documentado.
Secrets¶
- [ ] SOPS bootstrap funciona;
- [ ] recovery age key offline;
- [ ] Kubernetes secrets cifrados at rest;
- [ ] namespaces/RBAC limitan acceso.
Agentes¶
- [ ] Hermes puede usar tool privilegiada sin recibir raw token;
- [ ] ADK readonly no puede leer secrets ajenos;
- [ ] coding agent solo accede a vault paths autorizados.
31. Resumen final para implementación¶
La platform foundation actual queda así:
GitHub
wetopi-platform
│
infrastructure
│
Codex
│
wetopi-ops01
│
OpenTofu + Ansible
│
▼
┌─────────────┐
│ RKE2 HA │
└─────────────┘
│
Cilium + Hubble
│
Ceph CSI
│
Argo CD
│
SOPS bootstrap
│
Infisical
│
┌──────────────┼──────────────┐
│ │ │
Kubernetes Tool runtimes Humans
Secrets │ Web UI
│ │
└───────────────┼──────────────┐
│ │
Hermes ADK
Networking:
La intención global es mantener la primera versión simple:
- no Istio;
- no BGP obligatorio;
- no controller avanzado de egress;
- no OpenBao;
- no service mesh complejo;
- no rediseño simultáneo de Ceph.
La plataforma se estabiliza primero.
Después se despliegan:
y finalmente se inicia la migración progresiva de Swarm a RKE2.
32. PLATFORM-018 — CNI Cilium desde el día uno (sin Canal provisional)¶
Fecha: 29 de agosto de 2026 Estado: Decidido (operador). Refina PLATFORM-007 (Cilium será el CNI) y PLATFORM-008 (Hubble). Se graba como PLATFORM-018 — el siguiente identificador libre — porque PLATFORM-008 ya estaba asignado a Hubble en el registro original.
Decisión operativa para el primer addon del cluster RKE2:
- No habrá CNI provisional Canal. Cilium es el CNI desde el primer nodo y
sustituye al Canal que RKE2 instala por defecto: la configuración de
rke2-server debe fijar
cni: none, y el rol de RKE2 debe mantener deshabilitado el Canal incluido de serie. - Chart oficial Cilium fijado a la versión
1.20.1(oci://quay.io/cilium/charts/cilium, namespacekube-system). Las versiones de chart no llevan prefijov. - Encapsulación VXLAN (
routingMode: tunnel,tunnelProtocol: vxlan); sin BGP y sin native routing inicialmente, según el plan maestro (14.4) y PLATFORM-017. - IPAM
cluster-poolconclusterPoolIPv4PodCIDRList: [10.64.0.0/14]yclusterPoolIPv4MaskSize: 24, coincidiendo exactamente con el pod CIDR de RKE2. RKE2 es quien posee el pod CIDR y el service CIDR (10.68.0.0/16); Cilium no los re-deriva y no toca el CIDR de servicios. kubeProxyReplacement: falseen v1: kube-proxy estándar convive con Cilium VXLAN. La sustitución de kube-proxy queda documentada como opción futura.- Hubble habilitado con Hubble Relay (
hubble.enabled: true,hubble.relay.enabled: true);hubble.ui.enabled: falsepor defecto, activación opcional documentada. - La MTU queda por defecto (auto ~1450 sobre el LAN de nodos MTU 1500).
- Puertos obligatorios entre nodos: UDP 8472 (VXLAN) y TCP 4244 (Hubble Relay).
Método de instalación: Argo CD no existe todavía en el primer bootstrap, así
que el addon se instala desde wetopi-ops01 con Helm durante la fase de
apply (playbook ansible/playbooks/cilium.yml en el repo infrastructure).
Es una instalación solo de bootstrap: cuando Argo CD exista, la gestión del
addon pasa a él y el playbook se retira. Los valores pinneados viven en
kubernetes/cilium/values.yaml; la lista de verificación de post-instalación
en kubernetes/cilium/VALIDATION.md.
CIDRs: el ownership es de RKE2 (pod CIDR 10.64.0.0/14 y service CIDR 10.68.0.0/16); el pool de Cilium se limita a consumir el rango de pods y nunca debe diverger de la configuración de rke2-server.