Files
chinese-family-tree-2/DEPLOY_README.md
T
freedakgmail 3b0d8255f6 0.0.8.1
2025-11-23 19:38:51 +08:00

6.8 KiB
Raw Blame History

部署脚本使用说明

📋 部署脚本改进说明

已修复的问题

  1. 数据库密码特殊字符问题

    • 简化默认密码为 FamilyTree2024
    • 添加 DB_PASSWORD_ENCODED 变量支持URL编码
    • 使用占位符替换方式生成.env文件,避免变量展开问题
  2. Prisma安装问题

    • 自动配置国内镜像源
    • 智能检测prisma命令是否可用
    • 失败时自动安装完整依赖
    • 支持 npx prismapnpm exec prisma 两种方式
  3. 环境变量配置问题

    • 使用临时文件+sed替换方式生成.env
    • 避免heredoc中的变量展开问题
    • 确保NEXTAUTH_SECRET正确生成
  4. PM2配置优化

    • 检查是否已配置开机自启
    • 避免重复配置systemd服务
  5. 部署前检查

    • 检查必要命令(pnpm, rsync, ssh, nc
    • 检查本地.env文件是否存在
    • 提前发现问题,避免部署失败

🚀 使用方法

1. 配置部署参数

编辑 deploy.sh 文件,修改以下配置:

# 服务器配置
SERVER_IP="115.190.235.230"      # 服务器IP
SSH_PORT="22"                    # SSH端口
SERVER_USER="root"               # SSH用户
REMOTE_DIR="/var/www/chinese-family-tree"  # 部署目录
APP_PORT="8006"                  # 应用端口

# 数据库配置
DB_NAME="family_tree"
DB_USER="family_tree_user"
DB_PASSWORD="FamilyTree2024"     # 数据库密码

2. 准备本地环境

确保本地已安装:

  • Node.js 18+
  • pnpm
  • rsync
  • ssh客户端

3. 执行部署

chmod +x deploy.sh
./deploy.sh

📝 部署流程

脚本会自动完成以下步骤:

[0/9] 部署前检查

  • 检查必要命令是否安装
  • 检查本地.env文件是否存在

[1/9] 检查SSH密钥

  • 检查 ~/.ssh/id_rsa 是否存在
  • 不存在则自动创建4096位RSA密钥

[2/9] 测试服务器连接

  • 使用 nc 测试SSH端口是否开放
  • 验证服务器可访问性

[3/9] 配置免密登录

  • 检查是否已配置免密登录
  • 未配置则使用 ssh-copy-id 配置

[4/9] 本地构建项目

  • pnpm install - 安装依赖
  • npx prisma generate - 生成Prisma客户端
  • pnpm build - 构建Next.js应用

[5/9] 配置服务器环境

  • 安装Node.js 20.x(如未安装)
  • 安装pnpm(如未安装)
  • 安装PM2(如未安装)
  • 创建部署目录

[6/9] 配置PostgreSQL数据库

  • 检查PostgreSQL是否安装
  • 检查数据库是否存在
  • 创建数据库和用户(如不存在)
  • 配置完整权限(兼容PostgreSQL 15+

[7/9] 上传文件到服务器

  • 使用rsync同步文件
  • 自动排除不必要的文件:
    • node_modules
    • .git
    • .next/cache
    • .env(本地配置)
    • *.log, *.md
    • 测试脚本

[8/9] 配置环境变量

  • 检查服务器上.env文件是否存在
  • 不存在则自动创建
  • 配置内容:
    • DATABASE_URL(自动使用配置的数据库信息)
    • NEXTAUTH_URL(自动使用服务器IP和端口)
    • NEXTAUTH_SECRET(自动生成随机密钥)
    • SMTP配置
    • NODE_ENV=production

[9/9] 安装依赖并启动应用

  • 配置pnpm使用国内镜像
  • 安装生产依赖
  • 生成Prisma客户端
  • 运行数据库迁移
  • 使用PM2启动应用(监听指定端口)
  • 保存PM2配置
  • 配置开机自启动

⚙️ 配置说明

数据库密码特殊字符

如果数据库密码包含特殊字符,需要URL编码:

# 原密码
DB_PASSWORD="FamilyTree2024!@#"

# URL编码后(! → %21, @ → %40, # → %23
DB_PASSWORD_ENCODED="FamilyTree2024%21%40%23"

常见特殊字符编码:

  • !%21
  • @%40
  • #%23
  • $%24
  • %%25
  • ^%5E
  • &%26
  • *%2A

自定义SMTP配置

如需修改邮件配置,编辑脚本中的SMTP部分:

SMTP_HOST="smtp.163.com"
SMTP_PORT="465"
SMTP_USER="your-email@163.com"
SMTP_PASS="your-password"
SMTP_FROM="your-email@163.com"

🔧 常用管理命令

查看应用状态

ssh root@115.190.235.230 'pm2 status'

查看应用日志

ssh root@115.190.235.230 'pm2 logs chinese-family-tree'

重启应用

ssh root@115.190.235.230 'pm2 restart chinese-family-tree'

停止应用

ssh root@115.190.235.230 'pm2 stop chinese-family-tree'

查看实时日志

ssh root@115.190.235.230 'pm2 logs chinese-family-tree --lines 100'

更新部署

./deploy.sh

🐛 故障排查

1. pnpm install 失败

问题npm registry连接超时

解决方案

# 登录服务器
ssh root@115.190.235.230

# 配置国内镜像
pnpm config set registry https://registry.npmmirror.com

# 重新部署
./deploy.sh

2. Prisma命令找不到

问题Command "prisma" not found

解决方案: 脚本已自动处理,会安装完整依赖。如果仍有问题:

ssh root@115.190.235.230
cd /var/www/chinese-family-tree
pnpm install  # 安装所有依赖(包括devDependencies

3. 数据库连接失败

问题P1013: empty host in database URL

解决方案 检查.env文件中的DATABASE_URL是否正确:

ssh root@115.190.235.230
cat /var/www/chinese-family-tree/.env

确保格式正确:

DATABASE_URL="postgresql://family_tree_user:FamilyTree2024@localhost:5432/family_tree"

4. 端口被占用

问题:端口8006已被占用

解决方案

# 查看端口占用
ssh root@115.190.235.230 'lsof -i :8006'

# 停止占用进程
ssh root@115.190.235.230 'pm2 stop chinese-family-tree'

# 或修改APP_PORT为其他端口

5. 应用无法访问

检查清单

  1. 应用是否正常运行:pm2 status
  2. 防火墙是否开放端口:ufw status
  3. 云服务器安全组是否配置
  4. 浏览器缓存是否清除

📊 性能优化

1. 使用PM2集群模式

ssh root@115.190.235.230
cd /var/www/chinese-family-tree
pm2 delete chinese-family-tree
PORT=8006 pm2 start npm --name "chinese-family-tree" -i max -- start
pm2 save

2. 配置日志轮转

ssh root@115.190.235.230
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

3. 启用Gzip压缩

在next.config.mjs中添加:

const nextConfig = {
  compress: true,
  // ...其他配置
}

🔒 安全建议

  1. 修改默认密码:部署后立即修改数据库密码
  2. 配置防火墙:只开放必要端口
  3. 定期更新:保持系统和依赖包最新
  4. 使用HTTPS:配置SSL证书
  5. 限制SSH访问:使用fail2ban防止暴力破解
  6. 定期备份:备份数据库和应用文件

📞 技术支持

如遇到问题:

  1. 查看应用日志:pm2 logs chinese-family-tree
  2. 查看系统日志:/var/log/syslog
  3. 检查数据库日志:PostgreSQL日志文件

最后更新: 2025-11-23 脚本版本: v2.0(完善版)