起因是这两天连续刷到好几个监控站点部署的帖子,其中有一个吸引了我的注意[(NEW)白嫖一个始皇同款网站监控面板:uptime-kuma],他提供了个新颖的思路,通过第三方容器化服务去搭建Uptime Kuma,但有一个问题,Hugging face在48小时如果不去点击就会自动清空容器数据。这就恶心人了,一个监控容器自己会抹去数据。好在经过一番检索,找到了个较为完美的方法:Hugging face+Serverless数据库。具体如下:

创建在线数据库

这里有一位民间大神收集了网络上现有的一些提供免费云数据库的商家。在这里选用 Avien,它免费提供一个5GB存储空间的MySQL数据库,我们在这里创建一个Free plan的MySQL数据库,服务位置选择North America。稍等片刻,数据库创建完成后复制下链接地址,保存起来。

部署Docker容器

不同于在服务器上部署Docker容器,在Hugging face创建一个容器十分简单。

这里要感谢sugar404提供的容器模板!

先注册账号,然后点击此处,即可部署,Space hardware选择默认的free下面则是填写一些环境变量:

环境变量填写内容
UPTIME_KUMA_DB_TYPEmariadb
UPTIME_KUMA_DB_HOSTNAME数据库连接地址
UPTIME_KUMA_DB_PORT数据库端口
UPTIME_KUMA_DB_USERNAME用户名
UPTIME_KUMA_DB_NAME数据库名
UPTIME_KUMA_DB_PASSWORD数据库密码

填写完毕后点击Duplicate Space部署,等到最上面显示Running即部署完成。

自定义域名

Hugging face本身是不支持自定义域名的,这里通过Cloudflare的worker来实现。

首先复制下来Hugging face提供的二级域名:

点击右上角的SettingsEmbed this Space并复制二级域名:

image-20240626192033200

转到Cloudflare,新建一个worker脚本

//替换xxx.hf.space
export default {
  async fetch(request, env) {
    const _url = new URL(request.url);
    const hostname = _url.hostname;
    _url.hostname = "xxx.hf.space";
    const req = new Request(_url, request);
    req.headers.set('origin', 'https://xxx.hf.space');
    
    const res = await fetch(req);
    let newres = new Response(res.body, res);

    let location = newres.headers.get('location');
    if (location !== null && location !== "") {

      // 可选 - >
      // 去除原始路径中的 /dashboard
      location = location.replace('/dashboard', '');
      // 添加 /status/web 路径
      location = location + '/status/web';
      //  <- 可选

      location = location.replace('://xxx.hf.space', '://'+hostname);
      newres.headers.set('location', location);
    }
    return newres;
  },
};

之后为此worker自定义一个域名即可。

最后

其实类似的Serverless还有很多实现,大抵都是通过Vercel,Netlify或是本文所用的Hugging face来充当前端,再使用一些云数据库来保存状态,个人都是足够用的。