From 36d59e6c97c5e5321e04f1ab745b212d7d997ba6 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Date: Fri, 16 Oct 2020 10:43:47 -0400
Subject: [PATCH] Feat: Added serv.d directory and some basic framework to
 allow for improved https routing.

---
 .../99-swarm-proxy-letsencrypt-entry.sh       | 10 +++++
 .../app/letsencrypt_service                   |  2 +-
 swarm-proxy-letsencrypt/swarm-proxy.tmpl      | 42 ------------------
 swarm-proxy/01-copy-default-entry.sh          | 43 +++++++++++++++----
 swarm-proxy/Dockerfile                        | 10 +++--
 swarm-proxy/https-routing.conf.tmpl           | 24 +++++++++++
 swarm-proxy/nginx.conf                        |  8 ++++
 swarm-proxy/swarm-gen.conf                    | 12 +++++-
 ...swarm-proxy.tmpl => swarm-proxy.conf.tmpl} |  0
 9 files changed, 95 insertions(+), 56 deletions(-)
 delete mode 100644 swarm-proxy-letsencrypt/swarm-proxy.tmpl
 create mode 100644 swarm-proxy/https-routing.conf.tmpl
 create mode 100644 swarm-proxy/nginx.conf
 rename swarm-proxy/{swarm-proxy.tmpl => swarm-proxy.conf.tmpl} (100%)

diff --git a/swarm-proxy-letsencrypt/99-swarm-proxy-letsencrypt-entry.sh b/swarm-proxy-letsencrypt/99-swarm-proxy-letsencrypt-entry.sh
index 025edb2..5599395 100755
--- a/swarm-proxy-letsencrypt/99-swarm-proxy-letsencrypt-entry.sh
+++ b/swarm-proxy-letsencrypt/99-swarm-proxy-letsencrypt-entry.sh
@@ -180,3 +180,13 @@ cat > "/usr/share/nginx/html/.well-known/acme-challenge/active.html" << EOF
 </body>
 </html>
 EOF
