# Ghost en Kubernetes por [SREDevOps.Org](https://sredevops.org)
## Comunidad Site Reliability Engineering (SRE), DevOps, Cloud Native, GNU/Linux y m谩s. 馃寧
[](https://github.com/sredevopsorg/ghost-on-kubernetes/actions/workflows/multi-build.yaml) | [](https://github.com/sredevopsorg/ghost-on-kubernetes/pkgs/container/ghost-on-kubernetes/208368831?tag=main)
Este repositorio implementa Ghost CMS v5.xx.x de [@TryGhost (upstream)](https://github.com/TryGhost/Ghost) en Kubernetes, como una implementaci贸n utilizando nuestra [imagen personalizada](https://github.com/sredevopsorg/ghost-on-kubernetes/blob/main/Dockerfile), basada en la imagen oficial de Ghost 5 debian ["oficial"](https://github.com/docker-library/ghost/blob/master/5/debian/Dockerfile), con modificaciones importantes, como:
## Cambios recientes
Hemos realizado algunas actualizaciones significativas para mejorar la seguridad y la eficiencia de nuestra implementaci贸n de Ghost en Kubernetes:
1. **Imagen base Distroless**: La imagen del contenedor de Ghost ahora se basa en una imagen base Distroless. Esto reduce la superficie de ataque eliminando componentes innecesarios como shell, gestores de paquetes y utilidades que no son necesarios para que nuestra aplicaci贸n se ejecute. La imagen tambi茅n se construye mediante un proceso de compilaci贸n de varias etapas, lo que hace que la imagen final sea m谩s peque帽a y m谩s segura.
2. **StatefulSet de MySQL**: Hemos cambiado la implementaci贸n de MySQL de nuevo a un StatefulSet. Esto proporciona identificadores de red estables y almacenamiento persistente, lo que es importante para las bases de datos como MySQL que necesitan mantener estado.
3. **Usuario sin privilegios**: Por defecto, el contenedor de Ghost ahora se ejecuta como un usuario sin privilegios. Esto es una buena pr谩ctica de seguridad, ya que reduce el potencial da帽o si el contenedor se compromete. La aplicaci贸n Ghost se inicia con un contenedor de inicializaci贸n, que realiza tareas de configuraci贸n necesarias antes de que comience el contenedor principal de Ghost.
Consulta el archivo de implementaci贸n actualizado [deploy/06-ghost-deployment.yaml](deploy/06-ghost-deployment.yaml) para los detalles de implementaci贸n de estos cambios.
## Caracter铆sticas
- [Soporte ARM64!](#arm64-supported)
- Utilizamos la imagen de Node 20 Iron Buster oficial como entorno de compilaci贸n.
- Se introduce un proceso de compilaci贸n de varias etapas para compilar la imagen.
- [distroless node 20 debian 12](https://github.com/GoogleContainerTools/distroless/blob/main/README.md) como entorno de ejecuci贸n para la imagen final.
- Se elimin贸 gosu, utilizamos el usuario node predeterminado.
- Nuevo proceso de Entrypoint, utilizando un script en node.js ejecutado por el usuario node sin privilegios dentro del contenedor distroless.
- Utilizamos la 煤ltima versi贸n de Ghost 5 (cuando se construye la imagen).
## 馃搶 ARM64 compatible
- Las imagenes ahora son multiarch, con soporte amd64 y arm64 [(enlace a la discusi贸n)](https://github.com/sredevopsorg/ghost-on-kubernetes/issues/73#issuecomment-1933939315)
## Historial de estrellas
## Instalaci贸n
## 0. Clonar el repositorio
```bash
# 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
# Crear una nueva rama para sus cambios en modo desasociado (opcional pero recomendado).
git checkout -b my-branch --no-track --detach
```
## 1. Comprobar las configuraciones de ejemplo
- Hay algunos archivos de configuraci贸n de ejemplo en el [directorio `examples`](./examples/). Utilizamos la configuraci贸n almacenada como `kind: Secret` en el espacio de nombres `ghost-k8s` para la configuraci贸n de Ghost y MySQL. Existen dos archivos de configuraci贸n de ejemplo:
- `config.development.sample.yaml`: Este archivo de configuraci贸n es para el entorno de desarrollo de Ghost. Utiliza SQLite como base de datos. Puede ser 煤til si desea probar la configuraci贸n de Ghost antes de implementarla en un entorno de producci贸n.
- `config.production.sample.yaml`: Este archivo de configuraci贸n es para el entorno de producci贸n de Ghost. Utiliza MySQL 8, y es el archivo de configuraci贸n recomendado para entornos de producci贸n. Requiere TLD (dominio de nivel superior) v谩lido y la [configuraci贸n de Ingress para acceder a Ghost desde Internet.](./deploy/07-ingress.yaml)
- Si necesitas m谩s informaci贸n sobre la configuraci贸n, consulte la [documentaci贸n oficial de Ghost](https://ghost.org/docs/config/#custom-configuration-files).
## 2. Revisar los valores predeterminados y realizar cambios seg煤n sea necesario en los siguientes archivos
- deploy/00-namespace.yaml
- deploy/01-secrets.yaml
```yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-ghost-k8s
namespace: ghost-k8s
type: Opaque
stringData:
MYSQL_DATABASE: mysql-db-name # Igual que en deploy/04-config.production.yaml
MYSQL_USER: mysql-db-user # Igual que en deploy/04-config.production.yaml
MYSQL_PASSWORD: mysql-db-password # Igual que en deploy/04-config.production.yaml
MYSQL_ROOT_PASSWORD: mysql-db-root-password # Igual que en deploy/04-config.production.yaml
```
- deploy/02-pvc.yaml # Cambie el storageClassName seg煤n sus requisitos
- deploy/03-services.yaml # Cambie los hosts seg煤n sus requisitos
- deploy/04-config.production.yaml # Cambie los valores seg煤n los secretos y los servicios
- deploy/05-mysql.yaml # Cambie los valores seg煤n los secretos y los servicios
- deploy/06-ghost-deployment.yaml # Cambie los valores seg煤n los secretos y los servicios
- deploy/07-ingress.yaml # Opcional
## 3. Aplicar sus manifestaciones
```bash
# Crear el espacio de nombres
kubectl apply -f deploy/00-namespace.yaml
# Crear los secretos
kubectl apply -f deploy/01-secrets.yaml
# Crear el volumen persistente
kubectl apply -f deploy/02-pvc.yaml
# Crear servicios
kubectl apply -f deploy/03-service.yaml
# Crear la configuraci贸n de Ghost
kubectl apply -f deploy/04-config.production.yaml
# Crear la base de datos de MySQL
kubectl apply -f deploy/05-mysql.yaml
# Crear la implementaci贸n de Ghost
kubectl apply -f deploy/06-ghost-deployment.yaml
# Crear el Ingreso de Ghost
kubectl apply -f deploy/07-ghost-ingress.yaml
```
## 4. Acceder a su Ghost CMS
```bash
# Obtener la direcci贸n IP de entrada
kubectl get ing -n ghost-k8s -o wide
# O bien, cree un reenv铆o de puertos para acceder al Ghost CMS
kubectl port-forward -n ghost-k8s svc/ghost-k8s 2368:2368
```
## 5. Abra su navegador y acceda al Ghost CMS
[http://localhost:2368](http://localhost:2368)
## 6. Inicie sesi贸n en su Ghost CMS
[http://localhost:2368/ghost](http://localhost:2368/ghost)