-
Notifications
You must be signed in to change notification settings - Fork 964
在 ubuntu 20.04 上部署面板
-
站点 域名 一个。可以在 https://freenom.com/ 上申请一个免费域名,本文以
your_site_name_dot_com
代指。至于怎么操作,怎么避免踩坑,请自行 Google。 -
具备公网 IP 的 主机 一台。该主机的操作系统必须是 ubuntu 20.04 或以上。可自行购置。
-
将 域名 和这个主机的 IP 关联上,即 域名 的 DNS 解析指向本主机的 IP。
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
从 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}
mkdir /django-sspanel && cd /django-sspanel
git clone https://github.com/Ehco1996/django-sspanel.git `pwd`
cp .env.sample .env
这里,源代码已经下载到文件夹 /django-sspanel
中,环境变量文件 .env
也准备好了,下一步我们来编辑这个文件。
vi .env
如下图,请认真填写这三个值。我这里 mysql 的 用户名 和 密码 分别是 djsspanel 和 djsspanel_pass ,请一定要使用你自己的。 改好以后保存退出 vi。
创建名为 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
打开 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.
用 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
用 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
修改 /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 "[email protected]" --username "admin1" --password "adminadmin"
# 网站启动,监听的是 8002 端口,与 nginx 配置文件一致。
python3 manage.py runserver 0.0.0.0:8002
到这里,你可以打开浏览器输入你的网址访问了。注意是 https 的哟。