diff --git a/city-manual/docs/CLOUD_DEPLOYMENT.md b/city-manual/docs/CLOUD_DEPLOYMENT.md new file mode 100644 index 0000000..8677d22 --- /dev/null +++ b/city-manual/docs/CLOUD_DEPLOYMENT.md @@ -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 + +# 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 +- **作者:** 码神 ⚡ diff --git a/city-manual/scripts/deploy-to-cloud.sh b/city-manual/scripts/deploy-to-cloud.sh new file mode 100755 index 0000000..d970469 --- /dev/null +++ b/city-manual/scripts/deploy-to-cloud.sh @@ -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