01 / Arquitectura
Primero separa las cuatro responsabilidades
Build
Una web estática puede generar HTML/CSS/JS en una carpeta de salida; una app Node necesita código, dependencias y un entrypoint que permanece en ejecución.
Servicio local
Los archivos estáticos necesitan un file server. Una app Node debe escuchar en una dirección y puerto controlados, preferiblemente loopback si Caddy será la única entrada pública.
Frontera pública
Caddy recibe el dominio, termina HTTPS y decide si sirve archivos o envía la petición al proceso Node. El panel de administración no debería compartir esa superficie por defecto.
Actualización
GitHub puede ser la fuente del código y un runner self-hosted puede ejecutar build, pruebas y despliegue, pero actualizar una revisión es distinto de mantener vivo el servicio.
02 / Caddy
Caddy: archivos estáticos y reverse proxy son dos casos distintos
Para una web estática, Caddy puede servir directamente una raíz de archivos con file_server. Para Node, el patrón habitual es dejar la aplicación en un puerto local y colocar Caddy delante con reverse_proxy. Cuando la configuración usa un dominio público y DNS/puertos están preparados, Caddy puede gestionar HTTPS automáticamente.
- En estático, publica solo la carpeta de salida del build; no expongas el repositorio, .git, archivos .env ni directorios de trabajo.
- En Node, escucha en loopback cuando solo Caddy deba hablar con la aplicación. No hace falta abrir el puerto interno en el router.
- El dominio público debe apuntar a la IP correcta y TCP 80/443 debe llegar a Caddy si quieres certificados públicos automáticos.
- Valida la configuración antes de recargarla y comprueba el dominio real después del cambio.
- Un 200 del backend local y un 200 del dominio público son pruebas diferentes: necesitas ambas.
03 / GitHub
GitHub es la fuente de revisión, no el supervisor del proceso
Un workflow con runner self-hosted puede hacer checkout, instalar dependencias, ejecutar tests, generar un build y preparar una revisión nueva en el propio servidor. Eso no convierte GitHub Actions en un gestor de procesos. El servicio estático o Node necesita su propio mecanismo de ejecución, reinicio o sustitución controlada, y el despliegue debe saber qué revisión queda activa.
Flujo que conviene poder auditar
- Commit o SHA que se quiere desplegar y rama de origen.
- Resultado de build y pruebas antes de tocar el servicio activo.
- Directorio o revisión preparada fuera de la publicación actual.
- Cambio atómico o paso explícito de activación y reinicio del proceso Node.
- Smoke local y después smoke HTTPS del dominio público.
- Revisión anterior disponible para rollback si el cambio falla.
04 / Caso real
Caso real: NRS Home Server
NRS Home Server aplica esta separación en Windows. Los despliegues conservan procedencia GitHub e historial; StaticHost y AppHost mantienen servicios independientes del panel; y la publicación Caddy es opt-in por dominio. Caddy sigue siendo externo: NRS Home Server no lo instala ni modifica DNS, router, firewall o certificados del sistema.
- Las webs estáticas se registran y se sirven mediante un StaticHost independiente; las apps Node usan puertos loopback reservados.
- La publicación de un dominio solo apunta a servicios registrados. El panel, Drive, backups y administración de Minecraft no se convierten en targets públicos.
- Antes de recargar Caddy, la configuración generada se valida. Un gateway preparado no se presenta como alcanzable desde Internet si DNS o la red externa no se han comprobado.
- Los proyectos GitHub conservan revisión desplegada, comprobación manual de frescura y una revisión anterior compatible para recuperación.
- El modelo ligero de persistencia arranca después de iniciar sesión en Windows; no equivale a hosting 24/7 antes del login.
05 / Checklist
Checklist de publicación
- 01
Decide si el proyecto es estático o necesita un proceso Node persistente.
- 02
Mantén la app Node en loopback y publica solo Caddy hacia Internet.
- 03
Comprueba DNS, puertos 80/443 y firewall antes de esperar HTTPS público.
- 04
Ejecuta build y QA sobre la revisión exacta que quieres desplegar.
- 05
Prepara el cambio fuera del servicio activo y conserva una vía de rollback.
- 06
Verifica primero el servicio local y después el dominio HTTPS real.
- 07
No permitas que un workflow no fiable ejecute código con permisos del servidor.
06 / Límites
Lo que esta arquitectura no resuelve sola
Caddy no sustituye backups, monitorización, gestión de procesos, actualizaciones del sistema ni una política de seguridad. Un runner self-hosted tampoco es una caja de arena: ejecuta workflows dentro de una máquina que controlas y puede conservar estado entre jobs. Si el servidor es crítico, necesita más disciplina operativa que un PC doméstico encendido de forma puntual.