From c92a39ea60dda85dd97edf0808cc428b561785ad Mon Sep 17 00:00:00 2001
From: pierreozoux <pierre@ozoux.net>
Date: Fri, 10 Oct 2014 18:08:14 +0100
Subject: [PATCH] Adds confd support!

---
 .gitignore                                  |  3 +-
 Vagrantfile                                 |  2 +
 config/user-data                            |  6 ++
 scripts/approve-user.sh                     | 26 -------
 scripts/setup.sh                            | 14 +---
 scripts/unsecure-certs/example.dev.pem      | 83 +++++++++++++++++++++
 scripts/unsecure-certs/indiehosters.dev.pem | 83 +++++++++++++++++++++
 templates/haproxy-1.part                    | 20 -----
 templates/haproxy-2.part                    |  4 -
 templates/haproxy-3.part                    |  1 -
 templates/haproxy-4.part                    |  4 -
 templates/haproxy-backend.part              |  7 --
 templates/haproxy-cert.part                 |  4 -
 templates/haproxy-frontend.part             |  4 -
 unit-files/haproxy.service                  |  4 +-
 unit-files/nginx-discovery@.service         | 36 +++++++++
 unit-files/nginx@.service                   |  3 +
 unit-files/wordpress-discovery@.service     | 36 +++++++++
 unit-files/wordpress@.service               |  5 ++
 19 files changed, 261 insertions(+), 84 deletions(-)
 create mode 100644 scripts/unsecure-certs/example.dev.pem
 create mode 100644 scripts/unsecure-certs/indiehosters.dev.pem
 delete mode 100644 templates/haproxy-1.part
 delete mode 100644 templates/haproxy-2.part
 delete mode 100644 templates/haproxy-3.part
 delete mode 100644 templates/haproxy-4.part
 delete mode 100644 templates/haproxy-backend.part
 delete mode 100644 templates/haproxy-cert.part
 delete mode 100644 templates/haproxy-frontend.part
 create mode 100644 unit-files/nginx-discovery@.service
 create mode 100644 unit-files/wordpress-discovery@.service

diff --git a/.gitignore b/.gitignore
index 997ca2f..3dc7875 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
-.vagrant
\ No newline at end of file
+.vagrant
+docker-haproxy-confd
diff --git a/Vagrantfile b/Vagrantfile
index ef870f2..98d4c18 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -40,6 +40,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
       end
 
       core.vm.hostname = HOSTNAME
+      core.hostsupdater.aliases = ["example.dev"]
       core.vm.network :private_network, ip: "#{BASE_IP_ADDR}.#{i+1}"
       core.vm.synced_folder ".", "/data/infrastructure"
       core.vm.synced_folder "/data/per-user", "/data/per-user"
@@ -47,6 +48,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
       core.vm.synced_folder "/data/per-user", "/data/per-user", id: "coreos-per-user", :nfs => true, :mount_options => ['nolock,vers=3,udp']
       core.vm.provision :file, source: "./config/user-data", destination: "/tmp/vagrantfile-user-data"
       core.vm.provision :shell, path: "./scripts/setup.sh"
+      core.vm.provision :shell, inline: "etcdctl set /services/default '{\"app\":\"nginx\", \"hostname\":\"#{HOSTNAME}\"}'"
       core.vm.provision :shell, path: "./scripts/approve-user.sh", args: [HOSTNAME, "nginx"]
     end
   end
diff --git a/config/user-data b/config/user-data
index 2a32c3a..884a035 100644
--- a/config/user-data
+++ b/config/user-data
@@ -3,3 +3,9 @@
 coreos:
   update:
     reboot-strategy: best-effort
+  etcd:
+    addr: $public_ipv4:4001
+    peer-addr: $public_ipv4:7001
+  units:
+    - name: etcd.service
+      command: start
diff --git a/scripts/approve-user.sh b/scripts/approve-user.sh
index 1aa01b1..86c114a 100755
--- a/scripts/approve-user.sh
+++ b/scripts/approve-user.sh
@@ -3,29 +3,3 @@
 # Start service for new site (and create the user)
 systemctl enable $2@$1.service
 systemctl start  $2@$1.service
-
-sleep 10
-
-# Configure new site in HAproxy
-IP=`docker inspect --format '{{.NetworkSettings.IPAddress}}' $2-$1`
-
-echo IP address of new container \'$2-$1\' is \'$IP\'
-
-if [ -f /data/per-user/$1/combined.pem ]; then
-  echo Importing cert from /data/per-user/$1/combined.pem
-  echo TODO: enforce validity check at this point!
-  echo Please run scripts/check-cert.sh $1 to make sure it\'s OK
-  mkdir -p /data/server-wide/haproxy/approved-certs
-  cp /data/per-user/$1/combined.pem /data/server-wide/haproxy/approved-certs/$1.pem
-  echo /haproxy-override/approved-certs/$1.pem $1 >> /data/server-wide/haproxy/certs/list.txt
-  sed s/%HOSTNAME%/$1/g /data/infrastructure/templates/haproxy-cert.part >> /data/server-wide/haproxy/certs.part
-else
-  echo WARNING: TLS cert /data/per-user/$1/combined.pem not found! Not enabling SNI for this domain.
-fi
-
-sed s/%HOSTNAME%/$1/g /data/infrastructure/templates/haproxy-frontend.part >> /data/server-wide/haproxy/frontends.part
-
-sed s/%HOSTNAME%/$1/g /data/infrastructure/templates/haproxy-backend.part | sed s/%IP%/$IP/g >> /data/server-wide/haproxy/backends.part
-
-cat /data/server-wide/haproxy/haproxy-1.part /data/server-wide/haproxy/hostname.part /data/server-wide/haproxy/haproxy-2.part /data/server-wide/haproxy/certs.part /data/server-wide/haproxy/haproxy-3.part /data/server-wide/haproxy/hostname.part /data/server-wide/haproxy/haproxy-4.part /data/server-wide/haproxy/frontends.part /data/server-wide/haproxy/backends.part > /data/server-wide/haproxy/haproxy.cfg
-systemctl reload haproxy.service
diff --git a/scripts/setup.sh b/scripts/setup.sh
index d490795..03b500a 100755
--- a/scripts/setup.sh
+++ b/scripts/setup.sh
@@ -8,21 +8,13 @@ cp /data/infrastructure/unit-files/* /etc/systemd/system
 systemctl daemon-reload
 
 # Pull relevant docker images
+docker pull pierreozoux/haproxy-confd
 docker pull tutum/mysql
 docker pull tutum/wordpress-stackable
 docker pull tutum/nginx
 
 # Configure and start HAproxy
-docker pull dockerfile/haproxy
-mkdir -p /data/server-wide/haproxy/certs
-touch /data/server-wide/haproxy/certs/list.txt
-cp /data/infrastructure/templates/haproxy-*.part /data/server-wide/haproxy/
-rm /data/server-wide/haproxy/*.part
-#rm /etc/systemd/system/multi-user.target.wants/*
-touch /data/server-wide/haproxy/certs.part
-touch /data/server-wide/haproxy/frontends.part
-touch /data/server-wide/haproxy/backends.part
-hostname > /data/server-wide/haproxy/hostname.part
-cp /data/infrastructure/templates/haproxy-*.part /data/server-wide/haproxy/
+mkdir -p /data/server-wide/haproxy/approved-certs
+cp /data/infrastructure/scripts/unsecure-certs/*.pem /data/server-wide/haproxy/approved-certs
 systemctl enable haproxy.service
 systemctl start  haproxy.service
diff --git a/scripts/unsecure-certs/example.dev.pem b/scripts/unsecure-certs/example.dev.pem
new file mode 100644
index 0000000..bb9b927
--- /dev/null
+++ b/scripts/unsecure-certs/example.dev.pem
@@ -0,0 +1,83 @@
+-----BEGIN CERTIFICATE-----
+MIIFjDCCA3QCCQDmo57ouPDhnTANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC
+UFQxETAPBgNVBAgTCFBvcnR1Z2FsMQ8wDQYDVQQHEwZMaXNib24xFTATBgNVBAoT
+DEluZGllSG9zdGVyczEUMBIGA1UEAxMLZXhhbXBsZS5kZXYxJzAlBgkqhkiG9w0B
+CQEWGGNvbnRhY3RAaW5kaWVob3N0ZXJzLm5ldDAeFw0xNDEwMTAxNTA3MDVaFw0x
+NTEwMTAxNTA3MDVaMIGHMQswCQYDVQQGEwJQVDERMA8GA1UECBMIUG9ydHVnYWwx
+DzANBgNVBAcTBkxpc2JvbjEVMBMGA1UEChMMSW5kaWVIb3N0ZXJzMRQwEgYDVQQD
+EwtleGFtcGxlLmRldjEnMCUGCSqGSIb3DQEJARYYY29udGFjdEBpbmRpZWhvc3Rl
+cnMubmV0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAm/gbDGFtfMzT
+nVZaPBQNl7SqMUMhTlDoR2C24W53QPslLuqBGkatbBs+9jWKGm2XPWeuK0uC2ot6
+fIie72wghFepmzIdAb7SU0lpFVw49dk1nGVHIqwbFA3G6pYL7hY5ocD4HziNKnuj
+ZA42a+rjpYl3zx/4GgcWnNyuawlsIMI8rdvuv5Mg77fGaVSXriJKQ1nTJ/Z65CDU
+U6c9vzXSGkye3i0gv/8tZ0VA8xgV9FoXsLWhP7NLWDAh5+X/4aJpIFjvwzYSJLBr
+3O9siP17NZuJI+7zB6KVlBeoSt2Dmt3k7fG2YrpwTzFlFBMr4Hq6T+wp+Q2J1JQP
+Jm1s3lr2vJwmLVKlUspgT+zpuTAsUHOv2xxmbb+8k8ZE5II9IzAcE85C75bvL3An
+fG0xQlF2+dOcXgvYFtRyeJ8fCIEjQBkOoUJq4H2inTwM2IYo060FF32jEVgFB5ZP
+xuEsxEOGusUmOFsm8dIwaXv/WCPXopt1EGKFcNZWLSMC0jX0d4jZP74D1K0u4VPV
+/kkQS6lUCK4qrq6tNm1R4TQlquefbfcwEhE8hVyUGcyDX6FOCL5z4lXal3gyUgbC
+B50WrOST4hShb8+cWngcvDTO78kLg/OhqYZZVbpAshcF60sugEYke0xGNArWMQMU
+5uxaWqPA3/gA3u4rJfWhLOwFIU+4ewsCAwEAATANBgkqhkiG9w0BAQUFAAOCAgEA
+JiUIK43wZ6PHYrinKZu1wgDSbL7g3mNxSf2NiTMbu11J0JvypJc19DZHoSq5S0XH
+yalW9Xeml9U8u/zHaciTwAaxWyj/gzqWyLBbd1xHTmdx+WvoG+OjcnYJYelrFzDH
+bd4XumR+oHBXUsCiCIyF0d4gJZRUH8OxpDN/dD828FlcmMaeaPBl/xLm1G5ZXnPE
+KNA8VR6ylo4w4HayQCjXI6qef29Y9I2Jvt9lREEpR5YoEnc1aj1ZJofeEzISfmhm
+3D2BiI2Hx6mMlBwE95D+c9HZZAQyvdPyUdcTto7dOiJUGGt3EqhBRPebhe0HNlj8
+L5h2/w1zChlQKWoFCZ4Uz6AJeibvPMZTEgihWtNWPyRAbjWL39GH1Emb/0m8ydaR
+NmQEFL9VApMAsUm0mNHjWZQOTL5PYwgfKloXWMJ+rCd9N54sUUj5tt+Zc7G4irUN
+Lnu8fYAaFC2BljANwQdy0H7pkVCYBcwwqvtKsrhX+FBGukkUjMo43FWep+fA82BU
+uU6mlnPKm9vRYHC9gkKJejzFNgDZaC7p+xiwOO53oY/mFPgEVoCWwO0zAc1AXaZV
+mJkkeYhRWpqmuxvqP+tpXFSfHu2Ee/RKBrrowWDOad3IlWuV7gt7Bo5ZBj+iqbPf
+Km1Y5oFRF+Kp1NoIL527LHGj7dDV8eXinRIb7CPtbL4=
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/scripts/unsecure-certs/indiehosters.dev.pem b/scripts/unsecure-certs/indiehosters.dev.pem
new file mode 100644
index 0000000..a40918d
--- /dev/null
+++ b/scripts/unsecure-certs/indiehosters.dev.pem
@@ -0,0 +1,83 @@
+-----BEGIN CERTIFICATE-----
+MIIFljCCA34CCQDXgLjASWHpmDANBgkqhkiG9w0BAQUFADCBjDELMAkGA1UEBhMC
+UFQxETAPBgNVBAgTCFBvcnR1Z2FsMQ8wDQYDVQQHEwZMaXNib24xFTATBgNVBAoT
+DEluZGllSG9zdGVyczEZMBcGA1UEAxMQaW5kaWVob3N0ZXJzLmRldjEnMCUGCSqG
+SIb3DQEJARYYY29udGFjdEBpbmRpZWhvc3RlcnMubmV0MB4XDTE0MTAxMDE0MzY1
+NVoXDTE1MTAxMDE0MzY1NVowgYwxCzAJBgNVBAYTAlBUMREwDwYDVQQIEwhQb3J0
+dWdhbDEPMA0GA1UEBxMGTGlzYm9uMRUwEwYDVQQKEwxJbmRpZUhvc3RlcnMxGTAX
+BgNVBAMTEGluZGllaG9zdGVycy5kZXYxJzAlBgkqhkiG9w0BCQEWGGNvbnRhY3RA
+aW5kaWVob3N0ZXJzLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AKBOylYEoL1P3q7skTJsRA8yQj6fVHWHS3kPg6tcVavZawc6tRxIiDc41/EWjL7i
+Owb6io2UbKaD/g8695CFER9FvcW1iukrC/tUV5/AVd0SDcvS3RnGUndKh82HCNrM
+rUDU/XH8smEpfjuXrq0YPuiGbY1zSLQKirjYTiasJODfGkxSbobNfjdL7aEo+3HX
+BQq5mGIj9A4PYmeyFGkHCN8tRvf4lY1KfPJoWtDL4kmO4SFNZ4FAehH9AJ6vTN8y
+MFcHtFzpp2636TYTBQsLu48nrKs6MqOOyU0R/Ufw9QjiWDLo3Co6pcCTmVf16skO
+odg9BNdEhMXefpiEE1NOL6ZOkSUG5WSY0Q5Il649QcJOYzw2A0Nk3IOxoIexXat4
+siCgSlNfgyRmBn5HNcZo5aEDf9+3gEqFzEFSyH3ClIApC7RePbpPvsCAgpagBOXC
+PgO2w2VW9HfNHkwpF3Yqn7cqw0FQKwKREufVdnSvs9fgFlMZnqA3sMym8o99Fcvq
+WBaTuh54ePfNGmawPt1N8vUZUYXXOasWKmnjfan3S1rsNAf5M2ntLqEJRDwihdSm
+ZSO+B51hDO5jzHoqxHwA71CwUAp4hRO83xR6ziB1KR2834I/7LBzbpZ0EWm9adez
+8V+dwgBhTt0LYEUGLJN22XRi9d4RPhnRJpSLPV/h0Fa/AgMBAAEwDQYJKoZIhvcN
+AQEFBQADggIBAFzYeGiomhKZW//aUM4V4RLMVIf0B4uixSMxZGQIUWVtYckmyG2N
+t8qNBHAQ3gl811NqnqestIQ4DpGkNQRCv/iDa5OwdLJHTOQUxajUE/1xmidHtpzR
+ReBZvW48k0dLEM2gmIrt7qQwqqecjlWjvSQlvJxYWrn6TBAkFL6Quu8gfoPK9/cE
+HG/aRQ0PCywGV20LSZ+J03LN7MlACClgVTB7dJuWIN0dNi7TsqpIupk11ZQ3ybBY
+WPQmLnIiCAijL69kBmBynLvJT5XDy2C4ChyzZ5Y73CXhgJwCqOZJwbO7Doig9PZQ
+yVLtui18W3uVQ7ZlIxCAQUeFzSkZf3/XNlr2FkP+efw4LLGH8kiKMsyKuoLuthO1
+1YrXvI0sjuDOxQwrlNQ2CLVANLBpUMH2U1aiYbA6iICSHr8ORAc84StgG9mFLeyN
+w32/04MGPvZfset8gRCOuvA2sLTjylqh0IpaPWlnT77neqOFtETtzJ+3UuOcdfnN
+t2bxqimHT8WhBB823WajWlLdXcc902e9LLhe9M1/bwOqFIIlKDqtCndjyXpe/qhA
+s0YB8TqJLxJQqvdnmYiBFfGrDTgNBpjt6AKJHRGd4xgsYsmQ3zLJ0Z8mNNQhlLf/
+osGXa2s/ZX7ernfvSDQIOB70gohCLFtBok0unyBJhtHxXmZ7UmpuIanx
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/templates/haproxy-1.part b/templates/haproxy-1.part
deleted file mode 100644
index 98656d8..0000000
--- a/templates/haproxy-1.part
+++ /dev/null
@@ -1,20 +0,0 @@
-global
-    log 127.0.0.1 local0
-    log 127.0.0.1 local1 notice
-    maxconn 4096
-    user haproxy
-    group haproxy
-
-defaults
-    log global
-    mode http
-    option httplog
-    option dontlognull
-    retries 3
-    timeout connect 5000
-    timeout client 50000
-    timeout server 50000
-
-frontend https-in
-mode http
- bind *:443 ssl crt-list /haproxy-override/certs/list.txt crt /haproxy-override/approved-certs/
diff --git a/templates/haproxy-2.part b/templates/haproxy-2.part
deleted file mode 100644
index 84d9fb6..0000000
--- a/templates/haproxy-2.part
+++ /dev/null
@@ -1,4 +0,0 @@
-/combined.pem
- reqadd X-Forwarded-Proto:\ https
-
-
diff --git a/templates/haproxy-3.part b/templates/haproxy-3.part
deleted file mode 100644
index b6fd987..0000000
--- a/templates/haproxy-3.part
+++ /dev/null
@@ -1 +0,0 @@
-default_backend 
diff --git a/templates/haproxy-4.part b/templates/haproxy-4.part
deleted file mode 100644
index f4c2398..0000000
--- a/templates/haproxy-4.part
+++ /dev/null
@@ -1,4 +0,0 @@
-    
-frontend http-in
-    bind *:80
-
diff --git a/templates/haproxy-backend.part b/templates/haproxy-backend.part
deleted file mode 100644
index f0755d0..0000000
--- a/templates/haproxy-backend.part
+++ /dev/null
@@ -1,7 +0,0 @@
-
-# %HOSTNAME%:
-backend %HOSTNAME%
-    cookie SERVERID insert nocache indirect
-    option httpclose
-    option forwardfor
-    server Server %IP%:80 cookie Server
diff --git a/templates/haproxy-cert.part b/templates/haproxy-cert.part
deleted file mode 100644
index 5e706c1..0000000
--- a/templates/haproxy-cert.part
+++ /dev/null
@@ -1,4 +0,0 @@
-
-# %HOSTNAME%:
-    acl https_%HOSTNAME% hdr_end(host) -i %HOSTNAME%
-    use_backend %HOSTNAME% if https_%HOSTNAME%
diff --git a/templates/haproxy-frontend.part b/templates/haproxy-frontend.part
deleted file mode 100644
index 2992b1b..0000000
--- a/templates/haproxy-frontend.part
+++ /dev/null
@@ -1,4 +0,0 @@
-
-# %HOSTNAME%:
-    acl is_%HOSTNAME%          hdr_end(host) -i %HOSTNAME%
-    use_backend %HOSTNAME%      if is_%HOSTNAME%
diff --git a/unit-files/haproxy.service b/unit-files/haproxy.service
index 856c2b9..d32f369 100644
--- a/unit-files/haproxy.service
+++ b/unit-files/haproxy.service
@@ -12,8 +12,8 @@ ExecStart=/usr/bin/docker run\
 --name %p\
 -p 80:80\
 -p 443:443\
--v /data/server-wide/%p:/haproxy-override\
-dockerfile/haproxy
+-v /data/server-wide/haproxy/approved-certs/:/etc/haproxy/approved-certs\
+pierreozoux/haproxy-confd
 ExecReload=/usr/bin/docker restart %p
 ExecStop=/usr/bin/docker stop %p
 
diff --git a/unit-files/nginx-discovery@.service b/unit-files/nginx-discovery@.service
new file mode 100644
index 0000000..0f9383c
--- /dev/null
+++ b/unit-files/nginx-discovery@.service
@@ -0,0 +1,36 @@
+[Unit]
+Description=%p for %i etcd registration
+
+# Requirements
+Requires=etcd.service
+Requires=nginx@%i.service
+
+# Dependency ordering and binding
+After=etcd.service
+After=nginx@%i.service
+BindsTo=nginx@%i.service
+
+[Service]
+
+EnvironmentFile=/etc/environment
+TimeoutStartSec=0
+# Start
+## Test whether service is accessible and then register useful information
+ExecStart=/bin/bash -c '\
+  sleep 3; \
+  while true; do \
+    app=`echo %p | cut -d"-" -f1`; \
+    ip=`docker inspect --format \'{{.NetworkSettings.IPAddress}}\' $app-%i`; \
+    curl -f $ip; \
+    if [ $? -eq 0 ]; then \
+      etcdctl set /services/$app/%i \'{"ip":"\'$ip\'", "port":"80"}\' --ttl 30; \
+    else \
+      etcdctl rm /services/$app/%i; \
+    fi; \
+    sleep 20; \
+  done'
+
+# Stop
+ExecStop=/bin/bash -ceux '\
+  app=`echo %p | cut -d"-" -f1`;\
+  /usr/bin/etcdctl rm /services/$app/%i
diff --git a/unit-files/nginx@.service b/unit-files/nginx@.service
index 5795ce8..c91765d 100644
--- a/unit-files/nginx@.service
+++ b/unit-files/nginx@.service
@@ -2,8 +2,11 @@
 Description=%p-%i
 After=docker.service
 Requires=docker.service
+Requires=etcd.service
 Requires=%p-importer@%i.service
 After=%p-importer@%i.service
+Requires=%p-discovery@%i.service
+Before=%p-discovery@%i.service
 
 [Service]
 Restart=always
diff --git a/unit-files/wordpress-discovery@.service b/unit-files/wordpress-discovery@.service
new file mode 100644
index 0000000..94b2cd2
--- /dev/null
+++ b/unit-files/wordpress-discovery@.service
@@ -0,0 +1,36 @@
+[Unit]
+Description=%p for %i etcd registration
+
+# Requirements
+Requires=etcd.service
+Requires=wordpress@%i.service
+
+# Dependency ordering and binding
+After=etcd.service
+After=wordpress@%i.service
+BindsTo=wordpress@%i.service
+
+[Service]
+
+EnvironmentFile=/etc/environment
+TimeoutStartSec=0
+# Start
+## Test whether service is accessible and then register useful information
+ExecStart=/bin/bash -c '\
+  sleep 3; \
+  while true; do \
+    app=`echo %p | cut -d"-" -f1`; \
+    ip=`docker inspect --format \'{{.NetworkSettings.IPAddress}}\' $app-%i`; \
+    curl -f $ip; \
+    if [ $? -eq 0 ]; then \
+      etcdctl set /services/$app/%i \'{"ip":"\'$ip\'", "port":"80"}\' --ttl 30; \
+    else \
+      etcdctl rm /services/$app/%i; \
+    fi; \
+    sleep 20; \
+  done'
+
+# Stop
+ExecStop=/bin/bash -ceux '\
+  app=`echo %p | cut -d"-" -f1`;\
+  /usr/bin/etcdctl rm /services/$app/%i
diff --git a/unit-files/wordpress@.service b/unit-files/wordpress@.service
index ddbae36..19d1083 100644
--- a/unit-files/wordpress@.service
+++ b/unit-files/wordpress@.service
@@ -1,11 +1,16 @@
 [Unit]
 Description=%p-%i
 After=docker.service
+
+Requires=etcd.service
 Requires=docker.service
 Requires=mysql@%i.service
 After=mysql@%i.service
 Requires=%p-importer@%i.service
+Requires=%p-discovery@%i.service
+
 After=%p-importer@%i.service
+Before=%p-discovery@%i.service
 
 [Service]
 Restart=always
-- 
GitLab