Ghost Blog · 12 min read · Oct 23, 2025
So setzen Sie Ghost Blog mit Nginx auf Debian 12 ein

Ghost ist eine Open-Source-Blogging-Plattform, die Ihnen hilft, einen professionell aussehenden Blog zu erstellen. Sie wurde 2013 als Alternative zu WordPress ins Leben gerufen. Sie ist in JavaScript geschrieben und wird von der Node.js-Bibliothek unterstützt.
In diesem Tutorial werden wir untersuchen, wie man Ghost CMS mit Nginx und MySQL auf einem Server mit Debian 12 installiert. Wir werden das Let’s Encrypt SSL-Zertifikat verwenden, um unsere Installation zu sichern.
Voraussetzungen
- Ein Server, der Debian 12 mit mindestens 2 GB RAM ausführt.
- Ein Nicht-Root-Benutzer mit Sudo-Rechten.
- Ein vollständig qualifizierter Domainname (FQDN) wie
example.com, der auf Ihren Server verweist. - Stellen Sie sicher, dass alles aktualisiert ist.
$ sudo apt update $ sudo apt upgrade - Einige Pakete, die Ihr System benötigt.
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yEinige dieser Pakete sind möglicherweise bereits auf Ihrem System installiert.
Schritt 1 - UFW-Firewall konfigurieren
Der erste Schritt besteht darin, die Firewall zu konfigurieren. Debian wird standardmäßig mit ufw (Uncomplicated Firewall) ausgeliefert.
Überprüfen Sie, ob die Firewall läuft.
$ sudo ufw status
Sie sollten die folgende Ausgabe erhalten.
Status: inactive
Erlauben Sie den SSH-Port, damit die Firewall die aktuelle Verbindung beim Aktivieren nicht unterbricht.
$ sudo ufw allow OpenSSH
Erlauben Sie auch die HTTP- und HTTPS-Ports.
$ sudo ufw allow http
$ sudo ufw allow https
Aktivieren Sie die Firewall
$ sudo ufw enable
Befehl kann bestehende SSH-Verbindungen stören. Mit dem Vorgang fortfahren (y|n)? y
Firewall ist aktiv und beim Systemstart aktiviert
Überprüfen Sie den Status der Firewall erneut.
$ sudo ufw status
Sie sollten eine ähnliche Ausgabe sehen.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Schritt 2 - Nginx installieren
Debian 12 wird mit einer älteren Version von Nginx ausgeliefert. Um die neueste Version zu installieren, müssen Sie das offizielle Nginx-Repository herunterladen.
Importieren Sie den Signaturschlüssel von Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Fügen Sie das Repository für die stabile Version von Nginx hinzu.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Aktualisieren Sie die System-Repositorys.
$ sudo apt update
Installieren Sie Nginx.
$ sudo apt install nginx
Überprüfen Sie die Installation. Das sudo ist erforderlich, um den Befehl auf Debian auszuführen.
$ sudo nginx -v
nginx version: nginx/1.24.0
Starten Sie den Nginx-Server.
$ sudo systemctl start nginx
Schritt 3 - Node.js installieren
Der Ghost-Installer benötigt Node.js, um zu funktionieren. Der erste Schritt besteht darin, den GPG-Schlüssel von Nodesource zu importieren.
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg
Erstellen Sie als Nächstes die Nodesource-Repository-Datei. Wir werden Node 18x installieren, das die aktuelle LTS (Long Term Support)-Version ist, die Ghost empfiehlt.
$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
Aktualisieren Sie die System-Repository-Liste.
$ sudo apt update
Installieren Sie Node.
$ sudo apt install nodejs -y
Bestätigen Sie die Node-Installation.
$ node --version
v18.18.2
Schritt 4 - MySQL mit Docker installieren
Debian wird nicht mehr mit MySQL ausgeliefert. Stattdessen wird es mit MariaDB ausgeliefert. Ghost unterstützt nur MySQL. Sie können Ghost anpassen, um mit MariaDB zu arbeiten, aber das wird nicht empfohlen. Da die offiziellen Repositories von MySQL zum Zeitpunkt des Schreibens dieses Tutorials nicht für Debian 12 aktualisiert wurden, werden wir es mit Docker installieren.
Importieren Sie den GPG-Schlüssel von Docker.
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
Erstellen Sie eine Docker-Repository-Datei.
$ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Aktualisieren Sie die System-Repository-Liste.
$ sudo apt update
Installieren Sie Docker und Docker Compose.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Standardmäßig benötigt Docker Root-Rechte. Wenn Sie vermeiden möchten, bei jedem Ausführen des docker-Befehls sudo zu verwenden, fügen Sie Ihren Benutzernamen zur docker-Gruppe hinzu.
$ sudo usermod -aG docker $(whoami)
Sie müssen sich vom Server abmelden und wieder als derselbe Benutzer anmelden, um diese Änderung zu aktivieren, oder den folgenden Befehl verwenden.
$ su - ${USER}
Bestätigen Sie, dass Ihr Benutzer zur Docker-Gruppe hinzugefügt wurde.
$ groups
navjot wheel docker
Jetzt, da Docker installiert ist, müssen wir eine Docker-Compose-Datei für MySQL erstellen. Erstellen Sie ein Verzeichnis für MySQL-Docker.
$ mkdir ~/mysql
Erstellen und öffnen Sie die Datei docker-compose.yml zur Bearbeitung.
$ nano docker-compose.yml
Fügen Sie den folgenden Code ein.
services:
database:
image: container-registry.oracle.com/mysql/community-server:latest
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_USER: ghost
MYSQL_PASSWORD: ghostpassword
MYSQL_DATABASE: ghostdb
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.
Hier haben wir das Root-Passwort und die MySQL-Anmeldeinformationen für die Ghost-Datenbank festgelegt. Diese werden erstellt, wenn der Container ausgeführt wird.
Starten Sie den MySQL-Container.
$ docker compose up -d
Überprüfen Sie den Status des Docker-Containers.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec42fb205f1e container-registry.oracle.com/mysql/community-server:latest "/entrypoint.sh mysq…" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp mysql
Ghost kann sich über den Port 3306 mit dem MySQL-Container verbinden und darauf zugreifen.
Schritt 5 - Ghost installieren
Wir können Ghost auch mit Docker installieren, was die Dinge vereinfachen kann, aber wir werden es hier nicht tun.
Die Ghost-Installation besteht aus drei Komponenten - dem Ghost-CLI-Befehlszeilenwerkzeug, das die Ghost-Blog-Updates installiert und verwaltet, und dem Blog-Paket selbst.
Ghost-CLI installieren
Führen Sie den folgenden Befehl aus, um das Ghost-CLI-Tool zu installieren.
$ sudo npm install ghost-cli@latest -g
Ghost-Verzeichnis vorbereiten
Erstellen Sie das Ghost-Stammverzeichnis.
$ sudo mkdir -p /var/www/html/ghost
Setzen Sie den Besitz des Verzeichnisses auf den aktuellen Benutzer.
$ sudo chown $USER:$USER /var/www/html/ghost
Setzen Sie die richtigen Verzeichnisberechtigungen.
$ sudo chmod 755 /var/www/html/ghost
Wechseln Sie in das Ghost-Verzeichnis.
$ cd /var/www/html/ghost
Ghost installieren
Die Installation von Ghost ist ein Vorgang mit einem einzigen Befehl.
$ ghost install
Während der Installation wird das CLI-Tool mehrere Fragen stellen, um den Blog zu konfigurieren.
- Blog-URL: Geben Sie Ihre vollständige Blog-URL zusammen mit dem https-Protokoll ein. (
https://example.com) - MySQL-Hostname: Drücken Sie die Eingabetaste, um den Standardwert
localhostzu verwenden, da sich unsere Ghost-Installation und MySQL auf demselben Server befinden. - MySQL-Benutzername: Geben Sie
ghostals Ihren MySQL-Benutzernamen ein. - MySQL-Passwort: Geben Sie Ihr zuvor im Docker-File erstelltes Root-Passwort ein.
- Ghost-Datenbankname: Geben Sie den Namen der Datenbank (
ghostdb) ein, die im Docker-File konfiguriert ist. - Sudo-Passwort: Es wird nach Ihrem Sudo-Passwort gefragt, um administrative Aufgaben auszuführen.
- Nginx einrichten?: Normalerweise erkennt Ghost-CLI Ihre Nginx-Installation und konfiguriert sie automatisch für Ihren Blog. Aber das funktioniert nur für Nginx, das mit dem OS-Paket installiert wurde. Da wir es über das Nginx-Repository installiert haben, kann Ghost es nicht erkennen und überspringt es automatisch.
- SSL einrichten?: Da die Nginx-Konfiguration übersprungen wurde, wird das CLI-Tool auch die Einrichtung eines SSL überspringen.
- Systemd einrichten?: Ghost wird fragen, ob Sie einen Systemdienst für Ghost einrichten möchten. Drücken Sie Y, um fortzufahren.
- Ghost starten?: Drücken Sie Y, um Ihre Ghost-Installation zu starten. Es wird jedoch nicht funktionieren, da Nginx und SSL noch nicht konfiguriert sind.
Schritt 6 - SSL installieren
Bevor wir fortfahren, müssen wir das Certbot-Tool installieren und ein SSL-Zertifikat für unsere Domain installieren.
Um Certbot zu installieren, verwenden wir den Snapd-Paket-Installer. Snapd hat immer die neueste stabile Version von Certbot. Debian wird jedoch nicht mit installiertem Snapd ausgeliefert. Installieren Sie es zuerst.
$ sudo apt install snapd
Stellen Sie sicher, dass Ihre Version von Snapd auf dem neuesten Stand ist.
$ sudo snap install core
$ sudo snap refresh core
Installieren Sie Certbot.
$ sudo snap install --classic certbot
Verwenden Sie den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt werden kann, indem Sie einen symbolischen Link zum Verzeichnis /usr/bin erstellen.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Überprüfen Sie die Installation.
$ certbot --version
certbot 2.7.1
Generieren Sie ein SSL-Zertifikat.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
Der obige Befehl lädt ein Zertifikat in das Verzeichnis /etc/letsencrypt/live/example.com auf Ihrem Server herunter.
Generieren Sie ein Diffie-Hellman-Gruppe-Zertifikat.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Überprüfen Sie den Zeitplan des Certbot-Erneuerungsdienstes.
$ sudo systemctl list-timers
Sie finden snap.certbot.renew.service als einen der Dienste, die geplant sind.
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left Mon 2023-10-16 00:00:18 UTC 9h ago dpkg-db-backup.timer dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer apt-daily.service
Führen Sie einen Testlauf des Prozesses durch, um zu überprüfen, ob die SSL-Erneuerung einwandfrei funktioniert.
$ sudo certbot renew --dry-run
Wenn Sie keine Fehler sehen, sind Sie bereit. Ihr Zertifikat wird automatisch erneuert.
Schritt 7 - Nginx konfigurieren
Erstellen und öffnen Sie die Datei /etc/nginx/conf.d/ghost.conf zur Bearbeitung.
$ sudo nano /etc/nginx/conf.d/ghost.conf
Fügen Sie den folgenden Code in die Datei ghost.conf ein. Ersetzen Sie alle Vorkommen von example.com durch Ihre Domain.
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:2368;
}
}
Die obige Konfiguration leitet alle HTTP-Anfragen zu HTTPS um und dient als Proxy für den Ghost-Dienst, um ihn über Ihre Domain bereitzustellen.
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.
Öffnen Sie die Datei /etc/nginx/nginx.conf zur Bearbeitung.
$ sudo nano /etc/nginx/nginx.conf
Fügen Sie die folgende Zeile vor der Zeile include /etc/nginx/conf.d/*.conf; hinzu.
server_names_hash_bucket_size 64;
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.
Überprüfen Sie Ihre Nginx-Konfiguration.
$ sudo nginx -t
Wenn Sie keine Fehler sehen, sind Sie bereit. Starten Sie den Nginx-Server neu, um die Konfiguration anzuwenden.
$ sudo systemctl restart nginx
Schritt 9 - Die Seite ausführen
Jetzt können Sie Ihre Installation überprüfen, indem Sie https://example.com in Ihrem Webbrowser öffnen. Sie erhalten die folgende Seite, die eine erfolgreiche Installation anzeigt.

Schritt 10 - Einrichtung abschließen
Um die Einrichtung Ihres Ghost-Blogs abzuschließen, besuchen Sie https://example.com/ghost in Ihrem Browser. Das zusätzliche /ghost am Ende Ihrer Blog-Domain leitet Sie zum Admin-Panel von Ghost oder in diesem Fall zur Einrichtung, da Sie darauf zum ersten Mal zugreifen.
Hier müssen Sie Ihr Administratorkonto erstellen und einen Blogtitel wählen.

Geben Sie Ihre Daten ein und klicken Sie auf die Schaltfläche Konto erstellen & veröffentlichen , um fortzufahren.
Als Nächstes gelangen Sie zu folgendem Bildschirm, auf dem Ihnen Optionen wie das Schreiben Ihres ersten Beitrags, das Anpassen Ihrer Seite und das Importieren von Mitgliedern angeboten werden.

Wir wählen Ghost-Admin erkunden, um zu erkunden und direkt zum Dashboard zu gelangen. Am Ende der Einrichtung werden Sie mit dem Administrationspanel von Ghost begrüßt.

Wenn Sie in den Dunkelmodus wechseln möchten, können Sie dies tun, indem Sie auf den Umschalter neben der Einstellungssymbol-Schaltfläche am unteren Rand der Einstellungsseite klicken.
Sie sehen einen Standardbeitrag. Sie können ihn nicht veröffentlichen oder löschen und mit dem Posten beginnen.

Schritt 11 - Mailer konfigurieren
Ghost fungiert nicht nur als Blogging-Plattform, sondern auch als Newsletter-Manager. Für den täglichen Betrieb können Sie jeden Transaktionsmaildienst verwenden, um mit Ghost für den Versand von E-Mails zu arbeiten. Wenn Sie jedoch Newsletter über Ghost versenden möchten, ist der einzige offizielle Bulk-Mailer, der unterstützt wird, Mailgun. Sie können auch einen anderen Newsletterdienst verwenden, aber dafür müssen Sie die Zapier-Integrationsfunktion von Ghost verwenden.
Lassen Sie uns zunächst einen SMTP-Dienst für Transaktions-E-Mails konfigurieren. Öffnen Sie dazu die Datei /var/www/html/ghost/config.production.json zur Bearbeitung.
$ nano /var/www/html/ghost/config.production.json
Suchen Sie die folgenden Zeilen.
"mail": {
"transport": "Direct"
},
Ersetzen Sie sie durch den folgenden Code.
"mail": {
"from": "'HowtoForge Support' [email protected]",
"transport": "SMTP",
"options": {
"host": "YOUR-SES-SERVER-NAME",
"port": 465,
"service": "SES",
"auth": {
"user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
"pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
}
}
},
Hier verwenden wir den Amazon SES-Maildienst, da er kostengünstig ist und keine monatlichen Gebühren erfordert.
Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden. Sobald Sie fertig sind, starten Sie die Ghost-Anwendung neu, damit die Änderungen wirksam werden.
$ ghost restart
Um die Newsletter-Einstellungen zu konfigurieren, besuchen Sie den Abschnitt Einstellungen >> E-Mail-Newsletter.

Klicken Sie auf den Link Mailgun-Konfiguration, um ihn zu erweitern.
Füllen Sie Ihre Mailgun-Region, Domain und API-Schlüssel aus.

Klicken Sie auf die Schaltfläche Speichern oben rechts, um die Einstellungen zu speichern.
Um die Zustellung des Newsletters zu testen, erstellen Sie einen neuen Testbeitrag, klicken Sie auf Veröffentlichen und wählen Sie die Option Nur E-Mail. Wenn Sie den Beitrag auch veröffentlichen möchten, wählen Sie die Option Veröffentlichen und E-Mail.

Klicken Sie auf die Schaltfläche Weiter, letzte Überprüfung, um fortzufahren. Die nächste Seite fragt erneut nach der endgültigen Bestätigung.

Klicken Sie auf die Schaltfläche E-Mail jetzt senden, um den Newsletter zu senden. Sie erhalten die folgende Nachricht, sobald die E-Mail gesendet wurde.

Überprüfen Sie Ihre E-Mail für den Beitrag.

Schritt 12 - Ghost aktualisieren
Es gibt zwei Arten von Ghost-Updates - kleinere Updates und größere Updates.
Zuerst machen Sie ein vollständiges Backup, wenn Sie ein kleines Update durchführen möchten. Es erstellt ein Backup aller Beiträge, Mitglieder, Themen, Bilder, Dateien und Weiterleitungsdateien.
$ cd /var/www/html/ghost
$ ghost backup
Führen Sie den Update-Befehl aus, um das kleine Update durchzuführen.
$ ghost update
Um ein großes Update durchzuführen, sollten Sie die offizielle detaillierte Update-Anleitung bei Ghost befolgen. Je nachdem, welche Version Sie derzeit verwenden und auf welche Hauptversion Sie aktualisieren möchten, variieren die Schritte.
Fazit
Damit endet unser Tutorial zur Einrichtung von Ghost CMS auf Ihrem Debian 12-Server mit Nginx. Wenn Sie Fragen oder Feedback haben, teilen Sie diese bitte in den Kommentaren mit.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.