Mi propio blog en Ghost
TLDR: Quise crear mi propia página web tipo Blog, usando alguna tecnología que fuera novedosa, descartando viejos conocidos en PHP como WordPress o Drupal. También quise implementar el proceso de levantamiento usando algún servicio de cómputo en la nube como AWS o Vercel. Terminé eligiendo Ghost como tecnología, descartando el servicio que ellos ofrecen para los blogs y creando una instancia en AWS EC2. No salió como esperaba, tuve unos inconvenientes y me apoyé con unas imágenes ya existentes de Bitnami para la puesta en servicio. Lo demás fue configuración y aquí estamos.
Elección de Ghost (razones personales, puedes saltar esta sección)
Primero, dentro de lo que quería hacer, investigué varias herramientas para creación de páginas web (no solo blogs) que sean contenidas en un solo aplicativo (backend y frontend en el mismo despliegue) y que estén basadas en node.js.
En el mundo de node.js no hay muchas opciones, las más relevantes son Headless CMS: Strapi y Directus. Dos espectaculares opciones que llegan hasta ese punto, el de Headless.
Estas 2 opciones poseen todo lo que uno necesita para administrar contenido: manejo de usuarios, permisos, documentos, imágenes, rutas, etc. Sin embargo, como su nombre indica, son Headless, o lo que en la practica traduce, sólo es el backend o la administración del contenido. Para mi solución, quería desplegar usando un solo proyecto o repositorio, y a pesar de que podía iniciar un proyecto en React.js o Next.js con alguna librería como MUI, no quería llegar hasta ese punto o complicación.
Otro punto a tomar en cuenta, es que en el trabajo estábamos evaluando un cliente el cuál insistía con un CMS completo, que a su preferencia, quería usar WordPress. Desde el departamento sabemos que estas tecnologías ahorran en esfuerzo a la hora del despliegue, pero dificultan (y en gigantes rangos) el proceso de integración y crecimiento propio de la solución, pero en nuestra opinion, esta es la principal razón por la que aún no logramos superar PHP como lenguaje: proyectos completos como WordPress o Drupal nos enamoran para su uso, alejándonos de lenguajes de programación más eficientes, óptimos y con mejores curvas de aprendizaje.
Nunca había escuchado Ghost, y a pesar de que al inicio tuve algunas confusiones acerca de cómo resuelve el contenido, me gustó saber que:
- Es un CMS que permite generar páginas y posts.
- Posee una interfaz completa para la creación y edición de contenido.
- Está enfocado a páginas por suscripción, sin embargo, esto es opcional.
- Posee Newsletter, lo cuál permite crear campañas de correos personalizadas.
- La interfaz está impulsada por Handlebars, lo cuál es una tecnología fácil de conocer.
- Existen varios temas gratuitos y otros más que pueden adquirirse por un precio, que complementan y mejora todo lo que Ghost puede hacer.
- Las rutas, lenguajes, tags y otros elementos pueden personalizarse.
Y queriendo usar algún lenguaje de fácil uso para mi como node.js, está fue una elección fácil que me entusiasmó. Pero igual, les recomiendo tomar en cuenta las contras:
- Manejo de un sólo Content-Type (posts).
- No posee integración nativa con servicios de archivos o media files como AWS S3.
De todas maneras, sigo pensando que es una buena solución para portales sencillos: blogs personales, páginas de empresas, información de podscasts o eventos, etc.
Elección de AWS (también personal, puedes continuar con la siguiente sección)
Este es un tema un poco más directo que la elección de Ghost. Durante mi carrera, he trabajado con uso de cómputo en la nube con los proveedores Azure y AWS. Cada uno tiene sus pros y contras, sin embargo, en mi día a día actual, es más frecuente la elección de AWS debido a que su principal ventaja es la economía de precios (o eso aparenta).
Sin ahondar mucho, me gusta probar y saber qué y qué no se puede hacer con este servicio de cómputo en la nube, y con el ofrecimiento de 750 horas de cómputo gratis durante un año, me parece una buena opción.
El portal de Ghost ofrece un servicio de despliegue de tu portal (TryGhost), con tu propio dominio, por $ 9.00, el cual es un buen precio a mi parecer, pero sigo pensando en que quiero desplegar mi propia solución.
Como dije al inicio, quería hacer un despliegue desde sus inicios, usar las tecnologías de AWS y aprovechar las 750 horas ofrecidas, por lo que de una vez tomé esta opción.
Primeros pasos y fallos
Bien, ya pongámonos en modo programador y despleguemos nuestro propio portal.
Antes de iniciar, debo adquirir mi propio nombre de dominio o DNS (Domain Name System), que es cómo voy a ser conocido en el internet. Me dirigí a Namecheap y adquirí jorgetech.dev por la módica suma de aproximadamente $ 11.00.
Crear mi primera instancia de AWS EC2
Listo, ahora simplemente creo una instancia en AWS EC2 con una imagen en Ubuntu y hago la instalación. Todos los pasos se encuentran en la página de Ghost. Ya había "jugado" con esta tecnología en local, por lo que simplemente era instalar en mi nueva máquina virtual, subir el tema de mi elección (desde la tienda o personalizado) y listo, ¿suena fácil no?
En primer lugar, accedí a mi cuenta de AWS, me dirigí a la sección de EC2 e inicié una instancia micro (permitida para las 750 horas gratuitas) usando la imagén de Ubuntu que había mencionado. En menos de 5 minutos, ya podía conectarme a través del protocolo SSH a mi máquina virtual (recuerden crear las credenciales necesarias para la conexión).
Listo, entonces es solo ingresar y seguir los pasos:
- Crear un nuevo usuario.
- Actualizar todos los paquetes.
- Instalar NGINX.
- Instalar MySQL.
- Instalar Node.js.
- Instalar Ghost-CLI.
- Crear el directorio y habilitar los permisos para el usuario de la máquina.
Y listo, ya solo falta el paso 8, instalar Ghost.
- Instalar Ghost con el comando
ghost install
.
Aquí es donde todo no correo como esperamos. Esta instalación nunca ocurre, la máquina virtual dura horas instalando Ghost hasta que se pierde la conexión. Pensé que era un problema de falta de memoría física (AWS EBS), por lo que repetí la creación de la instancia dejando a la máquina con 50 GB de memoria, pero aún así, la instalación se congelaba.
Probando con otras imágenes oficiales de AWS
Al momento de crear una instancia, tenemos otras opciones para la imagen, desde Linux, Debian, una versión creada específicamente por Amazon, hasta instalar Windows o MacOS.
Obviamente todos los intentos fueron con las distribuciones de Linux (donde los comandos no son siempre iguales), sin embargo, sucedía lo mismo: siempre se congelaba en el paso 4 o 5 de la instalación de Ghost.
Por lo que ya había que recurrir a la magía del internet. Resulta que este problema, no era único para mi. Como pueden ver en el post, varios usuarios reclamaban el mismo inconveniente, por lo que eran un mensaje en Github donde un usuario indicaba que este inconveniente era porque la máquina virtual sólo tenía 1 GB de memoria RAM y se necesitaban mínimo 2 GB. Esto era contradictorio a la página de Ghost, donde se indica que mínimo, 1 GB de memoria RAM es suficiente.
Lástima, todo parecía muy sencillo. Luego de esto, sólo quedaba la configuración de NGINX, el dominio y los certificados.
Esto fueron varios intentos, cada uno durando entre 1 hora y 3 horas. Al 3er día me rendí con esta opción y empecé a buscar alternativas.
Pude haber elegido Digital Ocean para el despliegue, o directamente adquirir el servicio desde la página de Ghost, sin embargo, quería insistir con esta opción. Dudo mucho que hayan clientes pequeños en mi trabajo para proponer esta opción, pero quien sabe, nunca está de más tener esto en el arsenal (al menos una landing page con redirecciones puede ser muy fácil para vender).
Y aquí es cuando descubrí las bondades de desplegar una instancia usando imágenes de terceros, como los el proveedor Bitnami, quien justamente para Ghost tienen una imagen de uso gratuito.
Tutorial o guía de despliegue de Ghost en AWS EC2 con uso de una imagen de Bitnami
Vamos a seguir los pasos de manera general de como instalar Ghost en AWS usando una imagen de instancia de Bitnami:
- Ingresamos a nuestra cuenta de AWS, nos dirigimos a la sección de EC2 y seleccionamos crear una instancia.
- En la sección de imagen, nos vamos a la sección de imágenes de terceros.
- Buscamos Ghost de Bitnami y seleccionamos la que necesitamos.
- Seleccionar un "key pair" para la instancia (para la conexión a través de SSH).
- Seleccionar un "security group" que permita conexiones desde cualquier IP (Anywhere).
- Configurar unos 30 GB de storage EBS.
- Esperamos por la finalización del despliegue y luego nos vamos a los mensajes de Log de la instancia.
- Buscamos la sección donde se inicia el usuario y contraseña para ingresar. Este proceso es para obtener las credenciales para ingresar al aplicativo por primera vez: encuentra las credenciales de la aplicación.
- En la sección de Getting started puedes obtener información adicional de cómo ingresar a la base de datos o la configuración inicial de Apache.
- En la sección de Configuration hay información adicional para otras configuraciones del servicio SMTP o Apache.
- En la sección de Administration se encuentra la mayor porción de información para el servidor en Ghost.
- Esta sub-sección te muestra los comandos para iniciar, reiniciar o detener los servicios de Ghost.
- Sub-sección a seguir para configurar el dominio del servidor.
- En esta guía se encuentra la información para configurar los certificados SSL y el DNS a través de HTTPS.
- Crear una Elastic IP desde AWS y asignarla a nuestra instancia de Ghost.
- También se debe configurar el DNS (para mi caso usé Namecheap en la compra de mi dominio). Este proceso es sencillo y directo. Cuando estés configurando el dominio, ve a la sección de "Advanced DNS" para el dominio y crea un "A Record". Selecciona "Host" como "@" e introduce el Valor de la Elastic IP que configuraste antes. Guarda esto y crea un segundo "A Record", selecciona "Host" como "www" y introduce el Valor para que sea el mismo del Elastic IP que configuraste antes.
Hay varios puntos y fuentes de información adicional que dejaré por acá para vuestro interés:
- Readme en Github por el usuario bdeitte donde explica el proceso de configuración de Ghost con AWS y Namecheap.
- Consulta en Stack Overflow donde se concluye que para la instalación de Ghost se requieren 2 GB de memoria RAM en vez de 1 GB.
Se que hay otros datos importantes, sin embargo, si presentas un inconveniente durante la instalación, déjame saber para ayudarte o guiarte durante el proceso.