Files
nanami-web/docs/DEPLOY-BAOTA.md
2026-03-18 17:13:27 +08:00

310 lines
6.2 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.

# 阿里云宝塔面板部署文档
本文档介绍如何在阿里云 ECS + 宝塔面板环境中部署 nanami-web 项目。
---
## 方案概览
```
用户浏览器 --> Nginx (宝塔管理SSL) --> Node.js (PM2 守护) --> PostgreSQL
```
- **Nginx**: 由宝塔面板管理,负责反向代理和 SSL
- **Node.js**: 使用 PM2 进程守护运行 Next.js standalone 产物
- **PostgreSQL**: 通过宝塔面板安装,或使用 Docker
---
## 一、环境准备
### 1.1 宝塔面板安装软件
在宝塔面板「软件商店」中安装:
- **Nginx**(推荐最新稳定版)
- **PostgreSQL 16**(或通过 Docker 安装)
- **PM2 管理器**Node.js 进程管理)
- **Node.js 版本管理器**,并安装 **Node.js 20+**
### 1.2 创建数据库
1. 进入宝塔面板 → 数据库 → PostgreSQL
2. 添加数据库:
- 数据库名:`nanamiweb`(宝塔不允许包含下划线等特殊字符)
- 用户名:`nanami`
- 密码:自行设定,建议只用字母和数字(记住用于后续配置)
如果宝塔不支持 PostgreSQL 管理界面,可通过终端操作:
```bash
# 切换到 postgres 用户
sudo -u postgres psql
# 创建用户和数据库
CREATE USER nanami WITH PASSWORD 'your_password_here';
CREATE DATABASE nanamiweb OWNER nanami;
\q
```
---
## 二、部署项目
### 2.1 上传代码
```bash
# 在服务器上克隆代码(或通过宝塔面板上传 zip
cd /www/wwwroot
git clone <your-repo-url> nanami-web
cd nanami-web
```
### 2.2 安装依赖并构建
```bash
# 安装 Node.js 依赖
npm install
# 创建环境变量文件
cp .env.example .env
```
### 2.3 配置环境变量
编辑 `/www/wwwroot/nanami-web/.env`
```env
DATABASE_URL="postgresql://nanami:your_password_here@localhost:5432/nanamiweb?schema=public"
NEXTAUTH_SECRET="生成一个随机字符串"
NEXTAUTH_URL="https://your-domain.com"
ADMIN_USERNAME="admin"
ADMIN_PASSWORD="your_admin_password"
```
生成随机密钥:
```bash
openssl rand -base64 32
```
### 2.4 初始化数据库
```bash
# 推送表结构
npx prisma db push
# 初始化管理员账号
npx tsx prisma/seed.ts
```
### 2.5 构建项目
```bash
npm run build
```
构建完成后会在 `.next/standalone` 目录生成独立的 Node.js 应用。
### 2.6 准备运行目录
```bash
# 复制静态文件到 standalone 目录
cp -r .next/static .next/standalone/.next/static
cp -r public .next/standalone/public
# 创建上传目录
mkdir -p .next/standalone/uploads
# 创建软链接使 uploads 共享
ln -sf /www/wwwroot/nanami-web/uploads .next/standalone/uploads
```
---
## 三、使用 PM2 启动应用
### 3.1 创建 PM2 配置文件
在项目根目录创建 `ecosystem.config.js`
```javascript
module.exports = {
apps: [
{
name: "nanami-web",
script: ".next/standalone/server.js",
cwd: "/www/wwwroot/nanami-web",
env: {
NODE_ENV: "production",
PORT: 3000,
HOSTNAME: "0.0.0.0",
},
instances: 1,
autorestart: true,
max_memory_restart: "512M",
},
],
};
```
### 3.2 启动应用
**方式一:通过宝塔 PM2 管理器**
1. 进入宝塔面板 → 软件商店 → PM2 管理器
2. 添加项目:
- 项目目录:`/www/wwwroot/nanami-web`
- 启动文件:`.next/standalone/server.js`
- 项目名称:`nanami-web`
**方式二:通过命令行**
```bash
cd /www/wwwroot/nanami-web
pm2 start ecosystem.config.js
pm2 save
pm2 startup # 设置开机自启
```
### 3.3 验证应用运行
```bash
curl http://localhost:3000
# 应返回 HTML 内容
```
---
## 四、配置 Nginx 反向代理
### 4.1 宝塔面板创建网站
1. 进入宝塔面板 → 网站 → 添加站点
2. 域名:填写你的域名(如 `addon.example.com`
3. PHP 版本:选择「纯静态」
4. 不创建数据库
### 4.2 配置反向代理
进入网站设置 → 反向代理 → 添加反向代理:
- 代理名称:`nanami`
- 目标 URL`http://127.0.0.1:3000`
- 发送域名:`$host`
或手动编辑 Nginx 配置,在 `server` 块中添加:
```nginx
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
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;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 上传文件大小限制(根据需要调整)
client_max_body_size 100m;
}
```
### 4.3 配置 SSL
1. 进入网站设置 → SSL
2. 选择 Let's Encrypt → 申请证书
3. 开启「强制 HTTPS」
### 4.4 阿里云安全组
确保阿里云安全组放行以下端口:
| 端口 | 用途 |
|---|---|
| 80 | HTTP |
| 443 | HTTPS |
| 22 | SSH |
> 注意3000 端口**不需要**对外开放Nginx 通过内部代理访问。
---
## 五、更新部署
当代码有更新时:
```bash
cd /www/wwwroot/nanami-web
# 拉取最新代码
git pull
# 安装依赖(如有新依赖)
npm install
# 同步数据库变更(如有 schema 变化)
npx prisma db push
# 重新构建
npm run build
# 复制静态文件
cp -r .next/static .next/standalone/.next/static
cp -r public .next/standalone/public
ln -sf /www/wwwroot/nanami-web/uploads .next/standalone/uploads
# 重启应用
pm2 restart nanami-web
```
可以将上述步骤写成脚本 `deploy.sh`
```bash
#!/bin/bash
set -e
cd /www/wwwroot/nanami-web
git pull
npm install
npx prisma db push
npm run build
cp -r .next/static .next/standalone/.next/static
cp -r public .next/standalone/public
ln -sf /www/wwwroot/nanami-web/uploads .next/standalone/uploads
pm2 restart nanami-web
echo "部署完成"
```
---
## 六、常见问题
### Q: 上传的文件在哪里?
上传的文件存储在 `/www/wwwroot/nanami-web/uploads/` 目录。请确保定期备份。
### Q: 如何备份数据库?
```bash
pg_dump -U nanami nanami_web > backup_$(date +%Y%m%d).sql
```
可在宝塔面板的「计划任务」中添加定时备份。
### Q: 忘记管理员密码?
重新运行 seed 脚本(会用 .env 中的密码重置):
```bash
cd /www/wwwroot/nanami-web
npx tsx prisma/seed.ts
```
### Q: 如何查看应用日志?
```bash
pm2 logs nanami-web
pm2 logs nanami-web --lines 100 # 查看最近100行
```