CMS · 15 min read · Oct 14, 2025
Cómo desplegar Ghost CMS en Rocky Linux 9

Ghost es una plataforma de blogs de código abierto que te ayuda a crear un blog con apariencia profesional. Se lanzó en 2013 como una alternativa a WordPress porque se estaba volviendo demasiado complejo. Está escrito en JavaScript y es impulsado por la biblioteca Node.js.
Este tutorial explorará cómo instalar Ghost CMS usando Nginx y MySQL en un servidor impulsado por Rocky Linux 9. Usaremos el servidor Nginx para alojar el blog y el certificado SSL de Let’s Encrypt para asegurar nuestra instalación.
Prerrequisitos
- Un servidor que ejecute Rocky Linux 9.
- Un usuario no root con privilegios sudo.
- Un nombre de dominio completamente calificado (FQDN) apuntando a tu servidor. Para nuestros propósitos, usaremos
ghost.example.comcomo el nombre de dominio. - Asegúrate de que todo esté actualizado.
$ sudo dnf update - Instala paquetes de utilidad básicos. Algunos de ellos pueden ya estar instalados.
$ sudo dnf install wget curl nano unzip yum-utils -y
Paso 1 - Configurar el Firewall
El primer paso es configurar el firewall. Rocky Linux utiliza Firewalld Firewall. Verifica el estado del firewall.
$ sudo firewall-cmd --state
running
El firewall trabaja con diferentes zonas, y la zona pública es la predeterminada que usaremos. Lista todos los servicios y puertos activos en el firewall.
$ sudo firewall-cmd --permanent --list-services
Debería mostrar la siguiente salida.
cockpit dhcpv6-client ssh
Wiki.js necesita puertos HTTP y HTTPS para funcionar. Ábrelos.
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
Recarga el firewall para aplicar los cambios.
$ sudo firewall-cmd --reload
Paso 2 - Instalar Nginx
Rocky Linux 9 viene con una versión más antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.
Crea y abre el archivo /etc/yum.repos.d/nginx.repo para crear el repositorio oficial de Nginx.
$ sudo nano /etc/yum.repos.d/nginx.repo
Pega el siguiente código en él.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Instala el servidor Nginx.
$ sudo dnf install nginx -y
Verifica la instalación.
$ nginx -v
nginx version: nginx/1.22.1
Habilita e inicia el servidor Nginx.
$ sudo systemctl enable nginx --now
Verifica el estado del servidor.
$ sudo systemctl status nginx
? nginx.service - nginx - servidor web de alto rendimiento
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 08:27:47 UTC; 2s ago
Docs: http://nginx.org/en/docs/
Process: 1650 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 1651 (nginx)
Tasks: 2 (limit: 5912)
Memory: 1.9M
CPU: 7ms
CGroup: /system.slice/nginx.service
??1651 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??1652 "nginx: worker process"
Oct 25 08:27:47 ghost.example.com systemd[1]: Starting nginx - high performance web server...
Paso 3 - Instalar Node.js
El instalador de Ghost necesita Nodejs para funcionar. Ejecuta los siguientes comandos para instalar Node 16.
$ curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
Instala Node.
$ sudo dnf install -y nodejs
Verifica la instalación de Node.
$ node --version
v16.18.0
En el momento de escribir este tutorial, Node 18 está disponible y es la versión LTS. Ghost aún no ha agregado soporte para ello. Mantente atento a la documentación de Ghost sobre las versiones de Node para la última versión de Node soportada. Cuando Ghost agregue soporte para Node 18, instala Node 18 usando los siguientes comandos en su lugar.
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs
Paso 4 - Instalar MySQL
Rocky Linux 9 viene con la última versión de MySQL. Puedes instalarlo con un solo comando.
$ sudo dnf install mysql-server
Verifica la versión de MySQL.
$ mysql --version
mysql Ver 8.0.30 for Linux on x86_64 (Source distribution)
Habilita e inicia el servicio MySQL.
$ sudo systemctl enable mysqld --now
Verifica el estado del servicio.
$ sudo systemctl status mysqld
? mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 09:00:26 UTC; 3s ago
Process: 2920 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Process: 2942 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Main PID: 3021 (mysqld)
Status: "El servidor está operativo"
Tasks: 39 (limit: 5912)
Memory: 404.4M
CPU: 4.686s
CGroup: /system.slice/mysqld.service
??3021 /usr/libexec/mysqld --basedir=/usr
Oct 25 09:00:18 ghost.example.com systemd[1]: Starting MySQL 8.0 database server...
Oct 25 09:00:18 ghost.example.com mysql-prepare-db-dir[2942]: Inicializando la base de datos MySQL
Oct 25 09:00:26 ghost.example.com systemd[1]: Started MySQL 8.0 database server.
Puedes iniciar sesión en el shell de MySQL usando la autenticación Unix por defecto. Pero no puedes ejecutar el asistente de configuración de seguridad. Por lo tanto, el siguiente paso es necesario para las versiones de MySQL 8.0.28 y superiores. Ingresa al shell de MySQL.
$ sudo mysql
Ejecuta el siguiente comando para establecer la contraseña para tu usuario root. Asegúrate de que tenga una mezcla de números, mayúsculas, minúsculas y caracteres especiales.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';
Sal del shell. La advertencia de este paso es que ya no puedes iniciar sesión en el shell de MySQL usando la autenticación Unix.
mysql> exit
Ejecuta el script de instalación segura de MySQL.
$ sudo mysql_secure_installation
Se te pedirá que instales el componente de validación de contraseñas. Verifica la fortaleza de las contraseñas utilizadas en MySQL. Presiona Y para instalarlo.
Asegurando la implementación del servidor MySQL.
Conectándose a MySQL usando una contraseña en blanco.
El COMPONENTE DE VALIDAR CONTRASEÑAS se puede usar para probar contraseñas
y mejorar la seguridad. Verifica la fortaleza de la contraseña
y permite a los usuarios establecer solo aquellas contraseñas que son
es lo suficientemente seguras. ¿Te gustaría configurar el componente VALIDAR CONTRASEÑAS?
Presiona y|Y para Sí, cualquier otra tecla para No: Y
A continuación, se te pedirá que establezcas el nivel de la política de validación de contraseñas. Elige 2 ya que es el más fuerte. Luego se te pedirá que crees una contraseña para root. Ingresa una contraseña con los requisitos dados. Y cuando se te pregunte si deseas continuar con la contraseña, presiona Y para proceder.
Hay tres niveles de política de validación de contraseñas:
BAJO Longitud >= 8
MEDIO Longitud >= 8, numérico, mayúsculas y minúsculas, y caracteres especiales
FUERTE Longitud >= 8, numérico, mayúsculas y minúsculas, caracteres especiales y archivo de diccionario
Por favor ingresa 0 = BAJO, 1 = MEDIO y 2 = FUERTE: 2
Por favor establece la contraseña para root aquí.
Nueva contraseña:
Reingresa nueva contraseña:
Fortaleza estimada de la contraseña: 100
¿Deseas continuar con la contraseña proporcionada? (Presiona y|Y para Sí, cualquier otra tecla para No): Y
Finalmente, presiona Y para eliminar usuarios anónimos, deshabilitar inicios de sesión remotos de root, eliminar la base de datos de prueba y recargar las tablas de privilegios.
Por defecto, una instalación de MySQL tiene un usuario anónimo,
permitiendo que cualquiera inicie sesión en MySQL sin tener que tener
una cuenta de usuario creada para ellos. Esto está destinado solo para
pruebas, y para hacer que la instalación sea un poco más fluida.
Deberías eliminarlos antes de pasar a un entorno de producción.
¿Eliminar usuarios anónimos? (Presiona y|Y para Sí, cualquier otra tecla para No): Y
Éxito.
Normalmente, root solo debería poder conectarse desde
'localhost'. Esto asegura que alguien no pueda adivinar la
contraseña de root desde la red.
¿Deshabilitar el inicio de sesión remoto de root? (Presiona y|Y para Sí, cualquier otra tecla para No): Y
Éxito.
Por defecto, MySQL viene con una base de datos llamada 'test' que
cualquiera puede acceder. Esto también está destinado solo para pruebas,
y debería eliminarse antes de pasar a un entorno de producción.
¿Eliminar la base de datos de prueba y el acceso a ella? (Presiona y|Y para Sí, cualquier otra tecla para No): Y
- Eliminando base de datos de prueba...
Éxito.
- Eliminando privilegios en la base de datos de prueba...
Éxito.
Recargar las tablas de privilegios asegurará que todos los cambios
realizados hasta ahora surtan efecto de inmediato.
¿Recargar tablas de privilegios ahora? (Presiona y|Y para Sí, cualquier otra tecla para No): Y
Éxito.
¡Todo listo!
Esto completa el proceso de instalación y aseguramiento de MySQL.
Paso 5 - Instalar Ghost
La instalación de Ghost constará de tres componentes: la herramienta de línea de comandos Ghost-CLI que instala y gestiona actualizaciones para el blog de Ghost y el paquete del blog en sí.
Instalar Ghost-CLI
Ejecuta el siguiente comando para instalar la herramienta Ghost-CLI. Ignora cualquier advertencia que recibas durante el proceso.
$ sudo npm install ghost-cli@latest -g
Preparar el Directorio de Ghost
Crea el directorio raíz de Ghost.
$ sudo mkdir -p /var/www/html/ghost
Establece la propiedad del directorio al usuario actual.
$ sudo chown $USER:$USER /var/www/html/ghost
Establece los permisos correctos del directorio.
$ sudo chmod 755 /var/www/html/ghost
Cambia al directorio de Ghost.
$ cd /var/www/html/ghost
Instalar Ghost
Instalar Ghost es un proceso de un solo comando.
$ ghost install
Durante la instalación, la herramienta CLI hará una serie de preguntas para configurar el blog.
- En el momento de escribir este tutorial, Ghost-CLI no soporta ningún otro SO aparte de Ubuntu. Preguntará si aún deseas continuar con la instalación. Presiona Y para continuar.
- URL del blog: Ingresa la URL completa de tu blog junto con el protocolo https. (
https://ghost.example.com) - Nombre de host de MySQL: Presiona Enter para usar el valor predeterminado de
localhostya que nuestra instalación de Ghost y MySQL están en el mismo servidor. - Nombre de usuario de MySQL: Ingresa
rootcomo tu nombre de usuario de MySQL. - Contraseña de MySQL: Ingresa tu contraseña de root creada anteriormente.
- Nombre de la base de datos de Ghost: Da un nombre a tu base de datos de Ghost. (
ghostdb) - Contraseña de sudo: Ingresa la contraseña de sudo de tu sistema para realizar comandos elevados.
- ¿Configurar un usuario MySQL para Ghost?: El instalador preguntará si deseas crear un usuario MySQL separado para Ghost. Presiona Y para proceder.
- ¿Configurar Nginx?: Por lo general, Ghost-CLI detecta tu instalación de Nginx y la configura automáticamente para tu blog. Pero hasta ahora, no puede detectar nuestra instalación de Nginx. Por lo tanto, el instalador omitirá automáticamente este paso. Configuraremos Nginx manualmente.
- ¿Configurar SSL?: Dado que omitió la configuración de Nginx, la herramienta CLI también omitirá la configuración de un SSL.
- ¿Configurar systemd?: Ghost preguntará si deseas configurar un servicio del sistema para Ghost. Presiona Y para proceder.
- ¿Iniciar Ghost?: Presiona Y para iniciar tu instalación de Ghost. El servicio se iniciará, pero necesitaremos configurar Nginx y SSL para que funcione.
Paso 6 - Instalar SSL
Antes de continuar, necesitamos instalar la herramienta Certbot y un certificado SSL para nuestro dominio.
Para instalar Certbot, usaremos el instalador de paquetes Snapd. Snapd siempre lleva la última versión estable de Certbot, que deberías usar.
La herramienta Snapd requiere el repositorio Epel para funcionar.
$ sudo dnf install epel-release -y
Usaremos Snapd para instalar Certbot. Instala Snapd.
$ sudo dnf install snapd -y
Habilita e inicia el servicio Snap.
$ sudo systemctl enable snapd.socket --now
Crea los enlaces necesarios para que Snapd funcione.
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Asegúrate de que tu versión de snapd esté actualizada.
$ sudo snap install core
$ sudo snap refresh core
Instala Certbot.
$ sudo snap install --classic certbot
Usa el siguiente comando para asegurarte de que el comando Certbot se pueda ejecutar creando un enlace simbólico al directorio /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Genera un certificado SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d ghost.example.com
El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/ghost.example.com en tu servidor.
Genera un certificado de grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Realiza una prueba del proceso para verificar si la renovación del SSL está funcionando bien.
$ sudo certbot renew --dry-run
Si no ves errores, estás listo. Tu certificado se renovará automáticamente.
Paso 7 - Configurar Nginx
Crea y abre el archivo /etc/nginx/conf.d/ghost.conf para editar.
$ sudo nano /etc/nginx/conf.d/ghost.conf
Pega el siguiente código en el archivo ghost.conf. Reemplaza todas las instancias de ghost.example.com con tu dominio.
## forzar HTTPS
server {
listen 80;
listen [::]:80;
server_name ghost.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ghost.example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
http2_push_preload on; # Habilitar HTTP/2 Server Push
ssl_certificate /etc/letsencrypt/live/ghost.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ghost.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ghost.example.com/chain.pem;
ssl_session_timeout 1d;
# Habilitar versiones TLS (TLSv1.3 es requerido para el próximo HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Habilitar 0-RTT de TLSv1.3. Usa $ssl_early_data al hacer proxy inverso para
# prevenir ataques de repetición.
#
# @ver: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling ---
# obtener registros OCSP de la URL en ssl_certificate y almacenarlos en caché
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header X-Early-Data $tls1_3_early_data;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:2368;
}
}
# Este bloque es útil para depurar TLS v1.3. Siéntete libre de eliminar esto
# y usar la variable `$ssl_early_data` expuesta por NGINX directamente si
deseas hacerlo.
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
La configuración anterior redirigirá todas las solicitudes HTTP a HTTPS y servirá como un proxy para el servicio Ghost para servirlo a través de tu dominio.
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Abre el archivo /etc/nginx/nginx.conf para editar.
$ sudo nano /etc/nginx/nginx.conf
Agrega la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Verifica tu configuración de Nginx.
$ sudo nginx -t
Si no ves errores, significa que estás listo para continuar. Recarga el servidor Nginx.
$ sudo systemctl reload nginx
Paso 8 - Configurar SELinux
Permite que Nginx se conecte a la red.
$ sudo setsebool -P httpd_can_network_connect 1
Paso 9 - Ejecutar el Sitio
Ahora puedes verificar tu instalación abriendo https://ghost.example.com en tu navegador web. Obtendrás la siguiente página que indica una instalación exitosa.

