6.8 KiB
6.8 KiB
部署脚本使用说明
📋 部署脚本改进说明
已修复的问题
-
✅ 数据库密码特殊字符问题
- 简化默认密码为
FamilyTree2024 - 添加
DB_PASSWORD_ENCODED变量支持URL编码 - 使用占位符替换方式生成.env文件,避免变量展开问题
- 简化默认密码为
-
✅ Prisma安装问题
- 自动配置国内镜像源
- 智能检测prisma命令是否可用
- 失败时自动安装完整依赖
- 支持
npx prisma和pnpm exec prisma两种方式
-
✅ 环境变量配置问题
- 使用临时文件+sed替换方式生成.env
- 避免heredoc中的变量展开问题
- 确保NEXTAUTH_SECRET正确生成
-
✅ PM2配置优化
- 检查是否已配置开机自启
- 避免重复配置systemd服务
-
✅ 部署前检查
- 检查必要命令(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. 应用无法访问
检查清单:
- 应用是否正常运行:
pm2 status - 防火墙是否开放端口:
ufw status - 云服务器安全组是否配置
- 浏览器缓存是否清除
📊 性能优化
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,
// ...其他配置
}
🔒 安全建议
- 修改默认密码:部署后立即修改数据库密码
- 配置防火墙:只开放必要端口
- 定期更新:保持系统和依赖包最新
- 使用HTTPS:配置SSL证书
- 限制SSH访问:使用fail2ban防止暴力破解
- 定期备份:备份数据库和应用文件
📞 技术支持
如遇到问题:
- 查看应用日志:
pm2 logs chinese-family-tree - 查看系统日志:
/var/log/syslog - 检查数据库日志:PostgreSQL日志文件
最后更新: 2025-11-23 脚本版本: v2.0(完善版)