两种模式:开发直接跑,上线出静态。
cd server/web 后 npm run dev(3000 端口,重写规则转 3009 后端,浏览器同源)。next.config.js 已按环境变量切换:带 STATIC_EXPORT=1 时出静态(output: 'export'),不带时走默认(开发与 npm run start 不受影响;静态模式下重写规则不起作用,接口由 OpenResty 转)。
在 server/web 下跑(行内代码点一下就复制):
STATIC_EXPORT=1 npm run build
产物在 server/web/out/:index.html(登录页)、dashboard.html(管理台)、_next/static/(前端静态资源)。out/ 是构建产物,不进仓库。
把 out/ 里全部文件同步到服务器上的静态目录(路径换成实际的;下面配置里写成 /opt/sign-web,按服务器布局换):
rsync -a --delete server/web/out/ <服务器>:<静态目录>/
后端必须先在服务器本机跑起来(只绑 127.0.0.1:3009;种子与密码文件在服务器本机生成,见 server/README;后端起法 systemd 还是 docker,上服务器时定)。OpenResty 只做入口,不直接暴露后端。
server {
listen 443 ssl;
server_name <域名>;
ssl_certificate <证书全链路径>;
ssl_certificate_key <证书私钥路径>;
root <静态目录>;
index index.html;
# 上传包体上限:后端限 16MB,这里放宽到 32MB,否则大包上传报 413。
client_max_body_size 32m;
location / {
# 静态优先:/ → index.html,/dashboard → dashboard.html,/_next/static/* 直接出;
# 静态里没有的(登录、打包、记录、凭证等接口)一律转后端。
try_files $uri $uri.html $uri/ @backend;
}
location @backend {
proxy_pass http://127.0.0.1:3009;
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;
}
}
注意:
写配置后,在 OpenResty 容器里先测配置再 reload(容器名、compose 目录按 VPS 现有布局换成实际的):
nginx -t
nginx -s reload
后端已起、配置已 reload 后验证:
curl https://<域名>/
应返回登录页(静态 index.html)。
curl https://<域名>/health
应返回 ok(经 OpenResty 转后端)。
浏览器打开管理台,登录、上传打包、下载、改备注、删除走一遍(与本地一致)。
STATIC_EXPORT=1 npm run build,同步 out/,reload OpenResty(后端不动)。out/,reload(后端不动)。