Por qué autoalojar Ghost en un VPS
Ghost combina lo que WordPress hace de forma laboriosa y lo que Substack cobra caro: un editor depurado, un rendimiento nativo excelente (Node.js), una gestión de miembros y de suscripciones de pago integrada mediante Stripe, y el envío de newsletters sin plugin. Pero Ghost(Pro) factura en función de la audiencia, y las plataformas de newsletter se llevan una comisión sobre sus ingresos.
Al alojarlo en su VPS, conserva el 100 % de sus suscriptores de pago (sin contar las comisiones de Stripe), personaliza el tema sin restricciones y controla su lista de correos: su activo más valioso. Con Ghost v6, los creadores que monetizan sus newsletters se benefician además de la recaudación automática del IVA mediante Stripe Tax, sin ninguna dependencia de un servicio de terceros.
Las ventajas de un Ghost autoalojado
- Ninguna comisión de plataforma sobre sus suscripciones de pago (salvo Stripe)
- Rendimiento nativo: el tiempo de carga se mide desde la conexión del lector — depende del operador, de la hora y de la ruta seguida
- Newsletters y miembros integrados, sin acumular plugins
- Personalización total del tema Handlebars y acceso completo a la API
- Control de su lista de suscriptores y de sus datos
- Coste fijo del VPS sea cual sea el número de lectores
- Ghost v6: recaudación de IVA/impuestos integrada mediante Stripe Tax para los creadores monetizados
Requisitos realistas
Ghost v6 funciona con Node.js 20 LTS como mínimo (Node 22 recomendado para el rendimiento). Prevea un VPS con al menos 1 vCPU y 2 GB de RAM para un blog con un tráfico holgado; suba a 4 GB si su audiencia crece rápido o si activa newsletters voluminosas. Para un uso en producción, reserve 20 GB de disco como mínimo para los medios y la base de datos.
La base de datos recomendada en producción es MySQL 8 (SQLite solo se admite en desarrollo — véase la sección de solución de problemas). También necesita un servicio SMTP transaccional (Mailgun, Postmark, Brevo) para el envío fiable de las newsletters y de los correos de autenticación de los miembros, un dominio blog.votredomaine.com apuntado a la IP de su VPS, y Caddy o Nginx para el reverse proxy HTTPS. Caddy es preferible: provisiona y renueva los certificados Let's Encrypt sin configuración adicional.
Instalación mediante Ghost CLI (método recomendado)
Preparar el servidor
En Debian/Ubuntu, instale Node.js 20, MySQL 8, Nginx (requerido por Ghost CLI para su comprobación de compatibilidad) y Caddy. Cree un usuario dedicado (no root):
add user --disabled-login ghost-user su - ghost-userInstalar Ghost CLI
npm install ghost-cli@latest -gGhost CLI gestiona la instalación, las migraciones de base de datos, las actualizaciones y los reinicios del gestor de procesos PM2.
Crear el directorio y lanzar la instalación
mkdir -p /var/www/ghost cd /var/www/ghost ghost installEl asistente le pide la URL del blog (p. ej.
https://blog.votredomaine.com), las credenciales de MySQL, el servicio SMTP y si desea configurar Nginx. Responda no a la configuración de Nginx si utiliza Caddy: la configurará en el paso siguiente.Configurar el reverse proxy TLS con Caddy
Cree o edite su
Caddyfile:blog.votredomaine.com { reverse_proxy localhost:2368 encode gzip header /ghost/* Cache-Control "no-store" header /members/* Cache-Control "no-store" }Caddy obtiene y renueva el certificado Let's Encrypt automáticamente. Ghost escucha en local en el puerto 2368; solo Caddy queda expuesto en los puertos 80 y 443.
Asegurar el primer acceso
Abra
/ghostinmediatamente después de la instalación: Ghost muestra su asistente de creación de cuenta (nombre, correo electrónico, contraseña). Complételo sin demora — mientras el asistente no esté finalizado, cualquiera que llegue a esa URL puede convertirse en propietario del blog.Conectar su servicio SMTP
En Configuración → Email, compruebe que las credenciales SMTP son correctas y envíe un correo de prueba. El envío de newsletters y los correos de inicio de sesión de los miembros pasan por esta configuración: un
MAIL_FROMmal formado (sin dominio verificado) es una de las causas más frecuentes de silencios en el registro.Conectar Stripe y activar las suscripciones
En Configuración → Miembros, conecte su cuenta de Stripe para activar las suscripciones de pago. Defina sus niveles (tiers), sus precios mensuales y anuales, y después publique su primer artículo y envíe su primera newsletter.
Iniciar Caddy y comprobar el reverse proxy
Una vez escrito el Caddyfile, inicie o recargue Caddy para aplicar la configuración:
caddy run --config /etc/caddy/CaddyfileSi Caddy está gestionado como servicio systemd (que es el caso tras una instalación mediante APT), prefiera el comando de recarga sin interrupción:
systemctl reload caddyCaddy contacta de inmediato con Let's Encrypt para obtener un certificado TLS para su dominio mediante el desafío HTTP-01. En menos de 30 segundos, https://blog.votredomaine.com debe responder. Compruebe el estado del certificado:
curl -sv https://blog.votredomaine.com/ 2>&1 | grep -E 'SSL|subject|issuer'Si el comando muestra un issuer: O=Let's Encrypt, el certificado es válido. En caso de error connection refused, compruebe que Ghost funciona correctamente en el puerto 2368 con ghost status desde el directorio de instalación. Si el puerto 443 está cerrado en su firewall, ábralo antes de iniciar Caddy: ufw allow 443.
Ghost v6 y Stripe Tax: el nuevo campo tax_id_collection
Ghost v6 introduce la compatibilidad con el campo tax_id_collection de la API de Stripe. Este campo permite a Stripe Tax recopilar automáticamente el número de IVA o de identificación fiscal del comprador en el momento del pago, conforme a las normativas europeas y mundiales.
Para las instancias existentes migradas a Ghost v6, esta funcionalidad es una configuración de su lado de Stripe, no un cambio en Ghost. Dos puntos que comprobar:
1. En el Dashboard de Stripe, active Stripe Tax y configure sus reglas fiscales por país.
2. En Stripe → Checkout → Configuración, active la recopilación del número fiscal si es necesario para su mercado.
Las instancias de Ghost v5 que se actualicen a v6 sin ajustar sus parámetros de Stripe seguirán funcionando, pero las nuevas funciones de conformidad fiscal permanecerán inactivas mientras no configure Stripe Tax por su parte.
Actualizar Ghost con Ghost CLI
Ghost CLI simplifica las actualizaciones mayores y menores. Desde el directorio de instalación:
cd /var/www/ghost
ghost updatePara apuntar a una versión concreta, por ejemplo en una migración v5 → v6:
ghost update 6.x.xGhost CLI detiene el proceso PM2, aplica las migraciones de base de datos, actualiza los archivos y reinicia Ghost. Si una migración falla, Ghost CLI realiza un rollback automático y muestra el detalle del error en el terminal.
Antes de cualquier actualización mayor (v5 → v6), dos gestos preventivos son imprescindibles: haga una copia de seguridad del directorio de contenido /var/www/ghost/content (medios y temas personalizados) y exporte la base MySQL:
mysqldump -u ghost -p ghost_db > ghost_backup_$(date +%F).sqlPor último, compruebe la versión instalada tras la actualización:
ghost versionUn número de versión incorrecto tras una actualización suele indicar un problema de permisos en el directorio /var/www/ghost: compruebe que el usuario dedicado es realmente propietario de la carpeta.
Solución de problemas: los errores de arranque frecuentes
Ghost arranca pero devuelve una página en blanco o un error 500
Compruebe los logs con ghost log. La causa más frecuente es un valor url incorrecto en config.production.json: Ghost genera todos sus enlaces internos a partir de ese valor, y una URL en HTTP cuando Caddy sirve en HTTPS provoca bucles de redirección.
Error «ER_NOT_SUPPORTED_AUTH_MODE» al arrancar
Ghost v6 requiere MySQL 8 con el plugin de autenticación mysql_native_password. Si su MySQL está configurado en caching_sha2_password por defecto, modifique el usuario:
ALTER USER 'ghost'@'localhost' IDENTIFIED WITH mysql_native_password BY 'votre_mot_de_passe';
FLUSH PRIVILEGES;SQLite en producción: por qué no es una opción
Ghost acepta SQLite en modo desarrollo, pero este motor no está soportado en producción: no gestiona los accesos concurrentes, y las newsletters voluminosas o los picos de tráfico provocan bloqueos de base irreversibles. Migre a MySQL antes de poner su instancia en línea.
La subida de un tema falla en producción
Ghost limita el tamaño de las subidas de temas. Si la subida falla en silencio o devuelve un error 413, ajuste el límite del lado de Caddy:
blog.votredomaine.com {
request_body {
max_size 50MB
}
reverse_proxy localhost:2368
}MAIL_FROM mal configurado: miembros que no reciben los correos
El campo mail.from de config.production.json debe llevar una dirección cuyo dominio esté verificado en su proveedor SMTP (registros SPF y DKIM activos). Un dominio no verificado acaba en silencios en el registro o en rechazos SMTP que Ghost rara vez señala con claridad en sus logs.
Coloque Cloudflare como proxy delante de Caddy para absorber los picos de tráfico (efecto Hacker News o redes sociales): casi todo el contenido público de Ghost es estático y se cachea muy bien. Excluya /ghost/, /members/ y /api/ de la caché mediante reglas de página o una regla de caché personalizada — esas rutas deben llegar siempre a Ghost directamente para que la autenticación de los miembros y el admin funcionen correctamente.
Copias de seguridad automáticas
El contenido dinámico de Ghost (medios, temas personalizados) vive en /var/www/ghost/content. Añada un cron que copie ese directorio y una exportación diaria de MySQL hacia un almacenamiento remoto. Ghost CLI no hace copias de seguridad automáticamente.
# Export MySQL quotidien — à placer dans crontab
0 2 * * * mysqldump -u ghost -p ghost_db | gzip > /backups/ghost-$(date +%F).sql.gzLa documentación oficial
Para la configuración avanzada y las opciones propias de la herramienta, consulte la documentación oficial de Ghost. Esta guía cubre la puesta en línea en un VPS; la documentación del editor sigue siendo la referencia para los ajustes finos, las actualizaciones mayores y los casos de uso específicos.