¿Cómo instalar Ghost (CMS) usando Nodejs y Caddy?

Ghost es un gestor de contenidos (CMS) diseñadado especialmente para blogs y que se caracteriza por su funcionalidad, su elevado rendimiento, integración de AMP nativa sin tener que instalar plugins y webhooks para poder enviar nuestro contenido a cualquier sitio.

Además Ghost esta desarrollado enteramente en Javascript, usando NodeJS como plataforma del lado del servidor y es un proyecto open source. En este artículo os enseñaremos como instalar Ghost usando NodeJS y Caddy de una forma sencilla.

Necesitamos una base de datos

En este caso vamos a instalar MariaDB que personalmente nos ofrece mejor rendimiendo que el servidor mysql

sudo apt-get install mariadb-server
sudo mysql_secure_installation

⚠️ Nota: Al ejecutar el comando de "mysql_secure_installation", es para establecer vuestra clave de root para la base de datos por defecto no tiene. Asi que en la primera pregunta que os hace de introduccir la contraseña solo teneís que pulsar enter. Después introducir vuestra contraseña y el resto de preguntas es todo "Y". No os olvideís de la contraseña que os será necesaria para el siguiente paso.

Ahora necesitamos crear un usuario para nuestra DB:

mysql -u root

⚠️ Importante cambiar "password" en el primer comando donde creamos el usuario por vuestras propias claves, podéis usar cualquier carácter, pero no os recomiendo usar el "@", principalmente porque suele dar problemas algunas veces:

CREATE USER 'ghost'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'ghost'@'localhost';

FLUSH PRIVILEGES;

#bind-address = 127.0.0.1

exit

service mysql restart

Instalamos NodeJs

Al momento de escribir este artículo la última versión LTS de NodeJS era la 12, os recomiendo ir a la web de NodeJs y comprobar la versión LTS para instalar más actual.

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
apt-get install nodejs
node -v

Instalación de Caddy

Os pongo los enlaces de instalación de Caddy, este tutorial fue actualizado para incluir el link de instalación de Caddy v2 como la configuración correcta para que funcione para las dos versiones en este post.

Instalamos Ghost Cli

sudo npm i -g ghost-cli

Crear usuario (Remplazar "<user>" por el nombre de usuario que querais, importante no usar el nombre "ghost"):

adduser <user>

Le damos al usuarios que hemos creado permisos de administrador:

usermod -aG sudo <user>

Inicamos sesión como ese usuario:

su - <user>

Una vez estamos con la nueva cuenta de nuestro usuario solo nos queda crear la carpeta donde pondremos la instalación de ghost, en mi caso la pondré en la carpeta /var/www/ghost. Para ello tendremos que ejecutar los siguientes comandos:

cd /var/www
sudo mkdir ghost
cd ghost

Es importante que antes de realizar la instalación nos aseguremos que los permisos de la carpeta sean los correctos, para ello lo importante es asegurarnos que tengamos permisos de usuario/grupo sobre la carpeta y permisos de escritura sin ser root. Para ello solo tendremos que ejecutar los siguientes comandos:

# Remplazar "<user>" por vuestro nombre de usuario
sudo chown <user>:<user> /var/www/ghost


# Establecemos los permisos correctos para que el instalador pueda escribir en la carpeta
sudo chmod 775 /var/www/ghost

Para proceder con la instalación de Ghost solo tenemos que poner en nuestra terminal el siguiente comando:

ghost install

⚠️ Importante poner vuestro nombre del dominio o subdominio con https://... aunque no lo tengáis configurado en Caddy por el momento ya que el certificado lo creará Caddy de forma automática posteriormente. Al proceder a la instalación de Ghost, nos dirá que falta el paquete nginx y nos preguntará si queremos continuar de todas formas, escribimos "Y".

El proceso tiene que ser algo similar al siguiente:

root@:/var/www/ghost# ghost install

✔ Checking system Node.js version
✔ Checking current folder permissions
System checks failed with message: 'Linux version is not Ubuntu 16'
Some features of Ghost-CLI may not work without additional configuration.
For local installs we recommend using `ghost install local` instead.
? Continue anyway? Yes
✔ Checking operating system
✔ Checking MySQL is installed
✔ Checking for latest Ghost version
✔ Setting up install directory
✔ Downloading and installing Ghost vX.XX.X
✔ Finishing install process
? Enter your blog URL: https://dominio.es
? Enter your MySQL hostname: localhost
? Enter your MySQL username: ghost
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghost_prod
✔ Configuring Ghost
✔ Setting up instance
Running sudo command: useradd --system --user-group ghost
Running sudo command: chown -R ghost:ghost /var/www/ghost/content
✔ Setting up "ghost" system user
? Do you wish to set up Nginx? **No**
ℹ Setting up Nginx [skipped]
Task ssl depends on the 'nginx' stage, which was skipped.
ℹ Setting up SSL [skipped]
? Do you wish to set up "ghost" mysql user? **Yes**
MySQL user is not "root", skipping additional user setup
ℹ Setting up "ghost" mysql user [skipped]
? Do you wish to set up Systemd? **Yes**
✔ Creating systemd service file at /var/www/ghost/system/files/ghost_cms-tecnonucleous-com.service
Running sudo command: ln -sf /var/www/ghost/system/files/ghost_cms-tecnonucleous-com.service /lib/systemd/system/ghost_ovh-tecnonucleous-com.service
Running sudo command: systemctl daemon-reload
✔ Setting up Systemd
Running sudo command: /var/www/ghost/current/node_modules/.bin/knex-migrator-migrate --init --mgpath /var/www/ghost/current
✔ Running database migrations
? Do you want to start Ghost? **Yes**
✔ Validating config
Running sudo command: systemctl start ghost_ovh-tecnonucleous-com
✔ Starting Ghost
Running sudo command: systemctl enable ghost_ovh-tecnonucleous-com --quiet
✔ Starting Ghost
You can access your blog at https://dominio.es

Ghost uses direct mail by default
To set up an alternative email method read our docs at https://docs.ghost.org/docs/mail-config

CaddyFile para Ghost

cd /etc/caddy
nano CaddyFile

Caddyfile para Caddy v1:

dominio.com {
proxy / 127.0.0.1:2368 {
    transparent
    header_upstream X-Forwarded-Proto https
    }
}

Caddyfile para Caddy v2:

dominio.com {
    reverse_proxy 127.0.0.1:2368 {
		header_up X-Forwarded-Proto {http.request.scheme}
  }
encode gzip
}

Para aplicar los cambios en el caso de Caddy v2 usamos el comando caddy validate para ver si el Caddyfile esta correcto y después aplicamos los cambios con caddyy reload. En el caso de que usemos Caddy v1 (la versión vieja) usaremos el comando systemctl restart caddy para aplicar los cambios.

Si esta todo bien al entrar en nuestro dominio desde el navegador nos tendría que salir algo una pagina similar a la siguiente, el diseño puede varias por la evolución que tiene Ghost.

Creamos nuestra cuenta de admin

Para iniciar la creación de nuestra cuenta de admin tenemos que ingresar en la ruta "/ghost" de nuestro dominio desde el navegador. Ej: https://dominio.es/ghost

Una vez realizado todo este proceso tendremos ghost funcionando perfectamente, espero que este pequeño tutorial os aclarará todos las dudas al respecto.