¿Cómo instalar Ghost correctamente en DigitalOcean?

Ya hace un par de meses atrás me di la tarea de migrar de Wordpress a Ghost, esto debido a que tras años usando el CMS más popular de internet terminé quemado. Demasiados plugins, errores, dependencias... cada vez era más estresante mantenerlo.

Si llegaste a esta publicación ya tendrás una idea básica de Ghost y quieres empezar con el proceso de instalación. DigitalOcean es de las mejores opciones para hacer self-hosting de este CMS.

Creando el Droplet en DigitalOcean

Lo primero que debes hacer es registrarte en DigitalOcean, puedes hacerlo desde este enlace y tendrás $100 de crédito por 60 días. Así, al menos al principio, no tendrás que preocuparte por pagar los dos primeros meses de prueba.

Luego de registrarte lo siguiente será crear nuestra máquina, para eso damos clic en Create que se sitúa justo en la parte superior derecha, luego en Droplets.

Los Droplets son pequeños cloud servers en el cual podemos configurar libremente desde sistema operativo, región del servidor y elegir las mejores opciones para nuestro proyecto.

La imagen de sistema operativo que necesitaremos es Ubuntu 20.04 (LTS), en Choose a plan mantengamos el Basic.

🛑
Aunque en otros tutoriales les dicen que uses el Marketplace de DigitalOcean para una instalación "simple", no lo hagan. Les dará problema más adelante, no es lo ideal. La manera correcta de hacerlo es mediante una instalación manual.

En las opciones de CPU queda a su decisión, yo personalmente elegí el Regular with SSD ya que es un poco más barata y para una página web está bien.

Ahora, esta es la parte crítica ya que muchos tutoriales en vídeos/blogs venden la idea de que con el Droplet de $5 (1GB/1CPU con 25GB SSD) es suficiente y la verdad es que no, en la práctica da problemas.

Lo recomendable es elegir (2GB/1 CPU) en adelante, esto debido a que hay configuraciones posteriores que requerirán más acceso a RAM. En mi caso elijo la opción de $12/mes.

Lo siguiente es elegir la región del Datacenter, esta opción dependerá enteramente de donde eres. Aquí lo importante es la cercanía, en mi caso, ya que soy de Latino América elegí el de New York (aunque también tienes la opción de San Francisco), si eres de Europa tendrás opciones entre Ámsterdam, Frankfurt y London.

En Authentication lo más sencillo es crear una contraseña (que será como accedes por SSH al droplet) y si tienes ya experiencia puedes generar una llave SSH para que sólo los equipos que tengan esa llave puedan acceder.

Te recomiendo también adquirir el Enable backups, pero es opcional, añade unos $2.40/al mes.

Como último le pones el nombre como quieres que se llame le proyecto (sino por defecto DigitalOcean pondrá uno aleatorio).

Finalizamos dando clic en Create Droplet.

Configurando el DNS

Puedes configurar el DNS en donde haz comprado tu dominio, aunque personalmente prefiero utilizar Cloudflare como mi gestor de DNS.

Desde nuestro panel de DigitalOcean encontraremos nuestro proyecto, al lado de un IP. Copiamos ese IP y desde nuestro DNS creamos un nuevo record tipo A.

Record A:
Name: [tu dominio]
IPV4 (target): [IP de tu Droplet]
TTL: Auto

Si lo haces en Cloudflare deberás cambiar el Proxy status a DNS, ya que en Proxied da problemas.

Añadimos otro record tipo CNAME y lo configuramos de la siguiente forma:

Record CNAME:
Name: www
Target: [tu dominio]
TTL: Auto

En Cloudflare aquí si quieres puedes habilitar el Proxy status a Proxied, no he tenido problemas con ello.

Instalando Ghost en tu Droplet de DigitalOcean

Desde nuestro panel de inicio de DigitalOcean veremos nuestro proyecto, justo al final de esta opción veremos tres puntitos, le damos clic ahí y luego a Access console.

Luego, nos saldrá otro menú. Le damos clic en Launch Droplet Console y esto nos desprenderá una nueva ventana donde tendremos acceso a la terminal de nuestro droplet.

Lo primero será crear un nuevo usuario, ya que las instalaciones de Ghost no se efectúan con el usuario root. Desde esta terminal escribimos lo siguiente:

# Crear un nuevo usuario y seguir las indicaciones
adduser <usuario>
💡
Lo usuarios con el nombre ghost posteriormente dan problemas, evitar dicho nombre de usuario.
# Añadir el usuario al grupo de superusuario
usermod -aG sudo <usuario>

