Ghost ist ein Open-Source-Content-Management-System, das sich für Blogs, Newsletter oder Mitglieder-Websites eignet.
Es ist superschnell und SEO-optimiert. Wir lieben es hier bei Linux Handbook. Unsere Website verwendet natürlich Ghost.
Jetzt können Sie sich für eine verwaltete Ghost-Instanz von den Machern von Ghost selbst entscheiden. Es würde Sie viel kosten, aber Sie müssen sich keine Mühe geben, Ghost bereitzustellen, zu aktualisieren und zu warten. Und natürlich hilft es der Entwicklung des Ghost-Projekts.
Wenn Sie vermeiden möchten, viel auszugeben oder die Dinge mit einem „Do-it-yourself“-Ansatz selbst in die Hand nehmen möchten, können Sie Ghost selbst auf Ihrem Server hosten.
In diesem Tutorial zeige ich Ihnen die Schritte zum Bereitstellen von Ghost mit Docker.
Selbsthostender Ghost mit Docker
Hier ist das Ding. Einige Cloud-Server-Anbieter wie DigitalOcean bieten auch Ghost-Bereitstellung mit einem Klick. Das könnte der einfache Ausweg sein, wenn Sie sich den Ärger mit der anfänglichen Einrichtung und Konfiguration von Ghost ersparen möchten.
Mal sehen, was Sie brauchen, um Ghost mit Docker auf einem Linux-Server bereitzustellen.
Anforderungen
Neben der Vertrautheit mit Linux-Befehlen ist hier auch die Kenntnis der Grundlagen von Docker Compose hilfreich.
- Ein Linux-Server. Sie können einen physischen Server, eine virtuelle Maschine oder Cloud-Server verwenden. Sie können sich bei unserem Partner Linode anmelden und 100 $ an kostenlosen Credits erhalten.
- Docker und Docker Compose auf Ihrem Server installiert.
- Zugriff auf das DNS Ihrer Domain, in der Sie Ghost bereitstellen möchten.
- Nginx-Reverse-Proxy-Setup mit www/nicht-www-Umleitung und zulässigen Upload-Limits.
Schritt 0:Bereiten Sie die Ersteinrichtung vor
Docker und Docker Compose müssen auf Ihrem System installiert sein. Sie können sich auf diese Tutorials beziehen, um Anweisungen für Ubuntu zu erhalten.
Abgesehen davon müssen Sie auch Ngnix-Reverse-Proxy-Setup haben. Dies ist vorteilhaft, wenn Sie mehr als einen Ghost oder einen anderen Webdienst auf demselben Server installieren möchten.
Nun, ich habe dieses Thema im unten verlinkten Tutorial ausführlich behandelt, sodass ich die gleichen Schritte hier nicht wiederholen werde. Dieses Setup muss jedoch auf Ihrem System vorhanden sein.
Folgen Sie diesem Tutorial bis Schritt 4:
Schritt 1:Vorbereitung der Bereitstellung von Ghost
Ich verwende hier die Reverse-Proxy-Methode von Jwilder, da sie SSL-Zertifikate, www/non-www-Umleitung und zulässige Upload-Limits berücksichtigt.
Der Umgang mit SSL-Zertifikaten ist bereits in dem oben geteilten Link im Abschnitt Anforderungen beschrieben. Außerdem werde ich beschreiben, wie man die www/nicht-www-Umleitung aktiviert und die zulässigen Upload-Limits erhöht.
WWW/Nicht-WWW-Umleitung
Abhängig von Ihren SEO-Präferenzen möchten Sie möglicherweise die Umleitung von www zu nicht-www oder umgekehrt festlegen. Wenn Ihr Blog beispielsweise auf domain.com gehostet wird, müssen Benutzer, die www.domain.com besuchen, dorthin umgeleitet werden (wie die Domain von GitHub funktioniert).
Ebenso müssen Benutzer, die domain.com besuchen, umgeleitet werden, wenn Sie sie auf www.domain.com hosten (wie die Domain von Linode funktioniert).
WWW zu Nicht-WWW
Erstellen Sie eine Datei namens www.domain.com
innerhalb des nginx docker compose Verzeichnisses mit folgendem Inhalt und speichern Sie es:
rewrite ^/(.*)$ https://domain.com/$1 permanent;
Nicht-WWW zu WWW
Erstellen Sie eine Datei namens domain.com
innerhalb des nginx docker compose Verzeichnisses mit folgendem Inhalt und speichern Sie es:
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Angenommen, Sie möchten die Umleitung von WWW zu Nicht-WWW verwenden. Alles, was Sie tun müssen, ist, die Datei im Volumes-Abschnitt Ihrer Nginx-Dienstkonfiguration zu mounten:
- ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
Zulässige Upload-Limits erhöhen
Bild-Uploads können durch die standardmäßige maximale Upload-Größe von 50 MB beeinträchtigt werden. Erstellen Sie eine Datei mit dem Namen client_max_upload_size.conf
, um ein maximales Upload-Limit festzulegen und Probleme beim Hochladen von Bildern auf Docker zu vermeiden, z. B. für 1 GB und speichern Sie es mit folgendem Inhalt:
client_max_body_size 1G;
Später müssen Sie es wie bei der vorherigen Datei beschrieben mounten:
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
Führen Sie docker-compose up -d
aus aus dem Nginx-Verzeichnis, um Ihre Nginx-Konfiguration zu aktualisieren.
Zunächst einmal besteht die Ghost-Bereitstellungskonfiguration im Wesentlichen aus zwei Hauptkomponenten:
- MariaDB-Datenbank-Backend
- Ghost selbst als Web-Frontend
Da Sie Ghost mit Docker bereitstellen, werden alle oben genannten Komponenten als ihre eigenen jeweiligen Container eingerichtet.
Für den Datenbankdienst verwende ich ein internes Netzwerk namens ghost
da es nur für den Ghost-Dienst sichtbar sein muss.
networks:
- ghost
Aber für den Ghost-Dienst natürlich dasselbe net
Netzwerk, das in der Reverse-Proxy-Konfiguration verwendet wird, muss zusammen mit dem ghost
angegeben werden Netzwerk, und nur dann wäre es möglich, es mit dem Nginx-Docker-Container zum Laufen zu bringen.
networks:
- net
- ghost
Betrachten Sie nun, wie sie mit Docker Compose individuell konfiguriert werden:
Für MariaDB verwende ich das offizielle MariaDB 10.5.3-Image, das auf Docker Hub verfügbar ist:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
Hier verwende ich ein Volume namens ghostdb
um die Datenbankdaten unter /var/lib/mysql
zu speichern . Ich setze auch die relevanten Umgebungsvariablen in der env_file
namens mariadb.env
:
MYSQL_RANDOM_ROOT_PASSWORD=1
MYSQL_USER=mariadbuser
MYSQL_PASSWORD=mariadbpassword
MYSQL_DATABASE=ghost
Für den Ghost-Dienst selbst, anstatt einen latest
zu verwenden -Tag, bevorzuge ich ausdrücklich die Versionsnummer, die auf dem von den Entwicklern gestarteten Docker Hub als stabile Version gekennzeichnet ist. Hier, zum jetzigen Zeitpunkt, ist 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
Die Bindung hat config.json
gemountet Datei besteht aus SMTP (Mailgun) und wesentlichen Einstellungen für die Protokollrotation (fehlerbezogen):
{
"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"
}
}
Wenn MySQL/MariaDB verwendet werden muss, muss sich der Ghost-Dienst auf die ghostdb
verlassen Service, damit es betriebsbereit ist. Dies kann nur sichergestellt werden, wenn Sie die ghost-mariadb.env
bind gemountet haben Datei (gezeigt im Volumes-Abschnitt des Ghost-Datenbankdienstes) mit der korrekten Datenbankkonfiguration gemäß mariadb.env
im Datenbankdienst, das wäre:database__client
, database__connection__host
, database__connection__user
, database__connection__password
und database__connection__database
.
Ich werde auch jeder der Umgebungsvariablen VIRTUAL_HOST
zuweisen und LETSENCRYPT_HOST
zu beiden domain.com
sowie www.domain.com
bzw. um sicherzustellen, dass beide vorhanden sind. Dadurch wird absolut sichergestellt, dass die Umleitungen und SSL-Zertifikate reibungslos und ohne Probleme funktionieren. Ich möchte, dass meine Haupt-URL ohne www ist, also setze ich sie als url=https://domain.com
. Da Sie dieses Setup für die Verwendung auf Produktionsebene verwenden werden, ist der NODE_ENV
Variable ist auf Produktionsmodus eingestellt. Diese Details müssen ebenfalls hinzugefügt werden.
Daher ist die vollständige Umgebungsdatei (ghost-mariadb.env
) für den Ghost-Dienst wäre:
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
Inkonsistenzen in den obigen Daten könnten dazu führen, dass Ghost fälschlicherweise zu SQLite wechselt. Das willst du nicht. Stellen Sie daher sicher, dass alle oben genannten Parameter korrekt mit dem für mariadb.env
besprochenen Datenbankdienst übereinstimmen oben.
Jeder der Datenbankdienste verfügt über seine eigenen jeweiligen Docker-Volumes zum Speichern von Benutzer- und Inhaltsdaten. Ich erstelle sie als externe Volumes:
docker volume create ghostdb
docker volume create ghost
Jetzt müssen Sie ein volumes
hinzufügen Abschnitt in der Docker-Compose-Datei mit den folgenden Details:
volumes:
ghost:
external: true
ghostdb:
external: true
Sie verfügen nun über die erforderlichen Komponenten zum Bereitstellen von Ghost.
Schritt 2:Bereitstellen von Ghost
Jetzt sollten Sie die Docker-Compose-Datei bereit haben. Es ist an der Zeit, diese Datei zu verwenden.
Erstellen Sie das Ghost-Docker-Compose-Verzeichnis auf Ihrem Server:
mkdir ghost
Gehen Sie in das Verzeichnis, um die erforderlichen Dateien zu bearbeiten:
cd ghost
Erstellen Sie nun die folgende Docker-Compose-Datei basierend auf unseren bisherigen Diskussionen:
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
Vergessen Sie auch nicht, die anderen Konfigurationsdateien wie oben beschrieben zu erstellen:config.json
, mariadb.env
und ghost-mariadb.env
innerhalb desselben Verzeichnisses.
Starten Sie die Ghost-Instanz:
docker-compose up -d
Greifen Sie mit Ihrer angegebenen Domain-URL auf die in der Konfiguration angegebene Ghost-Domain zu.
Schritt 3:Richten Sie Ihr Ghost-Admin-Konto ein
Beachten Sie, dass Sie zum Einrichten Ihres Administratorkontos zu domain.com/ghost gehen müssen und befolgen Sie die Anweisungen auf dem Bildschirm, bis Sie Ihre Site als Ghost-Administrator beansprucht haben.
Bestätigen Sie zur Überprüfung, dass Sie tatsächlich MySQL/MariaDB und nicht SQLite verwenden. Navigieren Sie unten links zu Ihrem Benutzersymbol:
Jetzt können Sie sicher sein, dass Sie tatsächlich den separaten Datenbankcontainer verwenden, der als mysql
angezeigt wird unabhängig davon, ob Sie ein MySQL- oder MariaDB-Docker-Image verwenden:
Sie können auch sehen, dass die anderen drei Parameter:Version, Umgebung und E-Mail, basierend auf unseren oben genannten Schritten wie erwartet eingestellt sind. Das war's! Sie haben Ghost erfolgreich als selbst gehostete Instanz auf Ihrem Server bereitgestellt!
Tipps zur Wartung Ihrer selbstgehosteten Ghost-Instanz
Hier sind ein paar Tipps, die Ihnen bei der Wartung Ihrer Ghost-Instanz helfen werden.
Ghost-Protokolle in Echtzeit überwachen
Wenn Sie die Protokolle des Containers überprüfen möchten, während er in Echtzeit bereitgestellt wird, können Sie Folgendes ausführen:
docker logs -f ghost_ghost_1
Geist-Volumes ohne Ausfallzeit sichern und wiederherstellen
Mit einem Cloud + Local-Ansatz können Sie Ihre Ghost-Volumes ohne Ausfallzeiten sichern und wiederherstellen.
Ghost-Container ohne Ausfallzeiten aktualisieren
Mit der --scale
Flag auf Docker Compose können Sie einen neuen Container basierend auf der neuesten Version von Ghost erstellen. Wenn es fertig ist, können Sie das alte entfernen. Dies führt zu null Ausfallzeiten.
Es gibt noch ein paar weitere Tipps, die Sie im folgenden Artikel lesen können.
Möglicherweise möchten Sie auch Ghost-Designs mithilfe von GitHub-Aktionen bereitstellen und verwalten, um Ihre Arbeit zu vereinfachen.
Wenn Sie auf einen Fehler stoßen, Probleme haben oder einen Vorschlag haben, lassen Sie es mich bitte wissen, indem Sie unten einen Kommentar hinterlassen.