# 阿里云宝塔面板部署文档

本文档介绍如何在阿里云 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行
```
