Guías 11 min de lectura
Cero conocimientos técnicos, cero coste: monta tu blog con dominio propio en 30 minutos (guía paso a paso de CF CMS)
Cero conocimientos técnicos y cero coste aparte del dominio: 8 pasos para crear un blog con dominio propio en el plan gratuito de Cloudflare con CF CMS, y cómo mantenerlo en el día a día.
¿Te ha pasado alguna vez?
Llevas dos años publicando en una plataforma y, de repente, una restricción de alcance, un bloqueo de cuenta, y tu contenido y tus seguidores desaparecen sin más.
Decides montar tu propio blog y buscas un tutorial: alquilar un servidor, preparar el entorno, configurar Nginx, poner HTTPS, defenderte de ataques a diario… y te rindes antes de escribir la primera línea.
Este artículo es para ti.
Te voy a guiar para crear un blog independiente con tu propio dominio de nivel superior en Cloudflare, usando el proyecto de código abierto CF CMS. El sitio que estás leyendo ahora mismo se montó exactamente así.
Vamos a ser claros desde el principio:
- Cero conocimientos técnicos: no hace falta programar. Todo se reduce a copiar, pegar y pulsar Enter. ¿Ni eso te apetece? Pásale los comandos a un agente de IA y que los ejecute él.
- Cero coste: aparte del propio dominio (las extensiones baratas cuestan unos pocos dólares al año), el sitio, la base de datos, el almacenamiento de imágenes y la traducción automática funcionan con el plan gratuito de Cloudflare. No tienes que alquilar ningún servidor.
¿Listo? Empezamos.
Lo primero: qué consigues
- ✅ Un dominio de nivel superior que es tuyo, como
yourdomain.com - ✅ HTTPS automático + CDN global, tan rápido como los grandes sitios
- ✅ Cinco idiomas: chino, inglés, japonés, español y árabe. Escribes una vez y se traduce al guardar
- ✅ 8 plantillas prediseñadas + logo, favicon y color de tema con un clic
- ✅ Un panel de administración oculto tras una ruta secreta aleatoria;
/admina secas devuelve 404 - ✅ Un endpoint MCP integrado para que un agente de IA publique artículos y cambie ajustes por ti
Solo necesitas tres cosas:
- Un dominio (más abajo te explico cómo conseguirlo)
- Una cuenta gratuita de Cloudflare
- Un ordenador con terminal (macOS / Linux; en Windows se recomienda WSL)
Un diagrama: ¿dónde funciona todo esto?

En resumen:
- Pages: el sitio en sí, que renderiza cada página
- D1: la base de datos de artículos, etiquetas y ajustes
- R2: el almacenamiento de imágenes
- Workers AI: traduce tu artículo a los otros cuatro idiomas cuando guardas
No hay ningún servidor que tengas que mantener. Parches, escalado, protección contra DDoS: todo eso es cosa de Cloudflare.
Todo el proceso en una imagen: 8 pasos

Si todo va bien, de 30 a 60 minutos. El único paso que de verdad exige pensar es el 1: elegir un buen nombre.
Paso 1: Compra un dominio
El dominio es tu dirección en internet y es lo único de todo este montaje que cuesta dinero.
Sirve cualquier registrador fiable, por ejemplo Spaceship, Cloudflare Registrar o Namecheap. Elige uno con precios transparentes, renovaciones razonables y protección de privacidad WHOIS.
Tres consejos rápidos para elegir dominio:
- Corto, fácil de recordar y de escribir. Si se lo puedes decir en voz alta a un amigo, es un buen dominio.
- Mira el precio de renovación, no solo el del primer año. Algunas extensiones son baratísimas el primer año y cuestan varias veces más el segundo.
- No te obsesiones con
.com:.cc,.devy.mefuncionan muy bien para un blog personal.
Paso 2: Conecta tu dominio a Cloudflare
- Entra en la web de Cloudflare y crea una cuenta gratuita.
- Haz clic en Add a site, escribe tu dominio y elige el plan Free.
- Cloudflare te dará dos direcciones de nameserver (servidores de nombres).
- Vuelve al panel de tu registrador y cambia los nameservers por esos dos.
- Espera entre unos minutos y unas horas. Cuando Cloudflare muestre Active, listo.
Clave: el dominio tiene que estar en la misma cuenta de Cloudflare que usarás para desplegar. El script de instalación lo busca con tu token de API.
Paso 3: Crea un token de API (cópialo tal cual)
Ruta: icono de perfil arriba a la derecha en Cloudflare → My Profile → API Tokens → Create Token → Create Custom Token.
Marca uno a uno los permisos de esta imagen:

