# 部署脚本使用说明 ## 📋 部署脚本改进说明 ### 已修复的问题 1. **✅ 数据库密码特殊字符问题** - 简化默认密码为 `FamilyTree2024` - 添加 `DB_PASSWORD_ENCODED` 变量支持URL编码 - 使用占位符替换方式生成.env文件,避免变量展开问题 2. **✅ Prisma安装问题** - 自动配置国内镜像源 - 智能检测prisma命令是否可用 - 失败时自动安装完整依赖 - 支持 `npx prisma` 和 `pnpm exec prisma` 两种方式 3. **✅ 环境变量配置问题** - 使用临时文件+sed替换方式生成.env - 避免heredoc中的变量展开问题 - 确保NEXTAUTH_SECRET正确生成 4. **✅ PM2配置优化** - 检查是否已配置开机自启 - 避免重复配置systemd服务 5. **✅ 部署前检查** - 检查必要命令(pnpm, rsync, ssh, nc) - 检查本地.env文件是否存在 - 提前发现问题,避免部署失败 ## 🚀 使用方法 ### 1. 配置部署参数 编辑 `deploy.sh` 文件,修改以下配置: ```bash # 服务器配置 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. 执行部署 ```bash 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编码: ```bash # 原密码 DB_PASSWORD="FamilyTree2024!@#" # URL编码后(! → %21, @ → %40, # → %23) DB_PASSWORD_ENCODED="FamilyTree2024%21%40%23" ``` 常见特殊字符编码: - `!` → `%21` - `@` → `%40` - `#` → `%23` - `$` → `%24` - `%` → `%25` - `^` → `%5E` - `&` → `%26` - `*` → `%2A` ### 自定义SMTP配置 如需修改邮件配置,编辑脚本中的SMTP部分: ```bash SMTP_HOST="smtp.163.com" SMTP_PORT="465" SMTP_USER="your-email@163.com" SMTP_PASS="your-password" SMTP_FROM="your-email@163.com" ``` ## 🔧 常用管理命令 ### 查看应用状态 ```bash ssh root@115.190.235.230 'pm2 status' ``` ### 查看应用日志 ```bash ssh root@115.190.235.230 'pm2 logs chinese-family-tree' ``` ### 重启应用 ```bash ssh root@115.190.235.230 'pm2 restart chinese-family-tree' ``` ### 停止应用 ```bash ssh root@115.190.235.230 'pm2 stop chinese-family-tree' ``` ### 查看实时日志 ```bash ssh root@115.190.235.230 'pm2 logs chinese-family-tree --lines 100' ``` ### 更新部署 ```bash ./deploy.sh ``` ## 🐛 故障排查 ### 1. pnpm install 失败 **问题**:npm registry连接超时 **解决方案**: ```bash # 登录服务器 ssh root@115.190.235.230 # 配置国内镜像 pnpm config set registry https://registry.npmmirror.com # 重新部署 ./deploy.sh ``` ### 2. Prisma命令找不到 **问题**:`Command "prisma" not found` **解决方案**: 脚本已自动处理,会安装完整依赖。如果仍有问题: ```bash 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是否正确: ```bash 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已被占用 **解决方案**: ```bash # 查看端口占用 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集群模式 ```bash 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. 配置日志轮转 ```bash 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中添加: ```javascript 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(完善版)