Ghost op een TransIP VPS

Ghost op een TransIP VPS
Photo by Aaron Burden / Unsplash

Waar Wordpress draait op PHP en MySQL maakt Ghost gebruik van NodeJS en MySQL. Dit vergt een andere manier van hosten en dus ook een aantal nieuwe uitdagingen. Nou ben ik redelijk bekend met NodeJS en het draaien van Docker containers voor dergelijke oplossingen, maar toch heeft het aardig wat tijd gekost om het zaakje netjes te krijgen. De uitdaging zat vooral in de mail configuratie in samenspel met de Transip vps mail relay.

Gmail desktop app on MacBook.
Photo by Justin Morgan / Unsplash

Docker Compose

Laten we vooraf beginnen met het draaien van de containers die nodig zijn voor de hosting van Ghost. Ik laat de reverse Proxy buiten de scope van dit stuk, er is genoeg te vinden over oplossingen als Nginx Proxy Manager bijvoorbeeld.

Ter verduidelijking, de containers die via web benaderbaar moeten zijn hangen in een gedeeld Docker netwerk en via de reverse proxy worden de diverse sites naar buiten ontsloten.

version: '3'

services:
  ghost:
    container_name: ghost
    depends_on:
      - db
    image: ghost:5-alpine
    restart: always
    environment:
      - database__client=${databaseclient}
      - database__connection__host=${databasehost}
      - database__connection__user=${databaseuser}
      - database__connection__password=${databasepass}
      - database__connection__database=${databasename} 
      - spam__user_login__minWait=600
      - spam__user_login__maxWait=600000
      - spam__user_login__freeRetries=5
      - url=https://hermanronk.nl
      - mail__transport=SMTP
      - mail__from=${mailfrom}
      - mail__options__host=${mailserver}
      - mail__options__port=${mailport}
      - mail__options__auth__user=${mailuser}
      - mail__options__auth__pass=${mailpass}
    volumes:
      - <lokaal pad op server>:/var/lib/ghost/content
    networks:
      - proxy_default
      - internal_network

  db:
    image: mysql:latest
    container_name: db
    restart: always
    volumes:
      - <lokaal pad op server>:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${dbroot}
      - MYSQL_DATABASE=${databasename} 
      - MYSQL_USER=${databaseuser}
      - MYSQL_PASSWORD=${databasepass}
    networks:
      - dpnet
      - internal_network

networks:
  proxy_default:
    external:
      name: proxy_default
  internal_network:
    driver: bridge

Een deel van de waarden kan je in een .env file (of iets van die strekking) meegeven zodat je in de docker-compose file zelf geen gevoelige gegevens hoeft te zetten. Daarnaast heb je voor de twee volumes nog lokale paden op de server nodig voor het opslaan van de data.

mailserver=vps.transip.email
mailport=587
mailuser=***@vps.transip.email
mailpass=***
databaseclient=mysql
databasehost=db
databaseuser=***
databasename=***
databasepass=***
dbroot=***
mailfrom=***@***

Mailen

Voor het gebruik van Ghost maak je gebruik van twee mailstromen. De individuele mails gaan via SMTP en de bulk mals moeten via API naar bijvoorbeeld Mailgun. Allereerst het mailen via SMTP, wanneer je bij Transip een VPS afneemt kan je gebruik maken van hun mail relay service. Het is ook zeker aan te raden om dit te doen om gedoe met blacklists en veel configuratie werk voor je eigen oplossing te voorkomen.

Je kan deze service ook prima gebruiken naast je eigen maildientsn. Zo gebruik ik voor dit domein Micorosoft 365 voor mail, Mailgun voor bulk mail (via een subdomein, mail.hermanronk.nl) en dus de Transip relay voor het verzenden van de reguliere mails.

SMTP

Voor het mailen via de mail relay van Transip moet je een aantal DNS records aanmaken, dit staat hier allemaal prima uitgelegd. Voor de Docker/Ghost instellingen is voornamelijk dit stuk uit de docker-compose file van belang:

  - mail__transport=SMTP
  - mail__from=${mailfrom}
  - mail__options__host=${mailserver}
  - mail__options__port=${mailport}
  - mail__options__auth__user=${mailuser}
  - mail__options__auth__pass=${mailpass}

Hier horen dan deze settings bij:

mailserver=vps.transip.email
mailport=587
mailuser=***@vps.transip.email
mailpass=***
mailfrom=***@***

Hiermee zouden directe mails (als je de DNS goed ingesteld hebt) meteen goed moeten werken.

Bulk (API)

De mailconfiguratie voor nieuwsbrieven loopt volledig via de beheer interface (gelukkig), de instellingen hiervoor vind je onder de "Email newsletter" settings:

Ghost admin interface

En dan de mailgun configuratie:

Ghost mailgun instellingen

De uitdaging met Mailgun is dat de "gratis" versie inmiddels erg goed verstopt zit. De oplossing hier is om een trial abonnement af te sluiten. Deze kan je vervolgens meteen weer opzeggen. Bij het opzeggen wordt je account omgezet naar een pay as you go abonnement, in dit abonnement krijg je grofweg 500 gratis mails per maand, wat in mijn geval voldoende is.

Tot slot

Dit is niet bedoeld als volledige tutorial, maar het zijn de delen die het meeste uitzoekwerk hebben gekost. Hopelijk helpt het iemand met het instellen van een eigen Ghost instance.