From 668a736ae36a2a39280aede832f85fd116199f5e Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen@paragon-es.de>
Date: Wed, 12 Apr 2017 15:02:14 +0200
Subject: [PATCH] Move Traefik container into central standalone project and
 increase Drush functionality

---
 src/Handler.php                    | 59 +++++++++++++++++++++++++++---
 templates/.env.twig                |  2 +
 templates/aliases.drushrc.php.twig | 13 +++++++
 templates/docker-compose.yml.twig  | 27 ++++----------
 templates/drushrc.php.twig         |  7 ++++
 templates/settings.docker.php.twig |  7 +---
 6 files changed, 85 insertions(+), 30 deletions(-)
 create mode 100644 templates/.env.twig
 create mode 100644 templates/aliases.drushrc.php.twig
 create mode 100644 templates/drushrc.php.twig

diff --git a/src/Handler.php b/src/Handler.php
index 655d164..c60100c 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -12,8 +12,7 @@ use Composer\Composer;
 use Composer\IO\IOInterface;
 use Composer\Script\Event as ScriptEvent;
 use Symfony\Component\Filesystem\Filesystem;
-use Rych\Random\Random;
-use Rych\Random\Encoder\Base64Encoder;
+use Symfony\Component\Yaml\Yaml;
 
 class Handler {
 
@@ -135,20 +134,60 @@ class Handler {
     if ($fs->exists(($settingsPhpFile))) {
       $settingsPhp = file_get_contents($settingsPhpFile);
       if (strpos($settingsPhp, 'settings.docker.php') === FALSE) {
-        $settingsPhp .= "\n\nif (file_exists(__DIR__ . '/settings.docker.php')) {include __DIR__ . '/settings.docker.php';}\n";
+        $settingsPhp .= "\n\nif (file_exists(__DIR__ . '/settings.docker.php')) {\n  include __DIR__ . '/settings.docker.php';\n}\n";
         file_put_contents($settingsPhpFile, $settingsPhp);
       }
     }
 
     // Initialize local git working copy
     try {
-      $this->git('ignore docker-compose.yml');
-      $this->git('ignore settings.docker.php');
+      foreach ($this->getFiles($projectRoot, $webRoot, $settingsPath) as $template => $def) {
+        $this->git('ignore ' . $template);
+      }
     }
     catch (\Exception $ex) {
       // We're ignoring this for now
     }
 
+    // Update host wider traefik container
+    $traefikPath = $_SERVER['HOME'] . '/.traefik';
+    $traefikFile = $traefikPath . '/docker-compose.yml';
+    if ($fs->exists($traefikFile)) {
+      $traefik = Yaml::parse(file_get_contents($traefikFile));
+    }
+    else {
+      $fs->mkdir($traefikPath);
+      $traefik = [
+        'version' => '2',
+        'services' => [
+          'traefik' => [
+            'image' => 'traefik',
+            'restart' => 'unless-stopped',
+            'command' => '-c /dev/null --web --docker --logLevel=DEBUG',
+            'networks' => [],
+            'ports' => [
+              '8000:80',
+              '8080:8080',
+            ],
+            'volumes' => [
+              '/var/run/docker.sock:/var/run/docker.sock',
+            ],
+          ],
+        ],
+        'networks' => [],
+      ];
+    }
+    if (!in_array($options['projectname'], $traefik['services']['traefik']['networks'])) {
+      $traefik['services']['traefik']['networks'][] = $options['projectname'];
+      $traefik['networks'][$options['projectname']] = [
+        'external' => [
+          'name' => $options['projectname'] . '_default',
+        ],
+      ];
+      file_put_contents($traefikFile, Yaml::dump($traefik, 9, 2, YAML::DUMP_MULTI_LINE_LITERAL_BLOCK));
+      exec('docker-compose -f ' . $traefikFile . ' --project-name traefik restart');
+    }
+
   }
 
   protected function getFiles($projectRoot, $webRoot, $settingsPath) {
@@ -160,6 +199,15 @@ class Handler {
       'docker-compose.yml' => [
         'dest' => $projectRoot,
       ],
+      'aliases.drushrc.php' => [
+        'dest' => $projectRoot . '/drush',
+      ],
+      'drushrc.php' => [
+        'dest' => $projectRoot . '/drush',
+      ],
+      '.env' => [
+        'dest' => $projectRoot,
+      ],
     ];
   }
 
@@ -171,6 +219,7 @@ class Handler {
   protected function getOptions() {
     $extra = $this->composer->getPackage()->getExtra() + ['docker4drupal' => []];
     $options = $extra['docker4drupal'] + [
+        'projectname' => str_replace([' ', '-', '_', '.'], '', basename(getcwd())),
         'port' => 8000,
         'drupal' => [
           'version' => '8',
diff --git a/templates/.env.twig b/templates/.env.twig
new file mode 100644
index 0000000..3c1ba47
--- /dev/null
+++ b/templates/.env.twig
@@ -0,0 +1,2 @@
+# Do not change manually
+COMPOSE_PROJECT_NAME={{ projectname }}
diff --git a/templates/aliases.drushrc.php.twig b/templates/aliases.drushrc.php.twig
new file mode 100644
index 0000000..2bf8fb5
--- /dev/null
+++ b/templates/aliases.drushrc.php.twig
@@ -0,0 +1,13 @@
+<?php
+
+$aliases['dev'] = array(
+  'root' => '/var/www/html/{{ webRoot }}',
+  'uri' => '{{ projectname }}.docker.localhost',
+);
+
+$aliases['live'] = array(
+  'root' => '',
+  'uri' => '',
+  'remote-host' => '',
+  'remote-user' => '',
+);
diff --git a/templates/docker-compose.yml.twig b/templates/docker-compose.yml.twig
index 7c5d021..c6e4925 100644
--- a/templates/docker-compose.yml.twig
+++ b/templates/docker-compose.yml.twig
@@ -8,8 +8,6 @@ services:
       MYSQL_DATABASE: drupal
       MYSQL_USER: drupal
       MYSQL_PASSWORD: drupal
-    ports:
-      - '8306:3306'
 
   php:
     image: wodby/drupal-php:{{ php.version }}-2.0.0
@@ -21,9 +19,10 @@ services:
 {% endif %}
     volumes:
       - ./:/var/www/html
+      - ./drush:/etc/drush
 
   nginx:
-    image: wodby/drupal-nginx:{{ drupal.version }}-{{ nginx.version }}-2.0.0
+    image: wodby/drupal-nginx:{{ drupal.version }}-{{ nginx.version }}
     restart: unless-stopped
     depends_on:
       - php
@@ -35,7 +34,7 @@ services:
     labels:
       - 'traefik.backend=nginx'
       - 'traefik.port=80'
-      - 'traefik.frontend.rule=Host:drupal.docker.localhost'
+      - 'traefik.frontend.rule=Host:{{ projectname }}.docker.localhost'
 
 {% if varnish.enable %}
   varnish:
@@ -49,7 +48,7 @@ services:
     labels:
       - 'traefik.backend=varnish'
       - 'traefik.port=6081'
-      - 'traefik.frontend.rule=Host:varnish.drupal.docker.localhost'
+      - 'traefik.frontend.rule=Host:varnish.{{ projectname }}.docker.localhost'
 {% endif %}
 
   redis:
@@ -66,7 +65,7 @@ services:
     labels:
       - 'traefik.backend=pma'
       - 'traefik.port=80'
-      - 'traefik.frontend.rule=Host:pma.drupal.docker.localhost'
+      - 'traefik.frontend.rule=Host:pma.{{ projectname }}.docker.localhost'
 
 {% if solr.enable %}
   solr:
@@ -76,7 +75,7 @@ services:
     labels:
       - 'traefik.backend=solr'
       - 'traefik.port=8983'
-      - 'traefik.frontend.rule=Host:solr.drupal.docker.localhost'
+      - 'traefik.frontend.rule=Host:solr.{{ projectname }}.docker.localhost'
 {% endif %}
 
   mailhog:
@@ -84,7 +83,7 @@ services:
     labels:
       - 'traefik.backend=mailhog'
       - 'traefik.port=8025'
-      - 'traefik.frontend.rule=Host:mailhog.drupal.docker.localhost'
+      - 'traefik.frontend.rule=Host:mailhog.{{ projectname }}.docker.localhost'
 
 {% if node.enable %}
   node:
@@ -93,20 +92,10 @@ services:
     labels:
       - 'traefik.backend=node'
       - 'traefik.port=3000'
-      - 'traefik.frontend.rule=Host:front.drupal.docker.localhost'
+      - 'traefik.frontend.rule=Host:front.{{ projectname }}.docker.localhost'
     expose:
       - "3000"
     volumes:
       - ./path/to/your/single-page-app:/app
     command: sh -c 'npm install && npm run start'
 {% endif %}
-
-  traefik:
-    image: traefik
-    restart: unless-stopped
-    command: -c /dev/null --web --docker --logLevel=INFO
-    ports:
-      - '{{ port }}:80'
-      - '8080:8080'
-    volumes:
-      - /var/run/docker.sock:/var/run/docker.sock
diff --git a/templates/drushrc.php.twig b/templates/drushrc.php.twig
new file mode 100644
index 0000000..ece2d54
--- /dev/null
+++ b/templates/drushrc.php.twig
@@ -0,0 +1,7 @@
+<?php
+
+$options['structure-tables']['common'] = array('cache', 'cache_*', 'history', 'search_*', 'sessions', 'watchdog');
+
+$options['shell-aliases']['pull-sql'] = '!drush -y --structure-tables-key=common sql-sync @live @dev && !drush -y @dev cr && !drush -y @dev dev on';
+$options['shell-aliases']['pull-files'] = '!drush -y rsync @live:%files @dev:%files --mode=rlDzq --chown=www-data:www-data --safe-links --max-size=20M && drush -y rsync @live:%private @dev:%private --mode=rlDzq --chown=www-data:www-data --safe-links --max-size=20M';
+$options['shell-aliases']['pull-all'] = $options['shell-aliases']['pull-sql'] . ' && ' . $options['shell-aliases']['pull-files'];
diff --git a/templates/settings.docker.php.twig b/templates/settings.docker.php.twig
index d90f0fc..d43ec1b 100644
--- a/templates/settings.docker.php.twig
+++ b/templates/settings.docker.php.twig
@@ -1,7 +1,7 @@
 <?php
 
 $settings['trusted_host_patterns'] = array(
-  '^drupal\.docker\.localhost$',
+  '^{{ projectname }}\.docker\.localhost$',
 );
 $databases = array (
   'default' => array (
@@ -17,8 +17,3 @@ $databases = array (
     ),
   ),
 );
-
-if (empty($_SERVER['GOTLP_VER'])) {
-  $databases['default']['default']['host'] = '127.0.0.1';
-  $databases['default']['default']['port'] = '8306';
-}
-- 
GitLab