自托管部署流水线
自托管部署流水线
这个站跑在我本地 Windows 机器上,没有用 Vercel 或任何云服务商。通过内网穿透暴露到公网,用 Cloudflare 做 DNS 和流量代理。
内网穿透方案
选的是 SakuraFrp,一个国内的 frp 中继服务。配置很简单——服务端由 SakuraFrp 维护,客户端只跑 frpc。
配置文件大概长这样:
[common]
user = xxxxxx
server_addr = frp-air.com
server_port = 7000
[myweb]
type = https
local_ip = 127.0.0.1
local_port = 3000
custom_domains = w-en.cc
SakuraFrp 支持 https 隧道,会自动处理 TLS 终止。我这边本地跑 Next.js 的 http 服务,frpc 负责把流量转成 https 到公网。
SSL 证书
隧道用 Let's Encrypt 证书做 HTTPS。第一次申请是手动跑的 ACME 流程,用的 DNS-01 验证方式——在 Cloudflare 上创建 TXT 记录验证域名所有权。
验证流程:
1. 调用 acme-client 创建订单
2. Cloudflare API 创建 _acme-challenge 的 TXT 记录
3. 等 DNS 传播(实测 20 秒基本够)
4. 验证挑战,获取证书
5. 清理 DNS 记录
证书有效期 90 天,写了个脚本用 certbot + Cloudflare API token 做自动续期。放在任务计划程序里每天凌晨 3 点跑一次。
续期脚本写得很保守——先检查证书过期时间,如果多于 30 天才到期就跳过,避免频繁调用 Let's Encrypt API。
启动脚本
start-server.bat 管理整个启动流程:
1. 杀掉端口 3000 上残留的进程
2. 检测 .next 构建是否存在,没有就自动 build
3. 启动 Next.js 服务
4. 等几秒确认服务就绪
5. 启动 frpc 看门狗
frpc 用 Node.js 写了个简单的 watch 脚本,检测到连接断开(EOF)就自动重启。frpc 本身不太稳定,长连接偶尔会被中继服务器断开,看门狗能保证断开后几秒内自动重连。
中间件
用了 Next.js middleware 做子域名转发。mc.w-en.cc 自动重定向到 /mc 页面,方便记忆。
? 为什么不上云
考虑过部署到 VPS,但国内访问境外服务器延迟不理想,而且每个月还要付服务器费用。本地机器有 48 核 CPU 和独立显卡,跑 Next.js 绰绰有余,带宽用 SakuraFrp 的 VIP 节点(48Mbps 限速),对个人站点来说完全够用。
缺点也有:机器不能关机,断网了网站就挂了。不过既然是个人站,偶尔挂一会影响不大。