Alojar Ghost® en un VPS administrado: su publicación, en su servidor

Alojar Ghost en un VPS administrado significa publicar sus artículos, reunir a sus miembros y enviar sus newsletters desde una máquina propia, que nuestros equipos mantienen actualizada y supervisan día y noche. Ghost es software libre con licencia MIT. Esta guía sigue su documentación oficial: Ghost-CLI o Docker Compose, MySQL, HTTPS, los correos, las copias de seguridad y las actualizaciones.

Simon Vasconcelos Lee Por Publicado el 9 de noviembre de 202613 minutos de lectura

Todas las guías

Lo esencial

  1. La licencia MIT de Ghost permite usarlo libremente en una empresa, conservando su aviso de licencia. El nombre y el logotipo dependen aparte de la política de marca de Ghost Foundation.
  2. El proyecto recomienda Ghost-CLI en Ubuntu, con Nginx, Node.js 22, MySQL 8 y al menos 1 GB de memoria. Su método Docker Compose, en «preview», añade la analítica web y ActivityPub autoalojado.
  3. MySQL 8 es la única base de datos admitida en producción.
  4. Prevea dos circuitos de correo: un relé SMTP para los correos transaccionales, indispensable, y Mailgun para las newsletters, el único servicio de envío masivo admitido.
  5. Haga copia de la base y de la carpeta content, y actualice con ghost update o docker compose pull: el proyecto publica actualizaciones cada semana.

Qué hace Ghost

Ghost es una plataforma de publicación profesional y libre, escrita para Node.js. Reúne en un solo lugar lo que una publicación independiente suele montar a partir de varias herramientas.

Según la documentación, el producto tiene las mismas funciones en autoalojamiento. Lo que lo rodea corre de su cuenta: el envío de las newsletters, la analítica web, una CDN y las copias de seguridad completas del sitio.

La licencia MIT y la marca

Ghost se publica bajo la licencia MIT. Autoriza a usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y vender el software, con una condición: conservar el aviso de copyright y el texto de la licencia en toda copia. Puede, por tanto, ejecutar Ghost en su empresa, adaptarlo y publicar en él para sus clientes, sin ninguna licencia que comprar.

La licencia cubre el código. El nombre y el logotipo pertenecen a Ghost Foundation y dependen de su política de marca: léala si construye una oferta en torno al software. Ghost es una marca registrada de Ghost Foundation.

This publication is independent of and not affiliated with, authorized, sponsored, or approved by Ghost Foundation. En español: esta publicación es independiente de Ghost Foundation y no está afiliada a ella, ni autorizada, patrocinada o aprobada por ella.

Ghost-CLI o Docker Compose: dos métodos oficiales

El proyecto documenta dos caminos para la producción. Ghost-CLI es la instalación que recomienda oficialmente, y Docker Compose es una «preview», que describe como muy reciente. Indica también que avanza hacia ese conjunto de herramientas Docker en lugar de hacer evolucionar Ghost-CLI, y proporciona un asistente para pasar de uno a otro.

PuntoGhost-CLIDocker Compose (preview)
SistemaUbuntu 22.04, 24.04 o 26.04Un servidor Linux con Docker 20.10.13 o más reciente
MemoriaAl menos 1 GBEl proyecto cita como ejemplo un servidor de 2 GB y 1 procesador
Servidor web y HTTPSNginx y un certificado Let’s Encrypt, instalados por Ghost-CLICaddy, en un contenedor, que se ocupa de TLS
Base de datosMySQL 8.0 u 8.4 instalado en el servidorMySQL en un contenedor
Analítica webNo compatibleDisponible, con una cuenta de Tinybird
Red social (ActivityPub)El servicio alojado por el proyecto, gratuito dentro de sus límites de usoEl mismo servicio por defecto, o el suyo, autoalojado

Antes de empezar: el dominio y el servidor

Haga que el dominio apunte al servidor antes de la instalación: el certificado se instala durante la puesta en marcha. En un VPS de Simafri, los visitantes llegan por los puertos 80 y 443, bajo el nombre de dominio del servidor, con registros A y AAAA. La dirección del sitio se escribe completa, con su protocolo, como https://example.com: una dirección IP provoca errores.

