Abe Estrada

Docker + Caddy + Ghost

El problema que intento solucionar es crear un blog en el 2020 que sea amigable para usuarios poco hábiles con las computadoras, requiera de poco o nulo mantenimiento con un presupuesto de $0 dólares.

Al empezar la búsqueda mi primer opción fue WordPress pero requiere de tener un servidor, instalar software de base de datos y estar actualizando todo constantemente, por lo cual me fuí por la opción de WordPress.com que es la opción de pago en la que ellos (la empresa) se hace cargo de todo el mantenimiento, lo he estado utilizando por varios meses pero el plan “Personal” en el que estoy, no me permite personalizar nada, aparte me di cuenta que es confusa la interfaz incluso para mí, que soy usuario de WordPress durante anos.

La solución que encontré de “bajo” costo, fácil de mantener y relativamente fácil para el usuario de utilizar fue Ghost, pero para evitarme pagar $29 USD, utilizo un servicio económico que ofrece Amazon, básicamente la competencia de Digital Ocean y Vultr. AWS Lightsail, ofrece servidores virtuales desde $3.5 USD que permiten ejecutar varias versiones de Linux e incluso una opción de usar Ghost de Bitnami que tiene más complicaciones que la opción a la que llegué.

Para empezar hay que seleccionar que tipo de sistema vamos a utilizar, en este caso va a ser Linux Ubuntu 18.04 en la región que mejor se ajuste a sus necesidades.

En mi caso seleccioné la opción más barata, es un blog que requiere muy pocos recursos, pero en caso de necesitarlo, se puede crear un “Snapshot” y se puede iniciar una instancia con un plan con más recursos.

Después de que se ha creado la instancia, se debe asignar una IP estática para luego poder dirigir el dominio a esta IP.

También hay que agregar una excepción para abrir el puerto 443 y que las conexiones seguras (https) sean posibles.

Una vez que todo lo anterior ha sido configurado hay que abrir una conexión al servidor para poder trabajar directamente sobre él. Se puede hacer por medio de la terminal ssh ubuntu@dirección-ip o con la terminal web que ofrece AWS Lightsail.

La siguiente secuencia de comando son los que vamos a necesitar para instalar Docker, darle permisos al usuario, iniciar docker y crear los directorios que vamos a utilizar.

sudo apt-get update
sudo apt-get install -y docker.io docker-compose
sudo usermod -aG docker ${USER}
newgrp docker
sudo service docker start
sudo systemctl enable docker
mkdir ghost caddy caddy/data

Luego hay que crear un archivo llamado docker-compose.yml que va a incluir toda la configuración para crear dos contenedores, uno de Caddy que es el servidor web con soporte automático de https que va a servir como proxy para redireccionar todo el tráfico al otro contenedor con Ghost ejecutandose con SQLite como base de datos, es posible agregar otro contenedor o modificar la configuración para utilizar MySQL como base de datos en caso de ser necesario.

docker-compose.yml
version: "3"
services:
  caddy:
    container_name: caddy
    image: caddy:2-alpine
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./caddy/data:/data
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
  ghost:
    container_name: ghost
    image: ghost:3-alpine
    restart: always
    ports:
      - 2368:2368
    volumes:
      - ./ghost/content:/var/lib/ghost/content
    environment:
      - NODE_ENV=production
      - url=https://domain.com

También hay que crear un archivo para configurar Caddy.

caddy/Caddyfile
domain.com {
    reverse_proxy ghost:2368
}

Los archivos quedan de la siguiente manera:

.
├── caddy/
│   ├── Caddyfile
│   └── data/
├── docker-compose.yml
└── ghost/

Una vez creados los archivos necesarios, solo es necesario ejecutar el siguiente comando para iniciar los contenedores. Todo esto es posible realizarse en 5 minutos y el blog esta disponible con la IP de la instancia creada.

docker-compose up -d

Nota:

El comando sudo systemctl enable docker permite iniciar Docker al momento que el sistema operativo enciende, y restart: always dentro de la configuración de los contenedores, permite iniciar los contenedores cuando se inicia el sistema operativo, lo que permite que no sea necesario ejecutar manualmente ningún comando cuando el sistema reinicia.