GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

7 nützliche Tipps zum Selbsthosten einer Ghost-Instanz mit Docker

Ghost ist eine Open-Source-CMS-Plattform, die leicht und schnell ist und sich auf die Erstellung einer Mitglieder-Website konzentriert.

Sie können sich jederzeit für Managed Hosting von Ghost selbst entscheiden. Da es sich jedoch um eine Open-Source-Software handelt, können Sie sie auch auf Ihrem eigenen Server hosten und selbst verwalten.

Dank Cloud-Diensten wie Linode und DigitalOcean ist die Bereitstellung eines neuen Linux-Servers mit installiertem Ghost eine Sache weniger Klicks.

Linode | Die unabhängige offene Cloud für EntwicklerUnsere Mission ist es, Innovationen zu beschleunigen, indem wir Cloud Computing einfach, erschwinglich und für alle zugänglich machen. Linode

Während die Bereitstellung von Ghost auf Cloud-Servern eine relativ einfachere Aufgabe ist, ist die Verwaltung von Ghost möglicherweise nicht immer so einfach.

Wir verwalten unsere Ghost-Instanz seit einigen Monaten, um das Linux-Handbuch zu hosten. Und diese Erfahrung hat uns einige Dinge gelehrt, die Sie wahrscheinlich nicht in der offiziellen Ghost-Dokumentation finden werden.

In diesem Artikel werde ich über einige entscheidende Faktoren sprechen, die Sie berücksichtigen sollten, bevor Sie Ihr von Ghost betriebenes Blog auf Produktionsservern bereitstellen.

Denken Sie daran, dass sich dieser Artikel auf das Docker-Image von Ghost bezieht, das von der Entwickler-Community erstellt und verwaltet wird.

In der DevOps-Community streben wir immer danach, einem Zustand namens NoOps so nahe wie möglich zu kommen. Aber im praktischen Sinne wird es immer ein Paradoxon bleiben.

Hier versuchen wir, das gleiche Ziel wie NoOps zu erreichen, jedoch mit einer hybriden Perspektive mit menschlichem Eingreifen, wann immer dies erforderlich ist.

Lassen Sie mich also ohne weitere Verzögerung die wesentlichen Elemente auflisten und beschreiben, um eine stabile Ghost-Instanz mit minimalem Wartungsaufwand zu gewährleisten.

1. Stellen Sie Ihre E-Mail-Konfiguration richtig ein

Sie werden E-Mails an Ihre Mitglieder und Abonnenten über Ihre Ghost-Instanz verfolgen:

  • Transaktions-E-Mails:für Mitglieder-Logins, Anmeldebestätigung usw.
  • Massen-E-Mails:zum Versenden von E-Mail-Newslettern über Ghost

Wenn Sie Newsletter nicht über Ghost zustellen möchten, können Sie einen beliebigen SMTP-Dienst verwenden. Andernfalls müssen Sie Mailgun verwenden.

SMTP-Einstellungen für transaktionale E-Mails

Theoretisch sollte Ihre Ghost-Instanz dank Nodemailer in der Lage sein, den Direktmail-Dienst zu nutzen.

Dies kann jedoch dazu führen, dass einige Anmeldungen mit der Fehlermeldung „Bitte geben Sie eine gültige E-Mail-Adresse ein“ fehlschlagen.

Aus diesem Grund müssen Sie SMTP-Einstellungen mit Mailgun oder Amazon SES einrichten. Sie können auch andere E-Mail-Weiterleitungsdienste wie SendGrid oder Mailchimp ausprobieren.

Eine typische SMTP-Einstellung, die über Mailgun konfiguriert wird, sieht wie folgt aus (festgelegt durch eine an Bind gemountete Datei config.production.json ):

  "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"
        }
    }
  },

Behalten Sie die SMTP-Portnummer im Auge . Manchmal schlagen E-Mails aufgrund der Portnummer fehl. In unserem Fall schlugen einige E-Mails mit Port 587 fehl und funktionierten mit Port 465.

Bitte lesen Sie diese Dokumentation von Mailgun hier, um vollständige Informationen zum Verifizieren Ihrer Domain und zum Aktualisieren der erforderlichen DNS-Einträge zu erhalten, die auch zum Senden von E-Mails erforderlich sind.

Im Allgemeinen müssen Sie die von Mailgun erhaltenen MX-, CNAME- und TXT-Einträge in den DNS-Eintragseinstellungen in Ihrem Domainnamen-Panel aktualisieren. Auf Linode sehen sie so aus:

Massen-E-Mails zum Versenden von Newslettern

Um Newsletter in großen Mengen an Ihre Mitglieder zu senden, ist Mailgun der einzige verfügbare Dienst, der für die Implementierung in Ihrer Ghost-Konfiguration verfügbar ist. Massen-E-Mail-Dienste unterscheiden sich stark von herkömmlichen SMTP-Diensten.

Um Massen-E-Mails auf Ghost für Ihre Mitglieder korrekt zu konfigurieren, müssen Sie zunächst sicherstellen, dass Mitgliedschaften aktiviert sind. Das ist eine offensichtliche Voraussetzung.

Scrollen Sie nun nach unten zum E-Mail-Bereich und erweitern Sie "E-Mail-Newsletter-Einstellungen".

Geben Sie den von Mailgun konfigurierten Domänennamen und den API-Schlüssel ein. Mailgun-Region wäre entweder „EU“ oder „US“. Bitte wählen Sie das Passende aus.

Wenn Sie sich an das obige Beispiel für die SMTP-Einstellungen erinnern, kann der Regionsname "EU" mit dem Namen des Hosts wahrgenommen werden, der smtp.eu.mailgun.org ist .

Lesen Sie hier weitere Informationen zum von Mailgun konfigurierten Domainnamen und API-Schlüssel. Informationen zur Auswahl von Domainnamen finden Sie hier.

2. Wählen Sie MySQL oder MariaDB für die Datenbank anstelle von SQLite

Wenn Ihr Ghost-Blog für den Produktionseinsatz geplant ist, empfehle ich, die standardmäßig im Ghost-Container bereitgestellte SQLite-Datenbank nicht zu verwenden.

Der Grund für die Verwendung der empfohlenen Datenbank wie MySQL oder MariaDB ist äußerst entscheidend, wenn Sie eine große Anzahl von Mitgliedern haben und ihnen E-Mail-Newsletter von Ghost selbst senden möchten.

Wir haben es auf die harte Tour gelernt. Anfangs haben wir MailerLite für die Erstellung und den Versand des Newsletters verwendet. Dann entschieden wir uns, die eingebaute Newsletter-Funktion von Ghost zu nutzen.

Mittlerweile haben wir rund 1.100 Mitglieder. Und dies führte zu einem Problem, da SQLite diese vielen Abfragen nicht gleichzeitig verarbeiten konnte. Der neu erstellte Beitrag konnte nicht gesendet werden. Protokolle zeigten diesen Fehler:

Processed job threw an unhandled error
"The email service was unable to send an email batch."

Error ID:
    24bf8000-4f50-11eb-adf5-73dcc562a630

Error Code: 
    SQLITE_ERROR

Das war es nicht. Sie weigerte sich sogar, 1100 Mitglieder zu exportieren. Der Download würde einfach nicht starten. Wir haben das gesamte Backup im JSON-Format heruntergeladen und die Mitgliederinformationen daraus extrahiert.

Um dies zu beheben, migrieren Sie von SQLite zu MySQL oder MariaDB, was zu einem unnötigen Overhead und potenziell unerwünschten Ausfallzeiten während der Migration führen würde, die sogar auf unbestimmte Zeit andauern könnten. Daher ist es immer besser, Ghost zunächst vorbeugend mit MySQL oder MariaDB einzusetzen.

Im Folgenden finden Sie ein Beispiel für eine typische MariaDB-Datenbankdienstkonfiguration für Ghost auf Docker Compose:

    db:
        image: mariadb:10.5.3
        volumes:
            - ghostdb:/var/lib/mysql
        restart: on-failure
        environment:
            MYSQL_RANDOM_ROOT_PASSWORD: 1
            MYSQL_USER: rename-me
            MYSQL_PASSWORD: replace-me
            MYSQL_DATABASE: rename-me

3. Protokollrotation aktivieren

