gongxiangp2/auto-deploy.sh
2025-10-26 09:11:04 +08:00

178 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "========================================="