✅ 一、服务器环境假设
系统:Ubuntu 22.04+
项目根目录:/var/www/material_management
Python 虚拟环境目录:/var/www/material_management/venv
数据库:MariaDB(已安装并配置)
域名:leica-microsystems-materials.com
邮箱发送任务:使用 Celery + Redis + Django 邮件系统
服务管理:systemd
✅二、项目结构
/var/www/material_management/
├── manage.py
├── material_management/ # 项目主目录
├── materials/ # 应用目录
├── static/ # 收集的静态文件目录
├── templates/
├── uwsgi.ini
├── requirements.txt
└── venv/
✅ 三、配置与依赖
- 安装依赖
sudo apt update
sudo apt install -y python3 python3-venv python3-dev build-essential mariadb-server libmariadb-dev \
nginx supervisor redis uwsgi uwsgi-plugin-python3
- 数据库创建
CREATE DATABASE material_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'django_user'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON material_db.* TO 'django_user'@'localhost';
FLUSH PRIVILEGES;
- 拉取项目到目标目录
sudo mkdir -p /var/www/
cd /var/www/
sudo git clone https://your_repo_url.git material_management
cd material_management
- 创建虚拟环境并安装依赖
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
# 安装依赖
pip install -r requirements.txt
# 若无 requirements.txt,可手动安装示例
pip install django mariadb django-celery-beat celery redis uwsgi gunicorn
5.Django 配置
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'material_db',
'USER': 'material_user',
'PASSWORD': 'your_strong_password',
'HOST': 'localhost',
'PORT': '3306',
}
}
# Celery 配置
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
6.数据库迁移与静态文件
python manage.py makemigrations
python manage.py migrate --fake-initial # 如果之前部署过,则直接执行fake-initial,否则跳过此步
python manage.py migrate
python manage.py collectstatic --noinput
- 创建 uwsgi.ini 文件
cd /var/www/material_management/
然后nano uwsgi.ini,将下面的内容拷贝到文件内并保存:
[uwsgi]
chdir = /var/www/material_management
module = material_management.wsgi:application
home = /var/www/material_management/venv
master = true
processes = 4
socket = /run/uwsgi/materials.sock
chmod-socket = 660
uid = www-data
gid = www-data
vacuum = true
die-on-term = true
8.创建 systemd 服务 /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Django Service
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/var/www/material_management
# 由 systemd 自动在 /run/uwsgi 建立目录
RuntimeDirectory=uwsgi
RuntimeDirectoryMode=0755
ExecStart=/var/www/material_management/venv/bin/uwsgi --ini /var/www/material_management/uwsgi.ini
Restart=always
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
9.启动 uWSGI 服务
sudo systemctl daemon-reexec
#启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable uwsgi
sudo systemctl start uwsgi
10.创建配置文件 /etc/nginx/sites-available/materials
# HTTP跳转到HTTPS
server {
listen 80;
server_name leica-microsystems-materials.com 8.153.193.21; #IP 和域名都可以访问
return 301 https://$host$request_uri;
}
# HTTPS server
server {
listen 443 ssl;
server_name leica-microsystems-materials.com 8.153.193.21;
ssl_certificate /etc/ssl/certs/leica-microsystems-materials.com.pem;
ssl_certificate_key /etc/ssl/private/leica-microsystems-materials.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
access_log /var/log/nginx/materials.access.log;
error_log /var/log/nginx/materials.error.log;
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/materials.sock;
}
# 静态文件(修改 alias 路径)
location /static/ {
alias /var/www/material_management/static/;
}
# 媒体文件(可选)
location /media/ {
alias /var/www/material_management/media/;
}
}
11.启用站点并重启
sudo ln -s /etc/nginx/sites-available/materials /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
四、自动部署脚本
路径:/var/www/material_management/deploy.sh
chmod +x /var/www/material_management/deploy.sh 给予文件执行权限。
#!/bin/bash
PROJECT_DIR="/var/www/material_management"
VENV_DIR="$PROJECT_DIR/venv"
BRANCH="main"
echo "🕘 [$(date)] 自动部署开始..."
cd $PROJECT_DIR || exit 1
git fetch origin $BRANCH
git reset --hard origin/$BRANCH
source $VENV_DIR/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart uwsgi
echo "✅ [$(date)] 自动部署完成"