Protokollrotation ist der Prozess des automatischen Zurücksetzens Ihrer Protokolldateien nach einem gewünschten Zeitraum. Dies trägt dazu bei, die Erstellung riesiger Protokolldateien zu vermeiden, die sich anhäufen und unnötigerweise den Festplattenspeicher Ihres Servers beanspruchen. Wenn Sie das folgende Snippet nicht in Ihre Ghost-Konfiguration aufnehmen, würde dies in der Regel dazu führen, dass sich Protokolldateien zu enormen Größen zwischen 15 und 20 GB anhäufen!:

  "logging": {
    "path": "content/logs/",
    "level": "info",
    "rotation": {
      "enabled": true,
      "count": 15,
      "period": "1d"
  },

Für einen detaillierten Überblick über die Anmeldung bei Ghost können Sie die entsprechende Dokumentationsseite besuchen.

3. Reverse-Proxy verwenden

Es ist immer ein zusätzlicher Vorteil, von Anfang an einen Reverse-Proxy zu verwenden, bevor Sie Ghost einsetzen. Es macht es viel einfacher, Ihre Webanwendungen sowohl kurz- als auch langfristig zu verwalten.

So verwenden Sie Nginx Reverse Proxy mit mehreren Docker-AppsErfahren Sie, wie Sie mithilfe von Nginx Reverse Proxy und Docker-Containern mehrere Webdienste auf demselben Server bereitstellen können. Linux-HandbuchDebdut Chakraborty

4. Aktualisieren Sie Ghost ohne Ausfallzeit

Wenn Sie einen Reverse-Proxy verwenden, ist die Aktualisierung Ihrer Ghost-Instanz ohne Ausfallzeiten ein Kinderspiel.

Hier ist, was ich empfehle. Richten Sie Docker Notify so ein, dass Sie über ein neues Docker-Image der Ghost-Instanz benachrichtigt werden (mit der neuesten Version von Ghost).

Dann können Sie diesem Tutorial folgen, um Ihren Docker-Container zu aktualisieren.

Aktualisieren von Docker-Containern ohne AusfallzeitEine Schritt-für-Schritt-Methode, die bei Ihren täglichen DevOps-Aktivitäten sehr hilfreich sein kann, ohne die unschätzbare Betriebszeit zu opfern. Linux-HandbuchAvimanyu Bandyopadhyay

Glücklicherweise gibt es absolut keine Ausfallzeit, wenn Sie das Update durchführen. Wenn Sie bereits beim Admin-Panel angemeldet sind (z. B. beim Verfassen eines Artikels), würden Sie keine Anomalien bemerken.

Wenn Sie jedoch nicht angemeldet sind, versucht das Admin-Panel, bis Sie den älteren Container nach dem Update entfernen, weiterhin, sich selbst zu laden, wenn Sie versuchen, sich neu anzumelden.

Aber im Sinne der Produktion wäre der Ghost-Blog selbst weiterhin am Front-End verfügbar, auch während Sie das Upgrade durchführen.

6. Legen Sie immer eine Neustartrichtlinie fest

Da Sie einen Ghost-Docker-Container verwenden, ist eine Neustartrichtlinie immer sehr wichtig und muss in Ihrer Konfiguration angegeben werden. Dadurch wird sichergestellt, dass sich Ihr Ghost-Container immer selbst neu startet, wenn Ihr physischer Server aufgrund eines Wartungsereignisses neu gestartet wurde.

Wenn für Ihre generische Docker-Konfiguration die Live-Wiederherstellung aktiviert ist, wird die Verwendung von on-failure empfohlen Richtlinie neu starten. Um die Neustartrichtlinien besser zu verstehen, sehen Sie bitte in der offiziellen Dokumentation nach, um eine vollständige Referenz zu solchen Richtlinien zu erhalten.

Normalerweise legen Sie eine solche Neustartrichtlinie im Dienst Ihrer Docker Compose-Datei wie folgt fest:

restart: on-failure
Docker-Neustartrichtlinie [mit Beispielen erklärt]Die Verwendung einer Neustartrichtlinie kann äußerst hilfreich sein, um Container bei bestimmten Ereignissen oder Fehlern automatisch neu zu starten. Linux-HandbuchAbhishek Prakash

7. Externe Docker-Volumes verwenden

Wenn Sie Volumes verwenden, die vor der Bereitstellung von Ghost manuell erstellt wurden, erleichtert dies die zukünftige Migration Ihrer Inhalte (innerhalb desselben oder eines anderen Servers). Es gibt Ihnen mehr Kontrolle über Ihre Daten, da Sie es sind, der das Volume zur Verwendung durch den Ghost-Container erstellt und angibt. Andernfalls müssten Sie es Docker Compose überlassen, um es lokal zu erstellen.

Um ein externes Docker-Volume für den Ghost-Container zu erstellen, verwenden Sie den folgenden Befehl:

docker volume create ghost

Wobei ghost ist der Name Ihres externen Docker-Ghost-Volumes.

Da ich bereits die Entscheidung für eine MySQL- oder MariaDB-Datenbank erwähnt habe, um eine bessere Leistung bei Tausenden von Benutzern zu gewährleisten, muss auch ihr Volume auf die gleiche Weise erstellt werden:

docker volume create ghostdb

Wo ghostdb ist der Name Ihres externen Docker-Ghost-Datenbank-Volumes.

Um Docker Compose anzuweisen, diese spezifischen Volumes zu verwenden, die Sie gerade oben erstellt haben, muss unser Abschnitt „Volumes“ in der Docker Compose-Datei wie folgt aussehen:

volumes:
  ghost:
    external: true
  ghostdb:
    external: true

Beachten Sie, wie ich angegeben habe, dass diese Docker-Volumes externer Natur sind.

Bonus-Tipp:Planen Sie regelmäßige Backups

Wenn Sie Linode, Digital Ocean oder einen anderen ähnlichen Cloud-Server-Anbieter verwenden, wird dringend empfohlen, immer Backups zu aktivieren, wenn Sie Ihren Server erstellen, um Ghost bereitzustellen.

Wenn Sie beispielsweise einen Server mit 1 GB RAM (genannt Nanode) auf Linode erstellen, finden Sie ein Kontrollkästchen, das Sie auffordert, Backups zu aktivieren. Wann immer Sie einen Produktionsserver bereitstellen, würde ich Ihnen immer empfehlen, ihn zu aktivieren, bevor Sie damit fortfahren, den Server tatsächlich für den ersten Start zu initiieren.

Außerdem können Sie ein Skript auf dem Server basierend auf einer Crontab bereitstellen, um manuell einen Snapshot Ihrer externen Docker-Volumes für Ghost zu erstellen.

Technisch gesehen die Volumendaten wie im vorherigen Punkt 7 besprochen, insbesondere ghost und ghostdb , befinden sich lokal unter /var/lib/docker/volumes/ghost/_data und /var/lib/docker/volumes/ghostdb/_data bzw. Um sie effektiv zu archivieren, können Sie tar verwenden, um diese beiden Verzeichnisse regelmäßig zu sichern.

Da wüsste man jetzt, wann diese tar Archive nach der Archivierung verfügbar wären, können Sie auch ein anderes Skript auf Ihrem lokalen System bereitstellen (von dem angenommen wird, dass es täglich zu einer bestimmten Zeit bei Ihnen zu Hause/im Büro live läuft), um per SSH auf den Ghost-Server zuzugreifen und diese Archive abzurufen. Auf diese Weise hätten Sie unabhängig von einem Internetzugang immer eine lokal aktualisierte Kopie Ihres Ghost-Blogs zur Verfügung.

Alternativ können Sie auch den logischen Backup-Ansatz zur Sicherung der MySQL-Datenbank mit dem Datenbankbefehl mysqldump verwenden. Bei MariaDB heißt der Befehl mariadb-dump was nichts anderes als ein symbolischer Link zu demselben mysqldump ist Befehl.

Einen hervorragenden Vergleich zwischen physischen und logischen Backups finden Sie hier.

Zähme den Geist

Das war eine Zusammenstellung verschiedener Ansätze, um mögliche Wartungsprobleme zu minimieren und zu verhindern, nachdem Sie Ihre Ghost-Instanz bereitgestellt haben. Ich hoffe, es ist hilfreich für Sie, wenn Sie Ihr eigenes Blog auf Ghost starten oder verwenden.

Wir werden unsere Reise mit Ghost fortsetzen und wenn wir auf ein anderes Problem stoßen, das mit einer anderen Konfiguration bei der Bereitstellung hätte vermieden werden können, werden wir diesen Artikel aktualisieren.

Wenn Sie Vorschläge zu den oben besprochenen Hinweisen haben oder neue haben, teilen Sie uns diese bitte im Abschnitt „Konversation“ unten mit. Wir würden uns freuen, mehr von Ihnen zu lesen und zu erfahren.


Docker
  1. 5 Tipps für den Einstieg in die Linux-Serversicherheit

  2. Weitere Tipps zum Packen Ihrer Linux-Software mit RPM

  3. 3 Strategien für automatisierte Produktionsbereitstellungen mit Docker

  4. 10 einfach zu befolgende Tipps zum Verwalten einer selbst gehosteten Nextcloud-Instanz mit Docker

  5. 7 nützliche Tipps zum Selbsthosten einer Ghost-Instanz mit Docker

Nützliche Meld-Tipps/Tricks für fortgeschrittene Benutzer

Docker-Leitfaden:Bereitstellen von Ghost Blog mit MySQL und Traefik mit Docker

5 Tipps zur Konfiguration von virtualenvs mit Ansible Tower

So scannen Sie Docker-Container-Images mit Trivy auf Schwachstellen

So automatisieren Sie Docker-Sicherheitsaudits mit Docker Bench for Security

Vollständiger Leitfaden für selbsthostendes Ghost-CMS mit Docker