+
+
+cat > "/etc/nginx/conf.d/lb.qoto.org-activate.conf" << EOF
+server {
+    server_name lb.qoto.org;
+    listen 80;
+
+    include /etc/nginx/vhost.d/default*;
+}
+EOF
diff --git a/swarm-proxy-letsencrypt/app/letsencrypt_service b/swarm-proxy-letsencrypt/app/letsencrypt_service
index cbc68fa..f3fbc86 100755
--- a/swarm-proxy-letsencrypt/app/letsencrypt_service
+++ b/swarm-proxy-letsencrypt/app/letsencrypt_service
@@ -331,7 +331,7 @@ function update_certs {
 server {
   server_name ${LE_HOST};
 
-  listen 443 ssl http2 ;
+  listen 444 ssl http2 ;
   ssl_session_timeout 5m;
   ssl_session_cache shared:SSL:50m;
   ssl_session_tickets off;
diff --git a/swarm-proxy-letsencrypt/swarm-proxy.tmpl b/swarm-proxy-letsencrypt/swarm-proxy.tmpl
deleted file mode 100644
index 1306fad..0000000
--- a/swarm-proxy-letsencrypt/swarm-proxy.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-### BEGIN SERVICE ###
-upstream ${HOST}_upstream {
-  server ${UPSTREAM}:${PORT};
-}
-
-server {
-    server_name ${HOST};
-    listen 80 ;
-
-    location /.well-known/acme-challenge/ {
-      auth_basic off;
-      allow all;
-      root /usr/share/nginx/html;
-      try_files $uri =404;
-      break;
-  }
-
-  location / {
-    return 301 https://$host$request_uri;
-  }
-}
-
-server {
-  server_name ${HOST};
-  listen 443 ssl http2 ;
-  ssl_session_timeout 5m;
-  ssl_session_cache shared:SSL:50m;
-  ssl_session_tickets off;
-  ssl_certificate /etc/nginx/certs/${HOST}.crt;
-  ssl_certificate_key /etc/nginx/certs/${HOST}.key;
-  ssl_dhparam /etc/nginx/certs/${HOST}.dhparam.pem;
-  ssl_stapling on;
-  ssl_stapling_verify on;
-  ssl_trusted_certificate /etc/nginx/certs/${HOST}.chain.pem;
-  add_header Strict-Transport-Security "max-age=31536000" always;
-  include /etc/nginx/vhost.d/*;
-
-  location / {
-    proxy_pass http://${HOST}_upstream;
-  }
-}
-### END SERVICE ###
diff --git a/swarm-proxy/01-copy-default-entry.sh b/swarm-proxy/01-copy-default-entry.sh
index 6589412..44ed379 100755
--- a/swarm-proxy/01-copy-default-entry.sh
+++ b/swarm-proxy/01-copy-default-entry.sh
@@ -1,7 +1,36 @@
 #!/bin/bash
 set -e
 
-echo "Copying default.conf to conf.d directory"
+echo "Copying serv.d/default.conf to serv.d directory"
+cat > "/etc/nginx/serv.d/default.conf" << EOF
+events {
+    worker_connections  1024;
+}
+
+
+http {
+    include       /etc/nginx/mime.types;
+    default_type  application/octet-stream;
+
+    log_format  main  '\$remote_addr - \$remote_user [\$time_local] "\$request" '
+                      '\$status $body_bytes_sent "\$http_referer" '
+                      '"\$http_user_agent" "\$http_x_forwarded_for"';
+
+    access_log  /var/log/nginx/access.log  main;
+
+    sendfile        on;
+    #tcp_nopush     on;
+
+    keepalive_timeout  65;
+
+    #gzip  on;
+
+    include /etc/nginx/conf.d/*;
+}
+EOF
+
+
+echo "Copying conf.d/default.conf to conf.d directory"
 cat > "/etc/nginx/conf.d/default.conf" << EOF
 ############################################################################
 ##                         General Configuration
@@ -51,7 +80,7 @@ access_log off;
 		ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
 		ssl_prefer_server_ciphers off;
 
-#resolver 10.0.0.2;
+resolver 10.0.0.2;
 
 # HTTP 1.1 support
 proxy_http_version 1.1;
@@ -73,21 +102,17 @@ proxy_set_header Proxy "";
 ##                         Catch all Servers
 ############################################################################
 
-upstream gitlab_pages_upstream {
-  server host.docker.internal:8080;
+upstream fallthrough_http_upstream {
+  server ${SWARM_PROXY_FALLTHROUGH_HTTP_HOST:-host.docker.internal}:${SWARM_PROXY_FALLTHROUGH_HTTP_PORT:-8080};
 }
 
 server {
     listen 80 default_server;
     server_name _;
 
-    include /etc/nginx/vhost.d/git.qoto.org*;
-    include /etc/nginx/vhost.d/default*;
-
     location / {
-      proxy_pass http://gitlab_pages_upstream;
+      proxy_pass http://fallthrough_http_upstream;
     }
 }
 
-
 EOF
diff --git a/swarm-proxy/Dockerfile b/swarm-proxy/Dockerfile
index 35f705d..9c1b813 100644
--- a/swarm-proxy/Dockerfile
+++ b/swarm-proxy/Dockerfile
@@ -6,14 +6,18 @@ LABEL maintainer="Jeffrey Phillips Freeman the@jeffreyfreeman.me"
 RUN sed -i 's/worker_processes  1/worker_processes  auto/' /etc/nginx/nginx.conf && \
     mkdir -p /etc/swarm-proxy && \
     mkdir -p /usr/share/swarm-proxy && \
-    rm /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
+    rm /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh && \
+    rm /etc/nginx/nginx.conf && \
+    mkdir -p /etc/nginx/serv.d
 
+COPY nginx.conf /etc/nginx/
 COPY dhparam.pem.default /etc/swarm-proxy/
 COPY generate-dhparam /usr/bin/
 COPY swarm-gen.conf /etc/swarm-gen/
-COPY swarm-proxy.tmpl /etc/swarm-gen/templates/
+COPY swarm-proxy.conf.tmpl /etc/swarm-gen/templates/
+COPY https-routing.conf.tmpl /etc/swarm-gen/templates/
 COPY 01-copy-default-entry.sh /docker-entrypoint.d/
 
-VOLUME ["/etc/nginx/certs", "/etc/nginx/dhparam", "/etc/nginx/conf.d", "/etc/nginx/vhost.d", "/usr/share/nginx/html"]
+VOLUME ["/etc/nginx/certs", "/etc/nginx/dhparam", "/etc/nginx/conf.d", "/etc/nginx/vhost.d", "/etc/nginx/serv.d", "/usr/share/nginx/html"]
 
 ENV DOCKER_HOST unix:///var/run/docker.sock
diff --git a/swarm-proxy/https-routing.conf.tmpl b/swarm-proxy/https-routing.conf.tmpl
new file mode 100644
index 0000000..4266bcc
--- /dev/null
+++ b/swarm-proxy/https-routing.conf.tmpl
@@ -0,0 +1,24 @@
+stream {
+
+    map $ssl_preread_server_name $name {
+### BEGIN SERVICE ###
+        ${HOST} local_https;
+### END SERVICE ###
+        default fallthrough_https_upstream;
+    }
+
+    upstream fallthrough_https_upstream {
+        server host.docker.internal:8080;
+    }
+
+    upstream local_https {
+        server 127.0.0.1:444;
+    }
+
+    server {
+        listen 443;
+        proxy_pass $name;
+        ssl_preread on;
+    }
+}
+
diff --git a/swarm-proxy/nginx.conf b/swarm-proxy/nginx.conf
new file mode 100644
index 0000000..95e556f
--- /dev/null
+++ b/swarm-proxy/nginx.conf
@@ -0,0 +1,8 @@
+user  nginx;
+worker_processes  auto;
+
+error_log  /var/log/nginx/error.log warn;
+pid        /var/run/nginx.pid;
+
+
+include /etc/nginx/serv.d/*;
diff --git a/swarm-proxy/swarm-gen.conf b/swarm-proxy/swarm-gen.conf
index 1397729..45f1b3d 100644
--- a/swarm-proxy/swarm-gen.conf
+++ b/swarm-proxy/swarm-gen.conf
@@ -2,6 +2,11 @@
 interval=5
 wait=5
 
+[[directory]]
+dir=/etc/nginx/serv.d
+notifycmd=nginx -s reload
+wait=5
+
 [[directory]]
 dir=/etc/nginx/vhost.d
 notifycmd=nginx -s reload
@@ -23,6 +28,11 @@ notifycmd=nginx -s reload
 wait=5
 
 [[template]]
-template=/etc/swarm-gen/templates/swarm-proxy.tmpl
+template=/etc/swarm-gen/templates/swarm-proxy.conf.tmpl
 dest=/etc/nginx/conf.d/swarm-proxy.conf
 notifycmd=nginx -s reload
+
+[[template]]
+template=/etc/swarm-gen/templates/https-routing.conf.tmpl
+dest=/etc/nginx/serv.d/https-routing.conf
+notifycmd=nginx -s reload
diff --git a/swarm-proxy/swarm-proxy.tmpl b/swarm-proxy/swarm-proxy.conf.tmpl
similarity index 100%
rename from swarm-proxy/swarm-proxy.tmpl
rename to swarm-proxy/swarm-proxy.conf.tmpl
-- 
GitLab