#!/bin/bash # 自动部署脚本(包含密码认证) # 使用方法: ./auto-deploy.sh NAS_HOST="192.168.58.20" NAS_USER="root" NAS_PASSWORD="jsjj8888" NAS_PROJECT_PATH="/mnt/tank/apps/youyidian-3d" echo "=========================================" echo "部署 由壹点3D素材 到 TrueNAS 服务器" echo "=========================================" # 检查是否已经打包 if [ ! -f "project.tar.gz" ]; then echo "错误: project.tar.gz 不存在!" exit 1 fi echo "1. 上传项目到 NAS 服务器..." sshpass -p "${NAS_PASSWORD}" scp project.tar.gz ${NAS_USER}@${NAS_HOST}:/tmp/ if [ $? -ne 0 ]; then echo "上传失败,尝试使用expect方式..." expect << EOF set timeout 60 spawn scp project.tar.gz ${NAS_USER}@${NAS_HOST}:/tmp/ expect { "password:" { send "${NAS_PASSWORD}\r" expect eof } "yes/no" { send "yes\r" expect "password:" send "${NAS_PASSWORD}\r" expect eof } } EOF fi echo "2. 在 NAS 服务器上部署..." sshpass -p "${NAS_PASSWORD}" ssh ${NAS_USER}@${NAS_HOST} << 'ENDSSH' set -e # 创建项目目录 echo "创建项目目录..." mkdir -p /mnt/tank/apps/youyidian-3d cd /mnt/tank/apps/youyidian-3d # 备份旧的上传文件(如果存在) if [ -d "uploads" ]; then echo "备份旧的上传文件..." mkdir -p backups cp -r uploads backups/uploads-$(date +%Y%m%d-%H%M%S) fi # 解压项目 echo "解压项目文件..." tar -xzf /tmp/project.tar.gz # 清理临时文件 rm /tmp/project.tar.gz # 恢复上传目录(如果备份存在) if [ -d "backups" ]; then latest_backup=$(ls -td backups/uploads-* 2>/dev/null | head -1) if [ -n "$latest_backup" ] && [ -d "$latest_backup" ]; then echo "恢复上传文件..." cp -r "$latest_backup"/* uploads/ 2>/dev/null || true fi fi # 停止旧容器 echo "停止旧容器..." docker-compose down # 构建并启动新容器 echo "构建并启动 Docker 容器..." docker-compose up -d --build # 等待容器启动 echo "等待容器启动(30秒)..." sleep 30 # 运行数据库迁移 echo "运行数据库迁移..." docker-compose exec -T app npx prisma db push --accept-data-loss || echo "数据库迁移可能已执行" # 初始化场景数据 echo "初始化场景数据..." docker-compose exec -T app npx prisma db execute --stdin << 'EOSQL' INSERT INTO scenes (id, name, "createdAt") VALUES (gen_random_uuid(), '客厅', NOW()), (gen_random_uuid(), '卧室', NOW()), (gen_random_uuid(), '厨房', NOW()), (gen_random_uuid(), '餐厅', NOW()), (gen_random_uuid(), '书房', NOW()), (gen_random_uuid(), '儿童房', NOW()), (gen_random_uuid(), '主卧', NOW()), (gen_random_uuid(), '次卧', NOW()), (gen_random_uuid(), '阳台', NOW()), (gen_random_uuid(), '卫生间', NOW()), (gen_random_uuid(), '玄关', NOW()), (gen_random_uuid(), '衣帽间', NOW()), (gen_random_uuid(), '办公室', NOW()), (gen_random_uuid(), '会议室', NOW()), (gen_random_uuid(), '展厅', NOW()) ON CONFLICT (name) DO NOTHING; EOSQL # 查看容器状态 echo "" echo "=========================================" echo "容器状态:" docker-compose ps # 查看容器日志 echo "" echo "=========================================" echo "最近的日志:" docker-compose logs --tail=30 app echo "" echo "=========================================" echo "部署完成!" echo "访问地址: http://192.168.58.20:4320" echo "=========================================" ENDSSH if [ $? -ne 0 ]; then echo "SSH部署失败,尝试使用expect方式..." expect << 'EOF' set timeout 300 set password "jsjj8888" spawn ssh root@192.168.58.20 expect { "password:" { send "$password\r" } "yes/no" { send "yes\r" expect "password:" send "$password\r" } } expect "# " send "cd /mnt/tank/apps/youyidian-3d\r" expect "# " send "tar -xzf /tmp/project.tar.gz\r" expect "# " send "docker-compose down\r" expect "# " send "docker-compose up -d --build\r" expect "# " send "sleep 30\r" expect "# " send "docker-compose exec -T app npx prisma db push --accept-data-loss\r" expect "# " send "docker-compose ps\r" expect "# " send "exit\r" expect eof EOF fi echo "" echo "=========================================" echo "部署完成!" echo "访问地址: http://192.168.58.20:4320" echo "========================================="