Ghost es un sistema de administración de contenido de código abierto que es adecuado para un blog, boletín informativo o sitio web de membresía.
Es súper rápido y está optimizado para SEO. Nos encanta aquí en Linux Handbook. Nuestro sitio web utiliza Ghost, por supuesto.
Ahora, puede optar por una instancia administrada de Ghost de los creadores de Ghost. Le costaría mucho, pero no tendrá que esforzarse en implementar Ghost, actualizarlo y mantenerlo. Y por supuesto, ayuda al desarrollo del proyecto Ghost.
Si desea evitar gastar mucho o tomar las riendas del asunto con un enfoque de "hágalo usted mismo", puede alojar Ghost en su servidor.
En este tutorial, le mostraré los pasos para implementar Ghost con Docker.
Fantasma de autohospedaje con Docker
Aquí está la cosa. Algunos proveedores de servidores en la nube como DigitalOcean también brindan implementación de Ghost con un solo clic. Esa podría ser la salida más fácil si no quiere los problemas de la instalación y configuración inicial de Ghost.
Aparte de eso, veamos qué necesita para implementar Ghost con Docker en un servidor Linux.
Requisitos
Además de la familiaridad con los comandos de Linux, conocer los conceptos básicos de Docker Compose también será útil aquí.
- Un servidor Linux. Puede utilizar un servidor físico, una máquina virtual o servidores en la nube. Puede registrarse con nuestro socio Linode y obtener $100 en créditos gratuitos.
- Docker y Docker Compose instalados en su servidor.
- Accede al DNS de tu dominio donde quieras implementar Ghost.
- Configuración de proxy inverso de Nginx con redirección www/non-www y límites de carga permitidos.
Paso 0:Prepare la configuración inicial
Debe tener Docker y Docker Compose instalados en su sistema. Puede consultar estos tutoriales para obtener instrucciones para Ubuntu.
Aparte de eso, también debe tener la configuración del proxy inverso Ngnix. Esto es beneficioso si desea tener más de un Ghost o algún otro servicio web instalado en el mismo servidor.
Ahora, he cubierto este tema en detalle en el tutorial vinculado a continuación, por lo que no voy a repetir los mismos pasos aquí. Sin embargo, debe tener esta configuración en su sistema.
Siga este tutorial hasta el Paso 4:
Paso 1:Preparar la implementación de Ghost
Aquí utilizo el método de proxy inverso de Jwilder porque tiene en cuenta los certificados SSL, la redirección www/non-www y los límites de carga permitidos.
La forma de manejar los certificados SSL ya se describe en el enlace compartido anteriormente en la sección de requisitos. Además, describiré cómo habilitar la redirección www/non-www y aumentar los límites de carga permitidos.
Redirección WWW/no WWW
Dependiendo de sus preferencias de SEO, es posible que desee configurar la redirección de www a no-www o viceversa. Por ejemplo, si su blog está alojado en dominio.com, los usuarios que visiten www.dominio.com deben ser redirigidos a él (tal como funciona el dominio de GitHub).
Del mismo modo, si lo aloja en www.dominio.com, los usuarios que visiten dominio.com deben ser redirigidos (tal como funciona el dominio de Linode).
de WWW a no WWW
Cree un archivo llamado www.domain.com
dentro del directorio de redacción de nginx docker con el siguiente contenido y guárdelo:
rewrite ^/(.*)$ https://domain.com/$1 permanent;
No-WWW a WWW
Crea un archivo llamado domain.com
dentro del directorio de redacción de nginx docker con el siguiente contenido y guárdelo:
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Ahora, suponga que desea utilizar la redirección de WWW a no WWW. Todo lo que tiene que hacer es montar el archivo en la sección de volúmenes de la configuración de su servicio Nginx:
- ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
Aumentar los límites de carga permitidos
Las cargas de imágenes pueden verse afectadas por el tamaño de carga máximo predeterminado de 50 MB. Para establecer un límite de carga máximo y evitar problemas al cargar imágenes en Docker, digamos para 1 GB, cree un archivo llamado client_max_upload_size.conf
y guárdelo con el siguiente contenido:
client_max_body_size 1G;
Más tarde, debe montarlo tal como se describe con el archivo anterior:
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
Ejecute docker-compose up -d
desde el directorio de Nginx para actualizar su configuración de Nginx.
En primer lugar, la configuración de implementación de Ghost consta esencialmente de dos componentes principales:
- Back-end de la base de datos MariaDB
- Ghost en sí mismo como interfaz web
Dado que está implementando Ghost con Docker, todos los componentes anteriores se configuran como sus propios contenedores respectivos.
Para el servicio de base de datos, usaré una red interna llamada ghost
ya que solo necesita ser visible para el servicio Ghost.
networks:
- ghost
Pero para el servicio Ghost, por supuesto, la misma net
la red utilizada en la configuración del proxy inverso debe especificarse junto con el ghost
red, y solo entonces sería posible ponerlo en funcionamiento con el contenedor Nginx Docker.
networks:
- net
- ghost
Ahora considere cómo se configuran individualmente con Docker Compose:
Para MariaDB, uso la imagen oficial de MariaDB 10.5.3 que está disponible en Docker Hub:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
Aquí uso un volumen llamado ghostdb
para almacenar los datos de la base de datos en /var/lib/mysql
. También establecí las variables de entorno relevantes en el env_file
llamado mariadb.env
:
MYSQL_RANDOM_ROOT_PASSWORD=1
MYSQL_USER=mariadbuser
MYSQL_PASSWORD=mariadbpassword
MYSQL_DATABASE=ghost
Para el propio servicio de Ghost, en lugar de usar un latest
etiqueta, específicamente prefiero usar el número de versión etiquetado en Docker Hub lanzado por los desarrolladores como una versión estable. Aquí, en el momento de escribir este artículo, es 4.5.0
:
ghost:
image: ghost:4.5.0
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on: ghostdb
networks:
- net
- ghost
El enlace montó config.json
El archivo consta de SMTP (Mailgun) y configuración esencial de rotación de registros (centrada en errores):
{
"url": "http://localhost:2368",
"server": {
"port": 2368,
"host": "0.0.0.0"
},
"mail": {
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.eu.mailgun.org",
"port": 465,
"secureConnection": true,
"auth": {
"user": "replace-me-with-a-mailgun-configured-email-address",
"pass": "replace-me-with-the-relevant-mailgun-apikey-of-50-characters"
}
}
},
"logging": {
"path": "content/logs/",
"level": "error",
"rotation": {
"enabled": true,
"count": 10,
"period": "1d"
},
"transports": [
"file",
"stdout"
]
},
"process": "systemd",
"paths": {
"contentPath": "/var/lib/ghost/content"
}
}
Si debe usar MySQL/MariaDB, el servicio Ghost debe confiar en ghostdb
servicio para que esté operativo. Esto puede asegurarse solo cuando haya montado el enlace ghost-mariadb.env
archivo (que se muestra en la sección de volúmenes del servicio de base de datos de Ghost) con la configuración de base de datos correcta según mariadb.env
en el servicio de la base de datos, que sería:database__client
, database__connection__host
, database__connection__user
, database__connection__password
y database__connection__database
.
También asignaré cada una de las variables de entorno VIRTUAL_HOST
y LETSENCRYPT_HOST
a ambos domain.com
así como www.domain.com
respectivamente, para garantizar que ambos existan. Esto garantiza absolutamente que las redirecciones y los certificados SSL funcionen sin problemas. Quiero que mi URL principal no tenga www, así que la configuro como url=https://domain.com
. Dado que utilizará esta configuración para el uso a nivel de producción, el NODE_ENV
La variable se establece en el modo de producción. Estos detalles también deben agregarse.
Por lo tanto, el archivo de entorno completo (ghost-mariadb.env
) para el servicio Ghost sería:
VIRTUAL_HOST=domain.com,www.domain.com
LETSENCRYPT_HOST=domain.com,www.domain.com
url=https://domain.com
NODE_ENV=production
database__client=mysql
database__connection__host=ghostdb
database__connection__user=mariadbuser
database__connection__password=mariadbpassword
database__connection__database=ghost
Las inconsistencias en los datos anteriores podrían hacer que Ghost cambie erróneamente a SQLite. No quieres eso. Por lo tanto, asegúrese de que todos los parámetros anteriores se correspondan correctamente con el servicio de base de datos discutido para mariadb.env
arriba.
Cada uno de los servicios de base de datos tendrá sus propios volúmenes Docker respectivos para almacenar datos de usuario y contenido. Los crearé como volúmenes externos:
docker volume create ghostdb
docker volume create ghost
Ahora debe incluir un volumes
dentro del archivo de redacción de la ventana acoplable con los siguientes detalles:
volumes:
ghost:
external: true
ghostdb:
external: true
Ahora tiene los componentes necesarios para implementar Ghost.
Paso 2:Implementación de Ghost
Ahora debería tener listo el archivo docker-compose. Es hora de usar este archivo.
Cree el directorio de redacción de la ventana acoplable Ghost en su servidor:
mkdir ghost
Vaya al directorio para editar los archivos necesarios:
cd ghost
Ahora cree el siguiente archivo docker-compose basado en nuestras discusiones hasta ahora:
version: '3.7'
services:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
ghost:
image: ghost:4.5.0
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
volumes:
ghost:
external: true
ghostdb:
external: true
networks:
net:
external: true
ghost:
internal: true
Además, no olvide crear los otros archivos de configuración como se mencionó anteriormente:config.json
, mariadb.env
y ghost-mariadb.env
dentro del mismo directorio.
Inicie la instancia de Ghost:
docker-compose up -d
Acceda al dominio Ghost especificado en la configuración usando la URL de su dominio especificado.
Paso 3:configurar su cuenta de administrador de Ghost
Tenga en cuenta que para configurar su cuenta de administrador, debe ir a domain.com/ghost y siga las instrucciones en pantalla hasta que haya reclamado su sitio como administrador fantasma.
Para verificar dos veces, confirme que realmente está usando MySQL/MariaDB y no SQLite. Navegue hasta su icono de usuario en la parte inferior izquierda:
Ahora puede estar seguro de que en realidad está utilizando el contenedor de base de datos separado que se mostrará como mysql
independientemente de si está utilizando una imagen MySQL o MariaDB Docker:
También puede ver que los otros tres parámetros:Versión, Entorno y Correo, están configurados como se esperaba según los pasos mencionados anteriormente. ¡Eso es todo! ¡Ha implementado correctamente Ghost como una instancia autohospedada en su servidor!
Sugerencias para mantener su instancia de Ghost autohospedada
Aquí hay algunos consejos que lo ayudarán a mantener su instancia de Ghost.
Supervisión de registros fantasma en tiempo real
Si desea verificar los registros del contenedor mientras se implementa en tiempo real, puede ejecutar:
docker logs -f ghost_ghost_1
Copia de seguridad y restauración de volúmenes fantasma sin tiempo de inactividad
Con un enfoque de nube + local, puede realizar copias de seguridad y restaurar sus volúmenes fantasma sin tiempo de inactividad.
Actualizar contenedores fantasma sin tiempo de inactividad
Con la --scale
marca en Docker Compose, puede crear un nuevo contenedor basado en la última versión de Ghost. Cuando haya terminado, puede eliminar el antiguo. Esto da como resultado un tiempo de inactividad cero.
Hay algunos consejos más que puedes leer en el siguiente artículo.
También puede implementar y administrar temas fantasma mediante acciones de GitHub para simplificar su trabajo.
Si encuentra un error, tiene problemas o tiene alguna sugerencia, hágamelo saber dejando un comentario a continuación.