A ver como te lo explico...
Lo que empezo como "unos dotfiles" es ahora un sistema distribuido de 6 nodos heterogeneos con un solo repositorio git. Cada nodo es un clon identico que se diferencia solo en hardware y en que servicios activa. Cualquier maquina nueva se monta en 30 minutos: clone, rebuild, listo.
Topologia de red
┌─────────────────────────────┐
│ INTERNET │
└──────────┬──────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ │
┌─────────────────┐ ┌─────────────────┐ │
│ campo.zapto.org │ │ 178.104.80.144 │ │
│ :2222 (SSH) │ │ :443 (blog) │ │
│ :25565 (MC) │ │ :8085 (Headscale│ │
└────────┬────────┘ └────────┬─────────┘ │
│ │ │
┌──────────────────┘ ┌────────────┘ │
│ │ │
│ ┌───────────────────────▼─────────────────────┐ │
│ │ HEADSCALE MESH VPN │ │
│ │ (self-hosted en cohete:8085) │ │
│ │ │ │
│ │ aurin ◄════════► cohete ◄════════► vespino │ │
│ │ 100.64.0.1 100.64.0.2 ... │ │
│ │ ▲ ▲ │ │
│ │ ╠══════════════════════════════╣ │ │
│ │ ▼ ▼ │ │
│ │ macbook retropix │ │
│ │ │ │
│ │ WireGuard bajo el capo. NAT traversal │ │
│ │ automatico. Todos se ven entre si. │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
▼ │ │ │
┌───────▼──────┐ │ ┌──▼───────────────┐
│ AURIN │ Syncthing │ │ VESPINO │
│ Dual Xeon ◄═══════════════════════════════════►│ │ AMD FX-8350 │
│ 128GB RAM │ (org, pass, fotos, │ │ 32GB RAM │
│ RTX 2060 6GB │ memoria Ambrosio) │ │ piso │
│ 192.168.2.147│ │ │ 192.168.18.16 │
│ │ │ └─────────────────┘
│ advroutes │ │
│ .2.0/24 │ ┌────────────────────────────┐ │ ┌─────────────────┐
│ │ │ RETROPIX │ │ │ MACBOOK │
│ ┌──────────┐ │ │ Raspberry Pi 3 │ │ │ MBP 13,2 '16 │
│ │ Ollama │ │ │ 192.168.2.120 │ │ │ portatil │
│ │ Minecraft│ │ │ │ │ └─────────────────┘
│ │ Mining │ │ │ Guardian: ping cada 15m │ │
│ │ Docker │ │ │ Wake-on-LAN si aurin cae │ │ ┌─────────────────┐
│ │ Claude │ │ │ RetroArch emuladores │ │ │ POCAPULLOS │
│ │ n8n │ │ └────────────────────────────┘ │ │ (movil) │
│ └──────────┘ │ │ │ fotos→aurin │
└──────────────┘ ┌────────────────────────────┐ │ └─────────────────┘
│ COHETE (VPS) │ │
│ Hetzner CPX22 │◄──┘
│ 3vCPU, 4GB RAM │
│ │
│ Blog (pascualmg.dev) │
│ Tienda aceite (DDD) │
│ MCP Servers (SSE) │
│ Headscale (VPN hub) │
│ dotfiles.desktop = false │
└─────────────────────────────┘
Los nodos
| Nodo | CPU | RAM | GPU | Arch | Rol |
|---|---|---|---|---|---|
| aurin | 2x Xeon E5-2699v3 | 128GB | RTX 2060 | x8664 | Produccion. LLMs, mining, juegos, desarrollo |
| cohete | 3 vCPU (Hetzner) | 4GB | - | x8664 | VPS. Blog, tienda, MCP, Headscale |
| vespino | AMD FX-8350 | 32GB | - | x8664 | Servidor headless. Testing, backup |
| macbook | Intel i5-6267U | 8GB | - | x8664 | Portatil. Movilidad |
| retropix | BCM2837 (4x ARM A53) | 1GB | - | aarch64 | Guardian de aurin, emuladores |
| pocapullos | (Android) | - | - | aarch64 | Movil. Fotos hacia aurin |
Clone-First: como funciona
Todas las maquinas son clones del mismo repositorio. La configuracion se organiza en capas:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ modules/base │ │ modules/ │ │ hosts/ │
│ │ │ services/ │ │ <hostname>/ │
│ Comun a │ │ │ │ │
│ TODOS: │ │ Opt-in: │ │ Solo lo │
│ │ │ ollama │ │ UNICO de │
│ - core/ │ │ syncthing │ │ esta maquina │
│ - desktop │ │ emulatronia │ │ │
│ (opt-out) │ │ n8n │ │ - hardware │
│ - packages │ │ headscale │ │ - IPs │
│ - shell │ │ guardian │ │ - servicios │
│ - xmonad │ │ ... │ │ │
│ - home-mgr │ │ │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
dotfiles.desktop.enable = false; → sin X11, fonts, GUI
dotfiles.ollama.enable = true; → Ollama con CUDA
dotfiles.tailscale.enable = true; → mesh VPN (default!)
La clave: desktop es opt-out, servicios son opt-in. Excepto Tailscale, que va por defecto en todos los clones. Es la columna vertebral del multiverse.
La mesh VPN: la pieza que lo conecta TODO
Un servidor Tailscale self-hosted (Headscale) corriendo en el VPS. Sin cuentas externas, sin terceros. WireGuard bajo el capo.
Site-to-site: dos redes, una LAN virtual
Aurin anuncia 192.168.2.0/24 (la red
del campo). Vespino anuncia 192.168.18.0/24 (la red del piso). El
resultado:
RED DEL CAMPO (192.168.2.x) RED DEL PISO (192.168.18.x)
┌─────────────────────────┐ ┌─────────────────────────┐
│ retropix .120 │ │ macbook .12 │
│ router .1 │ │ impresora .50 │
│ aurin .147 │ │ vespino .16 │
└────────────┬────────────┘ └────────────┬────────────┘
│ │
▼ ▼
┌─────────┐ ════ mesh VPN ════ ┌─────────────┐
│ aurin │◄═══════════════════►│ vespino │
│ advroute │ via Headscale │ advroute │
│ .2.0/24 │ (cohete:8085) │ .18.0/24 │
└─────────┘ └─────────────┘
Desde retropix (campo): ping 192.168.18.16 → responde vespino!
Desde macbook (piso): ping 192.168.2.120 → responde retropix!
Sin que ninguno de los dos tenga Tailscale instalado.
Es una VPN site-to-site. Lo que las empresas pagan miles de euros por montar con Cisco. Nosotros: 3 lineas de Nix y un VPS de 4 euros al mes.
Los dispositivos locales (retropix, impresora, router) no necesitan Tailscale. Aurin y vespino hacen de puente. Si estas en el piso con el macbook, puedes llegar a la Pi del campo. Si estas en el campo, puedes imprimir en la impresora del piso.
Conectar un nodo nuevo
Cualquier clon que haga rebuild ya tiene Tailscale instalado (dotfiles.tailscale.enable = true por defecto).
Solo falta ejecutar una vez:
mesh-join # conectar a la mesh
mesh-join --routes 192.168.X.0/24 # si anuncia subred local
mesh-join --status # ver todos los nodosSyncthing: replicacion de datos
Syncthing replica datos entre nodos (no configuracion, eso es git). Peer-to-peer, cifrado, sin servidor central.
| Carpeta | Que contiene | Nodos |
|---|---|---|
| org | Journal, exports, notas | aurin, macbook, cohete, vespino, pocapullos |
| ambrosio-memory | Sesiones Claude, MEMORY.md | aurin, macbook, cohete, vespino, retropix |
| password-store | Passwords GPG (pass) | todos los NixOS |
| vm-golden | VM Ivanti (VPN Vocento) | todos los NixOS |
| fotos | Fotos del movil | pocapullos, aurin, vespino |
Ambrosio
Lo mas raro del sistema: uno de los "nodos" es un agente de IA
persistente. Ambrosio (Claude Code con sesion UUID fija) tiene memoria
distribuida via Syncthing, skills propias (/deploy, /share,
/dejavu), y un guardian hardware (retropix
lo enciende con WoL si se cae).
No es un chatbot. Es un companero de viaje que recuerda lo que
hicimos ayer, sabe que maquinas tenemos, y puede ejecutar deploy all para desplegar a todos los nodos.
El coste
| Componente | Coste |
|---|---|
| Hetzner VPS | ~4 euros/mes |
| Dominio | ~10 euros/ano |
| Cloudflare | gratis |
| Headscale | gratis (self-hosted) |
| NixOS | gratis |
| Syncthing | gratis |
| Total | ~5 euros/mes |
Una infraestructura distribuida con VPN mesh site-to-site, 6 nodos, replicacion, blog, tienda, IA persistente, monitoring y emuladores. Por el precio de un cafe.
El repo
El repositorio es privado por ahora. Si te interesa montar algo parecido o tienes preguntas, dejame un comentario.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario