From 1716b3ec98040f6345fe9eeb19b0f9147540711c Mon Sep 17 00:00:00 2001 From: maoshen Date: Sun, 12 Apr 2026 21:58:52 +0000 Subject: [PATCH] =?UTF-8?q?scripts:=20=E6=B7=BB=E5=8A=A0=20rsync=20?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 通过 rsync 同步代码到云服务器 - 解决云服务器无法访问内网 Git 服务器的问题 - 包含完整的部署流程 --- city-manual/scripts/deploy-via-rsync.sh | 158 ++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 city-manual/scripts/deploy-via-rsync.sh diff --git a/city-manual/scripts/deploy-via-rsync.sh b/city-manual/scripts/deploy-via-rsync.sh new file mode 100755 index 0000000..6b3a983 --- /dev/null +++ b/city-manual/scripts/deploy-via-rsync.sh @@ -0,0 +1,158 @@ +#!/bin/bash +# 城市手册 - 通过 rsync 部署到云服务器 +# 用法:./deploy-via-rsync.sh + +set -e + +SERVER_HOST="cssc.datalibstar.com" +SERVER_USER="ubuntu" +SERVER_PASS="825670@MashenClaw" +LOCAL_PATH="/root/.openclaw/workspace/city-manual" +REMOTE_PATH="/home/ubuntu/city-manual" + +echo "🚀 开始部署城市手册到云服务器..." +echo "服务器:$SERVER_USER@$SERVER_HOST" +echo "目标路径:$REMOTE_PATH" +echo "" + +# 检查 sshpass +if ! command -v sshpass &> /dev/null; then + echo "❌ 错误:sshpass 未安装" + echo "请运行:sudo apt install sshpass" + exit 1 +fi + +# 1. 创建远程目录 +echo "📁 1. 创建远程目录..." +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_HOST << 'EOF' +mkdir -p /home/ubuntu/city-manual +EOF + +# 2. 同步代码(排除不需要的项目) +echo "📦 2. 同步代码..." +sshpass -p "$SERVER_PASS" rsync -avz --delete \ + --exclude '.git' \ + --exclude '__pycache__' \ + --exclude '*.pyc' \ + --exclude 'venv' \ + --exclude 'node_modules' \ + --exclude '.env' \ + --exclude 'db.sqlite3' \ + "$LOCAL_PATH/" \ + "$SERVER_USER@$SERVER_HOST:$REMOTE_PATH/" + +# 3. 远程部署 +echo "🔧 3. 远程配置..." +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_HOST << 'ENDSSH' +set -e + +cd /home/ubuntu/city-manual + +echo "🐍 创建虚拟环境..." +cd backend +python3 -m venv venv +source venv/bin/activate + +echo "📦 安装依赖..." +pip install -r requirements.txt -q +pip install gunicorn -q + +echo "🗄️ 配置环境变量..." +cd /home/ubuntu/city-manual +cat > .env << EOF +DJANGO_SETTINGS_MODULE=config.settings.production +DJANGO_SECRET_KEY=cssc-secret-key-$(date +%s) +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=/home/ubuntu/city-manual/backend/media +STATIC_ROOT=/home/ubuntu/city-manual/backend/static +EOF + +echo "📦 数据库迁移..." +cd backend +source ../venv/bin/activate +python manage.py migrate --noinput +python manage.py collectstatic --noinput + +echo "⚙️ 创建 Gunicorn 服务..." +sudo cat > /etc/systemd/system/city-manual.service << 'EOF' +[Unit] +Description=City Manual Gunicorn Service +After=network.target + +[Service] +User=ubuntu +Group=ubuntu +WorkingDirectory=/home/ubuntu/city-manual/backend +ExecStart=/home/ubuntu/city-manual/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 + +echo "🌐 配置 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 /home/ubuntu/city-manual/backend/static/; + expires 30d; + add_header Cache-Control "public, immutable"; + } + + location /media/ { + alias /home/ubuntu/city-manual/backend/media/; + expires 7d; + } + + 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 +sudo systemctl reload nginx + +echo "" +echo "✅ 部署完成!" +echo "" +echo "📍 访问地址:http://cssc.datalibstar.com" +echo "📍 Admin: http://cssc.datalibstar.com/admin" +echo "" +echo "📊 服务状态:" +sudo systemctl status city-manual --no-pager | head -5 +sudo systemctl status nginx --no-pager | head -5 +ENDSSH + +if [ $? -eq 0 ]; then + echo "" + echo "🎉 部署成功!" +else + echo "" + echo "❌ 部署失败,请检查错误信息" + exit 1 +fi