sign-server 网页 OpenResty 部署(静态导出)

两种模式:开发直接跑,上线出静态。

静态导出

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/ <服务器>:<静态目录>/

OpenResty 配置

后端必须先在服务器本机跑起来(只绑 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 转后端)。

浏览器打开管理台,登录、上传打包、下载、改备注、删除走一遍(与本地一致)。

更新与回滚