Warum L0pb?
L0pb.me ist ein Service, der eine Loopback-Verbindung zu Localhost ermöglicht. Alle *.l0pb.dev
und *.l0pb.me
-Domains verweisen grundsätzlich auf 127.0.0.1
, den localhost
. Dies ist ähnlich wie bei Diensten wie traefik.me oder nip.io. Dadurch wird die lokale Entwicklung, einschließlich der Verwendung von Zertifikaten, erheblich vereinfacht.
www.l0pb.me | löst auf nach | 127.0.0.1 |
meineseite.l0pb.me | löst auf nach | 127.0.0.1 |
www.l0pb.dev | löst auf nach | 127.0.0.1 |
meineseite.l0pb.dev | löst auf nach | 127.0.0.1 |
HTTPS-Unterstützung!
Dank Let’s Encrypt ist ein Wildcard-Zertifikat für *.l0pb.dev
und *.l0pb.me
verfügbar.
Lokale Entwicklung
Dieses Projekt ähnelt dem Projekt "DDEV", ist jedoch wesentlich weniger aufwendig und komplex. Es ist für die einfache lokale Entwicklung konzipiert. Das einzige, was dafür benötigt wird, ist das l0pb-traefik Image, ein angepasstes und vorkonfiguriertes Traefik-Image.
Um L0pb lokal zu nutzen, muss zunächst folgendes docker-compose.yml
auf der lokalen Umgebung ausgeführt werden:
services:
traefik:
container_name: l0pb-traefik
hostname: l0pb-traefik
image: psycho0verload/l0pb-traefik
labels:
traefik.docker.network: proxy
traefik.enable: "true"
traefik.http.routers.traefik.entrypoints: websecure
traefik.http.routers.traefik.rule: Host(`traefik.l0pb.me`) || Host(`traefik.l0pb.dev`)
traefik.http.routers.traefik.service: api@internal
traefik.http.routers.traefik.tls: "true"
traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly: "true"
traefik.http.services.traefik.loadbalancer.sticky.cookie.secure: "true"
networks:
proxy:
ipv4_address: 172.30.255.254
# Feste-IP am Ende der Range von 172.30.0.0/16
# Diese kann für Projekte auch als Proxy-Adresse verwendet werden
ports:
- mode: host
target: 80
published: "80"
protocol: tcp
- mode: host
target: 443
published: "443"
protocol: tcp
restart: unless-stopped
security_opt:
- no-new-privileges:true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./log/traefik/:/var/log/traefik/
mailhog:
image: mailhog/mailhog
hostname: l0pb-mailhog
container_name: l0pb-mailhog
restart: unless-stopped
labels:
traefik.docker.network: proxy
traefik.enable: "true"
traefik.http.routers.mailhog.entrypoints: websecure
traefik.http.routers.mailhog.rule: Host(`mailhog.l0pb.me`) || Host(`mailhog.l0pb.dev`)
traefik.http.routers.mailhog.tls: "true"
traefik.http.routers.mailhog.service: mailhog
traefik.http.services.mailhog.loadbalancer.server.port: "8025"
networks:
proxy:
networks:
proxy:
name: proxy
driver: bridge
ipam:
config:
- subnet: 172.30.0.0/16
attachable: true
Die docker-compose.yml
-Datei in einem Verzeichnis ablegen und anschließend mit dem Befehl docker compose up -d
starten. Sobald der Container geladen und gestartet ist, kann über https://traefik.l0pb.dev
bzw. https://traefik.l0pb.me
überprüft werden, ob das Projekt grundsätzlich funktioniert. Wird das Traefik-Dashboard angezeigt, funktioniert das Projekt:
Traefik ist ein Reverse Proxy, der in diesem Projekt für die Ports 80
und 443
genutzt wird. Diese Ports können jeweils nur einem einzigen Container zugewiesen werden. Um jedoch mehrere Projekte gleichzeitig verfügbar zu machen und diese über die genannten Ports zugänglich zu machen, wird Traefik verwendet. Der Reverse Proxy bindet die Ports an den l0pb-traefik
Container. Dadurch müssen in den jeweiligen Projekten keine Ports freigegeben werden, da dies sonst zu Konflikten führt und die Konfiguration nicht funktioniert. Nachfolgend ein Beispiel für die Verwendung mit nginx
.
Beispiel
services:
webserver:
image: nginx
ports:
- "80:80"
networks:
default:
networks:
default:
Ports entfernen
services:
webserver:
image: nginx
networks:
default:
networks:
default:
Es ist grundsätzlich keine explizite Portfreigabe erforderlich. Auch für Datenbanken ist keine Portfreigabe notwendig, solange sich die Datenbank im selben Netzwerk befinden wie das Projekt.
Labels und Netzwerk hinzufügen
services:
webserver:
image: nginx
labels:
traefik.docker.network: proxy
traefik.enable: "true"
traefik.http.routers.projektname.entrypoints: websecure
traefik.http.routers.projektname.rule: Host(`projektname.l0pb.dev`)
traefik.http.routers.projektname.tls: "true"
traefik.http.routers.projektname.service: projektname
traefik.http.services.projektname.loadbalancer.server.port: "80"
networks:
default:
proxy:
networks:
default:
proxy:
external: true
Projektname
Der Platzhalter
projektname
wird durch den tatsächlichen Projektnamen ersetzt. Beispiel:traefik.http.routers.mein-nginx.service: mein-nginx
Der Projektname muss eindeutig (unique) sein. Kein anderes Projekt darf denselben Namen verwenden.
Domainname
Der Domainname wird unter
Host(`projektname.l0pb.dev`)
festgelegt. Dieser Domainname muss ebenfalls eindeutig sein, kann aber unabhängig vom Projektnamen gewählt werden. Wichtig sind die Backticks`
.Mehrere Domainnamen für denselben Port
Um für denselben Port mehrere Domains zu nutzen, kann folgende Konfiguration verwendet werden:
Host(`projektname.l0pb.dev`) || Host(`projektname.l0pb.me`)
.traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.projektname.entrypoints: websecure traefik.http.routers.projektname.rule: Host(`projektname.l0pb.dev`) || Host(`projektname.l0pb.me`) traefik.http.routers.projektname.tls: "true" traefik.http.routers.projektname.service: projektname traefik.http.services.projektname.loadbalancer.server.port: "80"
Verschiedene Domainnamen für unterschiedliche Ports
Um für ein einzelnes Projekt mehrere HTTP-Ports zu nutzen, sieht die Konfiguration wie folgt aus:
traefik.docker.network: proxy traefik.enable: "true" traefik.http.routers.projektname.entrypoints: websecure traefik.http.routers.projektname.rule: Host(`projektname.l0pb.dev`) traefik.http.routers.projektname.tls: "true" traefik.http.routers.projektname.service: projektname traefik.http.services.projektname.loadbalancer.server.port: "80" traefik.http.routers.projektname1.entrypoints: websecure traefik.http.routers.projektname1.rule: Host(`projektname.l0pb.me`) traefik.http.routers.projektname1.tls: "true" traefik.http.routers.projektname1.service: projektname1 traefik.http.services.projektname1.loadbalancer.server.port: "8080"
In dieser Konfiguration greift die Domain
projektname.l0pb.dev
auf Port80
zu, während die Domainprojektname.l0pb.me
auf Port8080
zugreift. Beide Zugriffe erfolgen über HTTPS.Weitere Details
Weitere Informationen an dieser Stelle finden sich in der offiziellen Dokumentation von Traefik
HTTP-Port
Unter
traefik.http.services.projektname.loadbalancer.server.port: "80"
wird der HTTP-Port des Projekts angegeben.Zertifikat
Das Zertifikat wird durch den Reverse Proxy bereitgestellt, sodass die Webseite im Browser automatisch über HTTPS aufgerufen wird.
MailHog nutzen
MailHog ist ebenfalls im proxy
-Netzwerk integriert. Dadurch ist es für alle Container, die sich im proxy
-Netzwerk befinden, unter dem Hostnamen l0pb-mailhog
bzw. im Browser unter mailhog.l0pb.dev
und mailhog.l0pb.me
erreichbar. Ein Beispiel für die Nutzung wäre: /usr/sbin/sendmail -S l0pb-mailhog:1025
.
Hier ein Beispiel für eine lokale WordPress Docker Umgebung mit dem L0pb-Projekt, welche über https://wordpress.l0pb.dev
verfügbar ist:
services:
wordpress:
image: wordpress
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: wordpress-db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: wordpress
volumes:
- ./app:/var/www/html
labels:
traefik.docker.network: proxy
traefik.enable: "true"
traefik.http.routers.wordpress.entrypoints: websecure
traefik.http.routers.wordpress.rule: Host(`wordpress.l0pb.dev`)
traefik.http.routers.wordpress.tls: "true"
traefik.http.routers.wordpress.service: wordpress
traefik.http.services.wordpress.loadbalancer.server.port: "80"
networks:
default:
proxy:
wordpress-db:
image: mariadb:10.6-focal
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./database:/var/lib/mysql
networks:
default:
networks:
proxy:
external: true
In diesem Beispiel wird deutlich, dass die Datenbank keine Portfreigabe benötigt, da wordpress
und wordpress-db
sich im selben Docker-Netzwerk default
befinden. Die Datenbank ist innerhalb dieses Netzwerks über ihren Hostnamen wordpress-db
erreichbar. Die Datenbank exposed ihren normalen Port innerhalb des Docker-Netzwerks und nicht nach außen hin. So können auch beliebig viele Datenbanken gleichzeitig betrieben werden.