OPERATIONS
部署与状态
静态站点与模型服务分离:Caddy 终止 TLS 并服务 dist/,/v1/* 反代到本地模型服务。提供 bare-metal 与 Docker Compose 两条部署路径。
部署架构
ARCH健康检查端点
HEALTH| 方法 | 路径 | 期望响应 | 说明 |
|---|---|---|---|
GET | /healthz | 200 · {"status":"ok"} | 模型服务存活;加载中返回 503 |
GET | /v1/models | 200 · OpenAI 模型列表 | Caddy 反代到 127.0.0.1:8000 |
POST | /v1/chat/completions | 200 · choices[0].message.content | 前端对话终端使用 |
GET | / | 200 · text/html | Caddy file_server 静态站点 |
GET | /assets/app.css | 200 · text/css | 带缓存头(max-age=3600) |
curl -fsS https://fnb.example.com/healthz
curl -fsS https://fnb.example.com/v1/models
域名以部署时的 FNB_DOMAIN 为准;本机演示可用 http://127.0.0.1:5173/(无模型后端,/v1 返回 404 并回落静态回放)。
当前状态
STATUS| 组件 | 状态 | 证据 / 说明 |
|---|---|---|
| 站点构建 | 就绪 | v1.0.0 · 2026-10-18 · 15 个页面 |
| 数据快照 | 就绪 | FY2024 · 2026-10-18 · 11 家对标公司 |
| 截图验收 | 就绪 | 11 张(桌面 1440×900 / 手机 390×844) |
| 模型服务 | 待完成 | 未启动:训练/评测轮次中,对话页回落静态回放 |
| 模型评测 | 就绪 | 已生成 · scorer v1.0 |
| 部署包 | 就绪 | Caddyfile / systemd units / install.sh / preflight.sh / compose / Dockerfiles |
部署命令 · bare-metal
DEPLOY-A 与 deploy/README.md 同源在仓库根目录执行。命令与 deploy/README.md 逐字一致(均由 deploy/deploy-commands.json 渲染)。
./deploy/preflight.sh
只读检查:发行版、端口、Caddy/Node、磁盘、出网、dist 与 systemd 状态;不改系统。
sudo FNB_DOMAIN=fnb.example.com ./deploy/install.sh
安装 Caddy/Node、拷贝 dist 与 serve/、写 Caddyfile 与 systemd units、启动 fnb-web 并做健康检查;可重复执行。
sudo FNB_DOMAIN=fnb.example.com ./deploy/install.sh --build
先在服务器上执行 node web/build.mjs,再同步 dist;否则直接使用仓库中已构建的 web/dist。
sudo systemctl status fnb-web --no-pager
Caddy 由 fnb-web.service 托管(自定义 unit,不使用发行版自带 caddy.service)。
curl -I https://fnb.example.com/
期望 200 + text/html;同时可看到 CSP、HSTS 与缓存头。
curl -fsS https://fnb.example.com/healthz
期望 {"status":"ok"};模型加载中返回 503,服务不可达时前端回落静态回放。
sudo FNB_DOMAIN=fnb.example.com caddy validate --config /etc/fnb-terminal/Caddyfile --adapter caddyfile
本机无 Caddy 时由 deploy/check.mjs 做静态语法检查;上线前必须用真实 caddy validate 复核。
sudo journalctl -u fnb-web -n 50 --no-pager
证书签发、反代与静态请求日志都在这里;模型服务日志用 journalctl -u fnb-model。
sudo systemctl restart fnb-web
修改 Caddyfile 或替换 dist 后执行;服务为 Restart=always。
部署命令 · Docker Compose
DEPLOY-B 与 deploy/README.md 同源docker compose -f deploy/docker-compose.yml build
web 镜像多阶段构建(node 构建 dist → caddy 运行);model 镜像在 --profile model 时才需要。
docker compose -f deploy/docker-compose.yml up -d
映射 8080:80;只用静态站点时无需模型镜像。
docker compose -f deploy/docker-compose.yml --profile model up -d
需要 NVIDIA Container Toolkit;模型权重挂载 ../models 到容器 /models(只读)。
curl -fsS http://127.0.0.1:8080/
期望返回首页 HTML;接口路径为 /v1/* 与 /healthz。
curl -fsS http://127.0.0.1:8080/healthz
经 web 容器反代到 model:8000;未启用 model profile 时返回 502。
docker compose -f deploy/docker-compose.yml ps
确认 web 为 healthy;model 的 start_period 较长(加载权重)。
docker compose -f deploy/docker-compose.yml logs -f web
Caddy 访问日志输出到 stdout;模型日志把 web 换成 model。
docker compose -f deploy/docker-compose.yml down
加 -v 会清理匿名卷;镜像可用 docker image rm fnb-terminal-web:1.0.0 删除。
验收证据
PROOFnode web/build.mjs && node web/check.mjs:构建 + 结构/链接/外链/数据表/截图全绿。node web/serve.mjs:本地静态预览http://127.0.0.1:5173。node deploy/check.mjs:部署包自洽性检查(Caddyfile / units / 脚本 / compose / README)。- 截图:
web/artifacts/(桌面 1440×900 + 手机 390×844)。