域名买了一阵子,机器也早就在跑,只是一直没往里放东西。今天算是把站填上了。
链路长什么样#
浏览器到这台 NAS 之间隔了四跳,每跳都在固定的位置上:
浏览器 │ DNS harderheng.life → 182.92.83.186 ▼云服务器 Caddy :443(Let's Encrypt 证书) │ reverse_proxy → 127.0.0.1:18001 ▼云服务器 frps :7000,18001 由 ufw 拦在公网与 tailnet 之外 │ frpc 隧道(NAS 主动连出) ▼fnOS Caddy 127.0.0.1:4000,root = /vol1/1000/blog/dist关键约束只有一条:家里的源站只听 127.0.0.1,永远不对家庭 WAN 开端口。公网那侧只认 80/443,别的都不露。
几个坑#
frps 的 proxyBindAddr = 0.0.0.0 是为了保 Minecraft 的 25565。 代价是所有 1800x 上游端口也听在全网卡上。唯一的锁是云服务器上那条 ufw deny 18001:18003/tcp——少了它,tailnet 里任何设备都能绕过 Caddy 直接连到源站。
备案这件事曾经是阻塞。 DNS 解析、证书、隧道全通,但大陆机房对未备案域名的 80/443 不放行。现在实测已经通了,证书是公网 CA 签的,协议栈上没留后门。
npm 在这台 NAS 上解包会把文件模式吃成 000。 表现是 esbuild 的 postinstall 报 spawnSync ... EACCES,然后 npm 把整个 node_modules 回滚,看起来像网络问题,其实是权限问题。修法:
find node_modules -type f -perm 000 -print0 | while IFS= read -r -d '' f; do if head -c4 "$f" | grep -q $'\x7fELF'; then chmod 755 "$f"; else chmod 644 "$f"; fidone同一次安装里这种文件有一万多个。
怎么写#
文章就是 src/content/posts/*.md,frontmatter 只有 title / description / date / tags / draft 五项。写完 npm run build,产物同步到 /vol1/1000/blog/dist,Caddy 是 file_server 按目录读,不用 reload。
health.json 留着不动,它是链路探针:哪天首页挂了、它还活着,说明问题在这台 NAS 上,不用先去怀疑隧道。