# A continuación, inicie la sesión como este nuevo usuario
su - <usuario>

Lo siguiente será actualizar los paquetes de nuestro droplet:

# Actualizar las listas de paquetes
sudo apt-get update
sudo apt-get upgrade

Ghost utiliza NGNIX como servidor y la configuración SSL requiere de una versión NGNIX 1.9.5 en adelante.

# Instalar NGNIX
sudo apt-get install nginx

Si ufw fue activado, el firewall permite las conexiones HTTP y HTTPS. Abra el cortafuegos:

sudo ufw allow 'Nginx Full'

Lo siguiente será instalar MySQL, ya que es la base de datos que utiliza para poder funcionar correctamente:

# Instalando MySQL
sudo apt-get install mysql-server

Ya que hemos elegido Ubuntu 20.04 LTS es requerida una contraseña para asegurarnos que MySQL sea compatible con Ghost-CLI, esto requiere de unos pasos extras.

# Para hacerlo deberemos ingresar lo siguiente
sudo mysql

# Ahora actualiza tu usuario con este comando
# Ojo, remplaza "contraseña" con tu contraseña dejando la comilla simple
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'contraseña';

# Ahora sal de MySQL
quit

# y accede a tu usuario antes creado
su - <usuario>

Ojo, guarda muy bien esta contraseña ya que es importante que la tengas para futuros mantenimientos.

También necesitaremos instalar la última versión de Node.js:

# Añadir el repositorio APT de NodeSource para Node 16
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash

# Instalar Node.js
sudo apt-get install -y nodejs

Una vez el servidor está correctamente configurado con todo lo esencial, lo siguiente será instalar Ghost-CLI. Lo siguientes pasos son los recomendados, pero puedes ver más opciones avanzadas desde este enlace.

# Cree un directorio: Cambia `sitio` por el que 
sudo mkdir -p /var/www/sitio

# Establezca el propietario del directorio: cambia <usuario> por el nombre de tu usuario
sudo chown <usuario>:<usuario> /var/www/sitename

# Configurar los debidos permisos
sudo chmod 775 /var/www/sitio

# Luego, vaya a ese directorio
cd /var/www/sitio

