Graduate OS Docs
Research · AI · Career
🛡️ 操作文档

PM2、Nginx 与双层保护

standalone、环境变量、IPv4、反向代理与 Basic Auth

PM2、Nginx 与双层保护#

standalone、环境变量、IPv4、反向代理与 Basic Auth

14. PM2 启动#

最终版项目根目录已经自带:

ecosystem.config.cjs

它已经整合真实部署修复:

node --env-file=/www/wwwroot/graduate-os/.env
NODE_OPTIONS=--dns-result-order=ipv4first

第一次启动:

cd /www/wwwroot/graduate-os
pm2 start ecosystem.config.cjs
pm2 save
pm2 startup

pm2 startup 会打印一条命令,再复制执行一次,然后:

pm2 save

验证:

pm2 status
pm2 logs graduate-os --lines 100
curl -I http://127.0.0.1:3000/login

必须使用:

node .next/standalone/server.js

不要改成:

next start

因为 output: "standalone" 使用 next start 会产生错误。


15. 为什么 PM2 要显式加载 .env#

真实部署过程中出现过:

请先配置 SECRET_ENCRYPTION_KEY

即使项目根 .env 已经填写。

原因是 standalone 运行时不能依赖“碰巧自动读取”项目根 .env

最终 ecosystem.config.cjs 已内置:

--env-file=/www/wwwroot/graduate-os/.env

所以不要在部署完成后删除这项


16. 为什么最终版优先 IPv4#

真实测试中:

IPv6 → zzshu.cc / Cloudflare → HTTP 403 Blocked
IPv4 → 同一 API → HTTP 200 / OK

因此 PM2 已内置:

NODE_OPTIONS=--dns-result-order=ipv4first

这不是 API Key 修复,而是第三方 API 网络兼容修复。

如果未来使用其他 OpenAI Compatible 服务,也可以保留该设置。


17. 配置 Nginx 反向代理#

最简单方式:

宝塔 → 网站 → 你的域名 → 反向代理 → 添加反向代理

填写:

名称:graduate-os
目标 URL:http://127.0.0.1:3000
发送域名:$host
缓存:关闭

然后在反向代理高级配置确认至少有:

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_set_header X-Forwarded-Host $host;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_buffering off;

私有 PDF 保护#

站点中必须保证:

location ^~ /storage/ {
    deny all;
    return 404;
}

如果宝塔反代已经生成 location /,不要再在同一 server 内重复写第二个 location /

项目里的 NGINX.conf.example 是完整参考,不建议在宝塔已自动管理 SSL 时整段替换站点文件。


18. 外层 Basic Auth#

推荐使用宝塔自带:

网站 → 访问限制 / 访问控制 → 密码访问

用户名可以自定义,不必叫 graduate_outer

如果面板版本没有该功能,可以手工:

apt update
apt install -y apache2-utils
mkdir -p /www/server/pass
htpasswd -c /www/server/pass/graduate-os.htpasswd 你想要的外层用户名
chmod 640 /www/server/pass/graduate-os.htpasswd

然后在合适的 Nginx 访问区域使用:

auth_basic "Graduate OS Private";
auth_basic_user_file /www/server/pass/graduate-os.htpasswd;

更换外层用户名#

最简单重新创建:

htpasswd -c /www/server/pass/graduate-os.htpasswd 新用户名

然后重载 Nginx。

外层 Basic Auth 和 Graduate OS /login 管理员密码必须使用不同密码。


19. 第一次进入后台#

浏览器:

https://xjtu.example.com

正确顺序:

外层 Basic Auth
  ↓
Graduate OS /login
  ↓
后台