Despliega la principal plataforma de publicación de código abierto, Ghost, en Kubernetes con la máxima seguridad y eficiencia utilizando una imagen de contenedor endurecida y multi-arquitectura.
Mantenido por SREDevOps.org: SRE, DevOps, Linux, Hacking Ético, IA, ML, Código Abierto, Cloud Native, Platform Engineering en Inglés, Español y Portugués (Brasil).
Este repositorio implementa Ghost CMS v6.xx.x de @TryGhost (Oficial) en Kubernetes con una imagen personalizada, que ofrece mejoras significativas para el uso en producción y características de seguridad en Kubernetes.
Seguridad Mejorada
Ejecución Sin Root: Tanto los componentes de Ghost como los de MySQL se ejecutan exclusivamente como un usuario sin privilegios (non-root) (UID/GID 65532) en Kubernetes, previniendo posibles ataques de escalada de privilegios.
Tiempo de Ejecución Distroless: Utilizamos Google Container Tools Distroless Debian 13 - NodeJS 22 como el entorno de tiempo de ejecución final. Las imágenes Distroless contienen solo las dependencias de la aplicación y el lenguaje requeridas, excluyendo shells y gestores de paquetes, lo que las hace sustancialmente más seguras y reduce la superficie de ataque.
Reducción de Vulnerabilidades: Al reemplazar gosu con un flujo de ejecución de contenedor nativo y adoptar Distroless, eliminamos varias vulnerabilidades críticas reportadas en la imagen original de Ghost:
Resultado: Solo este cambio redujo 6 vulnerabilidades críticas y 34 vulnerabilidades altas reportadas por Docker Scout en la imagen oficial.
Artefactos de Build Personalizados: Mantenemos dos Dockerfiles distintos para producción y desarrollo:
Imagen de Producción: La imagen principal construida utilizando nuestro proceso de construcción endurecido y multi-etapa. Ver el Dockerfile.
Imagen de Desarrollo: Una variante adaptada para pruebas, que incluye soporte para SQLite. Ver el Dockerfile-dev.
Soporte Multi-Arquitectura: Las imágenes están construidas para las arquitecturas amd64 y arm64.
Build Multi-Etapa: Utilizamos la imagen oficial de Node 22 Jod LTS para la construcción, lo que reduce significativamente el tamaño final de la imagen y mejora la seguridad al eliminar componentes de construcción innecesarios.
Ghost v6 y NodeJS 22 LTS Actualizados: Utilizando las últimas versiones estables para seguridad y rendimiento.
Punto de Entrada Robusto (entrypoint.js): Un script de punto de entrada Node.js personalizado, ejecutado por el usuario sin privilegios, maneja las operaciones de tiempo de ejecución necesarias, como la actualización de temas predeterminados, antes de iniciar la aplicación Ghost. El script se puede revisar aquí: entrypoint.js.
Contenedor Init Dedicado: El despliegue incluye un initContainer para manejar la creación de directorios, la propiedad correcta (UID/GID 65532) y la configuración de permisos antes del lanzamiento del contenedor principal de Ghost, asegurando una operación fluida dentro del contenedor Distroless.
Resumen de la Arquitectura de Despliegue
Este proyecto proporciona archivos manifest completos de Kubernetes (deploy/) para ejecutar una instancia de Ghost lista para producción, respaldada por una base de datos MySQL.
Recurso
Componentes
Detalles
Namespace
ghost-on-kubernetes
Proporciona aislamiento lógico para todos los componentes. (Archivo: 00-namespace.yaml)
StatefulSet
ghost-on-kubernetes-mysql
Gestiona la base de datos MySQL 8, asegurando red estable y almacenamiento persistente. (Archivo: 05-mysql.yaml)
Expone la aplicación Ghost al mundo exterior a través de HTTP/HTTPS (requiere un TLD). (Archivo: 07-ingress.yaml)
Nota: Puedes alojar múltiples instancias de Ghost reemplazando la especificación de Namespace en cada archivo manifest.
Instrucciones de Instalación (Producción)
Sigue estos pasos para desplegar Ghost en tu clúster de Kubernetes.
Prerrequisitos
Un clúster de Kubernetes en funcionamiento (kubectl configurado).
Un StorageClass provisionado (requerido para los PVCs).
0. Clonar (o hacer fork) del Repositorio
## Clonar el repositorio
git clone https://github.com/sredevopsorg/ghost-on-kubernetes.git --depth 1 --branch main --single-branch --no-tags
## Cambiar de directorio
cd ghost-on-kubernetes
1. Revisar y Configurar
Revisa los archivos de configuración de ejemplo y modifica los manifests en la carpeta deploy/ para adaptarlos a tu entorno (ej. clase de almacenamiento, nombre de dominio, valores de secretos).
Configuraciones: Revisa los archivos de configuración de ejemplo en el directorio examples/:
config.production.sample.yaml: Configuración recomendada usando MySQL 8. Requiere un dominio de nivel superior (TLD) válido para el campo url y la configuración de Ingress.
config.development.sample.yaml: Utiliza SQLite para entornos de prueba.
¡Damos la bienvenida a las contribuciones de la comunidad! Por favor, revisa el archivo CONTRIBUTING.md para obtener más información sobre cómo contribuir a este proyecto.
Licencia y Créditos
Este proyecto está licenciado bajo la Licencia MIT. Por favor, revisa el archivo LICENSE para obtener más información.
Si tu panorama ideal incluye debatir si Kubernetes es supuestamente un sistema operativo, torturarte gratuitamente por la tabs de un YAML modo sábana o darse apoyo moral comunitario por todas las caídas en producción a las 4 AM... te tenemos mansa noticia weón
La diferencia con el software se resumía en una frase que muchos repetíamos con una sonrisa: "El hardware se puede patear; el software, solo maldecir."