跳到正文

架构档案TOPOLOGY.SYS

系统架构

系统技术拓扑探索:从用户交互流到持续部署流水线。

  • 19个节点,分布在 2 条流中用户:10 • CI/CD:9
  • 6个流水线阶段从 Git 标签到经验证的切换
  • 6项安全措施完整性、隔离与弹性

[01]总览

点击拓扑图中的任意组件以查看其协议、安全边界与数据连接。

[02]用户流

Web 请求生命周期:从客户端浏览器经由 Cloudflare 与 Nginx 到达 Nuxt 4 引擎。

  1. CLIENT_RUNTIME

    1. Vue 3 客户端与 HTML5 音频播放器

    应用在访问者浏览器中运行:Vue 3 对服务端渲染的页面进行水合。HTML5 音频播放器按字节范围(HTTP 206)播放服务器提供的曲目。专辑封面与收听链接来自 /api/track-metadata,由服务端查询 iTunes、Deezer 与 YouTube。

    VUE 3 // HTML5 AUDIO // HTTP 206[ CLIENT_BOUND ]

  2. REVERSE_PROXY_CACHE

    2. Cloudflare 反向代理与边缘 CDN 缓存

    Cloudflare 作为反向代理位于访客与主机之间。它接收全部公网流量并从其全球缓存分发静态文件;主机只接受来自 Cloudflare 的连接。

    ANYCAST PROXY // CDN CACHE[ PROXIED ]

  3. L3/L4/L7_FILTERING

    3. Cloudflare WAF 与防 DDoS 过滤

    Cloudflare 在边缘吸收拒绝服务攻击(含 DDoS 防护),并应用 5 条自定义反机器人 WAF 规则(扫描器、工具 User-Agent、非公开路由、专用 Webhook)以及针对联系表单和 Overseer 的限速规则。随后 Nginx 将每个 IP 限制为每秒 10 个请求。

    DDOS PROTECTION // CUSTOM WAF RULES[ PROTECTED ]

  4. FULL_STRICT_TLS

    4. SSL/TLS 终结与边缘缓存

    TLS 握手在距离访客最近的边缘节点完成(最低 TLS 1.2,启用 HSTS)。静态文件、图标与本地字体从该缓存分发;随后 Cloudflare 以 Full (strict) SSL 模式连接主机。实测延迟约 25 毫秒。

    EDGE CACHE // FULL STRICT // AOP[ ENCRYPTED ]

  5. PORT_443_ONLY

    5. 主机 Nginx 反向代理与源站隔离

    在 Linux 主机上,Nginx 仅监听 443 端口(TLS 1.2 与 1.3,启用 HSTS),并通过 Authenticated Origin Pulls 只接受 Cloudflare。它还原访客真实 IP(CF-Connecting-IP),将每个 IP 限制为每秒 10 个请求,并把请求分发到 127.0.0.1:3001 与 127.0.0.1:3002。

    PORT 443 -> LOCAL 3001/3002 // LINUX SERVER[ ISOLATED ]

  6. SSR_&_APIS

    6. Nuxt 4 Nitro SSR 引擎与后端中继

    Nitro 引擎在服务端生成 HTML 并执行 API 路由。敏感操作(Breach Protocol 反垃圾挑战、邮箱 DNS MX 校验、NVIDIA NIM 推理、Telegram 消息)均在服务端执行:API 密钥保存在服务端配置中,绝不发送到浏览器。

    NVIDIA NIM // TELEGRAM API // SWR[ OPERATIONAL ]

[03]CI/CD 流水线

