5.8 KiB
5.8 KiB
部署指南
快速部署
1. 准备工作
在部署前,请确保:
-
服务器要求:
- 操作系统:Ubuntu 20.04+ / CentOS 7+ / Debian 10+
- 内存:至少 2GB RAM
- 磁盘:至少 10GB 可用空间
- 已安装 PostgreSQL 数据库
-
本地环境:
- 已安装 Node.js 18+
- 已安装 pnpm
- 已配置好
.env文件
2. 配置服务器信息
编辑 deploy.sh 文件,修改以下配置:
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 文件:
ssh -p 8006 root@115.190.235.230
cd /var/www/chinese-family-tree
nano .env
添加以下内容(根据实际情况修改):
# 数据库配置
DATABASE_URL="postgresql://user:password@localhost:5432/family_tree"
# NextAuth 配置
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"
4. 执行部署
# 给脚本添加执行权限
chmod +x deploy.sh
# 执行部署
./deploy.sh
5. 部署流程说明
脚本会自动完成以下步骤:
- ✓ 检查并创建SSH密钥
- ✓ 配置免密登录(首次需要输入服务器密码)
- ✓ 测试SSH连接
- ✓ 本地构建项目
- ✓ 配置服务器环境(安装Node.js、pnpm、PM2)
- ✓ 上传文件到服务器
- ✓ 启动应用
常用命令
查看应用状态
ssh -p 8006 root@115.190.235.230 'pm2 status'
查看应用日志
ssh -p 8006 root@115.190.235.230 'pm2 logs chinese-family-tree'
重启应用
ssh -p 8006 root@115.190.235.230 'pm2 restart chinese-family-tree'
停止应用
ssh -p 8006 root@115.190.235.230 'pm2 stop chinese-family-tree'
更新部署
# 直接运行部署脚本即可
./deploy.sh
Nginx 反向代理配置(可选)
如果需要使用域名访问或配置HTTPS,可以安装Nginx:
# 在服务器上安装Nginx
apt-get update
apt-get install -y nginx
# 创建配置文件
nano /etc/nginx/sites-available/chinese-family-tree
添加以下配置:
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;
}
}
启用配置:
ln -s /etc/nginx/sites-available/chinese-family-tree /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
防火墙配置
确保服务器防火墙开放必要端口:
# 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 安装和配置
# 安装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
故障排查
应用无法启动
# 查看详细日志
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'
数据库连接失败
# 测试数据库连接
ssh -p 8006 root@115.190.235.230 'cd /var/www/chinese-family-tree && npx prisma db pull'
端口被占用
# 查看端口占用
ssh -p 8006 root@115.190.235.230 'lsof -i :3000'
# 杀死占用进程
ssh -p 8006 root@115.190.235.230 'kill -9 <PID>'
性能优化建议
-
启用 PM2 集群模式:
pm2 start npm --name "chinese-family-tree" -i max -- start -
配置日志轮转:
pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 7 -
监控应用:
pm2 install pm2-server-monit
安全建议
- 定期更新系统和依赖包
- 使用强密码和密钥认证
- 配置防火墙规则
- 定期备份数据库
- 使用 HTTPS(配置 SSL 证书)
- 限制 SSH 登录尝试次数
备份和恢复
数据库备份
ssh -p 8006 root@115.190.235.230 'pg_dump -U family_tree_user family_tree > backup_$(date +%Y%m%d).sql'
数据库恢复
ssh -p 8006 root@115.190.235.230 'psql -U family_tree_user family_tree < backup_20240101.sql'
文件备份
ssh -p 8006 root@115.190.235.230 'tar -czf /backup/app_$(date +%Y%m%d).tar.gz /var/www/chinese-family-tree'