Modifying deploy script to replace nginx configuration at runtime (#106)
* Getting the script to work on Mac OS X Bash Version 3 * Correcting the nginx template configuration and Dockerfile for the appsmith-editor. Now any replaced environment variables will be replaced when the Nginx Docker container restarts.
This commit is contained in:
parent
a9ed054cbb
commit
1060423b99
|
|
@ -3,6 +3,8 @@ FROM nginx:1.17.9-alpine
|
|||
COPY ./build /var/www/appsmith
|
||||
|
||||
EXPOSE 80
|
||||
# This is the default nginx template file inside the container.
|
||||
# This is replaced by the install.sh script during a deployment
|
||||
COPY ./docker/templates/nginx-linux.conf.template /nginx.conf.template
|
||||
COPY ./docker/start-nginx.sh /start-nginx.sh
|
||||
CMD ["/start-nginx.sh"]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#!/bin/sh
|
||||
set -ue
|
||||
cat /nginx.conf.template | envsubst "$(printf '$%s,' $(env | grep -Eo '^APPSMITH_[A-Z0-9_]+'))" | sed -e 's|\${\(APPSMITH_[A-Z0-9_]*\)}||g' | tee /etc/nginx/conf.d/app.conf
|
||||
cat /nginx.conf.template | envsubst "$(printf '$%s,' $(env | grep -Eo '^APPSMITH_[A-Z0-9_]+'))" | sed -e 's|\${\(APPSMITH_[A-Z0-9_]*\)}||g' > /etc/nginx/conf.d/default.conf
|
||||
exec nginx -g 'daemon off;'
|
||||
|
|
|
|||
|
|
@ -44,30 +44,70 @@ start_docker() {
|
|||
fi
|
||||
}
|
||||
|
||||
check_os() {
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
package_manager="brew"
|
||||
desired_os=1
|
||||
return
|
||||
fi
|
||||
|
||||
os_name=`cat /etc/*-release | egrep "^NAME="`
|
||||
os_name="${os_name#*=}"
|
||||
echo $os_name
|
||||
case "${os_name}" in
|
||||
\"Ubuntu*\")
|
||||
echo "In here"
|
||||
desired_os=1
|
||||
package_manager="apt-get"
|
||||
;;
|
||||
\"Red\ Hat*\")
|
||||
desired_os=1
|
||||
package_manager="yum"
|
||||
;;
|
||||
\"CentOS*\")
|
||||
desired_os=1
|
||||
package_manager="yum"
|
||||
;;
|
||||
*) desired_os=0
|
||||
esac
|
||||
}
|
||||
|
||||
overwrite_file() {
|
||||
file_location=$1
|
||||
template_file=$2
|
||||
|
||||
if [ -f $install_dir/$file_location ]
|
||||
then
|
||||
read -p "File $file_location already exists. Would you like to replace it? [Y]: " value
|
||||
value=${value:-Y}
|
||||
|
||||
if [ $value == "Y" -o $value == "y" -o $value == "yes" -o $value == "Yes" ]
|
||||
then
|
||||
mv -f $template_file $install_dir/$file_location
|
||||
echo "File $install_dir/$file_location replaced successfuly!"
|
||||
else
|
||||
echo "You chose not to replace existing file: $install_dir/$file_location"
|
||||
rm -rf $template_file
|
||||
echo "File $template_file removed from source directory."
|
||||
echo ""
|
||||
fi
|
||||
else
|
||||
mv -f $template_file $install_dir/$file_location
|
||||
fi
|
||||
}
|
||||
|
||||
echo -e "\U1F44B Thank you for trying out Appsmith! "
|
||||
echo ""
|
||||
|
||||
declare -A osInfo;
|
||||
|
||||
osInfo[/etc/debian_version]="apt-get"
|
||||
osInfo[/etc/centos-release]="yum"
|
||||
osInfo[/etc/redhat-release]="yum"
|
||||
osInfo[/System/Library/CoreServices/SystemVersion.plist]="brew"
|
||||
|
||||
# Checking OS and assiging package manager
|
||||
desired_os=0
|
||||
echo -e "\U1F575 Detecting your OS"
|
||||
check_os
|
||||
echo ""
|
||||
for f in ${!osInfo[@]}
|
||||
do
|
||||
if [[ -f $f ]];then
|
||||
package_manager=${osInfo[$f]}
|
||||
desired_os=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $desired_os -eq 0 ]];then
|
||||
echo "This script is currently meant to install Appsmith on Ubuntu | RHEL | CentOS machines."
|
||||
echo "This script is currently meant to install Appsmith on Mac OS X | Ubuntu | RHEL | CentOS machines."
|
||||
echo "Please contact hello@appsmith.com with your OS details if you wish to extend this support"
|
||||
echo -e "Exiting for now. Bye! \U1F44B"
|
||||
exit
|
||||
|
|
@ -82,6 +122,7 @@ echo "1) Automatically setup mongo db on this instance (recommended)"
|
|||
echo "2) Connect to an external mongo db"
|
||||
read -p 'Enter option number [1]: ' mongo_option
|
||||
mongo_option=${mongo_option:-1}
|
||||
echo ""
|
||||
|
||||
if [[ $mongo_option -eq 2 ]];then
|
||||
read -p 'Enter your mongo db host: ' mongo_host
|
||||
|
|
@ -95,7 +136,7 @@ elif [[ $mongo_option -eq 1 ]];then
|
|||
read -sp 'Set the mongo password: ' mongo_root_password
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo ""
|
||||
echo "Appsmith needs password and salt to encrypt sensitive information"
|
||||
encryptionEnv=./template/encryption.env
|
||||
if test -f "$encryptionEnv"; then
|
||||
|
|
@ -104,6 +145,7 @@ if test -f "$encryptionEnv"; then
|
|||
echo "2) Yes. Overwrite the existing encryption (NOT SUGGESTED)"
|
||||
read -p 'Enter option number [1]: ' overwrite_encryption
|
||||
overwrite_encryption=${overwrite_encryption:-1}
|
||||
echo ""
|
||||
|
||||
if [[ $overwrite_encryption -eq 1 ]];then
|
||||
setup_encryption="false"
|
||||
|
|
@ -119,8 +161,8 @@ if [[ "$setup_encryption" = "true" ]];then
|
|||
echo "2) Set up your own salt and password"
|
||||
read -p 'Enter option number [1]: ' encryption_option
|
||||
encryption_option=${encryption_option:-1}
|
||||
|
||||
if [[ $encryption_option -eq 2 ]];then
|
||||
echo ""
|
||||
read -p 'Enter your encryption password: ' user_encryption_password
|
||||
read -p 'Enter your encryption salt: ' user_encryption_salt
|
||||
elif [[ $encryption_option -eq 1 ]];then
|
||||
|
|
@ -155,14 +197,14 @@ if [[ -z $custom_domain ]]; then
|
|||
fi
|
||||
|
||||
mkdir -p template
|
||||
cd template
|
||||
( cd template
|
||||
curl -O https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/template/docker-compose.yml.sh
|
||||
curl -O https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/template/init-letsencrypt.sh.sh
|
||||
curl -O https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/template/mongo-init.js.sh
|
||||
curl -O https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/template/docker.env.sh
|
||||
curl -O https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/template/nginx_app.conf.sh
|
||||
curl -O https://raw.githubusercontent.com/appsmithorg/appsmith/release/deploy/template/encryption.env.sh
|
||||
cd ..
|
||||
)
|
||||
|
||||
# Role - Docker
|
||||
if ! is_command_present docker ;then
|
||||
|
|
@ -180,7 +222,7 @@ if [ $package_manager == "yum" -o $package_manager == "apt-get" ];then
|
|||
fi
|
||||
|
||||
# Role - Folder
|
||||
for directory_name in nginx certbot mongo/db opa/config appsmith-server/config
|
||||
for directory_name in nginx certbot mongo/db opa/config
|
||||
do
|
||||
if [[ ! -d "$install_dir/data/$directory_name" ]];then
|
||||
mkdir -p "$install_dir/data/$directory_name"
|
||||
|
|
@ -198,42 +240,15 @@ if [[ "$setup_encryption" = "true" ]];then
|
|||
fi
|
||||
chmod 0755 init-letsencrypt.sh
|
||||
|
||||
declare -A fileInfo
|
||||
|
||||
fileInfo[/data/nginx/app.conf]="nginx_app.conf"
|
||||
fileInfo[/docker-compose.yml]="docker-compose.yml"
|
||||
fileInfo[/data/mongo/init.js]="mongo-init.js"
|
||||
fileInfo[/init-letsencrypt.sh]="init-letsencrypt.sh"
|
||||
fileInfo[/docker.env]="docker.env"
|
||||
fileInfo[/encryption.env]="encryption.env"
|
||||
|
||||
for f in ${!fileInfo[@]}
|
||||
do
|
||||
|
||||
if [ -f $install_dir/$f ]
|
||||
then
|
||||
read -p "File $f already exist. Would you like to replace it? [Y]: " value
|
||||
|
||||
if [ $value == "Y" -o $value == "y" -o $value == "yes" -o $value == "Yes" ]
|
||||
then
|
||||
mv -f ${fileInfo[$f]} $install_dir$f
|
||||
echo "File $install_dir$f replaced succeffuly!"
|
||||
else
|
||||
echo "You choose not to replae existing file: $install_dir$f"
|
||||
rm -rf ${fileInfo[$f]}
|
||||
echo "File ${fileInfo[$f]} removed from source directory."
|
||||
echo ""
|
||||
fi
|
||||
else
|
||||
mv -f ${fileInfo[$f]} $install_dir$f
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
overwrite_file "/data/nginx/app.conf.template" "nginx_app.conf"
|
||||
overwrite_file "/docker-compose.yml" "docker-compose.yml"
|
||||
overwrite_file "/data/mongo/init.js" "mongo-init.js"
|
||||
overwrite_file "/init-letsencrypt.sh" "init-letsencrypt.sh"
|
||||
overwrite_file "/docker.env" "docker.env"
|
||||
overwrite_file "/encryption.env" "encryption.env"
|
||||
|
||||
echo ""
|
||||
|
||||
#echo "Running init-letsencrypt.sh...."
|
||||
cd $install_dir
|
||||
if [[ ! -z $custom_domain ]]; then
|
||||
echo "Running init-letsencrypt.sh...."
|
||||
|
|
|
|||
|
|
@ -1,14 +1,9 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f docker-compose.yml ]
|
||||
then
|
||||
echo "file docker-compose.yml already exists"
|
||||
else
|
||||
if [ ! -f docker-compose.yml ]; then
|
||||
touch docker-compose.yml
|
||||
fi
|
||||
|
||||
|
||||
|
||||
cat > docker-compose.yml << EOF
|
||||
version: "3.7"
|
||||
|
||||
|
|
@ -20,10 +15,10 @@ services:
|
|||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./data/nginx:/etc/nginx/conf.d
|
||||
- ./data/nginx/app.conf.template:/nginx.conf.template
|
||||
- ./data/certbot/conf:/etc/letsencrypt
|
||||
- ./data/certbot/www:/var/www/certbot
|
||||
command: "/bin/sh -c 'while :; do sleep 6h & wait \$\${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
|
||||
command: "/bin/sh -c 'while :; do sleep 6h & wait \$\${!}; nginx -s reload; done & /start-nginx.sh'"
|
||||
depends_on:
|
||||
- appsmith-internal-server
|
||||
networks:
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f docker-compose.yml ]
|
||||
then
|
||||
echo "file docker-compose.yml already exists"
|
||||
else
|
||||
if [ ! -f docker-compose.yml ]; then
|
||||
touch docker-compose.yml
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f encryption.env ]
|
||||
then
|
||||
echo "file encryption.env already exists"
|
||||
else
|
||||
if [ ! -f encryption.env ]; then
|
||||
touch encryption.env
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f init-letsencrypt.sh ]
|
||||
then
|
||||
echo "file init-letsencrypt.sh already exists"
|
||||
else
|
||||
if [ ! -f init-letsencrypt.sh ]; then
|
||||
touch init-letsencrypt.sh
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f mongo-init.js ]
|
||||
then
|
||||
echo "file docker-compose.yml already exists"
|
||||
else
|
||||
if [ ! -f mongo-init.js ]; then
|
||||
touch mongo-init.js
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -1,15 +1,15 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f nginx_app.conf ]
|
||||
then
|
||||
echo "file nginx_app.conf already exists"
|
||||
else
|
||||
if [ ! -f nginx_app.conf ]; then
|
||||
touch nginx_app.conf
|
||||
fi
|
||||
|
||||
# This template file is different from the others because of the sub_filter commands in the Nginx configuration
|
||||
# Those variables are substituted inside the Docker container for appsmith-editor during bootup.
|
||||
# Hence we wish to prevent environment substitution here.
|
||||
# Relevant variables will be replaced at the end of this file via sed command
|
||||
|
||||
|
||||
cat > nginx_app.conf << EOF
|
||||
echo '
|
||||
server {
|
||||
listen 80;
|
||||
$NGINX_SSL_CMNT server_name $custom_domain ;
|
||||
|
|
@ -20,10 +20,6 @@ $NGINX_SSL_CMNT server_name $custom_domain ;
|
|||
root /var/www/appsmith;
|
||||
index index.html index.htm;
|
||||
|
||||
#location / {
|
||||
# return 301 https://\$host\$request_uri;
|
||||
#}
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/certbot;
|
||||
}
|
||||
|
|
@ -33,6 +29,21 @@ $NGINX_SSL_CMNT server_name $custom_domain ;
|
|||
|
||||
location / {
|
||||
try_files \$uri /index.html =404;
|
||||
|
||||
sub_filter __APPSMITH_SENTRY_DSN__ '\''${APPSMITH_SENTRY_DSN}'\'';
|
||||
sub_filter __APPSMITH_APPSMITH_HOTJAR_HJID__ '\''${APPSMITH_HOTJAR_HJID}'\'';
|
||||
sub_filter __APPSMITH_HOTJAR_HJSV__ '\''${APPSMITH_HOTJAR_HJSV}'\'';
|
||||
sub_filter __APPSMITH_OAUTH2_GOOGLE_CLIENT_ID__ '\''${APPSMITH_OAUTH2_GOOGLE_CLIENT_ID}'\'';
|
||||
sub_filter __APPSMITH_OAUTH2_GITHUB_CLIENT_ID__ '\''${APPSMITH_OAUTH2_GITHUB_CLIENT_ID}'\'';
|
||||
sub_filter __APPSMITH_MARKETPLACE_URL__ '\''${APPSMITH_MARKETPLACE_URL}'\'';
|
||||
sub_filter __APPSMITH_SEGMENT_KEY__ '\''${APPSMITH_SEGMENT_KEY}'\'';
|
||||
sub_filter __APPSMITH_OPTIMIZELY_KEY__ '\''${APPSMITH_OPTIMIZELY_KEY}'\'';
|
||||
sub_filter __APPSMITH_ALGOLIA_API_ID__ '\''${APPSMITH_ALGOLIA_API_ID}'\'';
|
||||
sub_filter __APPSMITH_ALGOLIA_SEARCH_INDEX_NAME__ '\''${APPSMITH_ALGOLIA_SEARCH_INDEX_NAME}'\'';
|
||||
sub_filter __APPSMITH_ALGOLIA_API_KEY__ '\''${APPSMITH_ALGOLIA_API_KEY}'\'';
|
||||
sub_filter __APPSMITH_CLIENT_LOG_LEVEL__ '\''${APPSMITH_CLIENT_LOG_LEVEL}'\'';
|
||||
sub_filter __APPSMITH_GOOGLE_MAPS_API_KEY__ '\''${APPSMITH_GOOGLE_MAPS_API_KEY}'\'';
|
||||
sub_filter __APPSMITH_TNC_PP__ '\''${APPSMITH_TNC_PP}'\'';
|
||||
}
|
||||
|
||||
location /f {
|
||||
|
|
@ -66,6 +77,21 @@ $NGINX_SSL_CMNT index index.html index.htm;
|
|||
$NGINX_SSL_CMNT
|
||||
$NGINX_SSL_CMNT location / {
|
||||
$NGINX_SSL_CMNT try_files \$uri /index.html =404;
|
||||
$NGINX_SSL_CMNT
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_SENTRY_DSN__ '\''${APPSMITH_SENTRY_DSN}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_APPSMITH_HOTJAR_HJID__ '\''${APPSMITH_HOTJAR_HJID}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_HOTJAR_HJSV__ '\''${APPSMITH_HOTJAR_HJSV}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_OAUTH2_GOOGLE_CLIENT_ID__ '\''${APPSMITH_OAUTH2_GOOGLE_CLIENT_ID}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_OAUTH2_GITHUB_CLIENT_ID__ '\''${APPSMITH_OAUTH2_GITHUB_CLIENT_ID}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_MARKETPLACE_URL__ '\''${APPSMITH_MARKETPLACE_URL}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_SEGMENT_KEY__ '\''${APPSMITH_SEGMENT_KEY}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_OPTIMIZELY_KEY__ '\''${APPSMITH_OPTIMIZELY_KEY}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_ALGOLIA_API_ID__ '\''${APPSMITH_ALGOLIA_API_ID}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_ALGOLIA_SEARCH_INDEX_NAME__ '\''${APPSMITH_ALGOLIA_SEARCH_INDEX_NAME}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_ALGOLIA_API_KEY__ '\''${APPSMITH_ALGOLIA_API_KEY}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_CLIENT_LOG_LEVEL__ '\''${APPSMITH_CLIENT_LOG_LEVEL}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_GOOGLE_MAPS_API_KEY__ '\''${APPSMITH_GOOGLE_MAPS_API_KEY}'\'';
|
||||
$NGINX_SSL_CMNT sub_filter __APPSMITH_TNC_PP__ '\''${APPSMITH_TNC_PP}'\'';
|
||||
$NGINX_SSL_CMNT }
|
||||
$NGINX_SSL_CMNT
|
||||
$NGINX_SSL_CMNT location /f {
|
||||
|
|
@ -81,4 +107,7 @@ $NGINX_SSL_CMNT proxy_pass http://appsmith-internal-server:8080;
|
|||
$NGINX_SSL_CMNT }
|
||||
$NGINX_SSL_CMNT
|
||||
$NGINX_SSL_CMNT }
|
||||
EOF
|
||||
' > nginx_app.conf
|
||||
|
||||
sed -in "s/\$NGINX_SSL_CMNT/$NGINX_SSL_CMNT/g" nginx_app.conf
|
||||
sed -in "s/\$custom_domain/$custom_domain/g" nginx_app.conf
|
||||
Loading…
Reference in New Issue
Block a user