由版本标签触发的流水线:质量门禁、cosign 签名镜像、HMAC 签名 Webhook 与蓝绿切换。

  1. SEMVER_TAG

    1. 版本标签

    推送到 GitHub 的 v*.*.* 版本标签触发生产部署。

    GIT OVER SSH // TAG v*.*.*

    查看详情

    开发者通过 SSH 将 v*.*.* 版本标签推送到 GitHub。每次推送到 main、develop 与 feature 分支都已运行 CI;生产部署只由该标签触发。

  2. QUALITY_GATE

    2. 质量门禁与 Docker 镜像

    完整 CI 必须通过,随后 GitHub Actions 为 amd64 与 arm64 构建多阶段 Alpine 镜像。

    NODE 24 ALPINE // AMD64 + ARM64

    查看详情

    发布之前,工作流要求完整 CI 通过:ESLint、npm audit(生产依赖,high 级别)、typecheck、Vitest、Nuxt 构建、Playwright E2E 测试(Firefox)以及镜像的 Trivy 扫描(CRITICAL 与 HIGH)。任何一项失败都不会发布镜像。通过后 Buildx 构建不含 npm 的多阶段 Alpine 镜像。

  3. SIGNED_BY_DIGEST

    3. 发布到 GHCR 并签名

    镜像发布到 GHCR(版本号、latest、短 sha),随后按 digest 使用 cosign 签名。

    ghcr.io/ardou0/website:X.Y.Z // COSIGN

    查看详情

    通过门禁后,镜像使用工作流的 GITHUB_TOKEN 推送到 GitHub Container Registry,带有三个标签:版本号(例如 1.4.0)、latest 与 sha- 加短提交哈希。随后以 keyless 模式(GitHub Actions 的 OIDC 身份,不存储密钥)按 digest 使用 cosign 签名。

  4. CONSTANT_TIME_CHECK

    4. 签名 Webhook

    服务器以恒定时间校验 Webhook 的 HMAC-SHA256 签名,并检查时间戳与 digest。

    HMAC-SHA256 // crypto.timingSafeEqual // 5 MIN WINDOW

    查看详情

    GitHub Actions 向 /api/deploy-webhook 发送 POST 请求,使用共享密钥进行 HMAC-SHA256 签名(X-Hub-Signature-256 请求头);请求体包含标签、镜像 digest 与时间戳。服务器用 crypto.timingSafeEqual 比对签名,拒绝与自身时钟相差超过 5 分钟的时间戳或已收到过的签名(防重放),并要求有效的 digest。HMAC 只验证请求来源而不加密,传输使用 HTTPS。

  5. FILE_SIGNAL

    5. 放置标记文件

    Web 容器没有 Docker 权限,只放置一个 pending.flag 文件。

    /deploy-flags/pending.flag // NON-ROOT

    查看详情

    Web 容器以非 root 身份运行,不挂载 Docker 套接字,也不执行任何命令。请求验证通过后,它在共享卷中写入 JSON 文件 pending.flag(标签与 digest),并向 Telegram 发送“DEPLOYMENT TRIGGERED”:Web 请求只能申请部署,无法在主机上执行命令。

  6. BLUE_GREEN

    6. 蓝绿部署与回退

    部署器验证签名,启动空闲颜色,等待 healthy 后切换;若失败,旧版本从未停止服务。

    SOCKET PROXY // COSIGN // HEALTHY

    查看详情

    website_deployer 容器每 5 秒读取一次标记文件,验证该 digest 的 cosign 签名,按 digest 拉取镜像并启动空闲颜色(app-blue 位于 3001,app-green 位于 3002)。它等待 Docker 状态变为 healthy(最长 90 秒),让两种颜色同时服务 10 秒,然后停止旧版本。若失败,新颜色被移除:旧版本从未停止服务。

[04]安全

应用于容器、部署与监控的防御措施,并列出每项措施针对的威胁。

安全措施矩阵
针对的威胁措施证据或状态
针对的威胁入侵后篡改容器措施只读的非 root 容器应用以 node 用户运行,不带任何 Linux capability(cap_drop ALL、no-new-privileges),文件系统只读:只写入其卷与 /tmp(tmpfs)。证据或状态NODE:NODE // CAP_DROP ALL // RO FSENFORCED
针对的威胁来自 Web 的远程代码执行(RCE)措施隔离的 IPC 屏障与 Docker 套接字代理Web 容器无法访问 Docker:更新通过共享卷中的标记文件传递。部署器只能经由套接字代理访问 Docker(已禁用 EXEC、BUILD、COMMIT 与 SYSTEM)。证据或状态FILE SIGNAL // DOCKER SOCKET PROXYISOLATED
针对的威胁针对部署签名的计时分析或重放攻击措施恒定时间签名校验与防重放部署的 HMAC 签名以恒定时间比对;时间戳与服务器时钟相差超过 5 分钟的请求会被拒绝,该时间窗口内已接受过的签名同样会被拒绝。每次失败都会写入 security 日志。证据或状态CRYPTO.TIMINGSAFEEQUAL // SHA256SECURED
针对的威胁部署后上线了有缺陷的版本措施健康探针与真实回退只有当 Docker 报告新版本为 healthy 时才保留它;否则将其移除,从未停止服务的旧版本继续在线。cosign 签名在任何下载之前就已验证。证据或状态HEALTHY ONLY // BLUE/GREENACTIVE
针对的威胁事件未被察觉:部署失败、AI API 故障、日志被篡改或未加时间戳措施遥测与告警转发Telegram 会收到联系消息、部署的各步骤与结果、NVIDIA API 的 HTTP 错误,以及日志链告警(违规、时间戳延迟、时钟偏差、写入锁被接管)。主机状态不在监测范围内。证据或状态TELEGRAM BOT // DEPLOY + LOG ALERTSMONITORED
针对的威胁镜像与依赖中的已知漏洞(CVE)措施CVE 检测与更新提议每次推送都会检查依赖与镜像:npm audit、Trivy 扫描(CRITICAL 与 HIGH)和 Semgrep(每周日也会运行)。Dependabot 每周一提议 npm、Docker 与 GitHub Actions 更新,同样经过质量门禁。证据或状态AUDIT // TRIVY // SEMGREP // DEPENDABOTSCANNED

聊一聊

对这项工作有疑问,或想了解更多?欢迎联系我。

联系我

目录