Paso 10 - Completar la Configuración
Para terminar de configurar tu blog Ghost, visita https://ghost.example.com/ghost en tu navegador. El extra /ghost al final del dominio de tu blog te redirige al Panel de Administración de Ghost o, en este caso, a la configuración ya que lo estás accediendo por primera vez.
Se te pedirá que crees tu cuenta de Administrador y elijas un título para el blog.

Ingresa tus detalles y haz clic en el botón Crear cuenta y comenzar a publicar para continuar.
A continuación, se te llevará a la siguiente pantalla, donde se te ofrecen opciones como escribir tu primera publicación, personalizar tu sitio e importar miembros.

Elegiremos Explorar la administración de Ghost para explorar e ir directamente al panel de control. Al final de la configuración, serás recibido con el panel de administración de Ghost.

Si deseas cambiar a modo oscuro, puedes hacerlo haciendo clic en el interruptor junto al botón de engranaje de configuración en la parte inferior de la página de configuración.
Cambia a la página de Publicaciones y verás una publicación predeterminada. Puedes despublicarla o eliminarla y comenzar a publicar.
)
Paso 11 - Configurar el Mailer
Ghost no solo actúa como una plataforma de blogs, sino también como un gestor de boletines. Para las operaciones diarias, puedes usar cualquier servicio de correo transaccional para trabajar con Ghost para enviar correos. Pero si deseas enviar boletines a través de Ghost, el único servicio de correo masivo oficial soportado es Mailgun. También puedes usar un servicio de boletines diferente, pero para eso, necesitarás usar la función de integración de Zapier de Ghost.
Primero configuremos un servicio SMTP para correos transaccionales. Para esto, abre el archivo /var/www/html/ghost/config.production.json para editar.
$ nano /var/www/html/ghost/config.production.json
Encuentra las siguientes líneas.
"mail": {
"transport": "Direct"
},
Reemplázalas con el siguiente código.
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"host": "YOUR-SES-SERVER-NAME",
"port": 465,
"service": "SES",
"auth": {
"user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
"pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
}
}
},
Aquí estamos usando el servicio de correo de Amazon SES ya que es muy barato y gratis de por vida si estás usando su servicio EC2.
Si deseas usar su servicio de boletines usando Mailgun, ingresa el siguiente código en su lugar.
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.mailgun.org",
"port": 587,
"secure": true,
"auth": {
"user": "[email protected]",
"pass": "1234567890"
}
}
},
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Una vez terminado, reinicia la aplicación Ghost para que los cambios surtan efecto.
$ ghost restart
Para configurar la configuración del boletín, visita la sección Configuración >> Boletín de correo electrónico.

Haz clic en el enlace Configuración de Mailgun para expandir.
Completa tu Región de Mailgun, dominio y clave API.

Haz clic en el botón Guardar en la parte superior derecha para guardar la configuración.
Para probar la entrega del boletín, abre cualquier publicación, abre su configuración y haz clic en la opción Boletín de correo electrónico. A continuación, envía un correo electrónico de prueba para verificar si funciona. Si no obtienes errores, significa que la entrega de tu boletín está funcionando.
Paso 12 - Actualizar Ghost
Hay dos tipos de actualizaciones de Ghost: actualizaciones menores y actualizaciones mayores.
Primero, haz una copia de seguridad completa si deseas realizar una actualización menor.
$ cd /var/www/html/ghost
$ ghost backup
Ejecuta el comando de actualización para realizar la actualización menor.
$ ghost update
Para realizar una actualización mayor, debes seguir la guía de actualización detallada oficial en Ghost. Dependiendo de qué versión estés actualmente y a qué versión mayor deseas actualizar, los pasos variarán.
Conclusión
Esto concluye nuestro tutorial sobre cómo configurar Ghost CMS en tu servidor Rocky Linux 9 usando Nginx. Si tienes alguna pregunta o comentario, compártelos en los comentarios a continuación.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.