利用githook将flask快速部署到Linux服务器
利用githook将flask快速部署到Linux服务器
网上有用到一些自动化部署工具来实现自动部署的,过程略为繁琐,就偷个懒,这个方法的灵感来源于hexo自动部署的过程,反正linux 下没有shell脚本不能做的。
就干脆利用git的post-receive 来实现了,简单粗暴。
环境
centos7 nginx web服务
本地flask应用创建
创建好本地flask应用。
服务器端配置
基本配置
- 在root用户下安装好nginx 、Python对应版本和git,并按照hexo的配置步骤创建一个普通用户(git)
nginx配置
新建nginx配置文件:
/etc/nginx/conf.d/flask.conf
添加以下内容:
server {
listen 80;
server_name example.com;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
}
并重启nginx服务器:
systemctl restart nginx
uwsgi 配置
切换到git用户:
su git && cd
新建flask.git用来作为远程git仓库
mkdir flask.git
cd flask.git && git init --bare
编辑githooks脚本,实现本地git push到该仓库后,自动运行uwsgi,完成自动部署。
cd hooks
vim post-receive
输入以下内容:
#!/bin/bash
GIT_REPO=/home/git/flask.git
TMP_GIT_CLONE=/tmp/flask
FLASK_DIR=/home/git/flask_ac
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
killall -9 uwsgi
rm -rf ${FLASK_DIR}/app
cp -rf ${TMP_GIT_CLONE}/app ${FLASK_DIR}
cd /home/git/flask_ac && sh uwsgistart.sh >/dev/null 2>&1
killall -9 uwsgi 先终止uwsgi程序,然后更新代码后运行 uwsgistart.sh 脚本启动uwsgi,>/dev/null 2>&1 表示结果不回显,开始没加的时候,本地终端关闭后,远程uwsgi也停止了,所以加了这个。其他几个就是用到的几个目录。
再赋予可执行权限
chmod +x post-receive
在用git推送之前,需要在服务器中配置好python venv环境,目录树如下:
.
├── app
│ ├── app.py
│ ├── __pycache__
│ ├── static
│ └── templates
├── flaskdeploy.sh
├── flaskrun.sh
├── requirements.txt
├── uwsgistart.sh
└── venv
├── bin
├── include
├── lib
├── lib64 -> lib
└── pyvenv.cfg
app目录是后续会经常修改的内容,这个在服务器端配置Python虚拟环境时创建一个空目录即可,后面git push上去就行了。其他内容在一次配置好后基本不需修改,所以这样分开可以很方便的更新站点文件。
requirements.txt通过本地的pip 导出,在本地flask中执行:
pip freeze > requirements.txt
flaskdeploy.sh 为本地使用,本地修改完app中的内容后,运行该脚本即可同步至服务器。内容如下:
#!/bin/bash
git add -A
git commit -m "auto deploy"
git push
就是git的推送命令。
flaskrun.sh也是本地使用的脚本,用来快速在本地运行flask:
#!/bin/bash
. venv/bin/activate && cd app && flask run
最后一个是uwsgistart.sh,这个是在服务器端起作用的,用来通过git-hooks脚本启动uwsgi服务。内容如下:
#!/bin/bash
. venv/bin/activate && cd app&&uwsgi --socket 0.0.0.0:8000 -p 3 -w app:app
这里就是将8000端口暴露给nginx,上面nginx配置中就是获取uwsgi的8000端口,实现http的访问,完成反向代理。