Wie ich meine Blogs online stelle

Ghost-Blogging auf Internetserver mit Docker-Container. Einfache Installation, sicherer Betrieb.

Wie ich meine Blogs online stelle
Photo by Tandem X Visuals / Unsplash

In diesem Blog-Post werde ich beschreiben, wie Ghost, eine beliebte Blogging-Plattform, mithilfe von Docker-Compose auf einem Internetserver installiert werden kann und wie schnell damit ein Blog online gestellt werden kann. In meinem Beitrag über den sicheren Betrieb eines Webservers habe ich bereits das Fundament für einen modularen Aufbau von Webdiensten beschrieben.

Eigener Webserver mit offiziellen Zertifikaten
Der Basis-Artikel für alle folgenden Services, die ich hier demonstrieren werde…

Container hinzufügen

Das Hinzufügen der Ghost-Blogging-Plattform ist daher wieder besonders einfach. Wir fügen dem docker-compose.yml-File einen weiteren Abschnitt hinzu:

  ghost:
    image: ghost:alpine
    container_name: ghost
    depends_on:
      - nginx-proxy-manager
      - ghost_mysql
    environment:
      url: https://blog.meister-security.de
      database__client: mysql
      database__connection__host: ghost_mysql
      database__connection__user: root
      database__connection__password: giuzghgfasdofiuhb226
      database__connection__database: ghost
    volumes:
      - ./ghost:/var/lib/ghost/content
    restart: unless-stopped
    labels:
        - "com.centurylinklabs.watchtower.enable=true"
    networks:
      - web
      - backend

  ghost_mysql:
    image: mysql:8
    container_name: ghost_mysql
    expose:
      - 3306
    environment:
      MYSQL_DATABASE: ghost
      MYSQL_ROOT_PASSWORD: giuzghgfasdofiuhb226
    volumes:
      - ./mysql:/var/lib/mysql
    restart: unless-stopped
    networks:
      - backend

Ghost besteht aus zwei Komponenten:

  • Ghost selbst
  • Eine Datenbank

Damit ich diesen Dienst wieder über den nginx-proxy-manager mit gültigen https-Zertifikaten anbieten kann, habe ich ihn in das interne Netzwerk web gehängt. Und schließlich befinden sich sowohl Ghost als auch die Datenbank im Netzwerk backend, welches aus Sicherheitsgründen nicht aus den vorgelagerten Netzen erreichbar ist.

Die internen Netze hatten wir bereits angelegt. Aus Sicht des Compose-Files sind diese Netze also bereits vorhanden und somit external. Verwirrend - ich weiß. Ansonsten würden die Container ihre eigenen Netze anlegen und wären z.B. für einen Reverse-Proxy mangels Konnektivität nicht erreichbar.

Gut ist auch, dass die Ports 2368 und 3306 nicht ins Internet freigegeben werden, sondern nur im jeweiligen Docker-Netzwerk. Also die Datenbank läuft im backend und die Webservices im Netzwerk web, vor dem der Reverse-Proxy steht.

Ghost starten

In dem Verzeichnis, in dem sich die docker-compose.yml-Datei befindet, führen wir, wie schon bei den anderen Diensten, den folgenden Befehl aus, um Ghost zu starten:

docker-compose up -d ghost

Die Datenbank wird automatisch mitgestartet, da wir Ghost mitgegeben haben, dass eine Abhängigkeit besteht.

Domain-Name im Reverse-Proxy hinzufügen

Wie schon bei den vorigen Services fügen wir im nginx-proxy-manager eine neue URL hinzu, unter der der Blog erreichbar sein soll.

Ich wähle blog.meine.domain.de und leite diese an ghost auf Port 2368 weiter. Nachdem nginx-proxy-manager die Zertifikate abgerufen hat, ist ghost online.

Die Grundkonfiguration

Nachdem man nun die Webseite von Ghost aufgerufen hat ( /ghost/ anhängen nicht vergessen!), kann man das Aussehen anpassen:

Eine oft übersehene Option ist Code injection. Eine tolle Ergänzung ist dabei Syntax-Highlighting. Dazu macht man folgende Anpassungen.

Site Header:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/themes/prism-tomorrow.min.css" integrity="sha512-vswe+cgvic/XBoF1OcM/TeJ2FW0OofqAVdCZiEYkd6dwGXthvkSFWOoGGJgS2CW70VK5dQM5Oh+7ne47s74VTg==" crossorigin="anonymous" referrerpolicy="no-referrer" />

<style>
  pre[class*="language-"] {
      font-size: 0.75em;
  }
</style>

Site Footer:

<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/components/prism-core.min.js" integrity="sha512-9khQRAUBYEJDCDVP2yw3LRUQvjJ0Pjx0EShmaQjcHa6AXiOv6qHQu9lCAIR8O+/D8FtaCoJ2c0Tf9Xo7hYH01Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.28.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-fTl/qcO1VgvKtOMApX2PdZzkziyr2stM65GYPLGuYMnuMm1z2JLJG6XVU7C/mR+E7xBUqCivykuhlzfqxXBXbg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

Um nun Quelltexte optisch ansprechend zu veröffentlichen, schreibt man einfach

```bash
 oder
```yml
  oder
```python

Sobald man Return drückt, landet man in einem Code Editor und kann den Sourcecode eingeben. Jetzt, da Ghost einsatzbereit ist, können wir einen Post erstellen.

Post hinzufügen

Um einen neuen Post zu schreiben, klicken wir auf New post:

Hinter dem Icon rechts neben Add feature image verbirgt sich Unsplash, eine Copyrightfreie Bildersammlung. So lassen sich leicht thematisch passende Bilder hinzufügen:

Und los geht´s. Man kann seinen Gedanken freien Lauf lassen. Es lassen sich auch viele verschiedene Objekt-Typen integrieren. Jetzt nurnoch auf Publish drücken, und schon ist der Post online:

Die Veröffentlichungen lassen sich so auch planen. Falls man im Urlaub ist, werden so auch vorbereitete Posts online gestellt.

Fazit

Da wir von Anfang an unseren Server modular und strukturiert aufgesetzt haben, ist es nun besonders leicht, weitere Dienste anzubieten. Letztlich haben wir ja nur das docker-compose.yml-File erweitert und eine URL dafür definiert. Das Erstellen von Blogs wurde dadurch zum Kinderspiel. So kann man sich stets auf die eigentliche Aufgabe konzentrieren, denn die Administration/Updates erledigt sich ja fast von selbst...