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

318 lines
6.8 KiB
Markdown
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.
# 部署脚本使用说明
## 📋 部署脚本改进说明
### 已修复的问题
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(完善版)