Más allá de la memoria indicada arriba, el proyecto no cifra ni el disco ni la carga: el tamaño depende de su tráfico, de sus imágenes y de sus medios. En un VPS administrado, descríbanos su publicación y le recomendamos el tamaño adecuado.

Instalar Ghost con Ghost-CLI en Ubuntu

Ghost-CLI se usa con un usuario que no sea root, y cuyo nombre no sea ghost, porque ese nombre entra en conflicto con la herramienta. Cree el usuario desde la cuenta root, sustituyendo user por el nombre elegido:

Terminal, como root
adduser <user>
usermod -aG sudo <user>
su - <user>

Nginx y MySQL

Actualice el sistema e instale Nginx (1.9.5 como mínimo para SSL) y MySQL. La línea ufw abre HTTP y HTTPS si ese cortafuegos está activo:

Terminal
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx
sudo ufw allow 'Nginx Full'
sudo apt-get install mysql-server

En las versiones recientes de Ubuntu, la cuenta root de MySQL se autentica por socket, algo que Ghost no admite. Dele una contraseña:

Terminal, y después consola de MySQL
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<your-new-root-password>';
FLUSH PRIVILEGES;
exit

Node.js y Ghost-CLI

Ghost requiere Node.js 22: las versiones 20, 21, 23 y posteriores no están admitidas. El proyecto pide instalarlo para todo el sistema, de esta forma:

Terminal
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=22
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt-get update
sudo apt-get install nodejs -y
sudo npm install ghost-cli@latest -g

Lanzar la instalación

Ghost se instala en su propia carpeta, con un propietario y unos permisos concretos. Sustituya sitename por el nombre que prefiera:

Terminal
sudo mkdir -p /var/www/sitename
sudo chown <user>:<user> /var/www/sitename
sudo chmod 775 /var/www/sitename
cd /var/www/sitename
ghost install

El comando hace entonces sus preguntas, y el proyecto recomienda responder que sí a cada paso propuesto:

El sitio responde entonces, y https://example.com/ghost le invita a crear la cuenta del propietario. Si la instalación se interrumpe, ghost setup retoma la configuración; si falla, ghost uninstall limpia mejor que borrar la carpeta. ghost doctor comprueba el sistema en cualquier momento.

Instalar Ghost con Docker Compose (preview)

El proyecto presenta este método como una «preview»: a sus ojos es muy reciente. Es el que permite autoalojar la analítica web y ActivityPub.

En un servidor con Docker instalado, descargue las herramientas oficiales en /opt/ghost y copie sus dos archivos de ejemplo:

Terminal
git clone https://github.com/TryGhost/ghost-docker.git /opt/ghost && cd /opt/ghost
cp .env.example .env
cp caddy/Caddyfile.example caddy/Caddyfile

En el archivo .env, indique estos valores:

En caddy/Caddyfile, descomente el bloque que corresponda a su caso: redirección de www al dominio sin prefijo, o a la inversa, o dominio de administración separado. Lance después Ghost y termine la puesta en marcha en /ghost:

Terminal
docker compose pull
docker compose up -d

La analítica web y ActivityPub

La analítica requiere una cuenta de Tinybird, servicio externo. Desde /opt/ghost, inicie sesión, despliegue su configuración y recupere los tokens que hay que pegar en .env, sección «Tinybird configuration»:

Terminal
docker compose run --rm tinybird-login
docker compose run --rm tinybird-sync
docker compose run --rm tinybird-deploy
docker compose run --rm tinybird-login get-tokens

ActivityPub funciona desde el principio con el servicio alojado por el proyecto, gratuito dentro de unos límites de uso que publica su documentación. Para autoalojar el suyo, descomente ACTIVITYPUB_TARGET=activitypub:8080. Active después en .env el perfil o los perfiles deseados y reinicie los contenedores:

