部署文档 - noenergysoftware/rateMyCourse GitHub Wiki

部署文档

本文档将简单介绍如何部署我们的网站。部署过程比较简单,并已在多个系统上经过测试。

系统,软件需求

项目对系统没有特殊需求,已知可以在以下系统上正常部署:

  • Ubuntu 1604/1804
  • Debian 9
  • CentOs 7

本项目主要基于Django进行开发,需求服务器正常配置以下环境:

  • Python >= 3.5
  • Django >= 2.0

其中Python3需求安装以下包:

  • Rankit
  • Django-test
  • gitpython
  • Django-extensions
  • Django-cors-headers
  • pandas

数据库无使用限制,你可以利用Django的数据库接口适配适合的数据库。项目默认使用的是SQLite3,可以在配置后直接使用。参考我们的测试结果,我们推荐在数据量不大时使用SQLite3,而在数据量较大时使用PostgreSQL。

部署过程

我们以Debian 9 + Python 3.6 + SQLite3 的环境为例。在部署时,我们要使用一个Web Server对前后端流量进行转发,在这里我们选择了Nginx为例。为了使例子尽可能简单,我们暂时不使用uWSGI,仅仅使用端口转发功能。详细的部署例子如下:

首先更新系统环境与软件

sudo apt update
sudo apt upgrade

之后我们安装必须的软件

sudo apt install python3 python3-pip nginx sqlite3 git
pip3 install Django gitpython Django-test Django-extensions django-cors-headers pandas rankit

之后就可以进行部署了。在开发时,我们是前后端分离进行开发的,而我们release的版本将前后端进行了合并。你可以选择分别部署前后端分支到不同的地方,也可以选择直接部署release版本,再调整权限。这里我们以直接部署release的beta版本为例。

我们首先需要下载并解压我们的项目

wget https://github.com/noenergysoftware/rateMyCourse/archive/beta.tar.gz
tar -zxvf beta.tar.gz
cd ratemycourse-beta

之后我们需要配置一下Nginx的转发功能。在这里我们假设用户已经有了域名example.com,前端为www.example.com,后端为api.example.com,服务运行在本机的1234端口上。同时假设用户仅使用HTTP访问,但是我们推荐配置HTTPS以获得更好的安全性。

Nginx的两个配置文件样例如下,一般位于 /etc/nginx/sites-enabled/ 目录下:

server {
        listen 80;
        listen [::]:80;

        server_name api.example.com;

        location / {
                proxy_pass http://127.0.0.1:1234;
                proxy_redirect default;
        }
}
server {
        listen 80;
        listen [::]:80;
        charset utf-8;
        root /PATH/TO/THE/TAR.GZ/FILE/ratemycourse-beta/front_end/;
        server_name www.example.com;
        location / {
            try_files $uri $uri/ =404;
        }
}

由于Nginx默认是由www-data用户执行的,因此我们需要修改一下文件夹的访问权限。你可以通过添加用户组实现,也可以修改文件夹的所有者,之后重启Nginx使配置生效即可。这里我们采取的是后者。

chown -R www-data front_end/
sudo nginx -t
sudo nginx -s reload

接下来我们进行后端与数据库的部署。在我们的项目中,部分关键信息是通过环境变量储存的,因此在部署后端之前我们需要先配置环境变量。目前我们在环境变量中共储存了3个变量,如下,正确配置完成后就可以进行下一步部署了。

变量名 作用
DJANGOSK Django的secret key,用于保护程序整体的安全性
DJANGOAID 腾讯验证模块的用户ID
DJANGOASK 腾讯验证模块的用户密钥

接着我们进行数据库导入工作。我们内置了一个课程数据库以及其配套的导入脚本,如果期望导入自己的课程,可以自行修改对应的csv文件。

python3 manage.py makemigrations
python3 manage.py migrate
python3 toDatabase.py
python3 manage.py runserver 1234

到此为止,部署工作就正常完成了。如果有问题请先利用搜索引擎解决,不能解决的情况可以通过issue向开发者寻求协助。