From 55d692b4d0f1add7761d1f6032fcf3232c8fe386 Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen@paragon-es.de>
Date: Tue, 29 Dec 2020 11:24:58 +0100
Subject: [PATCH] docker/l3d#48 Add support for reverse proxy

---
 README.md                          |  1 +
 src/Handler.php                    | 34 ++++++++++++++++++++++++++++++
 templates/settings.docker.php.twig |  4 ++++
 3 files changed, 39 insertions(+)

diff --git a/README.md b/README.md
index d9b2b2c..a8ca9c3 100644
--- a/README.md
+++ b/README.md
@@ -191,6 +191,7 @@ docker4drupal:
   ci_home: /home/gitlab-runner
   docker0:
     ip: [IP OF YOUR DOCKER HOST]
+    proxy: [IP OF TRAEFIK PROXY]
   live:
     root: ''
     uri: ''
diff --git a/src/Handler.php b/src/Handler.php
index 3babb82..542a79c 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -38,6 +38,9 @@ class Handler extends BaseHandler {
         'ip' => ($this->isCiContext() || $this->isLocalDevMode()) ?
           $this->getDockerGateway() :
           $this->getLocalIpv4('docker0'),
+        'proxy' => ($this->isCiContext() || $this->isLocalDevMode()) ?
+          $this->getDockerProxy($projectname) :
+          FALSE,
       ],
       'live' => [
         'root' => '',
@@ -358,6 +361,18 @@ class Handler extends BaseHandler {
     return $container['NetworkSettings']['Gateway'];
   }
 
+  /**
+   * @return string
+   */
+  private function getDockerProxy(string $projectname): string {
+    foreach ($this->readNetworkConfig($projectname)['Containers'] as $container) {
+      if (isset($container['Name']) && $container['Name'] === 'traefik_traefik_1') {
+        return explode('/', $container['IPv4Address'])[0];
+      }
+    }
+    return '127.0.0.1';
+  }
+
   /**
    * @param $projectRoot
    *
@@ -402,4 +417,23 @@ class Handler extends BaseHandler {
     ];
   }
 
+  /**
+   * @param string $projectname
+   *
+   * @return array
+   */
+  private function readNetworkConfig(string $projectname): array {
+    try {
+      $output = [];
+      exec('docker network inspect traefik_' . $projectname, $output);
+      return json_decode(implode('', $output), TRUE)[0];
+    }
+    catch (Exception $ex) {
+      // Ignore.
+    }
+    return [
+      'Containers' => [],
+    ];
+  }
+
 }
diff --git a/templates/settings.docker.php.twig b/templates/settings.docker.php.twig
index ac1fc19..a9cac93 100644
--- a/templates/settings.docker.php.twig
+++ b/templates/settings.docker.php.twig
@@ -1,6 +1,10 @@
 <?php
 
 {% if drupal.version >= 8 %}
+{% if docker0.proxy %}
+$settings['reverse_proxy'] = TRUE;
+$settings['reverse_proxy_addresses'] = array("{{ docker0.proxy }}");
+{% endif %}
 $settings['trusted_host_patterns'] = array(
   '^{{ projectname }}\.docker\.localhost$',
   '^{{ webserver.type }}$',
-- 
GitLab