.env
COMPOSE_PROFILES=analytics,activitypub
Terminal
docker compose pull
docker compose up -d

Para ActivityPub, el proyecto pide recrear también Ghost y Caddy, con docker compose up -d --force-recreate ghost caddy.

Pasar de Ghost-CLI a Docker Compose

Tras la clonación y la configuración, bash scripts/migrate.sh copia la carpeta content, importa la base en el contenedor MySQL y arranca Caddy en lugar de Nginx. Propone detener Nginx, lo que deja el sitio fuera de línea: responda que no si hay otros sitios en el servidor. No elimina ningún dato. bash recovery_instructions.sh restablece el sitio original si interrumpe la migración.

HTTPS y dominio de administración

La administración de Ghost debe pasar por HTTPS, y el proyecto recomienda HTTPS para todo el sitio: sin él, identificadores y contraseñas circulan en claro. Con Docker Compose, Caddy se ocupa de ello. Con Ghost-CLI, la instalación instala el certificado, y un comando lo hace a posteriori:

Terminal, en la carpeta del sitio
ghost setup ssl

Para cambiar la dirección de un sitio instalado con Ghost-CLI, ghost config url https://example.com actualiza la configuración, y ghost restart la aplica.

El proyecto aconseja también un dominio de administración separado, que reduce la superficie de ataque. La ruta sigue siendo /ghost/. En Ghost-CLI, se declara en config.production.json:

config.production.json
"admin": {
  "url": "https://admin.example.com"
}

En Docker Compose, indique ADMIN_DOMAIN, descomente su bloque en el Caddyfile y ejecute docker compose up -d --force-recreate ghost caddy. Este dominio necesita también sus registros A y AAAA.

MySQL 8, la base de datos de producción

MySQL 8 es la única base de datos que el proyecto admite en producción. Ghost-CLI se instala con MySQL 8.0 u 8.4, y el archivo Compose proporciona una imagen MySQL 8.0.

Los correos y las newsletters

Ghost distingue dos envíos, que no siguen el mismo camino. Es el punto más importante que hay que ajustar tras la instalación.

EnvíoEjemplosLo que lo sostiene
TransaccionalInvitaciones del equipo, contraseñas olvidadas, registros y enlaces de inicio de sesión de los miembros, código de inicio de sesión desde un dispositivo nuevoLa configuración mail de Ghost, en SMTP
NewslettersLos artículos enviados a sus miembrosLa API de Mailgun, cuyas claves se introducen en los ajustes «Email newsletter»

El relé SMTP, para los correos transaccionales

La documentación clasifica esta configuración como obligatoria en producción. Ghost envía también un código por correo cuando detecta un inicio de sesión desde un dispositivo nuevo: ajuste este relé antes de invitar a su equipo.

En un VPS de Simafri, el envío pasa por un relé SMTP autenticado, en el puerto 587: la dirección de una cuenta de correo que ya tenga, o Simafri Suite.

config.production.json (Ghost-CLI), y después ghost restart
"mail": {
  "transport": "SMTP",
  "from": "'Acme Support' <support@example.com>",
  "options": {
    "host": "smtp.example.com",
    "port": 587,
    "secure": false,
    "requireTLS": true,
    "auth": {
      "user": "support@example.com",
      "pass": "1234567890"
    }
  }
}
.env (Docker Compose), sección SMTP Email
mail__transport=SMTP
mail__options__host=smtp.example.com
mail__options__port=587
mail__options__secure=false
mail__options__requireTLS=true
mail__options__auth__user=support@example.com
mail__options__auth__pass=1234567890
mail__from="'Acme Support' <support@example.com>"
Terminal, tras un cambio del archivo .env
docker compose up -d --force-recreate ghost

Mailgun, para las newsletters

El relé SMTP no cubre las newsletters. Según la documentación, el envío masivo no se hace por SMTP y Mailgun es, a día de hoy, el único servicio de envío masivo que Ghost admite. Usted crea su cuenta de Mailgun e introduce sus claves de API en los ajustes de Ghost.

Si no envía sus artículos por correo, no necesita ninguna cuenta de Mailgun: esos ajustes se ignoran. Si prefiere otra herramienta de newsletter, el proyecto propone sincronizar sus miembros con ella, por ejemplo con Zapier o con sus guías de integración.

Copia de seguridad y restauración de Ghost

Ghost ofrece tres niveles de copia, y no contienen lo mismo. Para reconstruir un sitio idéntico, el proyecto pide hacer copia directamente de la base y de la carpeta content.

MétodoLo que contienePara qué uso
ghost backup (Ghost-CLI)Un zip: contenidos en JSON, miembros en CSV, temas, imágenes, archivos y medios, rutas y redireccionesLa precaución antes de una actualización
Exportación desde la administraciónUn zip: contenidos y ajustes, miembros, estadísticas de los artículos, temas, rutas y redirecciones, a elegir. Ni comentarios, ni historial de actividad de los miembros, ni mediosEl traslado del contenido a otro sitio
Base y carpeta contentLa totalidad de los datosLa recuperación tras un desastre, o una copia exacta

La exportación se encuentra en «Settings», «Advanced», «Import/Export», pestaña «Export», botón «All data». Para la copia completa, con Ghost-CLI, la cuenta de MySQL y el nombre de la base que hay que indicar están en config.production.json:

Terminal, Ghost-CLI
mkdir -p ~/ghost-backups
mysqldump -u ghost_user -p ghost_production > ~/ghost-backups/ghost_backup.sql
cd /var/www/sitename
tar czf ~/ghost-backups/ghost_content_backup.tar.gz content/

Con Docker Compose, las herramientas oficiales guardan el contenido en data/ghost. El volcado adopta la forma que da la imagen MySQL, y la contraseña root ya está en el contenedor. Conserve también una copia de .env y del Caddyfile.

Terminal, Docker Compose
cd /opt/ghost
mkdir -p ~/ghost-backups
docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" ghost' > ~/ghost-backups/ghost_backup.sql
tar czf ~/ghost-backups/ghost_content_backup.tar.gz data/ghost

Restaurar

Terminal, Ghost-CLI
cd /var/www/sitename
ghost stop
mysql -u ghost_user -p ghost_production < ~/ghost-backups/ghost_backup.sql
tar xzf ~/ghost-backups/ghost_content_backup.tar.gz
sudo chown -R ghost:ghost content
ghost restart
Terminal, Docker Compose
cd /opt/ghost
docker compose stop ghost
docker compose exec -T db sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" ghost' < ~/ghost-backups/ghost_backup.sql
tar xzf ~/ghost-backups/ghost_content_backup.tar.gz
docker compose start ghost

Copie esos archivos fuera del servidor, con rsync o scp, y haga una prueba de restauración en una máquina de pruebas. Si parte de una exportación con miembros de pago, conecte la misma cuenta de Stripe antes de importar a sus miembros.

Actualizar Ghost

El proyecto publica actualizaciones cada semana y recuerda que un servidor web público debe mantenerse al día. Lea las notas de la versión y ejecute después el comando de su método.

Con Ghost-CLI

Terminal, en la carpeta del sitio
ghost check-update
ghost backup
ghost update

Con Docker Compose

Terminal
cd /opt/ghost
git pull
docker compose pull
docker compose up -d
docker image prune

La última línea, opcional, elimina las imágenes antiguas. Deje GHOST_VERSION comentado en .env: fijar una versión bloquea estos comandos de actualización.

Reforzar su instancia y hacerla crecer

La documentación da varios ajustes para un servidor en producción:

Para la carga, el proyecto coloca una CDN y una capa de caché delante de Ghost. Precisa que el clustering y el sharding no están admitidos: una sola instancia sirve el sitio, y la caché absorbe el tráfico.

Quién hace qué en un VPS administrado

El autoalojamiento exige mantener el servidor además de la aplicación. En un VPS administrado, nuestros equipos se encargan del servidor y siguen su instancia de forma proactiva; Ghost sigue siendo su software, con sus ajustes y sus datos.

