3 min read

Q1, hoofdstuk 2: Een website opzetten met een domein en SSL in een Docker-container

Tijd om de eerste website op de VPS in te stellen, een domeinnaam toe te voegen en een SSL-certificaat te installeren. Ik ga Ghost CMS installeren.
Q1, hoofdstuk 2: Een website opzetten met een domein en SSL in een Docker-container
Photo by Nick Karvounis / Unsplash

Waarom Ghost CMS?

Mijn eerste website (1999) was gebouwd met StarOffice 4.0 en had HTML met frames. Rond 2002 stapte ik over naar een PHP-gebaseerd blogscript, heb kort Mambo/Joomla gebruikt en sinds 2009 gebruik ik WordPress voor de meeste van mijn websites. Tot voor kort.

WordPress is nog steeds een geweldig stuk software. Maar toen ik op zoek ging naar opties om een abonnementsmodel aan een van mijn sites toe te voegen, kwam ik Ghost tegen. Publicatiesoftware met ingebouwde nieuwsbrief- en abonnementsfunctionaliteit. Net als WordPress is Ghost open-source. Maar in tegenstelling tot WP heeft het geen uitgebreide bibliotheek met add-ons. Je zou kunnen zeggen dat dit een beperking is, maar omdat ik minder tijd wil besteden aan het onderhouden van mijn sites, sta ik open voor een eenvoudigere oplossing. En het lijkt gewoon alle functies te hebben die een van mijn sites nodig heeft.

Aangezien Ghost is gebouwd op Node.js, kan het niet worden geïnstalleerd op de meeste shared hostingpakketten. Perfect om de kracht van Docker te laten zien.

Ik faalde meerdere keren

Tot nu toe heb ik niet veel mislukkingen genoemd. Maar deze keer ging het meerdere keren mis! Waarom? Omdat het niet simpelweg kopiëren en plakken is, het is iets complexer.

🚨
Fout 1: Ik zocht een YAML-configuratie voor Ghost en kwam terecht op een blog met veel nuttige informatie. Echter, deze YML gebruikte MariaDB in plaats van het nu aanbevolen MySQL8. Dit werkt nog steeds, maar kan in de toekomst problemen opleveren.

Eerste stappen: de site opzetten

Ghost heeft, net als WordPress, een beheerde oplossing: Ghost (Pro). Dit is hun om de kosten te dekken. De open-source informatie vind je via Product > For Developers. Door op de installatie-instructies te klikken, word je doorgestuurd naar Docker Hub, een plek waar veel Docker-images zijn opgeslagen.

Het eerste deel van de beschrijving behandelt de CLI-installatie van Ghost, maar we slaan dat over en gaan direct naar het voorbeeld van een docker-compose.yml:

version: '3.1'

services:

  ghost:
    image: ghost:5-alpine
    restart: always
    ports:
      - 2369:2368
    environment:
      # see https://ghost.org/docs/config/#configuration-options
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: example
      database__connection__database: ghost
      # this url value is just an example, and is likely wrong for your environment!
      mail__transport: SMTP
      mail__options__host: xxx
      mail__options__port: xx
      mail__options__secureConnection: "true"
      mail__options__auth__user: xx
      mail__options__auth__pass: xx
      mail__from: xxx
      url: https://befrankwith.me
    volumes:
      - ghost:/var/lib/ghost/content

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db:/var/lib/mysql

volumes:
  ghost:
  db:

Wat gebeurt er in deze YML?

  • image: ghost:5-alpine → Dit verwijst naar de afbeelding die je wilt installeren.
  • ghost is de naam, 5 is de versie (je kunt ook een specifiekere versie gebruiken, zoals 5.85 of 5.85.1).
  • alpine verwijst naar een lichte Linux-versie.
This image is based on the popular Alpine Linux project⁠, available in the alpine official image. Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general. This variant is useful when final image size being as small as possible is your primary concern. The main caveat to note is that it does use musl libc⁠ instead of glibc and friends⁠, so software will often run into issues depending on the depth of their libc requirements/assumptions. See this Hacker News comment thread⁠ for more discussion of the issues that might arise and some pro/con comparisons of using Alpine-based images.

Als ik naar de verschillende images kijk, is het verschil ongeveer 170MB vs. 150MB. Op basis van testen kun je later altijd wisselen en - omdat ik de helft begrijp uit deze quote - heb ik besloten om het weg te laten.

  • Ports: Het eerste getal is de openbare poort. Als je meerdere (identieke) services draait, kun je dit aanpassen.
🚨
Fout 2: In plaats van het eerste poortnummer te wijzigen, veranderde ik de tweede. Nu kon mijn website geen verbinding maken met de database.

Kopieer dit naar Dockge in een nieuwe stack en vervang de placeholders.

    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_USER: root
      MYSQL_DATABASE: ghost
🚨
Fout 3: Als je de databasegebruiker en/of databasenaam wijzigt in de ghost-omgeving, moet je deze ook toevoegen aan de db-omgeving. Anders lijkt het niet te kunnen verbinden, waarschijnlijk vanwege standaardinstellingen.

Wat met de SMTP-instellingen?

Alle e-mails die Ghost verstuurt - behalve nieuwsbrieven - gaan via het e-mailaccount dat je hier instelt. Dit geldt voor systeemmails zoals import voltooid en voor e-mails naar nieuwe aanmeldingen of reacties.

Start de stack

Nu kun je de stack starten. De site is bereikbaar op http://<<VPS-IP>>:2369 (of een andere poort als je deze hebt aangepast).

🔹 Let op: Als iets niet werkt, zoals e-mails die niet verzonden worden, pas dan de YML aan, sla op en herstart de stack.

Domeinnaam en SSL instellen

  1. Ga naar de DNS-instellingen van je domeinnaam en voeg een A-record toe dat verwijst naar het IP-adres van je VPS.
    • Bijvoorbeeld: example.befrankwith.me A <<IP>>
  2. Ga naar je Nginx Proxy Manager (<<IP>>:81) en voeg de details toe. Gebruik het poortnummer voor Ghost uit de YML.
  3. In de tab SSL kun je een certificaat aanvragen. Dit zou nu moeten werken.