310 lines
6.2 KiB
Markdown
310 lines
6.2 KiB
Markdown
# 阿里云宝塔面板部署文档
|
||
|
||
本文档介绍如何在阿里云 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行
|
||
```
|