¿Se puede, en un fin de semana, implementar desde cero la gestión automatizada de una infraestructura completa: persistencia, ingress, separación de privado y público, despliegues versionados, promoción de desarrollo a producción, repositorios de código, build e imágenes automáticos, definición de enjambres…?

Un experimento completo con DeepSeek 4.1 Flash 1017 para probar el agent coding sobre Rust.

  • Coste de infraestructura: 5 €/mes.
  • Coste de desarrollo: 5 € de API oficial de DeepSeek.
Consumo de la API oficial de DeepSeek durante el experimento
Consumo de la API oficial de DeepSeek durante el experimento

Entregable final

A partir de un único servidor «pelado», capacidad para:

  1. definir un proyecto o aplicación (SaaS, web app, investigación…);
  2. build, despliegue y versionado totalmente automáticos y desatendidos;
  3. cero configuración y cero código: todo se genera solo;
  4. empujar tareas agénticas al ciclo de desarrollo a partir de una única entrada (típicamente un prompt).

Qué se hizo (a ratos)

El desarrollo consistía básicamente en:

  1. Se generaba una especificación completa (01_spec.adoc) en vibe, revisada hasta alcanzar suficiente detalle.
  2. Una vez lista, el agente generaba un 02_plan.adoc que se revisaba en un breve vibe.
  3. Se revisaba algún detalle y se entregaban los cambios en lotes (mera enumeración: «eh, cambia: A, B, C»).

Eso, para cada pieza principal: la definición de una infraestructura básica reproducible (a partir de un servidor, levantar la base: nginx, Docker, PostgreSQL, Forgejo…), swarm.runner, swarm.apps y swarm.agents.

Y bueno, este ha sido el resultado.

Arquitectura

Todo el sistema se apoya en un único bastión de Hetzner. Sobre él corren Docker, nginx, PostgreSQL, Forgejo y los propios servicios de swarm. nginx publica en el puerto 444 las aplicaciones privadas, protegidas con HTTPS, certificado de cliente y autenticación básica. PostgreSQL actúa como base de datos común. Los trabajadores de ejecución, en cambio, son máquinas efímeras que se crean y se destruyen según la carga.

Índice de acceso a los servicios internos
Índice de acceso a los servicios internos

Forgejo

El código vive en Forgejo, servido desde el mismo bastión. La organización swarm agrupa los repositorios de los proyectos y de la propia infraestructura.

Listado de repositorios
Listado de repositorios
Página del proyecto awesome-app, creado automáticamente por swarm.agents
Página del proyecto awesome-app, creado automáticamente por swarm.agents

swarm.runner

swarm.runner es el punto de entrada de las tareas. Recibe trabajo, decide cuándo y dónde ejecutarlo y procura reutilizar la capacidad disponible. Hetzner cobra por horas naturales, así que conviene encender una máquina al principio de la hora y no apagarla hasta el final, encolando en ella las tareas que quepan antes de levantar otra.

Panel del orquestador
Panel del orquestador
Detalle de una tarea: detalle, consumo, stdout y script
Detalle de una tarea: detalle, consumo, stdout y script
Máquinas, scheduler y log del orquestador
Máquinas, scheduler y log del orquestador

swarm.apps

swarm.apps despliega aplicaciones de forma declarativa y automática a partir de su repositorio. Construye la imagen, publica puertos, genera el ingress de nginx y provisiona la base de datos de cada entorno. También gestiona todo el ciclo de despliegue y versionado. Mantiene el entorno de DES y permite promocionar una versión a PRO. Permite, además, mapear servicios entre aplicaciones, registrar URLs y otras tareas de plomería.

Listado de aplicaciones
Listado de aplicaciones
Detalle de awesome-app
Detalle de awesome-app
Puertos, ingress, URLs y versiones
Puertos, ingress, URLs y versiones
DES y PRO desplegados y listos de forma automática
DES y PRO desplegados y listos de forma automática

swarm.agents

swarm.agents es el intérprete de grafos de agentes. Un proyecto agrupa agentes y cada agente es un grafo que puede reutilizar otros agentes y delegar el trabajo largo en swarm.runner. Cada proyecto define así sus propios grafos, runners y condiciones, y recibe tareas desde fuera que serán ejecutadas.

Proyectos de agentes
Proyectos de agentes
Proyecto awesome-app
Proyecto awesome-app
Agente make-feature: vista general
Agente make-feature: vista general
Agente make-feature: propiedades y firma; a la derecha, propiedades de planner
Agente make-feature: propiedades y firma; a la derecha, propiedades de planner
Ejecución 33d837f9: resultado, visitas y eventos
Ejecución 33d837f9: resultado, visitas y eventos
Cada ejecución genera la ejecución de tareas que necesite
Cada ejecución genera la ejecución de tareas que necesite

La tarea del runner conserva la referencia al proyecto, al agente, a la ejecución y al nodo que la originaron. Esa trazabilidad es la que permite saltar de una ejecución a la tarea concreta que la materializó y volver, sin perder el hilo, al punto del grafo donde todo empezó.