From 801da8a5e1d8950947bd016b200ef744561f8ab3 Mon Sep 17 00:00:00 2001 From: maoshen Date: Sun, 12 Apr 2026 21:56:05 +0000 Subject: [PATCH] =?UTF-8?q?scripts:=20=E6=B7=BB=E5=8A=A0=E9=A6=96=E6=AC=A1?= =?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 - 新增 first-deploy.sh 用于首次部署到云服务器 - 自动克隆项目、配置环境、创建服务 - 支持 Ubuntu 用户和 sudo 权限 --- city-manual/scripts/first-deploy.sh | 142 ++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 city-manual/scripts/first-deploy.sh diff --git a/city-manual/scripts/first-deploy.sh b/city-manual/scripts/first-deploy.sh new file mode 100755 index 0000000..e9dbad8 --- /dev/null +++ b/city-manual/scripts/first-deploy.sh @@ -0,0 +1,142 @@ +#!/bin/bash +# 城市手册 - 首次部署到云服务器 +# 用法:./first-deploy.sh + +set -e + +SERVER_HOST="cssc.datalibstar.com" +SERVER_USER="ubuntu" +SERVER_PASS="825670@MashenClaw" + +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 + +# 执行远程部署 +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_HOST << 'ENDSSH' +set -e + +echo "📦 1. 克隆项目..." +cd /home/ubuntu +git clone http://10.2.0.100:8989/mashen/chengshishouce.git city-manual +cd /home/ubuntu/city-manual/city-manual + +echo "🐍 2. 创建 Python 虚拟环境..." +cd backend +python3 -m venv venv +source venv/bin/activate + +echo "📦 3. 安装依赖..." +pip install -r requirements.txt -q +pip install gunicorn -q + +echo "🗄️ 4. 配置环境变量..." +cd /home/ubuntu/city-manual/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/city-manual/backend/media +STATIC_ROOT=/home/ubuntu/city-manual/city-manual/backend/static +EOF + +echo "📦 5. 数据库迁移..." +cd backend +source ../venv/bin/activate +python manage.py migrate --noinput +python manage.py collectstatic --noinput + +echo "⚙️ 6. 创建 Gunicorn systemd 服务..." +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/city-manual/backend +ExecStart=/home/ubuntu/city-manual/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 "🌐 7. 配置 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/city-manual/backend/static/; + expires 30d; + add_header Cache-Control "public, immutable"; + } + + location /media/ { + alias /home/ubuntu/city-manual/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 "🔥 8. 配置防火墙..." +sudo ufw allow 80/tcp || echo "防火墙配置跳过" + +echo "" +echo "✅ 部署完成!" +echo "" +echo "📍 访问地址:http://cssc.datalibstar.com" +echo "📍 Admin: http://cssc.datalibstar.com/admin" +echo "📍 测试账号:demo / demo123" +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