- Account · Cloudflare Pages · Edit
- Account · D1 · Edit
- Account · Workers R2 Storage · Edit
- Account · Account Settings · Read
- Zone · Zone · Read (si usas tu propio dominio)
- Zone · DNS · Edit (si usas tu propio dominio)
Dos avisos:
- Workers AI no necesita permisos extra. En ejecución, el sitio usa el binding de IA de Pages.
- Este token es solo para el script de instalación. No se lo des a tu agente de escritura. Solo se muestra una vez, así que guárdalo enseguida.
Paso 4: Activa R2
R2 es donde se guardan tus imágenes, y hay que activarlo a mano en el panel antes de empezar. El script no puede pulsar ese botón por ti.
Abre R2 en la barra lateral izquierda del panel de Cloudflare y actívalo.
⚠️ Seamos sinceros: algunas cuentas tienen que añadir una tarjeta o PayPal antes de activar R2. Tranquilo: añadirla no significa que te vayan a cobrar. El uso dentro del plan gratuito (10 GB de almacenamiento) no se cobra. Las imágenes de un blog personal difícilmente llegarán a agotarlo.
Justo aquí se atascó mi primer despliegue: el script se paró a mitad con un 10042 porque R2 no estaba activado. Lo activé, volví a ejecutarlo y pasó a la primera.
Paso 5: Consigue el código
CF CMS es de código abierto y el código está en GitHub: github.com/jemkuo/cf-cms
Elige una opción:
- Recomendado: pulsa Fork en GitHub para copiarlo a tu propia cuenta; así te será fácil modificarlo después.
- O clónalo directamente:
git clone https://github.com/jemkuo/cf-cms.git
cd cf-cms
Necesitas tener instalado Node.js 20 o superior (descarga el instalador de la web oficial y sigue los pasos).
Paso 6: Despliega con un solo comando ⭐
Este es el corazón del artículo. Primero, guarda el token del paso 3 en una variable de entorno (solo existe en tu terminal y el script nunca lo imprime):
export CLOUDFLARE_API_TOKEN=pega-tu-token
Y después, un solo comando:
npm install && ./scripts/setup.sh --project myblog --domain yourdomain.com
Sustituye myblog por el nombre de proyecto que quieras y yourdomain.com por tu dominio.
¿No te fías? Añade --dry-run para hacer un ensayo que solo comprueba y no crea nada:
./scripts/setup.sh --project myblog --domain yourdomain.com --dry-run
Primero hace un «chequeo médico»
Antes de tocar nada, el script muestra una lista de comprobación previa: token, cuenta, Pages, D1, R2 y dominio, marcados uno por uno.

- Todo ✓: crea la base de datos D1, el bucket de R2, el proyecto de Pages y los secretos, y publica el sitio.
- Algún ✗: no crea absolutamente nada. Te dice qué paso falló, dónde corregirlo en el panel y qué comando volver a ejecutar, en chino y en inglés.
- No tienes que buscar tu account id: si el token solo ve una cuenta, el script la rellena por ti.
¿Falló a mitad? Vuelve a ejecutarlo
El progreso se guarda en local en .cf-cms-setup.json. Al volver a ejecutarlo, sigue donde lo dejó. Los recursos de D1, R2 y Pages ya creados se reutilizan, nunca se duplican, y tus artículos no se borran.
¿Registros antiguos en tu dominio? Primero te pregunta
Si tu dominio apuntaba antes a otro servidor, el script primero enumera los registros A / AAAA / CNAME antiguos y, por defecto, no los toca.
Cuando tengas claro que se pueden sustituir, vuelve a ejecutarlo con --replace-dns (o responde y en la pregunta) y los cambiará por un CNAME que apunta a Pages:

