Chenyao

迁移到 Cloudflare {Workers,Pages}

Posted at — Jul 31, 2022

最近买了一点点 Cloudflare 的股票。属于乱投资买彩票的水平,没看财报。自己找了以下原因:

  1. 股价跌了很多,但公司是一家很酷的公司
  2. 大家都喜欢薅 CF 的羊毛,算是开发者友好?
  3. 开源了很多好玩的东西,比如说 boringtun

感觉有炒币时瞎买的那种感觉。直觉上相信 CF 价值超过大部分市值比其高的垃圾币。

既然买了股票,顺便想着把自己的站从netlify 迁移到 CF,试用一下产品。

lcy.im

这个页面是之前是每天跑一个github actions,里面有一个py写的爬虫,爬完我的饭否内容之后渲染一个html然后上传到 netlify。

最直接迁移到 CF 的方案肯定是把 netlify 换成 pages,每天还是用github actions 去抓饭否内容。但还是想试用一下 workers,workers 可以运行wasm代码,也就是说可以用任意可以编译到wasm的语言来实现。对于rust,CF 官方还实现了一个库workers-rs,可以方便的隐藏一切boilerplate code。 我把爬虫等用 rust 重新实现一遍,把渲染好的页面直接存到 workers kv 里。访问主页就直接去kv里查出来这个 html然后返回。workers-rs 还可以帮忙把 kv 直接绑定成一个rust 的对象,自己不用写wrapper 就能直接用,极其方便。唯一遇到的一个小问题是我用 tera 来渲染 jinja 模版,可能是这个库特别大,或者我用了lazy_static,总之编译出来的wasm 文件过大,没办法直接部署。换成minijinja 就好了。

blog.lcy.im

这个博客是用hugo 渲染的,可以直接用 CF pages。pages 的使用起来和大多数host 静态网页的平台是一样的。连接pages到github上,当有新的 commit 时,pages 会自己抓下来渲染再更新。pages 会默认分配一个 XXX.pages.dev 的域名,XXX是你项目的名字。然后加自定义域名的方法也很暴力,是直接cname到XXX.pages.dev上(使用proxy模式)。然而我想把xxx.pages.dev的域名给干掉,根据这个回答似乎不太行。后来一想也有道理,毕竟任何一个人都可以代理你的网站。所以自己的网站有两个域名能访问也很正常。所以我给网页加上了一段js来判断域名是不是期待的域名,不是就重定向过来:

<script>
    if (!window.location.href.startsWith("{{ .Site.BaseURL }}")) {
        let href = "{{ .Site.BaseURL }}";
        if (href.endsWith("/")) {
            href = href.slice(0, -1);
        }
        href += window.location.pathname;
        window.location.replace(href);
    }
</script>

大家查看本页源码就可以看到这段代码。其中{{ .Site.BaseURL }}会被hugo渲染成配置里的 BaseURL。用.Site.BaseURL还有一个好处是用hugo server 命令在本地预览的时候,BaseURL会被改成localhost:1313,这样本地看的时候不会跳转走,不影响本地预览。

其他

好久没写博客了。可能是最近折腾少了的原因?但是写点稍微长一些的废话挺好玩的。我看上次更新是博客是把博客迁移到了 hugo,希望下次更新不是因为又折腾博客部署的事情😂