285 lines
6.4 KiB
Markdown
285 lines
6.4 KiB
Markdown
# 部署指南
|
||
|
||
## 快速部署
|
||
|
||
### 1. 准备工作
|
||
|
||
在部署前,请确保:
|
||
|
||
1. **服务器要求**:
|
||
- 操作系统:Ubuntu 20.04+ / CentOS 7+ / Debian 10+
|
||
- 内存:至少 2GB RAM
|
||
- 磁盘:至少 10GB 可用空间
|
||
- 已安装 PostgreSQL 数据库
|
||
|
||
2. **本地环境**:
|
||
- 已安装 Node.js 18+
|
||
- 已安装 pnpm
|
||
- 已配置好 `.env` 文件
|
||
|
||
### 2. 配置服务器信息
|
||
|
||
编辑 `deploy.sh` 文件,修改以下配置:
|
||
|
||
```bash
|
||
SERVER_IP="115.190.235.230" # 服务器IP
|
||
SERVER_PORT="8006" # SSH端口
|
||
SERVER_USER="root" # SSH用户名(根据实际情况修改)
|
||
REMOTE_DIR="/var/www/chinese-family-tree" # 部署目录
|
||
APP_PORT="3000" # 应用端口
|
||
```
|
||
|
||
### 3. 配置服务器环境变量
|
||
|
||
在服务器上创建 `.env` 文件:
|
||
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230
|
||
cd /var/www/chinese-family-tree
|
||
nano .env
|
||
```
|
||
|
||
添加以下内容(根据实际情况修改):
|
||
|
||
```env
|
||
# 数据库配置
|
||
DATABASE_URL="postgresql://user:password@localhost:5432/family_tree"
|
||
|
||
# NextAuth 配置
|
||
# ⚠️ 重要: NEXTAUTH_URL 必须与用户在浏览器中访问的URL完全一致!
|
||
# 如果用户通过 http://115.190.235.230:8006 访问,则设置为:
|
||
# NEXTAUTH_URL="http://115.190.235.230:8006"
|
||
# 如果用户通过 http://115.190.235.230:3000 访问,则设置为:
|
||
NEXTAUTH_URL="http://115.190.235.230:3000"
|
||
NEXTAUTH_SECRET="your-production-secret-key-here"
|
||
|
||
# 邮箱服务器配置
|
||
SMTP_HOST="smtp.163.com"
|
||
SMTP_PORT="465"
|
||
SMTP_USER="cftservice@163.com"
|
||
SMTP_PASS="SChncqpqS9TDPUD2"
|
||
SMTP_FROM="cftservice@163.com"
|
||
|
||
# 生产环境
|
||
NODE_ENV="production"
|
||
```
|
||
|
||
**⚠️ 关于 NEXTAUTH_URL 的重要说明**:
|
||
- 如果配置错误,会导致重定向循环 (ERR_TOO_MANY_REDIRECTS)
|
||
- 必须包含协议 (http:// 或 https://)
|
||
- 必须包含用户实际访问的端口号
|
||
- 不要使用 localhost 或 127.0.0.1
|
||
- 详细的故障排查请参考 `REDIRECT_LOOP_FIX.md`
|
||
|
||
### 4. 执行部署
|
||
|
||
```bash
|
||
# 给脚本添加执行权限
|
||
chmod +x deploy.sh
|
||
|
||
# 执行部署
|
||
./deploy.sh
|
||
```
|
||
|
||
### 5. 部署流程说明
|
||
|
||
脚本会自动完成以下步骤:
|
||
|
||
1. ✓ 检查并创建SSH密钥
|
||
2. ✓ 配置免密登录(首次需要输入服务器密码)
|
||
3. ✓ 测试SSH连接
|
||
4. ✓ 本地构建项目
|
||
5. ✓ 配置服务器环境(安装Node.js、pnpm、PM2)
|
||
6. ✓ 上传文件到服务器
|
||
7. ✓ 启动应用
|
||
|
||
## 常用命令
|
||
|
||
### 查看应用状态
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'pm2 status'
|
||
```
|
||
|
||
### 查看应用日志
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'pm2 logs chinese-family-tree'
|
||
```
|
||
|
||
### 重启应用
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'pm2 restart chinese-family-tree'
|
||
```
|
||
|
||
### 停止应用
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'pm2 stop chinese-family-tree'
|
||
```
|
||
|
||
### 更新部署
|
||
```bash
|
||
# 直接运行部署脚本即可
|
||
./deploy.sh
|
||
```
|
||
|
||
## Nginx 反向代理配置(可选)
|
||
|
||
如果需要使用域名访问或配置HTTPS,可以安装Nginx:
|
||
|
||
```bash
|
||
# 在服务器上安装Nginx
|
||
apt-get update
|
||
apt-get install -y nginx
|
||
|
||
# 创建配置文件
|
||
nano /etc/nginx/sites-available/chinese-family-tree
|
||
```
|
||
|
||
添加以下配置:
|
||
|
||
```nginx
|
||
server {
|
||
listen 80;
|
||
server_name your-domain.com; # 替换为你的域名
|
||
|
||
location / {
|
||
proxy_pass http://localhost:3000;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection 'upgrade';
|
||
proxy_set_header Host $host;
|
||
proxy_cache_bypass $http_upgrade;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
}
|
||
```
|
||
|
||
启用配置:
|
||
|
||
```bash
|
||
ln -s /etc/nginx/sites-available/chinese-family-tree /etc/nginx/sites-enabled/
|
||
nginx -t
|
||
systemctl reload nginx
|
||
```
|
||
|
||
## 防火墙配置
|
||
|
||
确保服务器防火墙开放必要端口:
|
||
|
||
```bash
|
||
# Ubuntu/Debian
|
||
ufw allow 8006/tcp # SSH端口
|
||
ufw allow 3000/tcp # 应用端口
|
||
ufw allow 80/tcp # HTTP(如果使用Nginx)
|
||
ufw allow 443/tcp # HTTPS(如果使用Nginx)
|
||
|
||
# CentOS
|
||
firewall-cmd --permanent --add-port=8006/tcp
|
||
firewall-cmd --permanent --add-port=3000/tcp
|
||
firewall-cmd --permanent --add-port=80/tcp
|
||
firewall-cmd --permanent --add-port=443/tcp
|
||
firewall-cmd --reload
|
||
```
|
||
|
||
## 数据库配置
|
||
|
||
### PostgreSQL 安装和配置
|
||
|
||
```bash
|
||
# 安装PostgreSQL
|
||
apt-get install -y postgresql postgresql-contrib
|
||
|
||
# 创建数据库和用户
|
||
sudo -u postgres psql << EOF
|
||
CREATE DATABASE family_tree;
|
||
CREATE USER family_tree_user WITH PASSWORD 'your_password';
|
||
GRANT ALL PRIVILEGES ON DATABASE family_tree TO family_tree_user;
|
||
\q
|
||
EOF
|
||
|
||
# 允许远程连接(如果需要)
|
||
nano /etc/postgresql/*/main/postgresql.conf
|
||
# 修改:listen_addresses = '*'
|
||
|
||
nano /etc/postgresql/*/main/pg_hba.conf
|
||
# 添加:host all all 0.0.0.0/0 md5
|
||
|
||
# 重启PostgreSQL
|
||
systemctl restart postgresql
|
||
```
|
||
|
||
## 故障排查
|
||
|
||
### 应用无法启动
|
||
```bash
|
||
# 查看详细日志
|
||
ssh -p 8006 root@115.190.235.230 'pm2 logs chinese-family-tree --lines 100'
|
||
|
||
# 检查环境变量
|
||
ssh -p 8006 root@115.190.235.230 'cd /var/www/chinese-family-tree && cat .env'
|
||
|
||
# 手动启动测试
|
||
ssh -p 8006 root@115.190.235.230 'cd /var/www/chinese-family-tree && npm start'
|
||
```
|
||
|
||
### 数据库连接失败
|
||
```bash
|
||
# 测试数据库连接
|
||
ssh -p 8006 root@115.190.235.230 'cd /var/www/chinese-family-tree && npx prisma db pull'
|
||
```
|
||
|
||
### 端口被占用
|
||
```bash
|
||
# 查看端口占用
|
||
ssh -p 8006 root@115.190.235.230 'lsof -i :3000'
|
||
|
||
# 杀死占用进程
|
||
ssh -p 8006 root@115.190.235.230 'kill -9 <PID>'
|
||
```
|
||
|
||
## 性能优化建议
|
||
|
||
1. **启用 PM2 集群模式**:
|
||
```bash
|
||
pm2 start npm --name "chinese-family-tree" -i max -- start
|
||
```
|
||
|
||
2. **配置日志轮转**:
|
||
```bash
|
||
pm2 install pm2-logrotate
|
||
pm2 set pm2-logrotate:max_size 10M
|
||
pm2 set pm2-logrotate:retain 7
|
||
```
|
||
|
||
3. **监控应用**:
|
||
```bash
|
||
pm2 install pm2-server-monit
|
||
```
|
||
|
||
## 安全建议
|
||
|
||
1. 定期更新系统和依赖包
|
||
2. 使用强密码和密钥认证
|
||
3. 配置防火墙规则
|
||
4. 定期备份数据库
|
||
5. 使用 HTTPS(配置 SSL 证书)
|
||
6. 限制 SSH 登录尝试次数
|
||
|
||
## 备份和恢复
|
||
|
||
### 数据库备份
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'pg_dump -U family_tree_user family_tree > backup_$(date +%Y%m%d).sql'
|
||
```
|
||
|
||
### 数据库恢复
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'psql -U family_tree_user family_tree < backup_20240101.sql'
|
||
```
|
||
|
||
### 文件备份
|
||
```bash
|
||
ssh -p 8006 root@115.190.235.230 'tar -czf /backup/app_$(date +%Y%m%d).tar.gz /var/www/chinese-family-tree'
|
||
```
|