Cloudflare gratis: por qué lo uso y cómo purgar su maldita caché
La situación: un servidor en casa con CGNAT
Tengo un servidor casero (un AMD FX-8350 con 32GB de RAM) que sirve este blog. No es un cloud server. No es un VPS. Es un PC en mi salón, conectado por cable al router.
Problema: mi ISP usa CGNAT (Carrier-Grade NAT). Significa que no tengo IP pública real. Mi router está detrás de otro router del ISP. Abrir puertos no sirve porque no hay puerto que abrir hacia internet.
Sin Cloudflare, este blog no existiría.
¿Qué me da Cloudflare gratis?
1. Cloudflare Tunnel: la magia
Esto es lo que resuelve el CGNAT. Instalo cloudflared en mi servidor, y él abre una conexión saliente hacia Cloudflare. Como la conexión la inicio yo, el CGNAT no bloquea nada.
Cloudflare recibe las peticiones de pascualmg.dev y las reenvía por ese túnel hasta mi servidor. Resultado: mi web es accesible desde cualquier parte del mundo sin IP pública ni puertos abiertos.
2. HTTPS automático
Mi servidor sirve HTTP plano en el puerto 80. Sin cifrar, sin certificados, sin complicaciones. Cloudflare pone SSL/TLS encima automáticamente. Los visitantes ven https:// con candado verde, pero mi servidor nunca toca un certificado.
Sin Cloudflare tendría que montar Let's Encrypt, renovar certificados cada 90 días, configurar nginx como reverse proxy... Para un blog personal es demasiado.
3. CDN global
Cloudflare cachea los archivos estáticos (imágenes, CSS, JavaScript) en ~300 datacenters repartidos por el mundo. Cuando alguien en Japón visita el blog, la imagen carga desde Tokyo, no desde mi salón en España.
Mi FX-8350 no tiene que servir la misma imagen 1000 veces. La sirve una vez, Cloudflare la cachea, y a partir de ahí el servidor solo se encarga del HTML dinámico.
4. Protección DDoS
Si alguien decide tirar mi web con un ataque de denegación de servicio, Cloudflare lo absorbe. Un FX-8350 con 32GB de RAM no aguantaría ni un DDoS modesto. Cloudflare tiene la infraestructura para absorber ataques de terabits por segundo. Gratis.
5. Firewall y analytics
Puedo ver cuántas visitas tengo, de qué países, qué URLs se consultan más. También puedo bloquear IPs, bots maliciosos, o crear reglas tipo "si viene de este rango de IPs, bloquear".
El problema: la caché es agresiva
Todo lo bueno tiene su lado oscuro. Cloudflare cachea archivos estáticos por horas (o días, según la configuración). Esto es genial para rendimiento, pero cuando actualizas un archivo, Cloudflare sigue sirviendo la versión vieja.
Ejemplo real: hoy he actualizado la imagen Open Graph del blog (la que sale cuando compartes el enlace en LinkedIn). Cloudflare seguía sirviendo la antigua. LinkedIn cacheó la preview con la imagen vieja. Un desastre en cadena.
Solución 1: la guarrada del query string
Cambiar la URL de imagen.png a imagen.png?v=2. Cloudflare lo trata como URL nueva y la recarga. Funciona, pero es feo y tienes que editar código cada vez.
Solución 2: la API de Cloudflare (la buena)
Cloudflare tiene una API REST que permite purgar URLs específicas de la caché. Necesitas:
- Un API token con permisos de "Cache Purge" para tu zona
- El Zone ID de tu dominio (lo encuentras en el dashboard de Cloudflare)
Crear el token
Ve a dash.cloudflare.com/profile/api-tokens → Create Token → Custom Token:
- Permissions: Zone → Cache Purge → Purge
- Zone Resources: Include → Specific zone → tu dominio
Guarda el token en un archivo seguro:
echo "tu-token-aqui" > ~/.secrets/cloudflare-cache-token
chmod 600 ~/.secrets/cloudflare-cache-tokenObtener el Zone ID
curl -s "https://api.cloudflare.com/client/v4/zones?name=tudominio.com" \
-H "Authorization: Bearer $(cat ~/.secrets/cloudflare-cache-token)" \
| python3 -m json.tool | grep '"id"' | head -1El script: cf-purge
Un script de bash que hace todo el trabajo:
#!/usr/bin/env bash
# cf-purge - Purge Cloudflare cache
# Usage:
# cf-purge # Purge everything
# cf-purge https://tudominio.com/img/foto.png # Purge specific URL(s)
ZONE_ID="tu-zone-id-aqui"
TOKEN_FILE="$HOME/.secrets/cloudflare-cache-token"
if [ ! -f "$TOKEN_FILE" ]; then
echo "Error: token not found at $TOKEN_FILE"
exit 1
fi
TOKEN=$(cat "$TOKEN_FILE")
if [ $# -eq 0 ]; then
echo "Purging ALL cache..."
curl -s -X POST \
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/purge_cache" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}' | python3 -m json.tool
else
FILES=$(printf '"%%s",' "$@" | sed 's/,$//')
echo "Purging: $@"
curl -s -X POST \
"https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/purge_cache" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
--data "{\"files\":[${FILES}]}" | python3 -m json.tool
fiUso
# Purgar una URL específica
cf-purge https://tudominio.com/img/og-default.png
# Purgar varias
cf-purge https://tudominio.com/css/style.css https://tudominio.com/js/app.js
# Purgar TODO (nuclear option)
cf-purgeSi la respuesta tiene "success": true, la caché se ha purgado. La siguiente petición irá directa a tu servidor (verás cf-cache-status: MISS) y Cloudflare recacheará la versión nueva.
¿Merece la pena?
Si tienes un servidor casero: absolutamente sí. Es gratis, resuelve el CGNAT, te da HTTPS sin config, y protege tu máquina de ataques. El único coste es aprender a lidiar con la caché, y para eso ya tienes el script.
Si tienes un VPS con IP pública y ya gestionas tus certificados, sigue mereciendo la pena por la CDN y la protección DDoS, pero es menos crítico.
En mi caso, sin Cloudflare este blog simplemente no existiría. Mi servidor está detrás de CGNAT, no tiene IP pública, y un AMD FX-8350 no es exactamente un rack en un datacenter. Cloudflare es lo que convierte un PC de salón en un servidor web accesible desde cualquier parte del mundo.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario