__/\\\_________________/\\\\\\\___________________/\\\_________________________________________________        
 _\/\\\_______________/\\\/////\\\________________\/\\\_________________________________________________       
  _\/\\\______________/\\\____\//\\\___/\\\\\\\\\__\/\\\_________________________________________________      
   _\/\\\_____________\/\\\_____\/\\\__/\\\/////\\\_\/\\\_________________/\\\\\__/\\\\\_______/\\\\\\\\__     
    _\/\\\_____________\/\\\_____\/\\\_\/\\\\\\\\\\__\/\\\\\\\\\_________/\\\///\\\\\///\\\___/\\\/////\\\_    
     _\/\\\_____________\/\\\_____\/\\\_\/\\\//////___\/\\\////\\\_______\/\\\_\//\\\__\/\\\__/\\\\\\\\\\\__   
      _\/\\\_____________\//\\\____/\\\__\/\\\_________\/\\\__\/\\\_______\/\\\__\/\\\__\/\\\_\//\\///////___  
       _\/\\\\\\\\\\\\\\\__\///\\\\\\\/___\/\\\_________\/\\\\\\\\\___/\\\_\/\\\__\/\\\__\/\\\__\//\\\\\\\\\\_ 
        _\///////////////_____\///////_____\///__________\/////////___\///__\///___\///___\///____\//////////__           
        

L0pb - Loopback

Loopback für deine lokale Entwicklung!

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.melöst auf nach127.0.0.1
meineseite.l0pb.melöst auf nach127.0.0.1
www.l0pb.devlöst auf nach127.0.0.1
meineseite.l0pb.devlöst auf nach127.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 Port 80 zu, während die Domain projektname.l0pb.me auf Port 8080 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.