Ojo: tras el cambio, lo que el servidor antiguo ofrecía en este dominio deja de estar accesible. Los registros TXT y demás se conservan.
Cuando termina
Lo último que imprime la terminal es la URL de Admin, así:
Admin: https://yourdomain.com/<ADMIN_SAFEPATH>/admin/
La contraseña del panel se genera al azar y se escribe en .dev.vars, dentro de la carpeta del proyecto. Nunca aparece en pantalla.
👉 Guarda bien la URL de Admin junto con .dev.vars. Son las llaves de tu blog.
Si el estado del dominio aparece como pending, tranquilo. La emisión del certificado y la propagación del DNS suelen tardar unos minutos.
Paso 7: Entra al panel oculto y dale tu estilo
Abre esa URL de Admin e introduce la contraseña:

¿Por qué ocultarlo? La mayoría de los escáneres atacan /admin y /wp-login. El panel de CF CMS está detrás de una ruta aleatoria, así que /admin a secas devuelve 404 y ni siquiera se ve un formulario de acceso.
Una vez dentro, haz dos cosas:
- Elige una plantilla: blog técnico personal (Dispatch, Signal), estilo de vida (Atelier, Hearth), web de empresa (Practice, Civic), empresa tecnológica (Launch, Orbit), además de las originales Paper, Ink y Terminal.
- Genera un kit visual con un clic: pulsa Generate visual kit para crear un logo, un favicon y un color de tema a juego con tu plantilla. ¿No te convence? Genera otro o pon tus propias imágenes.
Paso 8: Escribe y obtén cinco idiomas automáticamente
Un sitio recién desplegado trae algunos artículos de ejemplo para que veas cómo queda:

