Arquitectura para un CMS Gratuito en Cloudflare (Estilo WordPress)
21 Feb, 2026 • 5 min de lectura
¿Te imaginas tener tu propio CMS (sistema de gestión de contenidos) parecido a WordPress, pero sin tener que pagar absolutamente nada por alojamiento web mensual, y además con una velocidad y seguridad insuperables? La buena noticia es que el ecosistema gratuito de Cloudflare hace esto posible.
A continuación, te explico esta “arquitectura para dummies”, los componentes que necesitamos y cómo se comunican entre sí.
Contenidos
Las Piezas del Rompecabezas (¿Qué necesitamos?)
Para replicar un WordPress, necesitamos varias cosas: un lugar donde vivirán las páginas web, un “cerebro” que procese las acciones, un archivo central (base de datos) para los textos y un disco duro para las imágenes. En Cloudflare, usamos estos servicios que tienen generosas capas gratuitas (Free Tier):
- Cloudflare Pages (El Escaparate): Aquí alojaremos tu sitio web y también el panel de administración. Es alojamiento estático ultrarrápido (piensa en frameworks como Next.js, Astro o Nuxt).
- Cloudflare Workers (El Motor/Cerebro): Estos son pequeños trozos de código que se ejecutan directamente en los servidores de Cloudflare. Hacen el papel del backend (PHP en WordPress). Se encargan de procesar el registro de usuarios, publicar artículos y entregar contenido.
- Cloudflare D1 (El Archivador / Base de Datos): Es una base de datos relacional (SQLite) sin servidor. Aquí guardaremos todo el texto: artículos, configuración del sitio, usuarios, contraseñas seguras y comentarios.
-
Cloudflare R2 (El Almacén de Imágenes): Es donde guardaremos nuestras fotos, videos y archivos pesados. Es equivalente a la carpeta
wp-content/uploadsde WordPress, pero mejorado y distribuido globalmente.
1. Diagrama de Flujo de Datos (Dataflow)
¿Cómo se mueve la información cuando un visitante entra a tu web o cuando tú, como administrador, publicas un artículo?
graph TD
%% Trazado de Usuarios y Admin
Visitante((Visitante))
Admin((Administrador))
subgraph "Escudo Cloudflare (CDN & WAF)"
CDN[Red Global de Cloudflare]
end
subgraph "Nube de Cloudflare (Serverless CMS)"
Pages[Cloudflare Pages<br>Frontend Público + Admin Panel]
Workers(Cloudflare Workers<br>API / Lógica del CMS)
D1[(Cloudflare D1<br>Base de Datos SQL)]
R2[(Cloudflare R2<br>Almacenamiento de Medios)]
end
%% Flujo del visitante
Visitante -->|Visita la web| CDN
CDN -->|Carga interfaz estática| Pages
Pages -.->|Pide artículos / datos| Workers
Workers -.->|Consulta textos y autores| D1
Workers -.->|Solicita URLs de imágenes| R2
%% Flujo Directo CDN a R2
CDN --->|Carga imágenes directamente| R2
%% Flujo del Admin
Admin -->|Accede al Panel Adminsitrativo| CDN
Pages <-->|Usuario logueado crea contenido| Workers
Workers <-->|Guarda nuevo post| D1
Workers <-->|Sube nueva imagen| R2
classDef cf fill:#f38020,stroke:#d66000,stroke-width:2px,color:white;
class Pages,Workers,D1,R2,CDN cf;
¿Qué ocurre en el diagrama?
- Cuando alguien visita tu blog, la red de Cloudflare carga la página visual de Pages. En un instante, Pages habla con el Worker para obtener el último artículo.
- El Worker extrae el texto de D1 (la base de datos) y se lo devuelve a Pages.
- Al mismo tiempo, si el artículo lleva una imagen, el lector la descarga casi mágicamente y a toda velocidad directamente desde R2.
- Como el Administrador, tú subes datos. Cuando das a “Publicar”, Pages manda el texto al Worker, el cual lo guarda cuidadosamente en el D1 y despacha tu foto de portada al R2.
2. Diagrama de Entidad Relación (ERD)
Si Cloudflare D1 es nuestra base de datos (nuestro archivador), necesitamos organizar bien los cajones. A esto se le llama esquema de base de datos. Esto es lo mínimo que necesitamos para que funcione como un sistema de contenido (post, usuarios, y categorías):
erDiagram
USERS {
int id PK
string username
string email
string password_hash
string role "Admin, Autor"
datetime created_at
}
POSTS {
int id PK
int author_id FK
string title
string slug "url-amigable"
text content
string status "Borrador, Publicado"
datetime published_at
}
CATEGORIES {
int id PK
string name
string slug
}
MEDIA {
int id PK
int post_id FK "opcional"
string file_name
string r2_url
string mime_type "image/png, image/jpeg"
datetime uploaded_at
}
%% Relación de tablas (Posts y Categorías es de Mucho a Mucho)
POST_CATEGORY {
int post_id FK
int category_id FK
}
%% Relaciones
USERS ||--o{ POSTS : escribe
POSTS ||--o{ POST_CATEGORY : pertenece_a
CATEGORIES ||--o{ POST_CATEGORY : agrupa
POSTS ||--o{ MEDIA : contiene
Explicación del modelo de datos:
- USERS (Usuarios): La tabla para ti y tus autores. Aquí se guardan las credenciales con seguridad de acceso.
- POSTS (Artículos): El núcleo de tu información. Contiene el título, el enlace de “slug”, el texto y el estado del post (¿Borrador o publicado?). Todo post lo debe “escribir” un autor.
-
CATEGORIES (Categorías): Igual que en WP, las categorías para ordenar los artículos. Usamos una tabla intermedia (
POST_CATEGORY) porque un post puede tener varias categorías y viceversa. - MEDIA (Archivos Multimedia): Registra cada imagen subida, apuntando a su dirección pública en Cloudflare R2, para saber si este archivo fue subido para algún post en específico.
Conclusión
Montar un sistema así de forma nativa requiere una curva de aprendizaje inicial para integrar estos sistemas (generalmente usando un “Meta-Framework” como Remix, Next.js, Qwik o Hono), pero el resultado es espectacular:
- Tienes una plataforma CMS propia que reacciona en milisegundos a nivel mundial.
- Coste Cero: Las versiones gratuitas de D1, R2, Workers y Pages cubren sin problema proyectos medianos y pequeños con cientos de miles de visitas.
- Tu control de datos y velocidad se dispara en comparación con un hosting básico tradicional de WordPress.