Laradock mit Traefik nutzen (und HTTPS)

October 20, 2018 by Dimi

Other languages: fr en

Setup overview

Abbildung 1: Laradock und Traefik

Die Entwicklung mit Laravel ist dank des ausgezeichneten Ecosystems hervorragend und auch sehr bequem. Dank Homestead oder Valet (allerdings nur für Mac) erhält man eine Arbeitsumgebung und kann direkt losstarten. Mit Docker ist es jedoch noch bequemer geworden, spätestens mit Laradock. Hierbei lassen sich die einzelnen Services nicht nur schnell zu- und abschalten, sondern auch viele Konfigurationen oder auch Umgebungen lassen sich wie mit git verwalten. Aber auch hier gibt es einen kleinen Nachteil - man verwendet localhost:port, um auf den jeweiligen Dienst zuzugreifen. Zwar kann man auch etwas in die hosts Datei (z.B. laradock.local) eintragen, aber die Ports bleiben. Obwohl es in der docker-compose.yml Einträge für Proxy, Varnish und mehr gibt, habe ich mich gefragt, wieso hier Traefik fehlt.

Wieso es uns recht nützlich sein könnte, beschreibe ich nun im weiteren Verlauf. Aber zuerst machen wir einen kleinen Sprung zu DNS.

DNS

Eine Website oder ein SaaS ist normalerweise unter einer Domain, wie z.B. audk.at, verfügbar. Handelt es sich um ein größeres Projekt, so gibt es u.U. auch so etwas wie testing.audk.at oder staging.audk.at. Lokal wird jedoch oft so etwas wie audk.dev oder audk.local verwendet. Wieso eigentlich nicht *.dev.audk.at? Wir könnten ja 127.0.0.1 eintragen und zudem auch noch über echte Let’s Encrypt Zertifikate arbeiten! Feine Sache, machen wir das mal.

Hierzu benutze ich mal docker, um mir manuell ein Wildcard-Zertifikat über LE zu holen.

$ docker run -it --rm --name letsencrypt \
    -v "$PWD/le/config:/etc/letsencrypt" \
    -v "$PWD/le/work:/var/lib/letsencrypt" \
    quay.io/letsencrypt/letsencrypt:latest \
        certonly \
        -d dev.audk.at \
        -d *.dev.audk.at \
        --manual \
        --preferred-challenges dns \
        --server https://acme-v02.api.letsencrypt.org/directory

Sobald dieser Vorgang erfolgreich abgeschlossen ist, kann man das Zertifikat mit Traefik nutzen.

Tipp: Wenn man seine Domain bei gewissen Anbietern hat, welche auch eine API anbieten, kann dieser Vorgang mit Traefik automatisiert werden

Traefik

Definieren wir mal eine docker-compose.yml mit traefik als unseren LB. Hier geben wir auch gleich die Subdomain an, unter welcher das Dashboard erreichbar ist.

version: '3'
services:
  traefik:
    image: traefik:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
      - $PWD/le/config/live/dev.audk.at/cert.pem:/cert.pem
      - $PWD/le/config//live/dev.audk.at/privkey.pem:/key.pem
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    labels:
      - "traefik.port=8080"
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:lb.dev.audk.at"
      - "traefik.docker.network=proxy"

networks:
  proxy:
    external:
      name: proxy

Tipp: Das Netzwerk proxy wurde vorher angelegt

Laradock

Sobald wir den LB laufen haben, können wir die einzelnen Services mit Laradock starten. Hierbei ist zu beachten, dass man in der .env keine Ports 80/443 mehr verwendet, da diese vom LB belegt sind. Wenn wir nun aber die Services, so wie beschrieben, starten, bringt uns das nicht wirklich viel. Unter welcher Subdomain wären denn die einzelnen Services, wie z.B. nginx oder mailhog, erreichbar? Man denkt wohl zuerst, dass Veränderungen an der docker-compose.yml im laradock-Ordner nötig wären. Wir erinnern uns aber, dass man die Konfigurationen auch ergänzen kann. So legt man eine docker-compose.override.yml im laradock-Ordner (oder im eigenen Dev-Repo, hier ist man frei) an. Der Inhalt kann ungefähr so aussehen:

version: '3'

networks:
  proxy:
    external: true

services:

### NGINX Server #####################################################
    nginx:
      networks:
        - proxy
      labels:
        - "traefik.port=80"
        - "traefik.enable=true"
        - "traefik.frontend.rule=Host:api.dev.audk.at"
        - "traefik.docker.network=proxy"
...

Gestartet werden die Services nun jedoch etwas anders und zwar mit (z.B.) docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d nginx postgres redis mailhog. Nun kann man entweder den Browser öffnen und https://api.dev.audk.at eingeben oder mit Postman auf eine API über HTTPS zugreifen.

Tipp: In der docker-compose.override.yml können auch andere zusätzliche Services definiert werden, wie z.B. Keycloak

Copyright © 2018 Dimitrij Klesev | Hucore theme & Hugo