Introduction
Exalate on-premise (such as Azure DevOps, ServiceNow) is deployed as Docker images. There is no built-in ssl support as it is much simpler to bring up a reverse proxy which can terminate SSL connections.
Our preference is the jwilder/Nginx-proxy image, which is a customization of the Nginx proxy. This article gives you a quick run down of the setup process.
Note: For an in-depth tutorial on this topic, please see the article here.
Setting up jwilder/nginx-proxy with the letsencrypt SSL configuration
Warning: Despite our best efforts, code can change without notice due to a variety of factors. If you encounter an issue in any of the code shown here and find that a specific block of code is not correct, or is causing errors, please check with the Community to find an updated version.
1 version: "2" 2 3 services: 4 nginx-proxy: 5 image: jwilder/nginx-proxy 6 container_name: nginx-proxy 7 ports: 8 - "80:80" 9 - "443:443" 10 volumes: 11 - /etc/nginx/vhost.d 12 - /etc/nginx/certs 13 - /usr/share/nginx/html 14 - /var/run/docker.sock:/tmp/docker.sock:ro 15 networks: 16 - proxy 17 18 ssl-generator: 19 image: jrcs/letsencrypt-nginx-proxy-companion 20 volumes_from: 21 - nginx-proxy 22 volumes: 23 - /var/run/docker.sock:/var/run/docker.sock:ro 24 networks: 25 - proxy 26 27networks: 28 proxy:
Using it in the container
The next step is to configure a DNS name which points to the host with the jwilder container running - assume exalate.acme.com
In the service definition of the exalate configure the following environment variables:
... environment: - LETSENCRYPT_HOST=exalate.acme.com - VIRTUAL_HOST=exalate.acme.com ...
Now, cycle the container.
The jwilder proxy will detect that the container has the VIRTUAL_HOST environment variable. This will automatically add in the nginx configuration:
# exalate.acme.com upstream exalate.acme.com { # Cannot connect to network of this container server 127.0.0.1 down; ## Can be connected with "nginx-proxy" network # francisexalatenet_bluejira_1 server 172.18.0.8:8080; } server { server_name exalate.acme.com; listen 80 ; access_log /var/log/nginx/access.log vhost; return 301 https://$host$request_uri; } server { server_name exalate.acme.com; listen 443 ssl http2 ; access_log /var/log/nginx/access.log vhost; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS'; ssl_prefer_server_ciphers on; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_certificate /etc/nginx/certs/exalate.acme.com.crt; ssl_certificate_key /etc/nginx/certs/exalate.acme.com.key; ssl_dhparam /etc/nginx/certs/exalate.acme.com.dhparam.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/certs/exalate.acme.com.chain.pem; add_header Strict-Transport-Security "max-age=31536000" always; include /etc/nginx/vhost.d/default; location / { proxy_pass http://exalate.acme.com; } }
The letsencrypt integration will automatically generate a LetEncrypt SSL certificate and add it into the configuration.
Warning: It is important that the letsencrypt service has a clear path to exalate.acme.com as it will check if that service does exist with the right settings.
Warning: We recommend always including the full certificate chain, rather than just the server certificate, to avoid potential installation failures. Additionally, ensure that your certificates have an A or A+ rating.