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