docs: 添加云服务器部署指南和自动化脚本
- 新增 CLOUD_DEPLOYMENT.md 详细部署文档 - 新增 deploy-to-cloud.sh 自动化部署脚本 - 包含 SSH 配置、环境要求、部署步骤 - 包含故障排除和监控指南
This commit is contained in:
466
city-manual/docs/CLOUD_DEPLOYMENT.md
Normal file
466
city-manual/docs/CLOUD_DEPLOYMENT.md
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
# 云服务器部署指南
|
||||||
|
|
||||||
|
## 目标服务器
|
||||||
|
|
||||||
|
- **主机:** cssc.datalibstar.com
|
||||||
|
- **用户:** mashen
|
||||||
|
- **项目路径:** /root/.openclaw/workspace/city-manual
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 部署前准备
|
||||||
|
|
||||||
|
### 1. 解决 SSH 连接问题
|
||||||
|
|
||||||
|
当前 SSH 认证失败,需要:
|
||||||
|
|
||||||
|
**方案 A: 使用密码登录**
|
||||||
|
```bash
|
||||||
|
# 在本地测试
|
||||||
|
ssh mashen@cssc.datalibstar.com
|
||||||
|
# 输入密码:825670@MashenClaw
|
||||||
|
```
|
||||||
|
|
||||||
|
**方案 B: 配置 SSH 密钥**
|
||||||
|
```bash
|
||||||
|
# 在服务器上添加公钥
|
||||||
|
ssh-copy-id mashen@cssc.datalibstar.com
|
||||||
|
|
||||||
|
# 或手动添加
|
||||||
|
cat ~/.ssh/id_ed25519.pub | ssh mashen@cssc.datalibstar.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 服务器环境要求
|
||||||
|
|
||||||
|
**必需软件:**
|
||||||
|
- Python 3.8+
|
||||||
|
- Node.js 16+
|
||||||
|
- PostgreSQL 12+
|
||||||
|
- Nginx
|
||||||
|
- Gunicorn
|
||||||
|
|
||||||
|
**检查命令:**
|
||||||
|
```bash
|
||||||
|
python3 --version
|
||||||
|
node --version
|
||||||
|
psql --version
|
||||||
|
nginx -v
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 部署步骤
|
||||||
|
|
||||||
|
### 步骤 1: 克隆项目
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH 到服务器
|
||||||
|
ssh mashen@cssc.datalibstar.com
|
||||||
|
|
||||||
|
# 进入工作目录
|
||||||
|
cd /root/.openclaw/workspace
|
||||||
|
|
||||||
|
# 克隆最新代码
|
||||||
|
git clone http://10.2.0.100:8989/mashen/chengshishouce.git city-manual-temp
|
||||||
|
cd city-manual-temp
|
||||||
|
git checkout master
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2: 安装后端依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/city-manual-temp/backend
|
||||||
|
|
||||||
|
# 创建虚拟环境
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
pip install -r requirements.txt
|
||||||
|
pip install gunicorn
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3: 配置环境变量
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/city-manual-temp
|
||||||
|
|
||||||
|
# 创建 .env 文件
|
||||||
|
cat > .env << EOF
|
||||||
|
# Django 配置
|
||||||
|
DJANGO_SETTINGS_MODULE=config.settings.production
|
||||||
|
DJANGO_SECRET_KEY=your-secret-key-change-this
|
||||||
|
DEBUG=False
|
||||||
|
ALLOWED_HOSTS=cssc.datalibstar.com,127.0.0.1,localhost
|
||||||
|
|
||||||
|
# 数据库配置
|
||||||
|
DATABASE_URL=postgres://coder:825670wl@10.2.0.100:5432/cssc
|
||||||
|
|
||||||
|
# 媒体文件
|
||||||
|
MEDIA_ROOT=/root/.openclaw/workspace/city-manual-temp/backend/media
|
||||||
|
STATIC_ROOT=/root/.openclaw/workspace/city-manual-temp/backend/static
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 4: 数据库迁移
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/city-manual-temp/backend
|
||||||
|
source ../venv/bin/activate
|
||||||
|
|
||||||
|
# 执行迁移
|
||||||
|
python manage.py migrate
|
||||||
|
|
||||||
|
# 收集静态文件
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# 创建超级用户(可选)
|
||||||
|
python manage.py createsuperuser
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 5: 配置 Gunicorn
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建 systemd 服务文件
|
||||||
|
sudo cat > /etc/systemd/system/city-manual.service << 'EOF'
|
||||||
|
[Unit]
|
||||||
|
Description=City Manual Gunicorn Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
WorkingDirectory=/root/.openclaw/workspace/city-manual-temp/backend
|
||||||
|
ExecStart=/root/.openclaw/workspace/city-manual-temp/backend/venv/bin/gunicorn \
|
||||||
|
--access-logfile - \
|
||||||
|
--workers 3 \
|
||||||
|
--bind unix:/run/city-manual.sock \
|
||||||
|
city_manual.wsgi:application
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable city-manual
|
||||||
|
sudo systemctl start city-manual
|
||||||
|
|
||||||
|
# 检查状态
|
||||||
|
sudo systemctl status city-manual
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 6: 配置 Nginx
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建 Nginx 配置
|
||||||
|
sudo cat > /etc/nginx/sites-available/city-manual << 'EOF'
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name cssc.datalibstar.com;
|
||||||
|
|
||||||
|
# 日志
|
||||||
|
access_log /var/log/nginx/city-manual-access.log;
|
||||||
|
error_log /var/log/nginx/city-manual-error.log;
|
||||||
|
|
||||||
|
# 静态文件
|
||||||
|
location /static/ {
|
||||||
|
alias /root/.openclaw/workspace/city-manual-temp/backend/static/;
|
||||||
|
expires 30d;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# 媒体文件
|
||||||
|
location /media/ {
|
||||||
|
alias /root/.openclaw/workspace/city-manual-temp/backend/media/;
|
||||||
|
expires 7d;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Django 应用
|
||||||
|
location / {
|
||||||
|
include proxy_params;
|
||||||
|
proxy_pass http://unix:/run/city-manual.sock;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 客户端最大上传大小
|
||||||
|
client_max_body_size 10M;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 启用配置
|
||||||
|
sudo ln -sf /etc/nginx/sites-available/city-manual /etc/nginx/sites-enabled/
|
||||||
|
|
||||||
|
# 测试配置
|
||||||
|
sudo nginx -t
|
||||||
|
|
||||||
|
# 重载 Nginx
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 7: 配置防火墙
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 开放 HTTP 端口
|
||||||
|
sudo ufw allow 80/tcp
|
||||||
|
|
||||||
|
# 开放 HTTPS 端口(如果启用 SSL)
|
||||||
|
sudo ufw allow 443/tcp
|
||||||
|
|
||||||
|
# 检查防火墙状态
|
||||||
|
sudo ufw status
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 8: 部署前端(可选)
|
||||||
|
|
||||||
|
如果使用前后端分离部署:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /root/.openclaw/workspace/city-manual-temp/frontend
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 构建生产版本
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 配置 Nginx 服务构建文件
|
||||||
|
# (需要额外配置 Nginx 路由)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 9: 验证部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 Gunicorn 状态
|
||||||
|
sudo systemctl status city-manual
|
||||||
|
|
||||||
|
# 检查 Nginx 状态
|
||||||
|
sudo systemctl status nginx
|
||||||
|
|
||||||
|
# 测试访问
|
||||||
|
curl http://cssc.datalibstar.com/
|
||||||
|
curl http://cssc.datalibstar.com/admin/
|
||||||
|
|
||||||
|
# 查看日志
|
||||||
|
sudo tail -f /var/log/nginx/city-manual-access.log
|
||||||
|
sudo tail -f /var/log/nginx/city-manual-error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 自动化部署脚本
|
||||||
|
|
||||||
|
创建 `deploy.sh` 脚本:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🚀 开始部署城市手册..."
|
||||||
|
|
||||||
|
PROJECT_DIR="/root/.openclaw/workspace/city-manual"
|
||||||
|
VENV_DIR="$PROJECT_DIR/backend/venv"
|
||||||
|
|
||||||
|
# 1. 拉取最新代码
|
||||||
|
cd $PROJECT_DIR
|
||||||
|
git pull origin master
|
||||||
|
|
||||||
|
# 2. 安装依赖
|
||||||
|
source $VENV_DIR/bin/activate
|
||||||
|
pip install -r requirements.txt -q
|
||||||
|
|
||||||
|
# 3. 数据库迁移
|
||||||
|
cd $PROJECT_DIR/backend
|
||||||
|
python manage.py migrate --noinput
|
||||||
|
|
||||||
|
# 4. 收集静态文件
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# 5. 重启 Gunicorn
|
||||||
|
sudo systemctl restart city-manual
|
||||||
|
|
||||||
|
# 6. 检查状态
|
||||||
|
sleep 2
|
||||||
|
if sudo systemctl is-active --quiet city-manual; then
|
||||||
|
echo "✅ 部署成功!"
|
||||||
|
echo "📍 访问地址:http://cssc.datalibstar.com"
|
||||||
|
else
|
||||||
|
echo "❌ 部署失败,请检查日志"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
使用:
|
||||||
|
```bash
|
||||||
|
chmod +x deploy.sh
|
||||||
|
./deploy.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## HTTPS 配置(推荐)
|
||||||
|
|
||||||
|
### 使用 Let's Encrypt
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 安装 Certbot
|
||||||
|
sudo apt install certbot python3-certbot-nginx
|
||||||
|
|
||||||
|
# 获取证书
|
||||||
|
sudo certbot --nginx -d cssc.datalibstar.com
|
||||||
|
|
||||||
|
# 自动续期
|
||||||
|
sudo certbot renew --dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配置自动 HTTPS 重定向
|
||||||
|
|
||||||
|
Nginx 配置会自动添加 301 重定向。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 监控和维护
|
||||||
|
|
||||||
|
### 日志查看
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Nginx 日志
|
||||||
|
sudo tail -f /var/log/nginx/city-manual-access.log
|
||||||
|
sudo tail -f /var/log/nginx/city-manual-error.log
|
||||||
|
|
||||||
|
# Gunicorn 日志
|
||||||
|
sudo journalctl -u city-manual -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 性能监控
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看进程
|
||||||
|
ps aux | grep gunicorn
|
||||||
|
|
||||||
|
# 查看连接
|
||||||
|
sudo netstat -nltp | grep city-manual
|
||||||
|
|
||||||
|
# 查看资源使用
|
||||||
|
htop
|
||||||
|
```
|
||||||
|
|
||||||
|
### 备份数据库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 备份
|
||||||
|
pg_dump -h 10.2.0.100 -U coder cssc > backup_$(date +%Y%m%d).sql
|
||||||
|
|
||||||
|
# 恢复
|
||||||
|
psql -h 10.2.0.100 -U coder cssc < backup_20260412.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 故障排除
|
||||||
|
|
||||||
|
### 问题 1: Gunicorn 启动失败
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 查看详细错误
|
||||||
|
sudo journalctl -u city-manual -n 50
|
||||||
|
|
||||||
|
# 检查端口占用
|
||||||
|
sudo lsof -i :8000
|
||||||
|
|
||||||
|
# 手动测试
|
||||||
|
cd /root/.openclaw/workspace/city-manual/backend
|
||||||
|
source venv/bin/activate
|
||||||
|
python manage.py runserver
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题 2: Nginx 502 Bad Gateway
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查 Gunicorn socket
|
||||||
|
ls -la /run/city-manual.sock
|
||||||
|
|
||||||
|
# 检查权限
|
||||||
|
sudo chmod 666 /run/city-manual.sock
|
||||||
|
|
||||||
|
# 重启服务
|
||||||
|
sudo systemctl restart city-manual
|
||||||
|
sudo systemctl restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题 3: 静态文件 404
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 重新收集
|
||||||
|
cd /root/.openclaw/workspace/city-manual/backend
|
||||||
|
source venv/bin/activate
|
||||||
|
python manage.py collectstatic --noinput
|
||||||
|
|
||||||
|
# 检查 Nginx 配置路径
|
||||||
|
sudo nginx -t
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题 4: 数据库连接失败
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试连接
|
||||||
|
psql -h 10.2.0.100 -U coder -d cssc
|
||||||
|
|
||||||
|
# 检查 .env 配置
|
||||||
|
cat /root/.openclaw/workspace/city-manual/.env
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 回滚方案
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 切换到上一个版本
|
||||||
|
cd /root/.openclaw/workspace/city-manual
|
||||||
|
git checkout <previous-commit>
|
||||||
|
|
||||||
|
# 2. 重新部署
|
||||||
|
./deploy.sh
|
||||||
|
|
||||||
|
# 3. 验证
|
||||||
|
curl http://cssc.datalibstar.com/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 部署检查清单
|
||||||
|
|
||||||
|
- [ ] SSH 可以正常连接
|
||||||
|
- [ ] Python 和 Node.js 版本正确
|
||||||
|
- [ ] PostgreSQL 可连接
|
||||||
|
- [ ] 代码已拉取到最新
|
||||||
|
- [ ] 依赖已安装
|
||||||
|
- [ ] 数据库迁移完成
|
||||||
|
- [ ] 静态文件已收集
|
||||||
|
- [ ] Gunicorn 服务运行正常
|
||||||
|
- [ ] Nginx 配置正确
|
||||||
|
- [ ] 防火墙已配置
|
||||||
|
- [ ] 可以通过浏览器访问
|
||||||
|
- [ ] Admin 后台可以登录
|
||||||
|
- [ ] 日志正常无错误
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 参考链接
|
||||||
|
|
||||||
|
- [Django 部署文档](https://docs.djangoproject.com/en/stable/howto/deployment/)
|
||||||
|
- [Gunicorn 文档](https://docs.gunicorn.org/en/stable/)
|
||||||
|
- [Nginx 配置最佳实践](https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 版本信息
|
||||||
|
|
||||||
|
- **文档版本:** 1.0
|
||||||
|
- **创建日期:** 2026-04-12
|
||||||
|
- **项目版本:** 2026.4.12
|
||||||
|
- **作者:** 码神 ⚡
|
||||||
82
city-manual/scripts/deploy-to-cloud.sh
Executable file
82
city-manual/scripts/deploy-to-cloud.sh
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 城市手册 - 云服务器部署脚本
|
||||||
|
# 用法:./deploy-to-cloud.sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
SERVER_HOST="cssc.datalibstar.com"
|
||||||
|
SERVER_USER="mashen"
|
||||||
|
SERVER_PASS="825670@MashenClaw"
|
||||||
|
PROJECT_PATH="/root/.openclaw/workspace/city-manual"
|
||||||
|
|
||||||
|
echo "🚀 开始部署到云服务器..."
|
||||||
|
echo "服务器:$SERVER_USER@$SERVER_HOST"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 sshpass
|
||||||
|
if ! command -v sshpass &> /dev/null; then
|
||||||
|
echo "❌ 错误:sshpass 未安装"
|
||||||
|
echo "请运行:sudo apt install sshpass"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 1. 提交本地更改
|
||||||
|
echo "📝 提交本地更改..."
|
||||||
|
cd $PROJECT_PATH
|
||||||
|
git add -A
|
||||||
|
git commit -m "deploy: 准备部署到云服务器" || echo "无更改需要提交"
|
||||||
|
git push origin master
|
||||||
|
|
||||||
|
# 2. SSH 到服务器并部署
|
||||||
|
echo "🔌 连接到服务器..."
|
||||||
|
sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_HOST << 'ENDSSH'
|
||||||
|
echo "📦 拉取最新代码..."
|
||||||
|
cd /root/.openclaw/workspace/city-manual || {
|
||||||
|
echo "❌ 项目目录不存在"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
git pull origin master
|
||||||
|
|
||||||
|
echo "🐍 激活虚拟环境..."
|
||||||
|
source /root/.openclaw/workspace/city-manual/backend/venv/bin/activate || {
|
||||||
|
echo "❌ 虚拟环境不存在,请先手动创建"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "📦 安装依赖..."
|
||||||
|
pip install -r requirements.txt -q
|
||||||
|
|
||||||
|
echo "🗄️ 数据库迁移..."
|
||||||
|
cd backend
|
||||||
|
python manage.py migrate --noinput
|
||||||
|
|
||||||
|
echo "📁 收集静态文件..."
|
||||||
|
python manage.py collectstatic --noinput --clear
|
||||||
|
|
||||||
|
echo "⚙️ 重启 Gunicorn..."
|
||||||
|
sudo systemctl restart city-manual || {
|
||||||
|
echo "⚠️ Gunicorn 服务不存在,请手动创建"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "🌐 检查 Nginx..."
|
||||||
|
sudo nginx -t && sudo systemctl reload nginx || {
|
||||||
|
echo "⚠️ Nginx 配置有问题"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ 部署完成!"
|
||||||
|
echo ""
|
||||||
|
echo "📍 访问地址:http://cssc.datalibstar.com"
|
||||||
|
echo "📍 Admin: http://cssc.datalibstar.com/admin"
|
||||||
|
echo "📍 测试账号:demo / demo123"
|
||||||
|
ENDSSH
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "🎉 部署成功!"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo "❌ 部署失败,请检查服务器日志"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user