Ghost als Alternative zu Wordpress

Ghost als Alternative zu Wordpress
Photo by Lauren Mancke / Unsplash

Ghost ist ein Blog CMS, das ebenso wie Wordpress Open Source ist. Obwohl Ghost bereits seit 2013 existiert, ist es in Deutschland immer noch recht unbekannt. Den Vorteil gegenüber Wordpress sehe ich in dem schlankem Design des CMS, das insbesondere ohne Plugins auskommt. Das Wegfallen von Plugins bedeutet vor allem, dass es keinen aufgeblähten Code und keine Inkompatibilitäten gibt. Der Ghost Code bleibt unverändert und schlank. Die gestiegene Performance ist sofort spürbar. Ghost möchte nicht nur eine Alternative zu Wordpress bieten, sondern Journalismus mit neuen Möglichkeiten der Monetarisierung ausstatten. Die dazu vorhandene Paywall mit Memberships wird von mir nicht verwendet.

Ghost kann online genutzt oder als Docker Image selbst gehosted werden. Für mein HomeLab mit Traefik und Portainer habe ich über Docker Compose eine Instanz installiert, auf dem dieser Blog läuft.

version: '3.7'

services:
  ghost:
    image: ghost:alpine
    container_name: ghost
    restart: unless-stopped

    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
      - internal
    environment:
      # see https://ghost.org/docs/config/#configuration-options
      - database__client=mysql
      - database__connection__host=ghost-db
      - database__connection__user=root
      - database__connection__password=$GHOST_DB_PASSWORD
      - database__connection__database=ghost
      - url=https://$GHOST_DOMAINNAME
    volumes:
      - content:/var/lib/ghost/content
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.ghost.rule=Host(`$GHOST_DOMAINNAME`)"
      - "traefik.http.routers.ghost.entrypoints=websecure"
      - "traefik.http.services.ghost.loadbalancer.server.port=2368"
      - "traefik.http.routers.ghost.service=ghost"
      - "traefik.http.routers.ghost.tls.certresolver=leresolver"
      - "traefik.docker.network=proxy"

    depends_on:
      - ghost-db

  ghost-db:
    image: mariadb:latest
    container_name: ghost-db
    restart: unless-stopped

    security_opt:
      - no-new-privileges:true
    networks:
      - internal
    environment:
      - MYSQL_ROOT_PASSWORD=$GHOST_DB_PASSWORD
    volumes:
      - db:/var/lib/mysql

volumes:
  content:
  db:

networks:
  proxy:
    external: true
  internal:
    external: false

Auch für dieses Projekt sind zwei Variablenwerte an die eigene Umgebung anzupassen.

GHOST_DOMAINNAME=blog.example.com
GHOST_DB_PASSWORD=geheim