Cómo añadir comentarios a un blog Astro usando solo Cloudflare
Índice
Los sitios estáticos son sencillos hasta que necesitan guardar estado. Un sistema de comentarios es un buen ejemplo.
En Acecore no usamos un servicio externo de comentarios. En PR #101 lo resolvimos solo con Cloudflare:
- Astro muestra la UI.
- Cloudflare Pages Functions expone
/api/comments. - Cloudflare D1 guarda los comentarios.
- Cloudflare Turnstile protege el POST.
wrangler.jsoncsepara preview y production.
La ventaja es que el comentario no queda como una isla de terceros dentro de la página.
Arquitectura
| Capa | Archivo o servicio |
|---|---|
| UI | src/components/BlogComments.astro |
| Inserción en artículo | src/views/BlogPostPage.astro |
| API | functions/api/comments.ts |
| Datos | D1 binding COMMENTS_DB |
| Protección | Cloudflare Turnstile |
| Schema | migrations/0001_create_blog_comments.sql |
La UI lee con GET /api/comments?slug=...&locale=... y publica con POST /api/comments.
La Function valida origin, payload, Turnstile, límites, duplicados y contenido bloqueado antes de insertar.
D1 como almacenamiento
Los comentarios necesitan consultas simples pero relacionales:
- filtrar por
post_slug - ordenar por
created_at - ocultar con
deleted_at - detectar duplicados con
body_hash - limitar por
client_hash
Por eso D1 es más cómodo que un almacén key-value. Además, las consultas usan prepared statements con bind(), evitando concatenar input del usuario en SQL.
Configuración por Wrangler
El binding COMMENTS_DB se define en wrangler.jsonc. Preview apunta a acecore-comments-preview; production apunta a acecore-comments-production.
Esta separación evita que una preview de Pull Request escriba en la base real.
Turnstile en servidor
El widget del navegador no basta. El token se envía a Pages Functions y allí se valida contra Cloudflare Siteverify con TURNSTILE_SECRET_KEY.
También se comprueba el hostname devuelto. Esto es importante para aceptar previews legítimas y rechazar tokens emitidos desde orígenes inesperados.
Controles anti-spam
La primera versión es estricta:
- rechaza URLs
- rechaza emails
- rechaza HTML
- rechaza enlaces Markdown
- rechaza texto repetitivo
- rechaza palabras promocionales
- usa honeypot
También combina límites en memoria con límites persistentes en D1. El identificador del cliente se guarda como hash con salt, no como IP sin procesar.
SEO
Los comentarios se cargan en cliente y la sección usa data-pagefind-ignore. Por tanto, no se indexan como contenido principal.
Para un blog corporativo, esto es razonable: el artículo es contenido revisado; los comentarios son interacción.
Resumen
Un servicio externo puede ser práctico, pero si el sitio ya vive en Cloudflare Pages, una función de comentarios ligera puede vivir enteramente en Cloudflare.
Pages Functions, D1, Turnstile y Wrangler son suficientes para mantener UI, datos, seguridad y entornos bajo el mismo modelo operativo.
Referencias
¿Por qué no usar un widget externo?
¿D1 basta para comentarios?
¿Turnstile en el cliente es suficiente?
Comentarios
Gui
CEO de Acecore. Lidera sistemas de negocio, web, bases de datos e infraestructura, calidad y adopción de IA desde la definición de problemas de negocio hasta el diseño, la puesta en marcha y la mejora posterior. Se apoya en capacidad práctica con C#/.NET y también cubre PHP/JavaScript, SQL Server/PostgreSQL/MySQL y Linux/Windows Server, diseñando requisitos, selección tecnológica, estándares de calidad y operaciones de desarrollo basadas en GitHub como un flujo coherente. Incorpora la IA generativa en procesos de desarrollo, verificación y organización de información, como una base práctica para que equipos pequeños entreguen más rápido y con mayor fiabilidad.
¿Quiere saber más sobre nuestros servicios?
Ofrecemos soporte integral en desarrollo de sistemas, diseño web, diseño gráfico y educación IT.
Artículos relacionados
Diseñar un sitio Astro + Cloudflare que crece función por función 7 de junio de 2026, 19:00
Guía de instalación de Sveltia CMS 7 de junio de 2026, 16:00