edit deploy.sh
This commit is contained in:
parent
76e3c6c6b6
commit
adabac9750
190
DEPLOYMENT.md
190
DEPLOYMENT.md
@ -1,190 +0,0 @@
|
||||
# 部署指南
|
||||
|
||||
## 📋 部署前准备
|
||||
|
||||
### 系统要求
|
||||
- Ubuntu 20.04+ / CentOS 8+ / Debian 11+
|
||||
- Python 3.8+
|
||||
- Node.js 16+ 或 Bun
|
||||
- Nginx
|
||||
- Supervisor 或 systemd
|
||||
|
||||
### 安装依赖
|
||||
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt update
|
||||
sudo apt install python3 python3-venv python3-pip nginx supervisor
|
||||
|
||||
# 安装 Bun (推荐)
|
||||
curl -fsSL https://bun.sh/install | bash
|
||||
|
||||
# 或者安装 Node.js
|
||||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
```
|
||||
|
||||
## 🚀 部署步骤
|
||||
|
||||
### 1. 克隆项目
|
||||
```bash
|
||||
cd /var/www
|
||||
sudo git clone <your-repo-url> ball-tracking-server
|
||||
cd ball-tracking-server
|
||||
```
|
||||
|
||||
### 2. 修改配置文件路径
|
||||
编辑以下文件,将路径替换为实际路径:
|
||||
- `deploy.sh` - 第6行 PROJECT_ROOT
|
||||
- `supervisor.conf` - command, directory, stdout_logfile, environment 中的路径
|
||||
- `gunicorn.conf.py` - 如果需要修改用户
|
||||
- `ball-tracking-server.service` - WorkingDirectory, Environment, ExecStart 中的路径
|
||||
- `nginx.conf` - root, server_name 等配置
|
||||
|
||||
### 3. 运行部署脚本
|
||||
```bash
|
||||
# 给脚本执行权限
|
||||
chmod +x deploy.sh start.sh stop.sh
|
||||
|
||||
# 运行部署
|
||||
sudo ./deploy.sh
|
||||
```
|
||||
|
||||
### 4. 配置 Nginx
|
||||
```bash
|
||||
# 复制 Nginx 配置
|
||||
sudo cp nginx.conf /etc/nginx/sites-available/ball-tracking-server
|
||||
|
||||
# 启用站点
|
||||
sudo ln -s /etc/nginx/sites-available/ball-tracking-server /etc/nginx/sites-enabled/
|
||||
|
||||
# 测试配置
|
||||
sudo nginx -t
|
||||
|
||||
# 重启 Nginx
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
## 🔧 服务管理
|
||||
|
||||
### 使用 Supervisor(推荐)
|
||||
```bash
|
||||
# 查看状态
|
||||
sudo supervisorctl status ball-tracking-server
|
||||
|
||||
# 启动服务
|
||||
sudo supervisorctl start ball-tracking-server
|
||||
|
||||
# 停止服务
|
||||
sudo supervisorctl stop ball-tracking-server
|
||||
|
||||
# 重启服务
|
||||
sudo supervisorctl restart ball-tracking-server
|
||||
|
||||
# 查看日志
|
||||
sudo supervisorctl tail -f ball-tracking-server
|
||||
|
||||
# 或者使用脚本
|
||||
./start.sh # 启动
|
||||
./stop.sh # 停止
|
||||
```
|
||||
|
||||
### 使用 systemd(备选方案)
|
||||
```bash
|
||||
# 复制服务文件
|
||||
sudo cp ball-tracking-server.service /etc/systemd/system/
|
||||
|
||||
# 重载服务配置
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启用开机自启
|
||||
sudo systemctl enable ball-tracking-server
|
||||
|
||||
# 启动服务
|
||||
sudo systemctl start ball-tracking-server
|
||||
|
||||
# 查看状态
|
||||
sudo systemctl status ball-tracking-server
|
||||
|
||||
# 查看日志
|
||||
sudo journalctl -u ball-tracking-server -f
|
||||
```
|
||||
|
||||
## 📝 日志文件位置
|
||||
- Supervisor 日志: `logs/supervisor.log`
|
||||
- Gunicorn 访问日志: `logs/gunicorn_access.log`
|
||||
- Gunicorn 错误日志: `logs/gunicorn_error.log`
|
||||
- Nginx 访问日志: `/var/log/nginx/ball-tracking-server_access.log`
|
||||
- Nginx 错误日志: `/var/log/nginx/ball-tracking-server_error.log`
|
||||
|
||||
## 🔍 故障排查
|
||||
|
||||
### 检查端口占用
|
||||
```bash
|
||||
sudo netstat -tulpn | grep :5000
|
||||
```
|
||||
|
||||
### 检查进程
|
||||
```bash
|
||||
ps aux | grep gunicorn
|
||||
ps aux | grep supervisord
|
||||
```
|
||||
|
||||
### 检查防火墙
|
||||
```bash
|
||||
sudo ufw status
|
||||
sudo ufw allow 80
|
||||
sudo ufw allow 443
|
||||
```
|
||||
|
||||
### 权限问题
|
||||
```bash
|
||||
sudo chown -R www-data:www-data /var/www/ball-tracking-server
|
||||
sudo chmod -R 755 /var/www/ball-tracking-server
|
||||
```
|
||||
|
||||
## 🔄 更新部署
|
||||
|
||||
```bash
|
||||
# 简单更新(自动构建前端)
|
||||
sudo ./deploy.sh
|
||||
|
||||
# 手动更新
|
||||
git pull origin main
|
||||
cd app/web && bun run build && cd ../..
|
||||
sudo supervisorctl restart ball-tracking-server
|
||||
```
|
||||
|
||||
## 🌐 域名和 HTTPS
|
||||
|
||||
### 配置域名
|
||||
1. 修改 `nginx.conf` 中的 `server_name`
|
||||
2. 重启 Nginx
|
||||
|
||||
### 启用 HTTPS (Let's Encrypt)
|
||||
```bash
|
||||
# 安装 Certbot
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
|
||||
# 获取证书
|
||||
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
|
||||
|
||||
# 自动续期
|
||||
sudo crontab -e
|
||||
# 添加: 0 12 * * * /usr/bin/certbot renew --quiet
|
||||
```
|
||||
|
||||
## 📊 监控建议
|
||||
|
||||
- 使用 `htop` 或 `glances` 监控系统资源
|
||||
- 设置日志轮转避免磁盘空间不足
|
||||
- 配置监控告警(如 Zabbix、Prometheus)
|
||||
- 定期备份数据目录
|
||||
|
||||
## 🚨 安全建议
|
||||
|
||||
- 关闭不必要的端口
|
||||
- 启用防火墙
|
||||
- 定期更新系统和依赖
|
||||
- 使用 HTTPS
|
||||
- 设置强密码和 SSH 密钥登录
|
||||
148
deploy.sh
148
deploy.sh
@ -1,148 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 部署脚本
|
||||
# 使用方法: ./deploy.sh
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
PROJECT_NAME="ball-tracking-server"
|
||||
USER="root"
|
||||
PYTHON_VERSION="python3"
|
||||
|
||||
echo "🚀 开始部署 $PROJECT_NAME..."
|
||||
|
||||
# 1. 检查当前目录和权限
|
||||
echo "📍 当前目录: $(pwd)"
|
||||
echo "👤 当前用户: $(whoami)"
|
||||
|
||||
# 2. 更新代码 (如果使用 git)
|
||||
if [ -d ".git" ]; then
|
||||
echo "📥 更新代码..."
|
||||
git pull origin main # 或者你的主分支名
|
||||
fi
|
||||
|
||||
# 3. 检查 Python 版本
|
||||
echo "🐍 检查 Python 版本..."
|
||||
$PYTHON_VERSION --version
|
||||
which $PYTHON_VERSION
|
||||
|
||||
# 4. 创建虚拟环境 (如果不存在)
|
||||
if [ ! -d "venv" ]; then
|
||||
echo "🐍 创建 Python 虚拟环境..."
|
||||
$PYTHON_VERSION -m venv venv
|
||||
if [ ! -f "venv/bin/activate" ]; then
|
||||
echo "❌ 错误: 虚拟环境创建失败,检查 Python 安装"
|
||||
echo "尝试使用以下命令手动创建:"
|
||||
echo "$PYTHON_VERSION -m venv venv"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ 虚拟环境创建成功"
|
||||
else
|
||||
echo "✅ 虚拟环境已存在"
|
||||
fi
|
||||
|
||||
# 5. 检查虚拟环境激活脚本
|
||||
if [ ! -f "venv/bin/activate" ]; then
|
||||
echo "❌ 错误: 找不到虚拟环境激活脚本"
|
||||
echo "虚拟环境目录内容:"
|
||||
ls -la venv/ || echo "venv 目录不存在或无法访问"
|
||||
echo "尝试删除并重新创建虚拟环境..."
|
||||
rm -rf venv
|
||||
$PYTHON_VERSION -m venv venv
|
||||
fi
|
||||
|
||||
# 6. 激活虚拟环境并安装依赖
|
||||
echo "📦 安装 Python 依赖..."
|
||||
source venv/bin/activate
|
||||
echo "🐍 虚拟环境已激活: $(which python)"
|
||||
pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
|
||||
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
|
||||
pip install gunicorn supervisor -i https://mirrors.aliyun.com/pypi/simple/ # 生产环境依赖
|
||||
|
||||
# 7. 构建前端
|
||||
echo "🏗️ 构建前端..."
|
||||
cd app/web
|
||||
if command -v bun &> /dev/null; then
|
||||
echo "使用 Bun 构建..."
|
||||
bun install
|
||||
bun run build
|
||||
elif command -v npm &> /dev/null; then
|
||||
echo "使用 npm 构建..."
|
||||
npm install
|
||||
npm run build
|
||||
else
|
||||
echo "❌ 错误: 未找到 bun 或 npm"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 8. 返回项目根目录
|
||||
cd "../.."
|
||||
|
||||
# 9. 创建必要的目录
|
||||
echo "📁 创建必要目录..."
|
||||
mkdir -p logs
|
||||
mkdir -p data/sessions
|
||||
|
||||
# 10. 设置权限
|
||||
echo "🔐 设置文件权限..."
|
||||
chown -R $USER:$USER .
|
||||
chmod +x deploy.sh
|
||||
chmod +x start.sh
|
||||
chmod +x stop.sh
|
||||
|
||||
# 11. 检查并安装 Supervisor
|
||||
echo "🔍 检查 Supervisor 安装状态..."
|
||||
if ! command -v supervisorctl &> /dev/null; then
|
||||
echo "📦 安装 Supervisor..."
|
||||
if command -v apt-get &> /dev/null; then
|
||||
# Debian/Ubuntu
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y supervisor
|
||||
elif command -v yum &> /dev/null; then
|
||||
# CentOS/RHEL
|
||||
sudo yum install -y supervisor
|
||||
elif command -v dnf &> /dev/null; then
|
||||
# Fedora
|
||||
sudo dnf install -y supervisor
|
||||
else
|
||||
echo "❌ 错误: 无法自动安装 Supervisor,请手动安装"
|
||||
echo "Ubuntu/Debian: sudo apt-get install supervisor"
|
||||
echo "CentOS/RHEL: sudo yum install supervisor"
|
||||
echo "Fedora: sudo dnf install supervisor"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 12. 检查 Supervisor 配置目录
|
||||
if [ ! -d "/etc/supervisor/conf.d" ]; then
|
||||
echo "📁 创建 Supervisor 配置目录..."
|
||||
sudo mkdir -p /etc/supervisor/conf.d
|
||||
fi
|
||||
|
||||
# 13. 启动 Supervisor 服务
|
||||
echo "🚀 启动 Supervisor 服务..."
|
||||
if command -v systemctl &> /dev/null; then
|
||||
sudo systemctl enable supervisor
|
||||
sudo systemctl start supervisor
|
||||
elif command -v service &> /dev/null; then
|
||||
sudo service supervisor start
|
||||
fi
|
||||
|
||||
# 14. 复制配置文件到系统目录 (需要 sudo)
|
||||
echo "⚙️ 配置系统服务..."
|
||||
if [ -f "/etc/supervisor/conf.d/$PROJECT_NAME.conf" ]; then
|
||||
sudo cp supervisor.conf /etc/supervisor/conf.d/$PROJECT_NAME.conf
|
||||
sudo supervisorctl reread
|
||||
sudo supervisorctl update
|
||||
sudo supervisorctl restart $PROJECT_NAME
|
||||
else
|
||||
sudo cp supervisor.conf /etc/supervisor/conf.d/$PROJECT_NAME.conf
|
||||
sudo supervisorctl reread
|
||||
sudo supervisorctl update
|
||||
sudo supervisorctl start $PROJECT_NAME
|
||||
fi
|
||||
|
||||
echo "✅ 部署完成!"
|
||||
echo "📝 查看日志: sudo supervisorctl tail -f $PROJECT_NAME"
|
||||
echo "🔄 重启服务: sudo supervisorctl restart $PROJECT_NAME"
|
||||
echo "⏹️ 停止服务: sudo supervisorctl stop $PROJECT_NAME"
|
||||
@ -1,53 +0,0 @@
|
||||
# Gunicorn 配置文件
|
||||
import os
|
||||
import multiprocessing
|
||||
|
||||
# 服务器绑定
|
||||
bind = "0.0.0.0:5000"
|
||||
backlog = 2048
|
||||
|
||||
# 工作进程
|
||||
workers = multiprocessing.cpu_count() * 2 + 1 # 推荐的工作进程数
|
||||
worker_class = "sync"
|
||||
worker_connections = 1000
|
||||
timeout = 30
|
||||
keepalive = 2
|
||||
max_requests = 1000
|
||||
max_requests_jitter = 50
|
||||
|
||||
# 日志
|
||||
accesslog = "logs/gunicorn_access.log"
|
||||
errorlog = "logs/gunicorn_error.log"
|
||||
loglevel = "info"
|
||||
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s'
|
||||
|
||||
# 进程命名
|
||||
proc_name = "ball-tracking-server"
|
||||
|
||||
# 安全
|
||||
user = os.getenv('GUNICORN_USER', 'www-data')
|
||||
group = os.getenv('GUNICORN_GROUP', 'www-data')
|
||||
tmp_upload_dir = None
|
||||
|
||||
# 预加载应用
|
||||
preload_app = True
|
||||
|
||||
# SSL (如果需要)
|
||||
# keyfile = "/path/to/ssl/private.key"
|
||||
# certfile = "/path/to/ssl/certificate.crt"
|
||||
|
||||
# 开发环境配置 (生产环境请注释掉)
|
||||
# reload = True
|
||||
# reload_extra_files = ["app/"]
|
||||
|
||||
def when_ready(server):
|
||||
server.log.info("Gunicorn server is ready. Listening on: %s", server.address)
|
||||
|
||||
def worker_int(worker):
|
||||
worker.log.info("worker received INT or QUIT signal")
|
||||
|
||||
def pre_fork(server, worker):
|
||||
server.log.info("Worker spawned (pid: %s)", worker.pid)
|
||||
|
||||
def post_fork(server, worker):
|
||||
server.log.info("Worker spawned (pid: %s)", worker.pid)
|
||||
21
start.sh
21
start.sh
@ -1,21 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 启动服务
|
||||
|
||||
PROJECT_NAME="ball-tracking-server"
|
||||
|
||||
echo "🚀 启动 $PROJECT_NAME..."
|
||||
|
||||
# 检查 supervisor 是否运行
|
||||
if ! pgrep -x "supervisord" > /dev/null; then
|
||||
echo "启动 supervisord..."
|
||||
sudo systemctl start supervisor
|
||||
fi
|
||||
|
||||
# 启动应用
|
||||
sudo supervisorctl start $PROJECT_NAME
|
||||
|
||||
# 检查状态
|
||||
sudo supervisorctl status $PROJECT_NAME
|
||||
|
||||
echo "✅ 服务启动完成!"
|
||||
echo "📝 查看日志: sudo supervisorctl tail -f $PROJECT_NAME"
|
||||
14
stop.sh
14
stop.sh
@ -1,14 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 停止服务
|
||||
|
||||
PROJECT_NAME="ball-tracking-server"
|
||||
|
||||
echo "⏹️ 停止 $PROJECT_NAME..."
|
||||
|
||||
# 停止应用
|
||||
sudo supervisorctl stop $PROJECT_NAME
|
||||
|
||||
# 检查状态
|
||||
sudo supervisorctl status $PROJECT_NAME
|
||||
|
||||
echo "✅ 服务已停止!"
|
||||
@ -1,29 +0,0 @@
|
||||
[program:ball-tracking-server]
|
||||
; Supervisor 配置文件
|
||||
; 复制到 /etc/supervisor/conf.d/ 目录
|
||||
|
||||
; 基本配置
|
||||
command=/path/to/your/ball-tracking/server-neo/venv/bin/gunicorn --config gunicorn.conf.py wsgi:app
|
||||
directory=/path/to/your/ball-tracking/server-neo
|
||||
user=www-data
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startretries=3
|
||||
redirect_stderr=true
|
||||
|
||||
; 日志配置
|
||||
stdout_logfile=/path/to/your/ball-tracking/server-neo/logs/supervisor.log
|
||||
stdout_logfile_maxbytes=50MB
|
||||
stdout_logfile_backups=5
|
||||
|
||||
; 环境变量
|
||||
environment=PATH="/path/to/your/ball-tracking/server-neo/venv/bin",FLASK_ENV="production"
|
||||
|
||||
; 进程管理
|
||||
killasgroup=true
|
||||
stopasgroup=true
|
||||
stopsignal=TERM
|
||||
|
||||
; 其他配置
|
||||
priority=999
|
||||
numprocs=1
|
||||
Loading…
x
Reference in New Issue
Block a user