后端(Rust 宿主机进程 + systemd)+ 前端(Next.js 静态导出经 OpenResty 出)+ 证书的全链。域名、端口、目录、证书路径按实际换; 不要把后端端口暴露到公网。
cargo build --release -p sign-server,产物
target/release/sign-server。STATIC_EXPORT=1 npm run build,产物 server/web/out/。chmod -R a+rX(否则 660 权限出 403)。openssl rand -hex 32 写文件,600 权限;只用文件
或注入的环境变量进进程,绝不打在命令行上(会记进历史),
绝不经聊天发送。SIGN_SERVER_SIGNING_SEED_FILE、
SIGN_SERVER_ADMIN_PASSWORD_FILE 配进服务;缺任一服务拒绝启动,
绝不以默认密钥签名。[Unit]
Description=sign-server
After=network.target
[Service]
ExecStart=<后端二进制路径>
Environment=BIND=127.0.0.1
Environment=PORT=3009
Environment=SIGN_SERVER_SIGNING_SEED_FILE=<种子文件路径>
Environment=SIGN_SERVER_ADMIN_PASSWORD_FILE=<密码文件路径>
Environment=SIGN_SERVER_DATA_DIR=<数据目录>
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
BIND 默认 127.0.0.1;OpenResty 在容器里时设成容器网桥网关
地址,让容器能连进来(容器本身不对外发布端口,后端只经代理可达)。DATA_DIR 里放 SQLite(sign-server.db)与包文件(packages/)。静态 + 反代配置见 openresty-deployment.md(80 端口 ACME 与跳
https、静态 location、@backend 反代、client_max_body_size 32m)。
certbot webroot 签发;deploy-hook 按域名拷到证书目录并 reload OpenResty;每 12 小时 renew 自动续期。
curl <域名>/health 应回 ok;打开域名首页与 /dashboard 应
200;走一遍登录 → 新建打包 → 下载 → 退出;未登录调接口应 401。