本文最初发表于2018-01-26。本文包含将python3编写的Django代码部署到DigitalOcean的大致步骤,涉及git、pyvenv、mysql、pm2等技术,对Django部署有一定的参考意义。在开始部署之前,需要准备一个远程服务器,一个域名,并将这个域名的A记录解析到这个远程服务器上。版本控制使用Git作为版本控制工具。新建一个git账号1.在远程服务器上执行$sudoaddusergit$sugit$cd$mkdir.ssh&&chmod700.ssh$touch.ssh/authorized_keys&&chmod600.ssh/authorized_keys2.在本地开发上生成macssh密钥$cd$ssh-keygen3.将本地生成的sshkeypub文件上传到远程服务器,并添加到授权文件末尾$cd$cd.ssh$ssh-copy-id-iid_rsa.pubgit@新建一个git远程服务器上的仓库$sudomkdir-p/gitbase/$sudochown-Rgit:git/gitbase$sugit$cd/gitbase/$gitinit--bare提交本地代码到远程git服务器$cd~/projects/$gitinit$gitadd.$gitcommit-m'firstcommit.'$gitremoteaddorigingit@:/gitbase/$gitpushoriginmaster从远程git服务器拉代码到远程服务器的发布目录$sudomkdir-p/deploy/$sudochown-R:/deploy/$cd/deploy/<项目名称>$gitclonegit@:/gitbase/<项目名称>。将上面的和替换为实际的用户名和远程服务器域名,下同也可以使用gitee作为版本控制服务器。更多信息请参考服务器端Git配置Django运行环境。使用pyvenv管理python3运行环境。Python2代码可以使用python3的lib2to3模块工具转换成python3代码。$python3-mlib2to3-w使用python3运行环境$cd$python3-mvenvpy3env$sourcepy3env/bin/activate$cd/deploy/$pipinstall-rrequirements.txt测试代码如果正常运行,切换到项目根目录执行$pythonmanage.pymigrate$pythonmanage.pycreatesuperuser$curl-ilocalhost:8000安装配置mysql-server安装MySQL$sudoapt-getinstallmysql-clientmysql-服务器打开mysql服务器远程访问$mysql-uroot-pyourpassmysql>grantallon*.*touser_name@'%'identifiedby'user_password';找到bind-address=127.0.0.1这一行,我们将其注释掉。$sudovim/etc/mysql/mysql.conf.d/mysqld.cnf确保3306端口是开放的$sudonetstat-an|grep3306restartmysqlservice$sudoservicemysqlrestart详见Ubuntu下打开Mysql远程访问方法。将表格界面和数据同步到远程服务器。使用mysql远程用户名和密码将备份数据传输到远程服务器。可以直接使用mysql命令行,也可以使用可视化的mysql管理工具,如workbench、HeidiSQL、navicat、Sequel等。使用pm2部署Django代码安装node和pm2从node官网下载nodelinux平台的可运行包,使用npm安装pm2。$cd$wgethttps://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.xz$xz-dnode-v8.9.4-linux-x64.tar.xz$tar-xfnode-v8.9.4-linux-x64.tar$cdnode-v8.9.4-linux-x64$sudocp-r{bin,include,lib,share}/usr$npmi-gpm2配置pm2运行参数切换到项目根目录/deploy/,然后执行$touchprocess.yml$vimprocess.yml保存如下配置为process.ymlapps:-name:mysitescript:manage.pyargs:['runserver','0.0.0.0:8000']cwd:.interpreter:~/py3env/bin/python3运行pm2$pm2startprocess.yml查看pm2的运行结果$pm2status测试网站是否可以访问$curl-ilocalhost:8000使用nginx反向与agent确认8000和80端口打开,然后测试本地是否可以访问远程站点。如果不是,检查具体原因。继续使用nginx反向代理远程服务器上的http服务,将内部站点端口映射到服务器的80端口,将对应域名的根目录映射到内部站点的子目录,加载静态资源文件。具体可以参考在线文档,本文不再赘述。