演示地址:https://oss.zl4629.xyz

博客主站仍是 https://zl4629.xyz。两者共用一台机器上的 Caddy,但站点根目录分开。

01为什么不在服务器跑 FastAPI

本机开发时,大屏后端读 parquet 很方便。服务器只有大约 1.6G 内存,还已经跑着博客面板和 Caddy。

如果再常驻一个 Python 服务:

  1. 内存更紧。
  2. 进程挂了页面就挂。
  3. 和“只展示”的目标不匹配。

所以最终方案是:

text
本地 DuckDB / 脚本
  -> 导出 overview.json / charts.json ...
  -> 上传 /var/www/oss-sc-dw
  -> Caddy file_server

前端不再请求 /api/*,改为读 ./data/*.json。

02和博客如何共存

博客 Caddy 块大致是:

caddy
zl4629.xyz {
    root * /var/www/luminary
    file_server
}

大屏只追加,不改原块:

caddy
oss.zl4629.xyz {
    root * /var/www/oss-sc-dw
    encode gzip
    file_server

    @data path /data/*
    header @data Cache-Control "no-cache"
}

DNS 需要一条 oss 的 A 记录指向服务器。Caddy 会按主机名自动申请证书,方式和主站一致。

03发布检查清单

  1. 本地确认 deploy/static-site/data/charts.json 等文件齐全。
  2. 上传到 /var/www/oss-sc-dw。
  3. caddy validate --config /etc/caddy/Caddyfile。
  4. systemctl reload caddy。
  5. 服务器上 curl -I https://oss.zl4629.xyz/ 与 curl -I https://zl4629.xyz/ 都返回 200。

我实际操作时,主站和大屏都保持了 200。配置前会备份 Caddyfile。

04更新数据时怎么做

数仓重新跑完后:

  1. 再导出一轮 JSON。
  2. 覆盖服务器 /var/www/oss-sc-dw/data。
  3. HTML/JS 若有改动一并覆盖。

不需要重启业务采集,也不需要在服务器装 DuckDB。

05取舍

静态方案换来的是稳定和省资源,丢掉的是“服务器上点一下重算”。
对作品展示来说,这个交换划算;如果以后要在线重算,再单独加内网任务,不和公网展示进程绑在一起。

06相关文章