每年总有一段时间想折腾一下博客,今年的博客历时三天总算折腾结束了。之前的博客是自己基于 Github Discussion 开发的,使用的语言是 Go,今年也不想着再用别的语言重写一遍了,不过尝试了用 Vercel 的 Serverless function 把自己的博客成功的从阿里云迁移到 Vercel 了,这样子的话就不需要续费服务器了,感觉省下来了一个亿。
代码
完整代码可以去 pure 查看,这里简单说一下核心的改造地方:
目录结构
由于 Vercel 的要求,新增了一个 Api 的目录,然后由于一些原因,对代码进行了改造,实际最后新增了好几个目录:
路由问题
默认 serverless 的路由是 api
开头的,但是如果最后主页变成 /api/posts
之类的,实在太丑陋了,所以需要改写路径,一开始参考 Rewriting route for serverless function projects (i.e. no more /api) 直接修改 vercel.json
如下:
{
"rewrites": [
{ "source": "/:path*", "destination": "/api/:path*" }
]
}
有效但是只有一部分,只有主页部分是好的,其他部分都不行,然后最后使用 redirects
和 rewrites
完成了这个需求,不过不是完美实现,然后有缺陷,主页变成了 /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 上安安心心地写博客了
每年总有一段时间想折腾一下博客,今年的博客历时三天总算折腾结束了。之前的博客是自己基于 Github Discussion 开发的,使用的语言是 Go,今年也不想着再用别的语言重写一遍了,不过尝试了用 Vercel 的 Serverless function 把自己的博客成功的从阿里云迁移到 Vercel 了,这样子的话就不需要续费服务器了,感觉省下来了一个亿。
代码
完整代码可以去 pure 查看,这里简单说一下核心的改造地方:
目录结构
由于 Vercel 的要求,新增了一个 Api 的目录,然后由于一些原因,对代码进行了改造,实际最后新增了好几个目录:
路由问题
默认 serverless 的路由是
api
开头的,但是如果最后主页变成/api/posts
之类的,实在太丑陋了,所以需要改写路径,一开始参考 Rewriting route for serverless function projects (i.e. no more /api) 直接修改vercel.json
如下:有效但是只有一部分,只有主页部分是好的,其他部分都不行,然后最后使用
redirects
和rewrites
完成了这个需求,不过不是完美实现,然后有缺陷,主页变成了/posts
,其他部分都正常:不得不说实在太土了,不过好在能用,后面看看有没有更优雅的方式。
一些坑
由于 serveless 函数不支持使用上传的文件,所以我只好把原来的模版文件全部写到
constants.go
文件中,然后所有的 css 文件都直接引用 cdn 的文件。其实另外一个问题,其实是个小问题,我之前使用的 go 框架是 gin, vercel 默认的 golang 的 serverless 例子是这样子:
这就是需要我对原来的启动代码进行小小的改造,接受
(w http.ResponseWriter, r *http.Request)
这两个参数,改动如下:到这里就基本改造完成,然后部署到 vercel,最后把阿里云的服务器停掉,域名指向 vercel 分配到默认域名上,一切大功告成🎉,后面应该不会再折腾博客了,就在 discussion 上安安心心地写博客了