Porque Caddy?

Durante mucho tiempo use Nginx Proxy Manager como reverse proxy y certificate manager de los sitios que hosteo. Funciona muy bien, UI intuitiva, se habla con Let´s’Encrypt para generar certificados hasta tipo Wildcard, puede manejar autorizaciones de sitios para solicitar un login y password para ingresar. Pero tiene una falla, para mi gusto que no es fácil de arreglar o requiere echar mano de algo mas para subsanar. El puerto de la UI, la administración, es el 81 y debe de ser público y no usa certificado. Uno podría, esconderlo o cambiarlo, con un cert asegurarlo o algo más o bloquear que solo ciertos IP´s tengan acceso a la UI, pero esto requiere más trabajo y mantenmiento, solo para aegurar el portal.

Lo otro que requiere mantenimiento en el NPM en sí, es que utiliza una base de datos, lo cual implica backups y todo lo que conlleva mantener una BD.

Por esto cambie a Caddy.

Caddy

Reverse proxy y web server, es lo que nginx seria si fuera programado hoy. Rápido, sencillo y seguro.

Mas que cambie el blog a ser generado estáticamente, pero eso es otra historia.

Con Caddy el archivo de configuración es sencillo, el solito se encarga de generar los certificados, igual con Let’s Encrypt y de mantenerlos. También maneja autorizaciones, varios tipos, pero con la básica me basta para el sitio que intento asegurar.

Y lo mejor, pude cerrar el puerto 81 del NPM, el cual ya no ocupaba.

Archivo de configuracion de Caddy

Este es mi archivo de Caddy para mis sitios, obvio, escondi los FQDN, junto con los usarios y passwords:

{
	email user@example.com
	#  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}

# =========================
# PUBLICOS
# =========================

site1.techwm.xyz {
	reverse_proxy changedetection:5000
}

site2.techwm.xyz {
	reverse_proxy freshrss:80
}

site3.techwm.xyz {
	reverse_proxy trilium:8080
}

site4.techwm.xyz {
	reverse_proxy paperless-webserver-1:8000
}

techwm.xyz, www.techwm.xyz {
	root * /srv/techwm
	encode gzip zstd
	file_server
	header {
		X-Frame-Options "DENY"
		X-Content-Type-Options "nosniff"
		Referrer-Policy "strict-origin-when-cross-origin"
		Content-Security-Policy "default-src 'self'"
	}
}
# =========================
# PROTEGIDOS (sin login propio)
# =========================

site5.techwm.xyz {
	basic_auth {
		usuario HASHED_PASSWORD
	}
	reverse_proxy uptime-kuma:3001
}

Simple, fácil, se cambia si se agrega o quita algo y solo un reload a Caddy y listo.

Ahora, esta vez no use un wildcard, por la razón que el Caddy oficial no trae el plugin, en mi caso, de Cloudflare para generar el registro DNS necesario. Existen varios contenedores de Caddy con el plugin ya incluido, pero esto sería confiar en el mantenimiento de un tercero y no el oficial. La otra opción era, utilizando el contenedor de Caddy con tag de builder, hacer mi propio contenedor incluyendo el plugin, pero esto implicaba que cada vez que reiniciaba o actualizara el contenedor, se tenía que generar de cero completamente.

Por estas razones, y principalmente porque son pocos sitios, cambie la forma en que se manejan los certificados, y ahora Caddy los solicita por sitio o URL y listo.