diff --git a/backend/Dockerfile b/backend/Dockerfile index 0a9afe2..9a3808d 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -14,9 +14,9 @@ RUN apt-get update && apt-get install \ -y --no-install-recommends && \ rm -rf /var/lib/apt/lists/* -# Install Python dependencies +# Install Python dependencies (use Tsinghua mirror for faster download in China) COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn # Copy project COPY . . diff --git a/backend/requirements.txt b/backend/requirements.txt index 215fb61..d115839 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -8,4 +8,5 @@ Pillow>=10.0 graphene-django>=3.1 django-filter>=23.0 gunicorn>=21.0 -whitenoise>=6.5 \ No newline at end of file +whitenoise>=6.5 +django-extensions>=3.2 \ No newline at end of file diff --git a/deploy_final.sh b/deploy_final.sh new file mode 100755 index 0000000..0c98d08 --- /dev/null +++ b/deploy_final.sh @@ -0,0 +1,131 @@ +#!/bin/bash +# 最终部署脚本 - 使用 docker compose + +set -e + +SERVER_USER="ubuntu" +SERVER_HOST="cssc.datalibstar.com" +SERVER_PASS="825670@MashenClaw" +SERVER_DIR="/home/ubuntu/city-manual" +LOCAL_DIR="/root/.openclaw/workspace" +TEMP_TAR="/tmp/city-manual-deploy.tar.gz" + +echo "========================================" +echo " 城市手册项目部署到云服务器" +echo "========================================" +echo "" + +# 1. 打包本地代码 +echo "1. 打包本地代码..." +cd "$LOCAL_DIR" +tar --exclude='.git' \ + --exclude='node_modules' \ + --exclude='backend/venv' \ + --exclude='__pycache__' \ + --exclude='*.pyc' \ + --exclude='.env' \ + --exclude='db.sqlite3' \ + --exclude='media' \ + --exclude='staticfiles' \ + --exclude='.docker' \ + --exclude='frontend/node_modules' \ + -czf "$TEMP_TAR" . + +echo "✓ 打包完成:$TEMP_TAR ($(du -h "$TEMP_TAR" | cut -f1))" + +# 2. 上传到服务器 +echo "2. 上传到服务器..." +sshpass -p "$SERVER_PASS" scp -o StrictHostKeyChecking=no "$TEMP_TAR" "$SERVER_USER@$SERVER_HOST:/tmp/" +echo "✓ 上传完成" + +# 3. 在服务器上解压并部署 +echo "3. 在服务器上部署..." +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no "$SERVER_USER@$SERVER_HOST" " + set -e + + # 备份旧目录 + if [ -d '$SERVER_DIR' ]; then + echo '备份旧版本...' + mv $SERVER_DIR ${SERVER_DIR}.backup.\$(date +%Y%m%d_%H%M%S) + fi + + # 创建新目录 + mkdir -p $SERVER_DIR + + # 解压代码 + echo '解压代码...' + tar -xzf /tmp/city-manual-deploy.tar.gz -C $SERVER_DIR + + cd $SERVER_DIR + + # 创建 .env 文件 + echo '创建环境配置...' + cat > .env << 'EOF' +DJANGO_SECRET_KEY=CityWiki2024SecretKey825670 +DJANGO_DEBUG=False +DB_NAME=citywiki +DB_USER=citywiki +DB_PASSWORD=CityWiki2024! +DB_HOST=db +DB_PORT=5432 +ALLOWED_HOSTS=localhost,cssc.datalibstar.com,127.0.0.1 +CORS_ALLOWED_ORIGINS=http://localhost,http://cssc.datalibstar.com,http://127.0.0.1 +EOF + + # 安装前端依赖 + echo '安装前端依赖...' + cd frontend + npm install --production + cd .. + + # 构建并启动 Docker (使用 docker compose 而不是 docker-compose) + echo '构建 Docker 镜像...' + docker compose build + + echo '启动服务...' + docker compose up -d + + # 等待服务启动 + echo '等待服务启动...' + sleep 15 + + # 运行数据库迁移 + echo '运行数据库迁移...' + docker compose exec -T backend python manage.py migrate --noinput + + # 导入省份数据 + echo '导入省份数据...' + docker compose exec -T backend python manage.py seed_provinces + + # 创建超级用户 + echo '创建管理员账户...' + docker compose exec -T backend python manage.py shell << 'PYTHON' +from django.contrib.auth import get_user_model +User = get_user_model() +if not User.objects.filter(username='admin').exists(): + User.objects.create_superuser('admin', 'admin@citywiki.com', 'Admin123!') + print('✓ 管理员账户已创建') + print(' 用户名:admin') + print(' 密码:Admin123!') +else: + print('✓ 管理员账户已存在') +PYTHON + + # 清理临时文件 + rm -f /tmp/city-manual-deploy.tar.gz + + echo '' + echo '========================================' + echo ' 部署完成!' + echo '========================================' + echo '' + echo '访问地址:http://cssc.datalibstar.com' + echo '管理员:admin / Admin123!' + echo '' +" + +# 4. 清理本地临时文件 +rm -f "$TEMP_TAR" + +echo "" +echo "✅ 部署完成!" diff --git a/deploy_simple.sh b/deploy_simple.sh new file mode 100755 index 0000000..7303bc0 --- /dev/null +++ b/deploy_simple.sh @@ -0,0 +1,131 @@ +#!/bin/bash +# 简化的部署脚本 + +set -e + +SERVER_USER="ubuntu" +SERVER_HOST="cssc.datalibstar.com" +SERVER_PASS="825670@MashenClaw" +SERVER_DIR="/home/ubuntu/city-manual" +LOCAL_DIR="/root/.openclaw/workspace" +TEMP_TAR="/tmp/city-manual-deploy.tar.gz" + +echo "========================================" +echo " 城市手册项目部署到云服务器" +echo "========================================" +echo "" + +# 1. 打包本地代码 +echo "1. 打包本地代码..." +cd "$LOCAL_DIR" +tar --exclude='.git' \ + --exclude='node_modules' \ + --exclude='backend/venv' \ + --exclude='__pycache__' \ + --exclude='*.pyc' \ + --exclude='.env' \ + --exclude='db.sqlite3' \ + --exclude='media' \ + --exclude='staticfiles' \ + --exclude='.docker' \ + --exclude='frontend/node_modules' \ + -czf "$TEMP_TAR" . + +echo "✓ 打包完成:$TEMP_TAR ($(du -h "$TEMP_TAR" | cut -f1))" + +# 2. 上传到服务器 +echo "2. 上传到服务器..." +sshpass -p "$SERVER_PASS" scp -o StrictHostKeyChecking=no "$TEMP_TAR" "$SERVER_USER@$SERVER_HOST:/tmp/" +echo "✓ 上传完成" + +# 3. 在服务器上解压并部署 +echo "3. 在服务器上部署..." +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no "$SERVER_USER@$SERVER_HOST" " + set -e + + # 备份旧目录 + if [ -d '$SERVER_DIR' ]; then + echo '备份旧版本...' + mv $SERVER_DIR ${SERVER_DIR}.backup.\$(date +%Y%m%d_%H%M%S) + fi + + # 创建新目录 + mkdir -p $SERVER_DIR + + # 解压代码 + echo '解压代码...' + tar -xzf /tmp/city-manual-deploy.tar.gz -C $SERVER_DIR + + cd $SERVER_DIR + + # 创建 .env 文件 + echo '创建环境配置...' + cat > .env << 'EOF' +DJANGO_SECRET_KEY=CityWiki2024SecretKey825670 +DJANGO_DEBUG=False +DB_NAME=citywiki +DB_USER=citywiki +DB_PASSWORD=CityWiki2024! +DB_HOST=db +DB_PORT=5432 +ALLOWED_HOSTS=localhost,cssc.datalibstar.com,127.0.0.1 +CORS_ALLOWED_ORIGINS=http://localhost,http://cssc.datalibstar.com,http://127.0.0.1 +EOF + + # 安装前端依赖 + echo '安装前端依赖...' + cd frontend + npm install --production + cd .. + + # 构建并启动 Docker + echo '构建 Docker 镜像...' + docker-compose build + + echo '启动服务...' + docker-compose up -d + + # 等待服务启动 + echo '等待服务启动...' + sleep 15 + + # 运行数据库迁移 + echo '运行数据库迁移...' + docker-compose exec -T backend python manage.py migrate --noinput + + # 导入省份数据 + echo '导入省份数据...' + docker-compose exec -T backend python manage.py seed_provinces + + # 创建超级用户 + echo '创建管理员账户...' + docker-compose exec -T backend python manage.py shell << 'PYTHON' +from django.contrib.auth import get_user_model +User = get_user_model() +if not User.objects.filter(username='admin').exists(): + User.objects.create_superuser('admin', 'admin@citywiki.com', 'Admin123!') + print('✓ 管理员账户已创建') + print(' 用户名:admin') + print(' 密码:Admin123!') +else: + print('✓ 管理员账户已存在') +PYTHON + + # 清理临时文件 + rm -f /tmp/city-manual-deploy.tar.gz + + echo '' + echo '========================================' + echo ' 部署完成!' + echo '========================================' + echo '' + echo '访问地址:http://cssc.datalibstar.com' + echo '管理员:admin / Admin123!' + echo '' +" + +# 4. 清理本地临时文件 +rm -f "$TEMP_TAR" + +echo "" +echo "✅ 部署完成!" diff --git a/deploy_to_server.sh b/deploy_to_server.sh new file mode 100755 index 0000000..dd0f960 --- /dev/null +++ b/deploy_to_server.sh @@ -0,0 +1,114 @@ +#!/bin/bash +# 城市手册项目 - 本地构建并部署到服务器 + +set -e + +SERVER_USER="ubuntu" +SERVER_HOST="cssc.datalibstar.com" +SERVER_PASS="825670@MashenClaw" +SERVER_DIR="/home/ubuntu/city-manual" +LOCAL_DIR="/root/.openclaw/workspace" + +echo "========================================" +echo " 城市手册项目部署到云服务器" +echo "========================================" +echo "" + +# 1. 在服务器上创建目录 +echo "1. 准备服务器目录..." +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no "$SERVER_USER@$SERVER_HOST" " + if [ -d '$SERVER_DIR' ]; then + echo '备份旧版本...' + mv $SERVER_DIR ${SERVER_DIR}.backup.\$(date +%Y%m%d_%H%M%S) + fi + mkdir -p $SERVER_DIR +" + +# 2. 使用 rsync 同步代码 +echo "2. 同步代码到服务器..." +rsync -avz --delete \ + --exclude '.git' \ + --exclude 'node_modules' \ + --exclude 'backend/venv' \ + --exclude '__pycache__' \ + --exclude '*.pyc' \ + --exclude '.env' \ + --exclude 'db.sqlite3' \ + --exclude 'media' \ + --exclude 'staticfiles' \ + --exclude '.docker' \ + "$LOCAL_DIR/" \ + "sshpass -p '$SERVER_PASS' rsync --rsh=ssh -avz $SERVER_USER@$SERVER_HOST:$SERVER_DIR/" + +echo "✓ 代码同步完成" + +# 3. 在服务器上执行部署 +echo "3. 在服务器上执行部署..." +sshpass -p "$SERVER_PASS" ssh -o StrictHostKeyChecking=no "$SERVER_USER@$SERVER_HOST" " + cd $SERVER_DIR + + # 创建 .env 文件 + echo '创建环境配置...' + cat > .env << 'EOF' +DJANGO_SECRET_KEY=CityWiki2024SecretKey825670 +DJANGO_DEBUG=False +DB_NAME=citywiki +DB_USER=citywiki +DB_PASSWORD=CityWiki2024! +DB_HOST=db +DB_PORT=5432 +ALLOWED_HOSTS=localhost,cssc.datalibstar.com,127.0.0.1 +CORS_ALLOWED_ORIGINS=http://localhost,http://cssc.datalibstar.com,http://127.0.0.1 +EOF + + # 安装前端依赖 + echo '安装前端依赖...' + cd frontend + npm install --production + cd .. + + # 构建并启动 Docker + echo '构建 Docker 镜像...' + docker-compose build + + echo '启动服务...' + docker-compose up -d + + # 等待服务启动 + echo '等待服务启动...' + sleep 15 + + # 运行数据库迁移 + echo '运行数据库迁移...' + docker-compose exec -T backend python manage.py migrate --noinput + + # 导入省份数据 + echo '导入省份数据...' + docker-compose exec -T backend python manage.py seed_provinces + + # 创建超级用户 + echo '创建管理员账户...' + docker-compose exec -T backend python manage.py shell << 'PYTHON' +from django.contrib.auth import get_user_model +User = get_user_model() +if not User.objects.filter(username='admin').exists(): + User.objects.create_superuser('admin', 'admin@citywiki.com', 'Admin123!') + print('✓ 管理员账户已创建') + print(' 用户名:admin') + print(' 密码:Admin123!') +else: + print('✓ 管理员账户已存在') +PYTHON + + echo '' + echo '========================================' + echo ' 部署完成!' + echo '========================================' + echo '' + echo '访问地址:http://cssc.datalibstar.com' + echo '管理员:admin / Admin123!' + echo '' +" + +echo "" +echo "✅ 部署完成!"