Skip to content

Instantly share code, notes, and snippets.

@cnicodeme
Last active May 3, 2018 15:11
Show Gist options
  • Save cnicodeme/6a9638fc5327d7ac285056f01c7e03f9 to your computer and use it in GitHub Desktop.
Save cnicodeme/6a9638fc5327d7ac285056f01c7e03f9 to your computer and use it in GitHub Desktop.
Deploy a new NGinx serrver with git, Auto deploy, Supervisor+uWSGI
#!/bin/bash
read -e -p "Project Name: " project_name
mkdir -p "/var/www/$project_name/project.git"
cd "/var/www/$project_name/project.git"
git init --bare
cd "/var/www/$project_name/"
# Loading the latest changes
read -e -p "Project current repository (http): " project_repository
git clone $project_repository tmp
cd tmp
git push "file:///var/www/$project_name/project.git" master
cd ..
rm -rf tmp
# Cloning the code into place
git clone /var/www/$project_name/project.git www
touch reloaded
cd www
virtualenv --system-site-package ../env
/var/www/$project_name/env/bin/pip install -r requirements.txt
cd ..
echo "#!/bin/bash" > project.git/hooks/post-receive
echo "" >> project.git/hooks/post-receive
echo "unset \$(git rev-parse --local-env-vars)" >> project.git/hooks/post-receive
echo "cd /var/www/$project_name/www/" >> project.git/hooks/post-receive
echo "git pull" >> project.git/hooks/post-receive
echo "" >> project.git/hooks/post-receive
echo "/var/www/$project_name/env/bin/python manage.py db upgrade" >> project.git/hooks/post-receive
echo "" >> project.git/hooks/post-receive
echo "touch /var/www/$project_name/reloaded" >> project.git/hooks/post-receive
chmod +x project.git/hooks/post-receive
chown cx42:cx42 project.git/hooks/post-receive
# Setting UWSGI
mkdir /etc/uwsgi
echo "" > "/etc/uwsgi/${project_name}.conf"
echo "uwsgi:" >> "/etc/uwsgi/${project_name}.conf"
echo " socket: /var/www/$project_name/uwsgi.sock" >> "/etc/uwsgi/${project_name}.conf"
echo "# daemonize: /var/log/${project_name}_uwsgi.log" >> "/etc/uwsgi/${project_name}.conf"
echo "# pidfile: /var/run/${project_name}_uwsgi.pid" >> "/etc/uwsgi/${project_name}.conf"
echo " master: true" >> "/etc/uwsgi/${project_name}.conf"
echo " processes: 2" >> "/etc/uwsgi/${project_name}.conf"
echo " uid: cx42" >> "/etc/uwsgi/${project_name}.conf"
echo " gid: cx42" >> "/etc/uwsgi/${project_name}.conf"
echo " chmod-socket: 666" >> "/etc/uwsgi/${project_name}.conf"
echo " vacuum: true" >> "/etc/uwsgi/${project_name}.conf"
echo " wsgi-file: /var/www/${project_name}/www/wsgi.py" >> "/etc/uwsgi/${project_name}.conf"
echo " callable: app" >> "/etc/uwsgi/${project_name}.conf"
echo " virtualenv: /var/www/${project_name}/env/" >> "/etc/uwsgi/${project_name}.conf"
echo " pythonpath: /var/www/${project_name}/env/lib/python2.7/site-packages" >> "/etc/uwsgi/${project_name}.conf"
echo " pythonpath: /var/www/${project_name}/www/" >> "/etc/uwsgi/${project_name}.conf"
echo " post-buffering: 8192" >> "/etc/uwsgi/${project_name}.conf"
echo " touch-reload: /var/www/${project_name}/reloaded" >> "/etc/uwsgi/${project_name}.conf"
touch "/var/www/$project_name/uwsgi.sock" && chown cx42:cx42 "/var/www/$project_name/uwsgi.sock"
touch "/var/log/${project_name}_uwsgi.log" && chown cx42:cx42 "/var/log/${project_name}_uwsgi.log"
touch "/var/run/${project_name}_uwsgi.pid" && chown cx42:cx42 "/var/run/${project_name}_uwsgi.pid"
# Setting NGINX
read -e -p "Project main URL (ie: sponsored.tech): " project_url
read -e -p "Project sub URL (ie: www.sponsored.tech): " project_sub_url
echo "server {" > "/etc/nginx/sites-available/$project_name-ssl"
echo " listen 80;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen [::]:80;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " server_name ${project_sub_url};" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " include /etc/nginx/snippets/letsencrypt.conf;" >> "/etc/nginx/sites-available/$project_name"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " return 301 https://${project_url}\$request_uri;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "}" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "server {" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen 80;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen [::]:80;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " server_name ${project_url};" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " include /etc/nginx/snippets/letsencrypt.conf;" >> "/etc/nginx/sites-available/$project_name"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " return 301 https://${project_url}\$request_uri;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "}" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "server {" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen 443 ssl http2;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen [::]:443 ssl http2;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " server_name ${project_sub_url};" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " access_log off;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " error_log /var/log/nginx/${project_name}.error.log;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " return 301 https://${project_url}\$request_uri;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " include /etc/nginx/snippets/ssl.conf;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl on;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl_certificate /etc/letsencrypt/live/${project_url}/fullchain.pem;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl_certificate_key /etc/letsencrypt/live/${project_url}/privkey.pem;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl_trusted_certificate /etc/letsencrypt/live/${project_url}/fullchain.pem;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "}" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "server {" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen 443;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " listen [::]:443;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " server_name ${project_url};" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " access_log off;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " error_log /var/log/nginx/${project_name}.error.log;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " client_max_body_size 4m;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " include /etc/nginx/snippets/letsencrypt.conf;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " # enable gzip compression" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " gzip on;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " gzip_min_length 1100;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " gzip_buffers 4 32k;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " gzip_types text/plain application/x-javascript text/xml text/css;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " gzip_vary on;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " # end gzip configuration" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " include /etc/nginx/snippets/ssl.conf;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl on;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl_certificate /etc/letsencrypt/live/${project_url}/fullchain.pem;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl_certificate_key /etc/letsencrypt/live/${project_url}/privkey.pem;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " ssl_trusted_certificate /etc/letsencrypt/live/${project_url}/fullchain.pem;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " location / { try_files \$uri @yourapplication; }" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " location @yourapplication {" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " include uwsgi_params;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " uwsgi_pass unix:/var/www/$project_name/uwsgi.sock;" >> "/etc/nginx/sites-available/$project_name-ssl"
echo " }" >> "/etc/nginx/sites-available/$project_name-ssl"
echo "}" >> "/etc/nginx/sites-available/$project_name-ssl"
# NON SSL version:
echo "server {" > "/etc/nginx/sites-available/$project_name"
echo " listen 80;" >> "/etc/nginx/sites-available/$project_name"
echo " listen [::]:80;" >> "/etc/nginx/sites-available/$project_name"
echo " server_name ${project_sub_url};" >> "/etc/nginx/sites-available/$project_name"
echo " include /etc/nginx/snippets/letsencrypt.conf;" >> "/etc/nginx/sites-available/$project_name"
echo "" >> "/etc/nginx/sites-available/$project_name"
echo " return 301 http://${project_url}\$request_uri;" >> "/etc/nginx/sites-available/$project_name"
echo "}" >> "/etc/nginx/sites-available/$project_name"
echo "" >> "/etc/nginx/sites-available/$project_name"
echo "server {" >> "/etc/nginx/sites-available/$project_name"
echo " listen 80;" >> "/etc/nginx/sites-available/$project_name"
echo " listen [::]:80;" >> "/etc/nginx/sites-available/$project_name"
echo " server_name ${project_url};" >> "/etc/nginx/sites-available/$project_name"
echo " include /etc/nginx/snippets/letsencrypt.conf;" >> "/etc/nginx/sites-available/$project_name"
echo "" >> "/etc/nginx/sites-available/$project_name"
echo " location / { try_files \$uri @yourapplication; }" >> "/etc/nginx/sites-available/$project_name"
echo " location @yourapplication {" >> "/etc/nginx/sites-available/$project_name"
echo " include uwsgi_params;" >> "/etc/nginx/sites-available/$project_name"
echo " uwsgi_pass unix:/var/www/$project_name/uwsgi.sock;" >> "/etc/nginx/sites-available/$project_name"
echo " }" >> "/etc/nginx/sites-available/$project_name"
echo "}" >> "/etc/nginx/sites-available/$project_name"
echo "" >> "/etc/nginx/sites-available/$project_name"
ln -s /etc/nginx/sites-available/$project_name /etc/nginx/sites-enabled/$project_name.conf
# Now configuring Supervisor
echo "[program:$project_name]" > /etc/supervisor/conf.d/$project_name.conf
echo "user = cx42" >> /etc/supervisor/conf.d/$project_name.conf
echo "command=/usr/local/bin/uwsgi --yml /etc/uwsgi/${project_name}.conf" >> /etc/supervisor/conf.d/$project_name.conf
echo "autostart=true" >> /etc/supervisor/conf.d/$project_name.conf
echo "autorestart=true" >> /etc/supervisor/conf.d/$project_name.conf
echo "stopsignal=QUIT" >> /etc/supervisor/conf.d/$project_name.conf
echo "startsecs=5" >> /etc/supervisor/conf.d/$project_name.conf
chown -R cx42:cx42 /var/www/$project_name
# Starting the services:
service nginx restart
supervisorctl update && supervisorctl reread
echo ""
echo "Done!"
echo ""
echo "What's left:"
echo " * letsencrypt certbot command"
echo " * Restart NGinx"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment