Skip to content

开站

· 2 min · homelab / 建站

域名买了一阵子,机器也早就在跑,只是一直没往里放东西。今天算是把站填上了。

链路长什么样#

浏览器到这台 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 回滚,看起来像网络问题,其实是权限问题。修法:

Terminal window
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"; fi
done

同一次安装里这种文件有一万多个。

怎么写#

文章就是 src/content/posts/*.md,frontmatter 只有 title / description / date / tags / draft 五项。写完 npm run build,产物同步到 /vol1/1000/blog/dist,Caddy 是 file_server 按目录读,不用 reload。

health.json 留着不动,它是链路探针:哪天首页挂了、它还活着,说明问题在这台 NAS 上,不用先去怀疑隧道。