diff --git a/Dockerfile b/Dockerfile index c5d7825..4186212 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,4 +33,6 @@ WORKDIR /app/ EXPOSE 80 443 ENV DOCKER_HOST unix:///tmp/docker.sock +VOLUME ["/etc/nginx/certs"] + CMD ["forego", "start", "-r"] diff --git a/nginx.tmpl b/nginx.tmpl index 2f686a3..4c3295f 100644 --- a/nginx.tmpl +++ b/nginx.tmpl @@ -36,6 +36,7 @@ server { } {{ range $host, $containers := groupByMulti $ "Env.VIRTUAL_HOST" "," }} + upstream {{ $host }} { {{ range $container := $containers }} {{ $addrLen := len $container.Addresses }} @@ -65,6 +66,50 @@ upstream {{ $host }} { {{ end }} } +{{/* Get the first cert name defined by containers w/ the same vhost */}} +{{ $certName := (first (groupByKeys $containers "Env.CERT_NAME")) }} + +{{/* Get the best matching cert by name for the vhost. */}} +{{ $vhostCert := (closest (dir "/etc/nginx/certs") (printf "%s.crt" $host))}} + +{{/* vhostCert is actually a filename so remove any suffixes since they are added later */}} +{{ $vhostCert := replace $vhostCert ".crt" "" -1 }} +{{ $vhostCert := replace $vhostCert ".key" "" -1 }} + +{{/* Use the cert specifid on the container or fallback to the best vhost match */}} +{{ $cert := (coalesce $certName $vhostCert) }} + +{{ if (ne $cert "") }} + +server { + server_name {{ $host }}; + rewrite ^(.*) https://{{ $host }}$1 permanent; +} + +server { + server_name {{ $host }}; + listen 443 ssl; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA; + + ssl_prefer_server_ciphers on; + ssl_session_timeout 5m; + ssl_session_cache shared:SSL:50m; + ssl_stapling on; + ssl_stapling_verify on; + + ssl_certificate /etc/nginx/certs/{{ (printf "%s.crt" $cert) }}; + ssl_certificate_key /etc/nginx/certs/{{ (printf "%s.key" $cert) }}; + + add_header Strict-Transport-Security "max-age=31536000; includeSubdomains"; + + location / { + proxy_pass http://{{ $host }}; + } +} +{{ else }} + server { server_name {{ $host }}; @@ -72,4 +117,17 @@ server { proxy_pass http://{{ $host }}; } } + +server { + server_name {{ $host }}; + listen 443 ssl; + return 503; + + {{ if (and (exists "/etc/nginx/certs/default.crt") (exists "/etc/nginx/certs/default.key")) }} + ssl_certificate /etc/nginx/certs/default.crt; + ssl_certificate_key /etc/nginx/certs/default.key; + {{ end }} +} + +{{ end }} {{ end }}