本篇文章最初发表于 2018-01-26。node
本文包含部署使用 python3 编写的 Django 代码到 Digital Ocean 的通常步骤,涉及到 git, pyvenv, mysql, pm2 等技术,对于 Django 部署具备必定的参考借鉴意义。python
开始部署前,你须要准备一台远程服务器,一个域名,而且将这个域名 A 记录解析到这台远程服务器。mysql
使用 Git 做为版本控制工具。linux
$ sudo adduser git $ su git $ cd $ mkdir .ssh && chmod 700 .ssh $ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
$ cd $ ssh-keygen
$ cd $ cd .ssh $ ssh-copy-id -i id_rsa.pub git@<servername.com>
$ sudo mkdir -p /gitbase/<projectname> $ sudo chown -R git:git /gitbase $ su git $ cd /gitbase/<projectname> $ git init --bare
$ cd ~/projects/<projectname> $ git init $ git add . $ git commit -m 'first commit.' $ git remote add origin git@<servername.com>:/gitbase/<projectname> $ git push origin master
$ sudo mkdir -p /deploy/<projectname> $ sudo chown -R <user>:<user> /deploy/<projectname> $ cd /deploy/<projectname> $ git clone git@<servername.com>:/gitbase/<projectname> .
替换上述的 <user>
和 <servername.com>
为实际的用户名和远程服务器域名,下同。也可以使用 gitee来做为版本控制服务器。更多可参考Git on the Servernginx
使用 pyvenv 来管理 python3 的运行环境,python2 的代码能够使用 python3 的lib2to3 模块工具来转义成 python3 代码。git
$ python3 -m lib2to3 -w <mycode.py>
$ cd $ python3 -m venv py3env $ source py3env/bin/activate $ cd /deploy/<projectname> $ pip install -r requirements.txt
测试代码是否能正常运行,切换到项目根目录,并执行sql
$ python manage.py migrate $ python manage.py createsuperuser $ curl -i localhost:8000
$ sudo apt-get install mysql-client mysql-server
$ mysql -uroot -p yourpass mysql> grant all on *.* to user_name@'%' identified by 'user_password';
找到 bind-address = 127.0.0.1 这一行,咱们将它注释掉。npm
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
确保 3306 端口的开启状态vim
$ sudo netstat -an | grep 3306
重启 mysql 服务bash
$ sudo service mysql restart
想了解更多能够参考Ubuntu 下开启 Mysql 远程访问的方法。
使用 mysql 远程用户名和密码将备份的数据传输到远程服务器,能够直接使用 mysql 命令行,也能够使用可视化的 mysql 管理工具,例如 workbench、HeidiSQL、navicat、Sequel 等。
从 node 官网下载 node linux 平台的可运行包,并利用 npm 安装 pm2。
$ cd $ wget https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.xz $ xz -d node-v8.9.4-linux-x64.tar.xz $ tar -xf node-v8.9.4-linux-x64.tar $ cd node-v8.9.4-linux-x64 $ sudo cp -r {bin,include,lib,share} /usr $ npm i -g pm2
切换到项目根目录 /deploy/<projectname>
,而后执行
$ touch process.yml $ vim process.yml
将以下配置保存为 process.yml
apps: - name: mysite script: manage.py args: ['runserver', '0.0.0.0:8000'] cwd: . interpreter: ~/py3env/bin/python3
运行 pm2
$ pm2 start process.yml
查看 pm2 的运行结果
$ pm2 status
测试网站是否能访问
$ curl -i localhost:8000
确认 8000 和 80 端口开启后,而后再本地测试远程站点是否能够访问,若不能访问,则排查具体缘由。继续使用nginx 来反向代理远程服务器上的 http服务,将内部站点端口映射到服务器的 80 端口,将相应域名的根目录映射为内部站点的子目录,以及加载静态资源文件等实现。具体能够参考网上文档,本文再也不赘述。