TemaNuestros equiposUsted
El servidorActualizaciones del sistema y de seguridad, con intervenciones en el servidor incluidasEl momento que mejor convenga a su actividad
La supervisiónServidor vigilado las 24 horas del día, los 7 días de la semana, con intervención sin esperar su llamadaSus contenidos, sus miembros y sus suscripciones
GhostSeguimiento proactivo: errores, lentitud y espacio en disco detectados, corrección recomendadaSu instalación, sus actualizaciones, sus ajustes, su relé SMTP y su cuenta de Mailgun, que aplica usted o su asistente de IA
Las copias de seguridadCada noche, cifradas y guardadas fuera de la máquina; restauración incluidaLa petición de restauración, cuando la necesite
La migraciónSu servidor actual migrado, gratisEl momento del cambio

Si prefiere que nuestros equipos intervengan en la propia aplicación, ese servicio se factura por horas o a precio cerrado, con un presupuesto comunicado antes de la intervención.

Un servidor cuidado por nosotros para su sitio con Ghost

Con un VPS administrado de Simafri, nuestros equipos mantienen actualizado el servidor de su instancia de Ghost, lo vigilan día y noche e intervienen sin esperar su llamada; también siguen su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted o su asistente de IA. Las copias de seguridad se cifran cada noche y se guardan fuera de la máquina, su restauración está incluida, y la migración de su servidor actual es gratuita.

Descubrir los VPS administrados

Preguntas frecuentes

¿Ghost es gratuito en autoalojamiento?

Sí. Ghost tiene licencia MIT: puede usarlo en su empresa y adaptarlo, conservando su aviso de licencia. Quedan los servicios que lo rodean: el servidor, el relé de correo, Mailgun si envía newsletters, Tinybird si quiere su analítica.

¿Qué configuración hace falta para alojar Ghost?

El proyecto recomienda Ubuntu 22.04, 24.04 o 26.04, Nginx, Node.js 22, MySQL 8.0 u 8.4, systemd, al menos 1 GB de memoria, un dominio y un usuario que no sea root. Para Docker Compose, cita como ejemplo un servidor de 2 GB y 1 procesador.

¿Hay que instalar Ghost con Ghost-CLI o con Docker?

Ghost-CLI es la instalación que el proyecto recomienda para la producción. Docker Compose es una preview, la única que permite la analítica web y ActivityPub autoalojado, y el proyecto dice que avanza hacia esas herramientas. Un asistente permite pasar de Ghost-CLI a Docker Compose.

¿Ghost funciona con SQLite, MariaDB o PostgreSQL?

En producción, MySQL 8 es la única base de datos admitida. El proyecto recomienda una reinstalación en MySQL 8 desde SQLite, y una migración a MySQL 8 desde MariaDB. Su documentación no contempla PostgreSQL.

¿Se pueden enviar las newsletters de Ghost por SMTP?

No. El SMTP sirve para los correos transaccionales: invitaciones, contraseñas, enlaces de inicio de sesión de los miembros. Las newsletters requieren la API de Mailgun, el único servicio de envío masivo admitido. Si no envía artículos por correo, no hace falta ninguna cuenta de Mailgun.

¿Cómo hacer copia de seguridad de un sitio Ghost autoalojado?

Para una recuperación completa, haga copia de la base MySQL con mysqldump y de la carpeta content con tar. El comando ghost backup produce un zip antes de una actualización. La exportación de la administración deja fuera los comentarios, el historial de actividad de los miembros y los medios.

¿Cómo actualizar Ghost?

Con Ghost-CLI, ejecute ghost backup y después ghost update en la carpeta del sitio, y ghost update --rollback en caso de problema. Con Docker Compose, ejecute git pull, docker compose pull y docker compose up -d en /opt/ghost.

¿Un VPS administrado cubre Ghost?

Un VPS administrado cubre el servidor: sistema, seguridad, supervisión y copias de seguridad. Nuestros equipos siguen también su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted. Una intervención en la aplicación se factura por horas o a precio cerrado.

Contáctenos