Skip to content

在 ubuntu 20.04 上部署面板

ssrlive edited this page Jul 3, 2021 · 2 revisions

前置条件

  • 站点 域名 一个。可以在 https://freenom.com/ 上申请一个免费域名,本文以 your_site_name_dot_com 代指。至于怎么操作,怎么避免踩坑,请自行 Google。

  • 具备公网 IP 的 主机 一台。该主机的操作系统必须是 ubuntu 20.04 或以上。可自行购置。

  • 域名 和这个主机的 IP 关联上,即 域名 的 DNS 解析指向本主机的 IP。

安装 nginx 和 mysql 等

apt update -y
apt upgrade -y
apt install -y nginx-extras mysql-server libmysqlclient-dev python3 python-is-python3 openssl libssl-dev curl wget git screen
pip3 install virtualenv

创建临时站点文件夹

这是为下一步申请 TLS 证书作准备的。临时站点文件夹为 /temp_site

# 删掉 nginx 默认的站点配置文件 default
rm -rf /etc/nginx/sites-enabled/default

# 创建临时站点文件夹 和 证书认证子文件夹
mkdir -p /temp_site/.well-known/acme-challenge/

# 全新创建 nginx 站点配置文件 djsspanel.conf
rm -rf /etc/nginx/conf.d/*
cat > /etc/nginx/conf.d/djsspanel.conf <<EOF
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name localhost;
        index index.html index.htm index.nginx-debian.html;
        root  /temp_site;
    }
EOF

# 检查 配置文件是否有错
nginx -t

# 让 nginx 以新的配置文件重新加载
nginx -s stop
nginx

获取 TLS 证书

https://letsencrypt.org/ 网站取得 TLS 证书。

以下命令将在 /djsspanel_cert 文件夹内生成证书,证书文件名 chained_cert.pem, 私钥文件名 private_key.pem

注意,有个命令里的 your_site_name_dot_com 字符串请替换成你的域名。

可以将这一堆命令保存成一个 bash 文件如 a.sh,然后用 bash a.sh 命令 一次性 执行完毕。

org_pwd=`pwd`

mkdir /djsspanel_cert
cd /djsspanel_cert
openssl genrsa 4096 > account.key
openssl genrsa 4096 > private_key.pem

openssl req -new -sha256 -key private_key.pem -subj "/" -reqexts SAN -config <( cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:your_site_name_dot_com")) > domain.csr

curl -L https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py -o acme_tiny.py
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /temp_site/.well-known/acme-challenge/ > ./signed.crt
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained_cert.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained_cert.pem

cd ${org_pwd}

安装配置 Django-sspanel

下载源代码

mkdir /django-sspanel && cd /django-sspanel
git clone https://github.com/Ehco1996/django-sspanel.git `pwd`
cp .env.sample .env

这里,源代码已经下载到文件夹 /django-sspanel 中,环境变量文件 .env 也准备好了,下一步我们来编辑这个文件。

编辑 .env 文件

vi .env

如下图,请认真填写这三个值。我这里 mysql 的 用户名 和 密码 分别是 djsspanel 和 djsspanel_pass ,请一定要使用你自己的。 改好以后保存退出 vi。

image

创建环境变量加载模块 load_env

创建名为 load_env.py 的模块文件,内容如下

import re, os

# 读取的 str 转换为字典
def file_to_dict( file_path ):
    res = {}
    with open( file_path, "r" ) as text:
        for line in text:
            line.strip()
            if line[0] == '#' :
                continue
            index = line.find('#')
            if index != -1 :
                line = line[:index]
            str_list = line.split('=')
            if len(str_list) != 2 :
                continue
            res[ str_list[0].strip() ] = str_list[1].strip()
    for key, value in res.items() :
        m = re.search('^\${(\s|\w)+}$', value)
        if m == None :
            continue
        begin, end = m.span()
        key2 = value[begin+2:end-1].strip()
        if key2 in res :
            res[key] = res[key2]
    return res

dic = file_to_dict('.env')
for key, value in dic.items() :
    os.environ[key] = value

修改源代码以加载 load_env 模块

打开 manage.py 文件,做如下修改

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    import load_env  # 这里加载!!!
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "configs")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.

创建模块依赖文件 requirements.txt

用 vi 创建 requirements.txt 文件,内容如下

Django==3.2
django-anymail==8.2
django-countries==7.1
django-prometheus==2.1.0
django-simpleui==2021.4.1
flask>=0.11
Markdown==3.3.4
mysqlclient==2.0.3
python-alipay-sdk==3.0.1
sentry-sdk==1.0.0
short-url==1.2.2
tomd==0.1.3
uWSGI==2.0.19.1
pendulum==2.1.2
redis==3.5.3
celery==5.0.5
black==20.8b1
django-debug-toolbar==3.2.1
isort==5.8.0
autoflake==1.4
pip-upgrader==1.4.15

在 MySQL 内创建用户账户和数据库

用 root 账号登录 MySQL 系统后,创建数据库 sspanel 以及新账号 djsspanel 和密码 djsspanel_pass(账号和密码请用你自己的), 把各种权限给了新账号,然后退出。

mysql  # 或者命令 mysql -u root -p

# 以下是在 mysql 环境里操作
mysql> CREATE DATABASE sspanel;
mysql> CREATE USER 'djsspanel'@'localhost' IDENTIFIED BY 'djsspanel_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'djsspanel'@'localhost' WITH GRANT OPTION;
mysql> exit

修改 nginx 配置并重新加载

修改 /etc/nginx/conf.d/djsspanel.conf 文件,命令是

vi /etc/nginx/conf.d/djsspanel.conf

替换成以下内容,注意,你得用你自己的域名取代那个字符串 your_site_name_dot_com。 而 nginx 的反向代理设置中,让 nginx 试图连接的是本机 8002 端口。

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate       /djsspanel_cert/chained_cert.pem;
        ssl_certificate_key   /djsspanel_cert/private_key.pem;
        ssl_protocols         TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;

        # 服务器的 ip 或 名称
        server_name  your_site_name_dot_com;

        # 配置字符类型
        charset utf-8;
        client_max_body_size 100M;

        access_log /tmp/bonker.log;

        # 反向代理设置,注意 nginx 试图连接的是本机 8002 端口。
        location / {
            proxy_pass         http://localhost:8002/;
            proxy_redirect     off;

            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
            proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        }
    }

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name localhost;
        index index.html index.htm index.nginx-debian.html;
        root  /temp_site;
    }

保存退出后,最好用 nginx -t 命令检查一下看有没有错误,无误以后再以 systemctl restart nginx 命令重新加载 nginx 服务使得修改生效。

启动站点

经过艰难跋涉,我们终于就要抵达旅程的终点。我们进行最后一哆嗦。

# 运行 screen 命令创建 sspanel 会话,
# 这样即使你意外断开与这主机的网络连接,当前正在运行的程序也不会被系统杀死。
screen -R sspanel

# 创建相对隔离的 python 虚拟环境
virtualenv --python=python3 venv

# 启动 python 虚拟环境
source venv/bin/activate

# 在虚拟环境中安装 网站运行需要的依赖组件包
pip3 install -r requirements.txt

# 收集静态资源
python3 manage.py collectstatic --noinput

# 创建数据库表
python3 manage.py migrate

# 创建超级用户账号
python3 manage.py create_admin --email "admin@ss.com" --username "admin1" --password "adminadmin"

# 网站启动,监听的是 8002 端口,与 nginx 配置文件一致。
python3 manage.py runserver 0.0.0.0:8002

到这里,你可以打开浏览器输入你的网址访问了。注意是 https 的哟。