Ghost frente a WordPress: cuándo elegir cada uno
Ghost gana cuando el sitio es un blog, una publicación o un negocio de suscripciones; WordPress gana cuando necesitas funciones que solo existen como plugin. Los dos alojan contenido, pero resuelven problemas distintos.
| Criterio | Ghost | WordPress |
|---|---|---|
| Lenguaje | Node.js | PHP |
| Base de datos | MySQL 8.0 / 8.4 | MySQL o MariaDB |
| Newsletter y membresías | Integradas | Plugin de terceros |
| Ecosistema de extensiones | Limitado | Enorme |
| Superficie de ataque | Pequeña, sin plugins | Amplia, depende de plugins |
| Comercio electrónico | Suscripciones con Stripe | WooCommerce y similares |
| RAM mínima realista | 1-2 GB | 1-2 GB |
| Mantenimiento típico | Actualizar Ghost y Node | Actualizar núcleo, temas y plugins |
Si tu proyecto es una tienda, un directorio o un sitio corporativo con formularios complejos, WordPress sigue siendo la respuesta correcta y tenemos una guía completa de WordPress en VPS. Si es una publicación con boletín y suscriptores de pago, Ghost te ahorra media docena de plugins.
Requisitos oficiales
La documentación de Ghost exige Ubuntu 22.04, 24.04 o 26.04, un mínimo de 1 GB de RAM, NGINX 1.9.5 o superior, MySQL 8.0 u 8.4 y una versión LTS soportada de Node.js. También necesitas un dominio con registro A apuntando al VPS antes de empezar, porque el instalador solicita el certificado durante el proceso.
Un GB funciona, pero es ajustado: MySQL 8 reserva memoria con generosidad y el proceso de Node suma lo suyo. Con 2 GB el sitio respira, y si vas a publicar imágenes pesadas o servir mucho tráfico, 4 GB evita sorpresas. La guía de cuánta RAM necesita un VPS explica cómo sumar servicios.
Verifica el punto de partida:
lsb_release -a
free -h
df -h /
dig +short blog.ejemplo.com A Preparar el servidor y crear el usuario correcto
Ghost-CLI se niega a instalar como root, y el usuario que crees no puede llamarse ghost porque ese nombre lo reserva el propio instalador. Es el error que más veces detiene una instalación en el primer intento.
sudo apt update && sudo apt upgrade -y
sudo adduser editor
sudo usermod -aG sudo editor
su - editor Instala Nginx y abre el firewall:
sudo apt install -y nginx
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable Instala MySQL 8 y define una contraseña para el usuario root de la base:
sudo apt install -y mysql-server
sudo mysql Dentro del cliente:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'CLAVE_LARGA_AQUI';
FLUSH PRIVILEGES;
exit Guarda esa contraseña: el instalador de Ghost la pedirá para crear su propia base de datos y su propio usuario. Si tu servidor todavía no está endurecido, aplica antes lo de asegurar un VPS Ubuntu.
Instala Node.js desde el repositorio oficial de NodeSource, en la versión LTS que la documentación de Ghost indique para tu versión (Ghost 6 usa Node 22 LTS):
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node -v Instalar Ghost con Ghost-CLI
Ghost-CLI es la herramienta oficial: instala, configura Nginx, solicita el certificado y crea el servicio systemd en un solo comando interactivo.
sudo npm install ghost-cli@latest -g
sudo mkdir -p /var/www/ghost
sudo chown editor:editor /var/www/ghost
sudo chmod 775 /var/www/ghost
cd /var/www/ghost
ghost install El instalador pregunta, en este orden:
- 1 URL del blog: escríbela con
https://, por ejemplohttps://blog.ejemplo.com. Cambiarla después obliga a reconfigurar Nginx y el certificado. - 2 Usuario y contraseña de MySQL: los que acabas de definir.
- 3 Nombre de la base de datos: acepta el sugerido salvo que alojes varios Ghost.
- 4 Configurar Nginx: sí.
- 5 Configurar SSL: sí. Pedirá un correo para Let's Encrypt.
- 6 Configurar systemd: sí, para que Ghost arranque solo tras un reinicio.
- 7 Iniciar Ghost: sí.
Al terminar, abre https://blog.ejemplo.com/ghost/ y crea la cuenta de propietario de inmediato. Esa pantalla queda abierta hasta que alguien la reclame; si tardas, otro puede hacerlo por ti.
Comprueba el estado:
ghost status
ghost ls
sudo systemctl status nginx --no-pager Configurar el correo: dos sistemas distintos
Ghost usa dos canales de correo diferentes, y confundirlos es la causa habitual de "los suscriptores no reciben el boletín".
El correo transaccional cubre enlaces de acceso, restablecimiento de contraseña e invitaciones de personal. Acepta cualquier servidor SMTP. Se configura en /var/www/ghost/config.production.json:
"mail": {
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.ejemplo.com",
"port": 587,
"secure": false,
"auth": {
"user": "[email protected]",
"pass": "CLAVE_SMTP"
}
},
"from": "'Blog Ejemplo' <[email protected]>"
} ghost restart El envío masivo de newsletters es otra historia: Ghost solo soporta la API de Mailgun. No es una limitación arbitraria. Mandar mil correos desde el SMTP de un VPS nuevo lleva la IP a listas negras en horas. Si vas a usar la función de boletín, necesitas cuenta de Mailgun, dominio verificado y los registros SPF, DKIM y DMARC en orden; nuestra guía sobre por qué el correo cae en spam cubre esa parte.
Si no piensas enviar boletines, ignora Mailgun por completo: el blog funciona igual.
Migrar desde WordPress
Ghost publica un plugin oficial de exportación que genera un JSON con entradas, páginas, autores y etiquetas, listo para importar desde Settings → Import. El proceso funciona bien, pero conviene saber qué no viaja.
Lo que migra: contenido de las entradas, títulos, extractos, fechas, autores, etiquetas y URLs originales.
Lo que no migra automáticamente: comentarios (Ghost usa su propio sistema, ligado a miembros), plugins y sus datos, formularios, campos personalizados y el diseño del tema.
Las imágenes merecen atención aparte. Según el flujo que uses, el JSON puede conservar las URLs apuntando al servidor de WordPress antiguo. Descárgalas y súbelas a Ghost antes de apagar el sitio original; un blog cuyas imágenes viven en un dominio que ya no pagas se rompe entero de golpe.
Antes de cambiar el DNS, mapea las URLs. Si WordPress usaba /2024/05/titulo/ y Ghost usará /titulo/, define redirecciones 301 en el archivo de redirecciones de Ghost (Settings → Labs → Redirects) o directamente en Nginx. Sin eso pierdes el posicionamiento acumulado.
Backups: tres piezas, no una
La exportación JSON del panel guarda el contenido pero no las imágenes ni la configuración: por sí sola no reconstruye el sitio. Un respaldo completo necesita tres cosas.
# 1. Base de datos
mysqldump -u root -p ghost_prod | gzip > ~/ghost-db-$(date +%F).sql.gz
# 2. Carpeta de contenido: imágenes, temas, ajustes
tar czf ~/ghost-content-$(date +%F).tar.gz -C /var/www/ghost content
# 3. Configuración
cp /var/www/ghost/config.production.json ~/ghost-config-$(date +%F).json Envía los tres archivos fuera del VPS y prueba la restauración en otro servidor al menos una vez. La guía de backups en VPS sirve para automatizar el traslado con cron.
Una copia que nunca se restauró es una hipótesis, no un respaldo.
Actualizar y mantener
Ghost-CLI gestiona las actualizaciones, pero cada versión mayor puede exigir una versión distinta de Node. Respalda antes de tocar nada:
cd /var/www/ghost
ghost backup # si tu versión de Ghost-CLI lo incluye
ghost update
ghost status Si ghost update falla a mitad, ghost update --rollback vuelve a la versión anterior mientras la base lo permita. Por eso el volcado de MySQL se hace antes, no después.
Vigila tres cosas de forma rutinaria:
- Disco: las imágenes en
content/images/crecen sin avisar.du -sh /var/www/ghost/content. - Memoria: si el proceso muere sin explicación, revisa
dmesg | grep -i oomy considera swap. - Certificado:
ghostlo renueva vía Let's Encrypt, pero comprueba consudo certbot renew --dry-run.
Problemas frecuentes al instalar Ghost
| Síntoma | Causa | Solución |
|---|---|---|
ghost install se detiene | Ejecutado como root | Crear usuario con sudo y repetir |
| Error al crear el usuario | El usuario se llama ghost | Usar otro nombre de cuenta |
| Falla la conexión a MySQL | Plugin de autenticación o clave incorrecta | Revisar ALTER USER y volver a probar |
| SSL no se emite | DNS sin propagar o puerto 80 cerrado | dig +short y ufw status |
| 502 Bad Gateway | Ghost detenido tras un fallo | ghost status y ghost log |
| El boletín no llega | Mailgun sin configurar | Configurar la API de Mailgun, no SMTP |
| Imágenes rotas tras migrar | URLs apuntando al sitio antiguo | Reimportar medios y reescribir rutas |
Un 502 en Ghost casi siempre significa que Node no está escuchando; nuestra guía del error 502 Bad Gateway en Nginx detalla el diagnóstico.
Ghost en un VPS propio es una instalación limpia si respetas tres reglas: no instalar como root, no llamar ghost al usuario del sistema y tener el DNS resuelto antes de lanzar el instalador. Después, la operación se reduce a respaldar las tres piezas (base, content/ y configuración), decidir si necesitas Mailgun para boletines y actualizar con ghost update tras un volcado previo. A cambio, obtienes un CMS rápido, sin plugins que parchear cada semana y sin suscripción mensual a la nube de Ghost.
Terranode ofrece VPS KVM con NVMe en Ecuador desde $2,99 al mes; el plan de 4 GB de RAM y 40 GB de disco por $9 es el punto cómodo para auto-alojar Ghost con MySQL 8 en el mismo servidor.
Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.