From da2db65bbf4a5ba2708f0849769d4e2170ffc7d7 Mon Sep 17 00:00:00 2001 From: geekup-legodevops <72587752+geekup-legodevops@users.noreply.github.com> Date: Tue, 23 Nov 2021 12:52:09 +0700 Subject: [PATCH] Refactor to generate nginx config file with auto-redirect HTTPS (#9256) Refactor flow to generate nginx configuration file corresponding Custom domain set up Add 2 template for Nginx template for HTTP and HTTPS. HTTPS contains new block for auto-redirect for HTTPS (cherry picked from commit 5ec733e5a238fea10c18d6b2187b141421b2ba87) --- Dockerfile | 2 +- deploy/docker/scripts/init_ssl_cert.sh | 9 +- deploy/docker/scripts/run-nginx.sh | 20 +-- .../nginx/nginx-app-http.conf.template.sh | 74 +++++++++ .../nginx/nginx-app-https.conf.template.sh | 90 +++++++++++ deploy/docker/templates/nginx_app.conf.sh | 152 ------------------ 6 files changed, 181 insertions(+), 166 deletions(-) create mode 100644 deploy/docker/templates/nginx/nginx-app-http.conf.template.sh create mode 100644 deploy/docker/templates/nginx/nginx-app-https.conf.template.sh delete mode 100644 deploy/docker/templates/nginx_app.conf.sh diff --git a/Dockerfile b/Dockerfile index d3bea1be0a..d1e32f048c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -64,7 +64,7 @@ COPY ./app/rts/package.json ./app/rts/dist/* rts/ COPY ./app/rts/node_modules rts/node_modules # Nginx & MongoDB config template - Configuration layer -COPY ./deploy/docker/templates/nginx_app.conf.sh ./deploy/docker/templates/mongo-init.js.sh ./deploy/docker/templates/docker.env.sh templates/ +COPY ./deploy/docker/templates/nginx/* ./deploy/docker/templates/mongo-init.js.sh ./deploy/docker/templates/docker.env.sh templates/ # Add bootstrapfile COPY ./deploy/docker/entrypoint.sh ./deploy/docker/scripts/* ./ diff --git a/deploy/docker/scripts/init_ssl_cert.sh b/deploy/docker/scripts/init_ssl_cert.sh index 8e29d2c357..8fb8ba5426 100755 --- a/deploy/docker/scripts/init_ssl_cert.sh +++ b/deploy/docker/scripts/init_ssl_cert.sh @@ -1,10 +1,7 @@ #!/bin/bash init_ssl_cert() { - echo "Start Nginx to verify certificate" - nginx APPSMITH_CUSTOM_DOMAIN="$1" - NGINX_SSL_CMNT="" local rsa_key_size=4096 local data_path="/appsmith-stacks/data/certificate" @@ -19,15 +16,19 @@ init_ssl_cert() { fi echo "Re-generating nginx config template with domain" - bash "/opt/appsmith/templates/nginx_app.conf.sh" "$NGINX_SSL_CMNT" "$APPSMITH_CUSTOM_DOMAIN" >"/etc/nginx/conf.d/nginx_app.conf.template" + bash "/opt/appsmith/templates/nginx-app-http.conf.template.sh" "$APPSMITH_CUSTOM_DOMAIN" >"/etc/nginx/conf.d/nginx_app.conf.template" echo "Generating nginx configuration" cat /etc/nginx/conf.d/nginx_app.conf.template | envsubst "$(printf '$%s,' $(env | grep -Eo '^APPSMITH_[A-Z0-9_]+'))" | sed -e 's|\${\(APPSMITH_[A-Z0-9_]*\)}||g' >/etc/nginx/sites-available/default + echo "Start Nginx to verify certificate" + nginx + local live_path="/etc/letsencrypt/live/$APPSMITH_CUSTOM_DOMAIN" local ssl_path="/appsmith-stacks/ssl" if [[ -e "$ssl_path/fullchain.pem" ]] && [[ -e "$ssl_path/privkey.pem" ]]; then echo "Existing custom certificate" + echo "Stop Nginx" nginx -s stop return fi diff --git a/deploy/docker/scripts/run-nginx.sh b/deploy/docker/scripts/run-nginx.sh index 467fc338f2..da2bfad75a 100755 --- a/deploy/docker/scripts/run-nginx.sh +++ b/deploy/docker/scripts/run-nginx.sh @@ -7,20 +7,22 @@ set -o allexport . "$ENV_PATH" set +o allexport -if [[ -n $APPSMITH_CUSTOM_DOMAIN ]]; then - NGINX_SSL_CMNT="" +TEMPLATE_DIR="/opt/appsmith/templates" +APP_TEMPLATE="$TEMPLATE_DIR/nginx-app-http.conf.template.sh" + +# Check exist certificate with given custom domain +if [[ -n $APPSMITH_CUSTOM_DOMAIN ]]; then + APP_TEMPLATE="$TEMPLATE_DIR/nginx-app-https.conf.template.sh" + if ! [[ -e "/etc/letsencrypt/live/$APPSMITH_CUSTOM_DOMAIN" ]]; then + source "/opt/appsmith/init_ssl_cert.sh" + init_ssl_cert "$APPSMITH_CUSTOM_DOMAIN" + fi fi echo "Re-generating nginx config template" -bash "/opt/appsmith/templates/nginx_app.conf.sh" "$NGINX_SSL_CMNT" "$APPSMITH_CUSTOM_DOMAIN" >"/etc/nginx/conf.d/nginx_app.conf.template" +bash "$APP_TEMPLATE" "$APPSMITH_CUSTOM_DOMAIN" >"/etc/nginx/conf.d/nginx_app.conf.template" echo "Generating nginx configuration" cat /etc/nginx/conf.d/nginx_app.conf.template | envsubst "$(printf '$%s,' $(env | grep -Eo '^APPSMITH_[A-Z0-9_]+'))" | sed -e 's|\${\(APPSMITH_[A-Z0-9_]*\)}||g' >/etc/nginx/sites-available/default -# Check exist certificate with given custom domain -if ! [[ -e "/etc/letsencrypt/live/$APPSMITH_CUSTOM_DOMAIN" ]] && [[ -n $APPSMITH_CUSTOM_DOMAIN ]]; then - source "/opt/appsmith/init_ssl_cert.sh" - init_ssl_cert "$APPSMITH_CUSTOM_DOMAIN" -fi - exec nginx -g "daemon off;" \ No newline at end of file diff --git a/deploy/docker/templates/nginx/nginx-app-http.conf.template.sh b/deploy/docker/templates/nginx/nginx-app-http.conf.template.sh new file mode 100644 index 0000000000..55e09792d9 --- /dev/null +++ b/deploy/docker/templates/nginx/nginx-app-http.conf.template.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +set -o nounset + +CUSTOM_DOMAIN="$1" + +if [ -z $CUSTOM_DOMAIN ]; then + CUSTOM_DOMAIN=_ +fi + +cat <