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.
Por Simon Vasconcelos Lee
Publicado el 9 de noviembre de 202613 minutos de lectura
content, y actualice con ghost update o docker compose pull: el proyecto publica actualizaciones cada semana.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.
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.
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.
| Punto | Ghost-CLI | Docker Compose (preview) |
|---|---|---|
| Sistema | Ubuntu 22.04, 24.04 o 26.04 | Un servidor Linux con Docker 20.10.13 o más reciente |
| Memoria | Al menos 1 GB | El proyecto cita como ejemplo un servidor de 2 GB y 1 procesador |
| Servidor web y HTTPS | Nginx y un certificado Let’s Encrypt, instalados por Ghost-CLI | Caddy, en un contenedor, que se ocupa de TLS |
| Base de datos | MySQL 8.0 u 8.4 instalado en el servidor | MySQL en un contenedor |
| Analítica web | No compatible | Disponible, con una cuenta de Tinybird |
| Red social (ActivityPub) | El servicio alojado por el proyecto, gratuito dentro de sus límites de uso | El mismo servicio por defecto, o el suyo, autoalojado |
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.
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:
adduser <user>
usermod -aG sudo <user>
su - <user>
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:
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:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<your-new-root-password>';
FLUSH PRIVILEGES;
exit
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:
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
Ghost se instala en su propia carpeta, con un propietario y unos permisos concretos. Sustituya sitename por el nombre que prefiera:
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:
https://.localhost para el host, root y la contraseña fijada arriba, y después el nombre de la base, que crea Ghost-CLI.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.
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:
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:
DOMAIN: el dominio del sitio, por ejemplo example.com.ADMIN_DOMAIN: un dominio separado para la administración, si lo desea.DATABASE_ROOT_PASSWORD y DATABASE_PASSWORD: dos contraseñas generadas con openssl rand -hex 32. Se fijan de una vez por todas: con la base ya inicializada, cambiarlas rompe la conexión.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:
docker compose pull
docker compose up -d
HTTP_PORT y HTTPS_PORT si Ghost pasa detrás de otro proxy inverso. MySQL se queda en la red interna de los contenedores.data/ghost y la base en data/mysql, dos ubicaciones configurables en .env.-f compose.yml -f compose.ipv6.yml a sus comandos docker compose up.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»:
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:
COMPOSE_PROFILES=analytics,activitypub
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.
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.
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:
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:
"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 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.
ghost config database.client, en la carpeta del sitio, indica la base de datos empleada.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ío | Ejemplos | Lo que lo sostiene |
|---|---|---|
| Transaccional | Invitaciones 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 nuevo | La configuración mail de Ghost, en SMTP |
| Newsletters | Los artículos enviados a sus miembros | La API de Mailgun, cuyas claves se introducen en los ajustes «Email newsletter» |
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.
"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"
}
}
}
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>"
docker compose up -d --force-recreate ghost
secure y requireTLS: Ghost envía mediante Nodemailer, cuya documentación pide secure en false en el puerto 587, pasando la conexión después a STARTTLS. requireTLS rechaza el envío si ese paso falla. El archivo de ejemplo del repositorio indica el puerto 465 y secure=true: sustituya esas dos líneas.from lleva una dirección real y leída, lo que mejora la entregabilidad según el proyecto, y los registros SPF, DKIM y DMARC del dominio de envío completan el ajuste.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.
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étodo | Lo que contiene | Para qué uso |
|---|---|---|
ghost backup (Ghost-CLI) | Un zip: contenidos en JSON, miembros en CSV, temas, imágenes, archivos y medios, rutas y redirecciones | La precaución antes de una actualización |
| Exportación desde la administración | Un 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 medios | El traslado del contenido a otro sitio |
Base y carpeta content | La totalidad de los datos | La 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:
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.
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
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
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.
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.
ghost check-update
ghost backup
ghost update
ghost update --rollback vuelve a la versión anterior si una actualización sale mal.content se queda en su sitio durante las actualizaciones.ghost update [version] --force con su versión actual, porque sus dependencias binarias están compiladas para una versión concreta de Node.js.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.
La documentación da varios ajustes para un servidor en producción:
mysql_secure_installation tras una instalación correcta con Ghost-CLI.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.
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.
| Tema | Nuestros equipos | Usted |
|---|---|---|
| El servidor | Actualizaciones del sistema y de seguridad, con intervenciones en el servidor incluidas | El momento que mejor convenga a su actividad |
| La supervisión | Servidor vigilado las 24 horas del día, los 7 días de la semana, con intervención sin esperar su llamada | Sus contenidos, sus miembros y sus suscripciones |
| Ghost | Seguimiento proactivo: errores, lentitud y espacio en disco detectados, corrección recomendada | Su 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 seguridad | Cada noche, cifradas y guardadas fuera de la máquina; restauración incluida | La petición de restauración, cuando la necesite |
| La migración | Su servidor actual migrado, gratis | El 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.
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.
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.
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.
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.
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.
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.
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.
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 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.
Simafri
Hablemos de su proyecto
Díganos en pocas palabras lo que necesita: le respondemos rápidamente.
¡Gracias! Su solicitud ha sido enviada. Le responderemos en breve.
¿Prefiere el correo? Escríbanos a support@simafri.com.