Skip to content

Instantly share code, notes, and snippets.

@shesl-meow
Last active August 31, 2019 19:10
Show Gist options
  • Save shesl-meow/3c372c54999b2af93b24629764d0d3a2 to your computer and use it in GitHub Desktop.
Save shesl-meow/3c372c54999b2af93b24629764d0d3a2 to your computer and use it in GitHub Desktop.
ConfigDjangoUwsgi
#!/usr/bin/env bash
# required package:
# nginx, uwsgi, python
SELF_PATH=`cd $(dirname $0); pwd -P;`
read -e -p "Enter IP address of your config server?/ 请输入您服务器的 IP 地址:" \
-i "9.105.214.245" SERVER_IP
read -e -p "Enter the deploy port of your config? / 请输出您需要部署的服务器 IP 地址:"\
-i "8090" SERVER_PORT
read -e -p "Enter domain name of your config server / 请输入指向您服务器的域名:" \
-i "books.shesl.top" DOMAIN_NAME
read -e -p "What is the name of your project / 您希望您项目的名称叫什么(please do not leave blank):" \
-i "Book" PROJECT_NAME
read -e -p "What is your settings directory name or django project name / Django 设置文件所在的文件夹:" \
-i "Book" DJANGO_PROJECT_NAME
read -e -p "What is your python virtualenv directory / 您 python 的虚拟环境在哪个地址:" \
-i "${HOME}/.virtualenvs/" WORKON_HOME
read -e -p "Where is your frontend files / 该项目的前端文件在哪个目录下:" \
-i "Frontend/" FRONTEND_HOME
echo "---------------------------------------------------------------------------------"
read -e -p "Getting a new virtualenv / 是否需要新建一个 python 虚拟环境?[Y/others]" \
-i "N" VIRTUALENV_CHOICE
read -e -p "Config your ip and domain name into django-settings / 是否将 IP 和域名写入 Django 的设置中?[Y/others]" \
-i "Y" DJANGO_SETTING_CHOICE
read -e -p "Config your nginx and reload / 是否重新将配置写入 nginx 配置文件并重启 nginx?[Y/others]" \
-i "Y" NGINX_SETTING_CHOICE
read -e -p "Config a new uwsgi inite file / 是否需要新建一个 uwsgi 的初始化 ini 文件?[Y/others]" \
-i "Y" UWSGI_SETTING_CHOICE
read -e -p "Need shell scripts running and stopping uwsgi / 是否需要新建启动和停止 uwsgi 的脚本?[Y/others]" \
-i "Y" UWSGI_SCRIPT_CHOICE
sudo /usr/bin/python3.6 -m pip install virtualenv virtualenvwrapper
export PYTHON=python3.6
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.6
source `which virtualenvwrapper.sh`
case ${VIRTUALENV_CHOICE} in
y|Y)
mkvirtualenv ${PROJECT_NAME}
;;
*) workon ${PROJECT_NAME} ;;
esac
pip install -r ./requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
cat << _EOF_ > tmp
upstream django-${PROJECT_NAME} {
server unix://${SELF_PATH}/${PROJECT_NAME,,}.sock; # for a file socket
}
server {
listen ${SERVER_PORT};
server_name ${SERVER_IP} ${DOMAIN_NAME};
charset utf-8;
client_max_body_size 75M;
root ${SELF_PATH};
index index.html index.htm index.nginx-debian.html;
location /media {
alias ${SELF_PATH}/media;
}
location /static {
alias ${SELF_PATH}/static;
}
location / {
uwsgi_pass django-${PROJECT_NAME};
include ${SELF_PATH}/uwsgi_params;
}
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}
_EOF_
case ${NGINX_SETTING_CHOICE} in
y|Y)
sudo mv tmp /etc/nginx/sites-available/${PROJECT_NAME}.conf
sudo ln -sf /etc/nginx/sites-available/${PROJECT_NAME}.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx
;;
*) echo "nginx not config." ;;
esac
case ${DJANGO_SETTING_CHOICE} in
y|Y)
sed "s@ALLOWED_HOSTS = .*@ALLOWED_HOSTS = ['${DOMAIN_NAME}', '${SERVER_IP}']@g;
s@FRONTEND_ROOT = .*@FRONTEND_ROOT = '${FRONTEND_HOME}'@g" \
./${DJANGO_PROJECT_NAME}/settings.py > tmp
mv tmp ./${DJANGO_PROJECT_NAME}/settings.py
;;
*) echo "Leave ALLOWED_HOSTS." ;;
esac
cat << _EOF_ > tmp
# uwsig_${PROJECT_NAME,,}.ini file
[uwsgi]
chdir = %d
module = ${DJANGO_PROJECT_NAME}.wsgi
virtualenv = ${WORKON_HOME}/${PROJECT_NAME}
# process-related settings
master = true
processes = 10
socket = %d${PROJECT_NAME,,}.sock
chmod-socket = 665
# clear environment on exit
vacuum = true
uid = www-data
gid = www-data
pidfile = %dprocess_${PROJECT_NAME,,}.pid
plugins-dir = /usr/lib/uwsgi/plugins/
plugins = python36
_EOF_
case ${UWSGI_SETTING_CHOICE} in
y|Y)
mv tmp ./uwsgi_${PROJECT_NAME,,}.ini
;;
*) echo "You haven't create uwsgi ini file.";;
esac
cat << _EOF_ > tmp
#!/usr/bin/env bash
cd \`dirname \$0\`
export WORKON_HOME=${WORKON_HOME}
source `which virtualenvwrapper.sh`
workon ${PROJECT_NAME}
cat <(echo "yes") | python ./manage.py collectstatic
uwsgi --ini ./uwsgi_${PROJECT_NAME,,}.ini \
2> ./log/\`date +"%Y_%m_%d"\`.err.log 1> ./log/\`date +"%Y_%m_%d"\`.info.log &
sudo chown www-data:www-data ${PROJECT_NAME,,}.sock
_EOF_
case ${UWSGI_SCRIPT_CHOICE} in
y|Y)
mv tmp ./run_uwsgi_${PROJECT_NAME,,}.sh
chmod +x ./run_uwsgi_${PROJECT_NAME,,}.sh
;;
*) echo "You don't create run uwsgi script." ;;
esac
cat << _EOF_ > tmp
#!/usr/bin/env bash
cd \`dirname \$0\`
if [[ -f ./process_${PROJECT_NAME,,}.pid ]]; then
uwsgi --stop ./process_${PROJECT_NAME,,}.pid
else
read -e -p "Pid file not found. Force kill all uwsgi process?[Y/others]" -i "Y" CHOICE
case \${CHOICE} in
y|Y) sudo pkill -f uwsgi -9 ;;
*) echo "You don't kill any process." ;;
esac
fi
_EOF_
case ${UWSGI_SCRIPT_CHOICE} in
y|Y)
mv tmp ./stop_uwsgi_${PROJECT_NAME,,}.sh
chmod +x ./stop_uwsgi_${PROJECT_NAME,,}.sh
;;
*) echo "You don't create stop script." && rm tmp;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment