Instalación de Ghost CMS en Linux

Ghost es un moderno sistema de gestión de contenido de código abierto diseñado para creadores y profesionales. Proporciona una plataforma de publicación simplificada con enfoque en la simplicidad, el rendimiento y la experiencia del usuario. Esta guía recorre una instalación completa de Ghost en un servidor Linux, incluyendo la configuración de Node.js, la configuración de la base de datos MySQL, certificados SSL y el despliegue en producción con gestión de servicios systemd.

Tabla de contenidos

Requisitos previos

Antes de comenzar la instalación de Ghost, asegúrese de tener lo siguiente:

  • Un VPS o servidor dedicado ejecutando Ubuntu 20.04 LTS o superior
  • Acceso root o privilegios sudo
  • Un nombre de dominio válido que apunte a su servidor
  • Mínimo 2GB de RAM (4GB+ recomendado para producción)
  • 10GB de espacio en disco disponible
  • Conocimientos básicos de línea de comandos de Linux

Actualice los paquetes del sistema a las versiones más recientes antes de comenzar el proceso de instalación.

sudo apt update && sudo apt upgrade -y

Requisitos del sistema

Ghost tiene requisitos específicos del sistema que deben cumplirse para un rendimiento óptimo. La aplicación requiere Node.js 16.0 o superior, npm 7.0 o superior y un sistema de base de datos compatible.

Verifique su versión actual de Node.js si ya está instalado:

node --version
npm --version

Verifique los recursos del sistema:

free -h
df -h

Instalación de Node.js

Node.js es el entorno de ejecución requerido para Ghost. Instale la versión LTS más reciente desde el repositorio de NodeSource.

Agregue el repositorio de NodeSource para Node.js 18 LTS:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -

Instale Node.js y npm:

sudo apt install -y nodejs

Verifique la instalación:

node --version
npm --version

Instale las dependencias adicionales del sistema:

sudo apt install -y build-essential python3

Configure npm para usar los permisos correctos para los paquetes globales:

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
export PATH=~/.npm-global/bin:$PATH
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

Configuración de la base de datos MySQL

Ghost requiere una base de datos para almacenar contenido. Instale MySQL Server y cree una base de datos y usuario dedicados de Ghost.

Instale MySQL Server:

sudo apt install -y mysql-server

Inicie y habilite el servicio MySQL:

sudo systemctl start mysql
sudo systemctl enable mysql

Asegure su instalación de MySQL:

sudo mysql_secure_installation

Cree una base de datos para Ghost:

sudo mysql -u root -p << EOF
CREATE DATABASE ghost;
CREATE USER 'ghost'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON ghost.* TO 'ghost'@'localhost';
FLUSH PRIVILEGES;
EXIT;
EOF

Pruebe la conexión a la base de datos:

mysql -u ghost -p -h localhost
show databases;
exit;

Instalación de Ghost

Instale Ghost CLI globalmente, que es la forma recomendada de instalar y gestionar Ghost:

npm install -g ghost-cli

Cree un directorio para la instalación de Ghost:

sudo mkdir -p /var/www/ghost
sudo chown $USER:$USER /var/www/ghost
cd /var/www/ghost

Instale Ghost usando el instalador interactivo:

ghost install

El instalador le solicitará la siguiente información:

  • Versión de Ghost (presione Enter para la más reciente)
  • Host de base de datos: localhost
  • Nombre de la base de datos: ghost
  • Nombre de usuario de la base de datos: ghost
  • Contraseña de la base de datos: (ingrese la contraseña que creó)
  • Puerto de la base de datos: 3306
  • Puerto local para Ghost: 2368
  • Subdominio: example.com (use su dominio)
  • Habilitar HTTPS/SSL: Y (configuraremos SSL por separado)
  • Configurar Nginx: Y
  • Configurar Systemd: Y

Monitoree el progreso de la instalación y asegúrese de que todos los pasos se completen correctamente. El instalador configurará automáticamente Nginx y creará un servicio systemd.

Inicie Ghost después de la instalación:

cd /var/www/ghost
ghost start

Verifique que Ghost se está ejecutando:

ghost status

Acceda a la interfaz de administración:

curl http://localhost:2368/admin

Configuración del proxy inverso Nginx

Ghost CLI configura automáticamente Nginx, pero es posible que deba verificar o ajustar la configuración. Verifique el archivo de configuración de Nginx:

sudo cat /etc/nginx/sites-available/example.com.conf

La configuración debería verse similar a esto:

upstream ghost {
    server localhost:2368;
}

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://ghost;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Pruebe la configuración de Nginx:

sudo nginx -t

Recargue Nginx para aplicar los cambios:

sudo systemctl reload nginx

Configuración del certificado SSL

Configure certificados SSL gratuitos usando Let's Encrypt y Certbot. Ghost CLI generalmente se encarga de esto automáticamente durante la instalación.

