This commit is contained in:
freedakgmail
2025-12-21 13:57:32 +08:00
parent 1ae59960e8
commit cffdd75e96
431 changed files with 1219 additions and 9202 deletions
+47 -34
View File
@@ -1,12 +1,14 @@
#!/bin/bash
# 部署配置
SERVER_IP="115.190.235.230"
SERVER_IP="180.76.240.104"
SSH_PORT="22" # SSH连接端口
SERVER_USER="root" # 根据实际情况修改用户名
REMOTE_DIR="/var/www/chinese-family-tree" # 服务器上的部署目录
APP_PORT="8006" # Next.js 应用端口(对外访问端口)
SSH_HOST="180.76.240.104-root"
# 数据库配置
DB_NAME="family_tree"
DB_USER="family_tree_user"
@@ -47,13 +49,7 @@ echo -e "${GREEN}✓ 部署前检查通过${NC}"
# 1. 检查并创建SSH密钥
echo -e "\n${YELLOW}[1/9] 检查SSH密钥...${NC}"
if [ ! -f ~/.ssh/id_rsa ]; then
echo -e "${YELLOW}未找到SSH密钥,正在创建...${NC}"
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "deploy@chinese-family-tree"
echo -e "${GREEN}✓ SSH密钥创建成功${NC}"
else
echo -e "${GREEN}✓ SSH密钥已存在${NC}"
fi
echo -e "${GREEN}✓ 使用已配置的SSH免密登录(~/.ssh/config: ${SSH_HOST}${NC}"
# 2. 测试服务器连接
echo -e "\n${YELLOW}[2/9] 测试服务器连接...${NC}"
@@ -79,23 +75,14 @@ echo -e "${GREEN}✓ SSH端口 ${SSH_PORT} 可访问${NC}"
echo -e "\n${YELLOW}[3/9] 配置免密登录...${NC}"
# 检查是否已经配置免密登录
ssh -p $SSH_PORT -o BatchMode=yes -o ConnectTimeout=5 $SERVER_USER@$SERVER_IP "echo '已配置免密登录'" 2>/dev/null
ssh -o BatchMode=yes -o ConnectTimeout=5 $SSH_HOST "echo '已配置免密登录'" 2>/dev/null
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 免密登录已配置${NC}"
else
echo -e "${YELLOW}请输入服务器密码以配置免密登录:${NC}"
ssh-copy-id -p $SSH_PORT $SERVER_USER@$SERVER_IP
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 免密登录配置成功${NC}"
else
echo -e "${RED}✗ 免密登录配置失败${NC}"
echo -e "${YELLOW}请检查:${NC}"
echo -e " 1. 服务器用户名是否正确: ${SERVER_USER}"
echo -e " 2. 服务器密码是否正确"
echo -e " 3. 服务器是否允许密码登录"
exit 1
fi
echo -e "${RED}✗ 免密登录未配置或无法使用${NC}"
echo -e "${YELLOW}请先在本机配置好免密登录后再重试:${NC}"
echo -e " ssh ${SSH_HOST}"
exit 1
fi
# 4. 本地构建
@@ -118,7 +105,7 @@ fi
# 5. 在服务器上创建目录和安装依赖
echo -e "\n${YELLOW}[5/9] 配置服务器环境...${NC}"
ssh -p $SSH_PORT $SERVER_USER@$SERVER_IP << 'ENDSSH'
ssh $SSH_HOST << 'ENDSSH'
# 安装Node.js (如果未安装)
if ! command -v node &> /dev/null; then
echo "安装Node.js..."
@@ -146,7 +133,7 @@ echo -e "${GREEN}✓ 服务器环境配置完成${NC}"
# 6. 配置数据库
echo -e "\n${YELLOW}[6/9] 配置PostgreSQL数据库...${NC}"
ssh -p $SSH_PORT $SERVER_USER@$SERVER_IP bash << ENDSSH
ssh $SSH_HOST bash << ENDSSH
# 检查PostgreSQL是否安装
if ! command -v psql &> /dev/null; then
echo "PostgreSQL未安装,正在安装..."
@@ -169,10 +156,11 @@ CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
ALTER DATABASE $DB_NAME OWNER TO $DB_USER;
\\c $DB_NAME
GRANT ALL ON SCHEMA public TO $DB_USER;
GRANT USAGE, CREATE ON SCHEMA public TO $DB_USER;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO $DB_USER;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO $DB_USER;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO $DB_USER;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO $DB_USER;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO $DB_USER;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO $DB_USER;
EOF
echo "✓ 数据库创建成功"
fi
@@ -203,9 +191,8 @@ rsync -avz --progress --delete \
--exclude 'deploy-manual.sh' \
--exclude 'setup-ssh-key.sh' \
--exclude '*.tar.gz' \
--exclude 'public/uploads/*' \
-e "ssh -p $SSH_PORT" \
./ $SERVER_USER@$SERVER_IP:$REMOTE_DIR/
-e "ssh" \
./ $SSH_HOST:$REMOTE_DIR/
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 文件上传成功${NC}"
@@ -214,9 +201,24 @@ else
exit 1
fi
# 同步上传文件目录(如果存在)
if [ -d "public/uploads" ] && [ "$(ls -A public/uploads 2>/dev/null)" ]; then
echo -e "${YELLOW}同步上传文件目录...${NC}"
rsync -avz --progress \
-e "ssh" \
./public/uploads/ $SSH_HOST:$REMOTE_DIR/public/uploads/
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 上传文件同步成功${NC}"
else
echo -e "${YELLOW}⚠ 上传文件同步失败(非致命错误)${NC}"
fi
else
echo -e "${YELLOW}⚠ 本地无上传文件需要同步${NC}"
fi
# 8. 配置环境变量
echo -e "\n${YELLOW}[8/9] 配置环境变量...${NC}"
ssh -p $SSH_PORT $SERVER_USER@$SERVER_IP bash << ENDSSH
ssh $SSH_HOST bash << ENDSSH
cd $REMOTE_DIR
# 检查.env文件是否存在
@@ -270,7 +272,7 @@ fi
# 9. 在服务器上安装依赖和启动应用
echo -e "\n${YELLOW}[9/9] 安装依赖并启动应用...${NC}"
ssh -p $SSH_PORT $SERVER_USER@$SERVER_IP bash << ENDSSH
ssh $SSH_HOST bash << ENDSSH
cd $REMOTE_DIR
# 配置pnpm使用国内镜像(如果还没配置)
@@ -295,6 +297,17 @@ npx prisma generate || pnpm exec prisma generate
echo "运行数据库迁移..."
npx prisma migrate deploy || pnpm exec prisma migrate deploy
# 确保数据库用户有正确的权限
echo "检查数据库权限..."
sudo -u postgres psql -d $DB_NAME << 'SQLEOF'
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO $DB_USER;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO $DB_USER;
GRANT USAGE, CREATE ON SCHEMA public TO $DB_USER;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO $DB_USER;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO $DB_USER;
SQLEOF
echo "✓ 数据库权限已确认"
# 使用PM2启动应用(监听指定端口)
echo "启动应用..."
pm2 delete chinese-family-tree 2>/dev/null || true
@@ -317,9 +330,9 @@ if [ $? -eq 0 ]; then
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}应用访问地址: http://${SERVER_IP}:${APP_PORT}${NC}"
echo -e "${YELLOW}提示:${NC}"
echo -e " - 查看应用日志: ssh -p ${SSH_PORT} ${SERVER_USER}@${SERVER_IP} 'pm2 logs chinese-family-tree'"
echo -e " - 重启应用: ssh -p ${SSH_PORT} ${SERVER_USER}@${SERVER_IP} 'pm2 restart chinese-family-tree'"
echo -e " - 停止应用: ssh -p ${SSH_PORT} ${SERVER_USER}@${SERVER_IP} 'pm2 stop chinese-family-tree'"
echo -e " - 查看应用日志: ssh ${SSH_HOST} 'pm2 logs chinese-family-tree'"
echo -e " - 重启应用: ssh ${SSH_HOST} 'pm2 restart chinese-family-tree'"
echo -e " - 停止应用: ssh ${SSH_HOST} 'pm2 stop chinese-family-tree'"
echo -e "${GREEN}========================================${NC}"
else
echo -e "${RED}✗ 部署失败${NC}"