En un futuro, cada vez que tengas que hacer alguna configuración o quieras utilizar un comando de ghost (por ejemplo ghost doctor, que es para

Desde aquí ya podemos correr el comando para instalar Ghost en nuestro Droplet:

ghost install

La instalación nos hará una serie de preguntas para configurar tu Ghost:

  • Blog URL. Ingresa exactamente la dirección URL que tendrá tu sitio web incluyendo el protocolo HTTP o HTTPS. De añadir la URL bajo el protocolo HTTPS el instalador te ofrecerá un certificado SSL gratuito (se configura más adelante).
  • MySQL hostname. Esto determina desde dónde se puede acceder a su base de datos MySQL. Si MySQL está instalado en el mismo servidor, utilice localhost (pulse Enter para utilizar el valor por defecto). Si MySQL está instalado en otro servidor, introduzca el nombre manualmente.
  • MySQL username / password. Si ya tiene una base de datos MySQL, introduzca el nombre de usuario. De lo contrario, introduzca el nombre de usuario root. A continuación, introduzca la contraseña de su usuario.
  • Ghost database name. Introduzca el nombre de su base de datos. Se configurará automáticamente para usted, a menos que esté utilizando un usuario/contraseña de MySQL que no sea root. En ese caso, la base de datos ya debe existir y tener los permisos correctos.
  • Set up a ghost MySQL user? (recomendado) Aquí simplemente dale que "yes".
  • Set up NGINX? (recomendado) Igual, darle que sí.
  • Set up SSL? (recomendado) Esta será la parte en la que configurarás el SSL gracias a Let's Encrypt, es totalmente gratuito. Darle que sí y luego llenar los campos que se requieran.

    La configuración de la certificación SSL requiere una dirección de correo electrónico para que se le pueda mantener informado si hay algún problema con su certificado, incluso durante la renovación.
  • Set up systemd? (recomendado) Darle que yes.
  • Start Ghost? Esta es la última, lo que hace es arrancar Ghost, darle que yes.

Después de esto podrás acceder a tu panel de Ghost desde https://<tusitio>.com/ghost y aquí tendrás que seguir los pasos de configuración, que será el usuario y contraseña con que accederás al gestor.

Configurando Mailgun, para el newsletter

Uno de los puntos fuertes de Ghost es su sistema de newsletter, que automáticamente envía las publicaciones a los miembros que se registren en nuestro sitio web.

Para esto, cuando hacemos self-hosting deberemos configurar Mailgun.

  1. Registrate en Mailgun.com y luego inicia sesión.
  2. En Domains haz clic en Add New Domain. (Haz clic en copy password, más adelante la necesitarás).
  3. Ingresa tu dominio desde donde quieres que se envíe los correos.
  4. Actualiza tu DNS para verificar y autorizar tu dominio (seguir las instrucciones).
  5. Verifica tu dominio en Mailgun (cuando el DNS se propage correctamente).

Lo siguiente será configurar tu instancia de Ghost para que concuerde con lo configurado en Mailgun. Para esto tendrás que acceder a tu terminal bajo tu usuario (no el root, sino el creado durante el proceso).

Debemos dirigirnos a nuestra carpeta:

cd /var/www/<tusitio.com>/

Luego de esto deberemos abrir el archivo de configuración:

nano config.production.json

Tendremos una línea ya creada de mail, esta la sustituimos por lo siguiente:

  "mail": {
    "from": "Nombre de sitio <newsletter@<tusitio.com>",
    "transport": "SMTP",
    "options": {
      "service": "Mailgun",
      "host": "smtp.mailgun.org",
      "port": 465,
      "secureConnection": true,
      "auth": {
        "user": "newsletter@<tusitio.com>",
        "pass": "<contraseña antes copiada>"
      }
    }
  },
  • service - Define cual servicio de email deseas usar, en este caso Mailgun.
  • host y port, estas dos propiedades puedes encontrarlas en Domain Settings, luego en SMTP credentials.
  • host - depende de la región, en mi caso es smtp.mailgun.org
  • port - los servidores Mailgun usualmente están escuchando estos puertos (ex. 25, 587, and 465)
  • secureConnection - si quieres forzar el SMTP (en este caso lo recomendamos).

Luego de esto tendremos que ir a nuestro panel de Ghost, desde https://tusitio.com/ghost y nos vamos a Configuración (en la ruedita que está en la parte inferior izquierda).

Luego a Email newsletter > Mailgun configuration, le hacemos clic en Expand y configuramos la región, Mailgun domain y en Mailgun Private Key añadimos la contraseña (que también puedes encontrar aquí).

Damos Save en la parte superior derecha y ya estaría todo configurado. Regresamos a la consola y escribimos:

# Reiniciamos nuestra instancia de Ghost
ghost restart

# Revisamos si hay algún error
ghost doctor

Y ya con eso tendríamos todo configurado para gozar de Ghost, un CMS con muchas posibilidades, rápido y sencillo para escribir. Aunque lleva un poco de trabajo poder configurarlo del todo, esta forma es más accesible con todas las características, a diferencia de tus opciones de pago en la página oficial (que no requiere de mucho conocimiento ni tiempo de mantenimiento).

Mantenimiento

Es bueno que sepas algunas cosas básicas que debes saber para mantener tu instancia de Ghost. Una de ellas es que cada vez que quieras ejecutar un comando de Ghost deberás acceder al usuario que creaste y estar en la carpeta de dicha instancia, localizada en /var/www/tusitio.com.

Para generar un backup de todo el contenido de tu instancia puedes escribir el siguiente comando:

ghost backup

También puedes hacerlo manualmente desde el panel visual de tu Ghost, pero tomará un poco más de tiempo.

Para actualizar tu instancia de Ghost puedes escribir el siguiente comando:

ghost update

Y para conocer si hay algún problema con tu Ghost puedes escribir el siguiente comando:

ghost doctor

De igual forma, si deseas tener más conocimiento de Ghost te recomiendo leer su documentación (en inglés) ya que se te será de gran ayuda para el mantenimiento y cualquier problema que te pueda aparecer en el camino.

¡Bienvenid@, te haz suscrito! Kenneth Guerra
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
¡Bienvenid@ de vuelta, haz ingresado satisfactoriamente!
Error. No se ha podido iniciar la sesión. Por favor, inténtelo de nuevo.
¡Bien! Su cuenta se ha activado satisfactoriamente.
Error. Ha fallado la comprobación de Stripe.
Éxito. Sus datos de facturación están actualizados.
Error. Ha fallado la actualización de la información de facturación.