Instale Certbot si aún no está instalado:

sudo apt install -y certbot python3-certbot-nginx

Obtenga manualmente un certificado SSL:

sudo certbot certonly --nginx -d example.com -d www.example.com

Actualice la configuración de Nginx para usar HTTPS:

sudo nano /etc/nginx/sites-available/example.com.conf

Agregue o actualice el bloque de servidor para redirigir HTTP a HTTPS:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://ghost;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Pruebe y recargue Nginx:

sudo nginx -t
sudo systemctl reload nginx

Configure la renovación automática de certificados:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Configuración del servicio Systemd

Ghost CLI crea automáticamente un servicio systemd. Verifique la configuración del servicio:

sudo systemctl status ghost_www.example.com

Vea el archivo del servicio:

sudo cat /etc/systemd/system/ghost_www.example.com.service

El servicio debe estar configurado para iniciar Ghost automáticamente en el arranque del sistema. Habilite e inicie el servicio:

sudo systemctl enable ghost_www.example.com
sudo systemctl start ghost_www.example.com

Monitoree los registros del servicio:

sudo journalctl -u ghost_www.example.com -f

Verifique el estado del servicio:

sudo systemctl status ghost_www.example.com

Configuración posterior a la instalación

Acceda al panel de administración de Ghost para completar la configuración:

  1. Navegue a https://example.com/admin
  2. Cree la cuenta de administrador con nombre de usuario, correo electrónico y contraseña
  3. Configure el título y descripción del blog
  4. Configure la configuración de correo electrónico para notificaciones y alertas

Actualice la configuración de Ghost para uso en producción:

cd /var/www/ghost
sudo nano .env

Variables de entorno clave para verificar:

NODE_ENV=production
GHOST_SECURITY__PASSWORD_MIN_LENGTH=12
GHOST_SECURITY__PASSWORD_MIN_PASSWORD_LENGTH=12

Configure los parámetros de correo electrónico en el panel de administración:

  1. Configuración → General → Correo electrónico
  2. Configure las credenciales SMTP para notificaciones

Verifique que Ghost está correctamente configurado:

cd /var/www/ghost
ghost log

Copia de seguridad y mantenimiento

Implemente una estrategia de copia de seguridad regular para su instalación de Ghost y base de datos. Cree un script de copia de seguridad:

sudo nano /usr/local/bin/ghost-backup.sh

Agregue el siguiente contenido:

#!/bin/bash

BACKUP_DIR="/backups/ghost"
GHOST_DIR="/var/www/ghost"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/ghost-backup-$DATE.tar.gz"

mkdir -p $BACKUP_DIR

# Realizar copia de seguridad de los archivos de Ghost
tar -czf "$BACKUP_FILE" "$GHOST_DIR"

# Realizar copia de seguridad de la base de datos MySQL
mysqldump -u ghost -p'StrongPassword123!' ghost | gzip > "$BACKUP_DIR/ghost-db-$DATE.sql.gz"

# Mantener solo las últimas 30 días de copias de seguridad
find $BACKUP_DIR -type f -mtime +30 -delete

echo "Backup completed: $BACKUP_FILE"

Haga que el script sea ejecutable:

sudo chmod +x /usr/local/bin/ghost-backup.sh

Programe copias de seguridad diarias usando cron:

sudo crontab -e

Agregue la siguiente línea para ejecutar la copia de seguridad a las 2 AM diariamente:

0 2 * * * /usr/local/bin/ghost-backup.sh >> /var/log/ghost-backup.log 2>&1

Actualice Ghost periódicamente:

cd /var/www/ghost
ghost update

Verifique las actualizaciones disponibles:

cd /var/www/ghost
ghost update --check

Solución de problemas

Si Ghost no se inicia, verifique los registros:

cd /var/www/ghost
ghost log
tail -f /var/log/ghost.log

Verifique la conectividad de la base de datos:

mysql -u ghost -p -h localhost ghost
show tables;
exit;

Verifique el proceso de Node.js:

ps aux | grep node

Reinicie Ghost si es necesario:

cd /var/www/ghost
ghost restart

Verifique que Nginx está correctamente configurado:

sudo nginx -t
sudo systemctl status nginx

Verifique la caducidad del certificado SSL:

openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates

Conclusión

Ghost ahora está completamente instalado y configurado en su servidor Linux con proxy inverso Nginx, base de datos MySQL y encriptación SSL. El servicio systemd asegura que Ghost se inicie automáticamente en el reinicio del servidor. Las copias de seguridad periódicas y las actualizaciones mantienen su instalación segura y confiable. Monitoree regularmente los registros de la aplicación y mantenga su base de datos para asegurar un rendimiento óptimo. Para configuraciones avanzadas, consulte la documentación oficial de Ghost en ghost.org.