Cómo migrar Ghost a un contenedor en Docker

Mucho se habla de contenedores en este Blog pero el mismo no corre en uno. Hace unos días, solucione eso y te muestro cómo hacerlo.

Este blog corría a la "vieja" escuela, sobre un Ubuntu Server, con los paquetes de Node instalados, la Cli de Ghost y una base de datos, todo en el mismo server, Por supuesto, sin ningún problema pero el Ubuntu se quedo viejito (Tenía 14.04) y como estoy en proceso de re acomodar algunas cosas y tengo recursos disponibles en Azure, bueno, acá estamos.

Lo que primero hay que tener en cuenta cuando vamos a comenzar a migrar es lo siguiente:

  • La carpeta "content" debemos resguardarla, ahí esta casi todo el contenido de nuestro blog.
  • Exportar todos los posts y configuraciones en un archivo "JSON", eso se hace desde el apartado Labs, vean la siguiente captura
Este paso es esencial para poder resguardar todo nuestro trabajo. 

Con estas dos cosas estamos listos para migrar.

Poniendo a andar el nuevo Ghost.

Para hacer la configuración de nuestro nuevo contenedor, voy a usar un archivo Docker-Compose, para que sea más fácil de entender para todos. Así quedaría.

version: "3.3"

services:
  cduser.com:
    container_name: cduser-ghost
    image: ghost:3.11.0
    labels:
      - "traefik.http.routers.cduser.tls.certresolver=leresolver"
      - "traefik.http.routers.cduser.rule=Host(`cduser.com`,`www.cduser.com`)"
      - "traefik.enable=true"
      - "traefik.http.routers.cduser.entrypoints=websecure"
    volumes:
      - /home/data/volumes/cduser.com/content:/var/lib/ghost/content

En mi caso particular uso Traefik, como proxy reverso, si ustedes no lo usan o quieren exponerlo directo, algunos cambios deben hacerse, como por ejemplo, borrar todo lo que sea "labels" y especificar puertos. Quedando más o menos así:

version: "3.3"

services:
  cduser.com:
    container_name: cduser-ghost
    image: ghost:3.11.0
    ports:
      - "80:2368"
    volumes:
      - /home/data/volumes/cduser.com/content:/var/lib/ghost/content
El contenedor de Ghost, por defecto, escucha en el puerto 2368.c

Lo más importante de este contenedor es el montar el volumen. ¿Se acuerdan del la carpeta "content" que les comente más arriba? Bueno, esa hay que montarla en un volumen de Docker.

En mi caso, queda así, monto el contenido de "/home/data/volumes/cduser.com/content" en el "/var/lib/ghost/content" dentro del contenedor.

Una vez que las opciones están definidas, guardamos el archivo con el nombre docker-compose.yml y ejecutamos lo siguiente:

docker-compose up -d

Esto va a descargar la imagen de Ghost, este proceso se va a ver más o menos así:

Creating network "labs_default" with the default driver
Pulling cduser.com (ghost:3.11.0)...
3.11.0: Pulling from library/ghost
68ced04f60ab: Downloading [=======>                                           ]  3.881MB/27.09MB
d08ae0b74f9b: Download complete
fae40cf84f67: Downloading [=================>                                 ]  8.325MB/24.05MB
b2e030243655: Downloading [==========================>                        ]  1.444MB/2.765MB
2f877e419203: Waiting
21f095ca0a43: Waiting
8b6adca4bd4f: Waiting
25cc90b3a929: Waiting
83ef21406efd: Waiting

Si todo salió bien, cuando corramos un "docker ps", deberíamos verlo corriendo.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
df892bd2ac61        ghost:3.11.0        "docker-entrypoint.s…"   4 seconds ago       Up 2 seconds        0.0.0.0:80->2368/tcp   cduser-ghost

Con esto estamos listo para visitar nuestra URL/ghost o el localhost/ghost si estamos probando hacer esto localmente. Veremos la pantalla de bienvenida de Ghost, donde debemos crear nuestra cuenta, acuérdate, que si esta expuesto a Internet, el que primero crea la cuenta es el "owner" del Blog, así que no te demores mucho, siempre hay gente dando vueltas, buscando hacer maldades.

Una vez que estamos adentro, vamos a Lab y en vez de exportar, vamos a importar el archivo Json que les comenté más arriba.

Una vez arriba, si todo sale como planeamos, va a traer todos los posts, paginas y configuraciones.

Y eso es todo. No hay mucho más secreto.

Contame cómo te fue, si tuviste algún problema o si conoces otra manera de realizar este procedimiento.