From 844a39a3884c0800d066d00d89ca3b5fd9b98b1a Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen.haas@lakedrops.com>
Date: Sun, 10 Jan 2021 17:41:25 +0100
Subject: [PATCH] composer/library/docker-traefik#6 Update traefik config to
 version 2

---
 .ahoy.l3d.yml                     |  4 ++++
 ahoy.traefik.yml                  |  5 +++++
 src/CommandProvider.php           |  1 +
 src/Handler.php                   | 33 ++++++++++++++++++++++-----
 src/TraefikRewriteCommand.php     | 37 +++++++++++++++++++++++++++++++
 src/UpdateCommand.php             |  5 -----
 templates/docker-compose.yml.twig | 31 +++++++++++++-------------
 7 files changed, 90 insertions(+), 26 deletions(-)
 create mode 100644 ahoy.traefik.yml
 create mode 100644 src/TraefikRewriteCommand.php

diff --git a/.ahoy.l3d.yml b/.ahoy.l3d.yml
index a763df4..0c697da 100644
--- a/.ahoy.l3d.yml
+++ b/.ahoy.l3d.yml
@@ -12,3 +12,7 @@ commands:
     imports:
       - ahoy.debug.yml
     usage: PHP debugging
+  traefik:
+    imports:
+      - ahoy.traefik.yml
+    usage: Traefik commands
diff --git a/ahoy.traefik.yml b/ahoy.traefik.yml
new file mode 100644
index 0000000..1bda0e5
--- /dev/null
+++ b/ahoy.traefik.yml
@@ -0,0 +1,5 @@
+ahoyapi: v2
+commands:
+  rewrite:
+    cmd: composer lakedrops:traefik:rewrite
+    usage: Pull files and DB from live site
diff --git a/src/CommandProvider.php b/src/CommandProvider.php
index fb14a2e..64796d0 100644
--- a/src/CommandProvider.php
+++ b/src/CommandProvider.php
@@ -14,6 +14,7 @@ class CommandProvider implements CommandProviderCapability {
    */
   public function getCommands(): array {
     return [
+      new TraefikRewriteCommand(),
       new UpdateCommand(),
     ];
   }
diff --git a/src/Handler.php b/src/Handler.php
index 24512e5..e3a62dc 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -272,6 +272,31 @@ class Handler extends BaseHandler {
     $this->gitIgnore('tests/backstop/backstop_data/html_report');
     $this->gitLFS('tests/backstop/**/*.png');
 
+    $this->updateTraefik(FALSE);
+
+    // Set permissions, see https://wodby.com/stacks/drupal/docs/local/permissions
+    exec('setfacl -dR -m u:$(whoami):rwX -m u:82:rwX -m u:100:rX -m g::rwX ' . $projectRoot . ' >/dev/null 2>&1');
+    exec('setfacl -R -m u:$(whoami):rwX -m u:82:rwX -m u:100:rX -m g::rwX ' . $projectRoot . ' >/dev/null 2>&1');
+  }
+
+  /**
+   * Configure Traefik on the host for all projects.
+   *
+   * @param bool $rewrite
+   *   Whether to rewrite existing Traefik config.
+   */
+  public function configureTraefik($rewrite = FALSE): void {
+    if (!$this->isDevMode()) {
+      return;
+    }
+    $this->init();
+    $this->updateTraefik($rewrite);
+  }
+
+  /**
+   * @param $rewrite
+   */
+  private function updateTraefik($rewrite): void {
     $traefik = new Traefik(
       $this->config->readValue('projectname'),
       $this->config->readValue(['traefik', 'domain']),
@@ -280,11 +305,7 @@ class Handler extends BaseHandler {
       $this->config->readValue(['traefik', 'cert']),
       $this->config->readValue(['traefik', 'key'])
     );
-    $traefik->update();
-
-    // Set permissions, see https://wodby.com/stacks/drupal/docs/local/permissions
-    exec('setfacl -dR -m u:$(whoami):rwX -m u:82:rwX -m u:100:rX -m g::rwX ' . $projectRoot . ' >/dev/null 2>&1');
-    exec('setfacl -R -m u:$(whoami):rwX -m u:82:rwX -m u:100:rX -m g::rwX ' . $projectRoot . ' >/dev/null 2>&1');
+    $traefik->update($rewrite);
   }
 
   /**
@@ -378,6 +399,8 @@ class Handler extends BaseHandler {
   }
 
   /**
+   * @param string $projectname
+   *
    * @return string
    */
   private function getDockerProxy(string $projectname): string {
diff --git a/src/TraefikRewriteCommand.php b/src/TraefikRewriteCommand.php
new file mode 100644
index 0000000..bc5752e
--- /dev/null
+++ b/src/TraefikRewriteCommand.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace LakeDrops\Docker4Drupal;
+
+use LakeDrops\Component\Composer\BaseCommand;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class TraefikRewriteCommand extends BaseCommand {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function configure() {
+    $this->setName('lakedrops:traefik:rewrite');
+    $this->setDescription('Rewrite Traefik config on this host.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getHandlerClass(): string {
+    return Handler::class;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function execute(InputInterface $input, OutputInterface $output): int {
+    parent::execute($input, $output);
+    /** @var Handler $handler */
+    $handler = $this->handler;
+    $handler->configureTraefik(TRUE);
+    return 0;
+  }
+
+}
diff --git a/src/UpdateCommand.php b/src/UpdateCommand.php
index d31572d..89f0b3c 100644
--- a/src/UpdateCommand.php
+++ b/src/UpdateCommand.php
@@ -3,7 +3,6 @@
 namespace LakeDrops\Docker4Drupal;
 
 use LakeDrops\Component\Composer\BaseCommand;
-use LakeDrops\Component\Composer\BaseHandlerInterface;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 
@@ -26,10 +25,6 @@ class UpdateCommand extends BaseCommand {
 
   /**
    * {@inheritdoc}
-   *
-   * @throws \Twig\Error\LoaderError
-   * @throws \Twig\Error\RuntimeError
-   * @throws \Twig\Error\SyntaxError
    */
   protected function execute(InputInterface $input, OutputInterface $output): int {
     parent::execute($input, $output);
diff --git a/templates/docker-compose.yml.twig b/templates/docker-compose.yml.twig
index 031f710..5a31ea8 100644
--- a/templates/docker-compose.yml.twig
+++ b/templates/docker-compose.yml.twig
@@ -82,8 +82,7 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`{{ projectname }}.{{ traefik.domain }}`)
-      #{% for domain in extradomains|default([]) %},{{ domain }}{% endfor %}'
+      traefik.http.routers.{{ projectname }}_{{ webserver.type }}.rule: Host(`{{ projectname }}.{{ traefik.domain }}`){% for domain in extradomains|default([]) %} || Host(`{{ domain }}`){% endfor %}'
 {% if varnish.enable %}
 
   varnish:
@@ -97,7 +96,7 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`varnish.{{ projectname }}.{{ traefik.domain }}`)
+      traefik.http.routers.{{ projectname }}_varnish.rule: Host(`varnish-{{ projectname }}.{{ traefik.domain }}`)
 {% endif %}
 
   redis:
@@ -111,8 +110,8 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`adminer.{{ projectname }}.{{ traefik.domain }}`)
-      #traefik.port: '9000'
+      traefik.http.services.{{ projectname }}_adminer.loadbalancer.server.port: 9000
+      traefik.http.routers.{{ projectname }}_adminer.rule: Host(`adminer-{{ projectname }}.{{ traefik.domain }}`)
 {% elseif dbbrowser.type == 'pma' %}
   pma:
     image: 'phpmyadmin/phpmyadmin:5'
@@ -125,7 +124,7 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`pma.{{ projectname }}.{{ traefik.domain }}`)
+      traefik.http.routers.{{ projectname }}_pma.rule: Host(`pma-{{ projectname }}.{{ traefik.domain }}`)
 {% endif %}
 {% if solr.enable %}
 
@@ -136,8 +135,8 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`solr.{{ projectname }}.{{ traefik.domain }}`)
-      #traefik.port: '8983'
+      traefik.http.services.{{ projectname }}_solr.loadbalancer.server.port: 8983
+      traefik.http.routers.{{ projectname }}_solr.rule: Host(`solr-{{ projectname }}.{{ traefik.domain }}`)
 {% endif %}
 
   mailhog:
@@ -145,8 +144,8 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`mailhog.{{ projectname }}.{{ traefik.domain }}`)
-      #traefik.port: '8025'
+      traefik.http.services.{{ projectname }}_mailhog.loadbalancer.server.port: 8025
+      traefik.http.routers.{{ projectname }}_mailhog.rule: Host(`mailhog-{{ projectname }}.{{ traefik.domain }}`)
 {% if node.enable %}
 
   nodejs:
@@ -156,8 +155,8 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`nodejs.{{ projectname }}.{{ traefik.domain }}`)
-      #traefik.port: '8080'
+      traefik.http.services.{{ projectname }}_nodejs.loadbalancer.server.port: 8080
+      traefik.http.routers.{{ projectname }}_nodejs.rule: Host(`nodejs-{{ projectname }}.{{ traefik.domain }}`)
     volumes:
       - {{ projectroot }}/{{ node.path }}:/app
     command: sh -c 'npm install && npm run start'
@@ -168,8 +167,8 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`front.{{ projectname }}.{{ traefik.domain }}`)
-      #traefik.port: '3000'
+      traefik.http.services.{{ projectname }}_node.loadbalancer.server.port: 3000
+      traefik.http.routers.{{ projectname }}_node.rule: Host(`front-{{ projectname }}.{{ traefik.domain }}`)
     expose:
       - '3000'
     volumes:
@@ -216,8 +215,8 @@ services:
     labels:
       traefik.enable: true
       traefik.network: {{ projectname }}
-      traefik.http.routers.whoami.rule: Host(`webgrind.{{ projectname }}.{{ traefik.domain }}`)
-      #traefik.port: '8080'
+      traefik.http.services.{{ projectname }}_webgrind.loadbalancer.server.port: 8080
+      traefik.http.routers.{{ projectname }}_webgrind.rule: Host(`webgrind-{{ projectname }}.{{ traefik.domain }}`)
     volumes:
       - {{ projectroot }}/files:/mnt/files
 {% endif %}
-- 
GitLab