Cuando los hayas visto, bórralos y escribe los tuyos:
- Escribe en Markdown: títulos, listas, bloques de código e imágenes funcionan sin problema
- Sube las imágenes directamente; se guardan en R2
- Marca traducir al guardar y Workers AI genera las versiones en inglés, japonés, español y árabe (el árabe se maqueta de derecha a izquierda automáticamente)
- Configura el SEO de cada artículo: palabras clave, URL canónica e imagen para compartir de Open Graph
Escribes una vez y te encuentran lectores en cinco idiomas. Eso no te lo ofrecen ni muchas grandes plataformas.
El día a día: deja que un agente de IA sea tu editor
Publicar es solo el principio. Lo que de verdad ahorra tiempo es que casi todo el mantenimiento diario se puede delegar en la IA.
1. Conecta un agente de IA con una sola frase
CF CMS trae un endpoint MCP integrado (/mcp en tu dominio). En Cursor, Claude o cualquier cliente compatible con MCP, pega la «descripción en una frase» que ya viene en el README del proyecto, añade el ADMIN_API_TOKEN de .dev.vars, y tu agente podrá:
- Listar, crear, editar, publicar y borrar artículos
- Gestionar etiquetas, secciones, plantillas y el logo
- Subir imágenes
Una vez conectado, basta con decirle:
«Crea un borrador en chino con el slug edge-notes en la sección notes y tradúcelo a los demás idiomas.»
Seguridad por diseño: ADMIN_API_TOKEN solo gestiona contenido. No puede desplegar ni tocar tu cuenta de Cloudflare. Por eso mismo el token de Cloudflare del paso 3 nunca debe ir al agente.
2. Rota los secretos con regularidad
¿Sospechas que se ha filtrado una contraseña o un token? Cámbialo con un comando:
npx wrangler pages secret put ADMIN_PASSWORD --project-name myblog
Lo mismo con ADMIN_API_TOKEN y SESSION_SECRET. Una vez terminado el despliegue, también puedes borrar o rotar el token de API de Cloudflare del paso 3 y crear uno nuevo la próxima vez que despliegues.
3. Ten claros los límites del plan gratuito
| Recurso | Para qué sirve en el blog | Cuota gratuita habitual |
|---|---|---|
| Pages | Sitio y Functions | 500 builds/mes, 100.000 peticiones de Functions/día |
| D1 | Artículos, ajustes | 5 GB, límites diarios de lectura/escritura de filas |
| R2 | Imágenes | 10 GB de almacenamiento, operaciones de lectura/escritura limitadas |
| Workers AI | Traducción al guardar | 10.000 Neurons/día |
Consulta las cifras actuales en el panel de Cloudflare. El tráfico de un blog personal prácticamente nunca llega al techo. La traducción solo se ejecuta al guardar, no en cada visita, y la cuota de Workers AI se reinicia cada día.
4. Errores frecuentes de un vistazo
| Lo que ves | Qué hacer |
|---|---|
✗ R2 is not enabled, error 10042 |
Activa R2 en el panel (puede que primero tengas que añadir un método de pago) y vuelve a ejecutar |
| Token rechazado (10000) o sin permisos (9109, HTTP 403) | Añade los permisos de la lista del paso 3, vuelve a hacer export y ejecuta de nuevo |
| Dominio atascado en pending | Revisa los registros A / AAAA / CNAME antiguos que muestra el script y, cuando estés seguro, vuelve a ejecutar con --replace-dns; con el DNS ya correcto, el certificado aún tarda unos minutos |
| Nombre de proyecto de Pages ocupado | Elige otro nombre con --project |
| D1, R2 o Pages ya existen | Vuelve a ejecutar sin más; los recursos con el mismo nombre se reutilizan |
| Error de red | Comprueba la conexión y vuelve a ejecutar; los pasos completados se saltan |
Quédate con una regla: si algo falla, lee el mensaje, corrígelo y vuelve a ejecutar. El script te dice dónde corregir y qué ejecutar.
Sobre lo de «cero conocimientos técnicos», con sinceridad
Es verdad que en este proceso vas a abrir una terminal y escribir algunos comandos.
Pero no necesitas entender qué hacen. Lo único que tienes que hacer es:
- Copiar el comando
- Pegarlo en la terminal
- Pulsar Enter y fijarte en si aparece algún ✗
La opción todavía más cómoda: dale este artículo y el README a tu agente de IA y deja que lo ejecute todo. Cuando se atasque, será porque necesita que pulses algo en el panel (como activar R2) o que confirmes algo (como sustituir el DNS). Solo tienes que seguir las indicaciones.
Hagamos cuentas
| Concepto | Coste |
|---|---|
| Dominio | Desde unos pocos dólares al año (según la extensión) |
| Servidor | 0 (Cloudflare Pages) |
| Base de datos | 0 (plan gratuito de D1) |
| Almacenamiento de imágenes | 0 (plan gratuito de R2) |
| Traducción a cinco idiomas | 0 (plan gratuito de Workers AI) |
| Certificado HTTPS + CDN | 0 |
| Software CMS | 0 (código abierto) |
Aparte del dominio, no gastas ni un céntimo.
Para terminar
Las plataformas te dan alcance, pero el terreno siempre es suyo.
Un blog independiente es un activo digital de verdad tuyo: tu dominio, tu contenido y lectores que pueden encontrarte directamente.
Da hoy el primer paso: elige un dominio que te guste y sigue esta guía de principio a fin.
¿Te has atascado en algún punto? Déjame un comentario. Y si el proyecto te resulta útil, una ⭐ para CF CMS en GitHub siempre se agradece.
En el próximo artículo: cómo dejar que un agente de IA gestione este blog por ti cada día.