2023年博客折腾记

2023-09-24
#go #vercel

image

每年总有一段时间想折腾一下博客,今年的博客历时三天总算折腾结束了。之前的博客是自己基于 Github Discussion 开发的,使用的语言是 Go,今年也不想着再用别的语言重写一遍了,不过尝试了用 Vercel 的 Serverless function 把自己的博客成功的从阿里云迁移到 Vercel 了,这样子的话就不需要续费服务器了,感觉省下来了一个亿。

代码

完整代码可以去 pure 查看,这里简单说一下核心的改造地方:

目录结构

由于 Vercel 的要求,新增了一个 Api 的目录,然后由于一些原因,对代码进行了改造,实际最后新增了好几个目录:

image

路由问题

默认 serverless 的路由是 api 开头的,但是如果最后主页变成 /api/posts之类的,实在太丑陋了,所以需要改写路径,一开始参考 Rewriting route for serverless function projects (i.e. no more /api) 直接修改 vercel.json 如下:

{
  "rewrites": [
    { "source": "/:path*", "destination": "/api/:path*" }
  ]
}

有效但是只有一部分,只有主页部分是好的,其他部分都不行,然后最后使用 redirectsrewrites 完成了这个需求,不过不是完美实现,然后有缺陷,主页变成了 /posts,其他部分都正常:

{
     	
  "redirects": [
    {
      "source": "/",
      "destination": "/posts",
      "permanent": true
    }
  ],
      "rewrites": [
        {
          "source": "/posts",
          "destination": "/api/posts"
        },
        {
          "source": "/post/(.*)",
          "destination": "/api/post/(.*)"
        },
        {
          "source": "/about",
          "destination": "/api/about"
        },
        {
          "source": "/atom.xml",
          "destination": "/api/atom.xml"
        },
        {
          "source":"/category/(.*)",
          "destination": "/api/category/(.*)"
        },
        {
          "source":"/404",
          "destination": "/api/404"
        },
        {
          "source": "/api/(.*)",
          "destination": "/api/index.go"
        }
      ]

}

不得不说实在太土了,不过好在能用,后面看看有没有更优雅的方式。

一些坑

由于 serveless 函数不支持使用上传的文件,所以我只好把原来的模版文件全部写到 constants.go 文件中,然后所有的 css 文件都直接引用 cdn 的文件。

其实另外一个问题,其实是个小问题,我之前使用的 go 框架是 gin, vercel 默认的 golang 的 serverless 例子是这样子:

package handler
 
import (
  "fmt"
  "net/http"
)
 
func Handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "<h1>Hello from Go!</h1>")
}

这就是需要我对原来的启动代码进行小小的改造,接受 (w http.ResponseWriter, r *http.Request) 这两个参数,改动如下:

func Handler(writer http.ResponseWriter, request *http.Request) {
	r := gin.New()
        // ...
	r.ServeHTTP(writer, request)
}

到这里就基本改造完成,然后部署到 vercel,最后把阿里云的服务器停掉,域名指向 vercel 分配到默认域名上,一切大功告成🎉,后面应该不会再折腾博客了,就在 discussion 上安安心心地写博客了