因为无意看到有人用公网访问的对象存储搭建静态网站,突发奇想折腾一个备案的试试。域名在腾讯云购买,想着用七牛云的每月免费 10 G 流量的对象存储。国内建站的一个痛点是没有免费或低价服务器。如果是国外,很多免费静态资源托管,甚至很多免费 PHP 空间。国内的服务器一般几千元一年,一般只有第一年能享受几十元的价格。便宜的长期方案很少,腾讯云轻量无忧计划 180 元一年这种已经是很不错的了。纯静态网站可以用腾讯云 cloudbase ,现在优惠价 20 元一年,2 G 空间,5 G 流量,可备案,比国外免费的产品还差。
七牛的对象存储可以后付费,每月 10 G 免费公网流出流量。如果用用海外账号,无需实名,用起来体验挺好的。如果要介入国内的服务器,就要实名。公网访问可以提供免费 30 天的测试域名,长期使用需要绑定域名,国内账号域名需要备案。
有个问题,备案需要国内域名注册商加国内服务器,其实备案不一定需要有服务器,但要有服务器提供商的备案号,一种解决方案是咸鱼十几元购买一个备案号,不然就只能先买个服务器来备案。七牛是对象存储,不是服务器,不支持备案,国内要绑定域名又只支持备案域名,所以买了个新网备案号备了案,这样不知道是否合规,不过是可行的,用某个二级域名指向新网,也不会轻易掉备案号。然后在七牛通过 dns 验证域名,并 cname 到七牛指定的域名,即可使用对象存储通过域名公网访问。主页文件需要指定,其余文件的 url 就是文件路径。本地打包好,写个代码递归寻找所有文件,并使用相对路径作为 key 通过对象存储上传到七牛即可。试了一下,速度和体验良好,比自己托管体验好,自己的低价服务器带宽和性能毕竟不能和大厂比。
不过体验一下后就把网站迁到阿里云了,因为阿里云 ECS 轻量服务器有活动,99 元一年可续费 4 年,2C 2G 3M ,还可以,就买了。对象存储公网访问是不常用的行为,虽然免费 10 G ,但是如果受到攻击完全没办法防御,会被刷流量获得天价账单。虽然可以设置欠费停止服务,但有延迟。
新的网站源代码托管到 Github ,并使用 Github Actions 自动部署。当代码 push 时,自动使用 NodeJS 打包,并写了一个 GitHub Actions 通过 scp 命令把文件传到服务器上
name: xxx
on: [push]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm install
- run: npm run build
- run: |
ls build/
- uses: wjftu/copy-directory-via-ssh-password@master
with:
HOST: ${{ secrets.HOST }}
USERNAME: myname
PASSWORD: ${{ secrets.PASSWORD }}
SOURCE: build/*
TARGET: /path/to/static/file
Docker 打包了一个带有 sshpass 的镜像 wjftu/sshpass:latest
供此 actions 使用,这样做可能不太对,应该有现成的方案,或者更轻量的 NodeJS 的方案。
静态服务器用 caddy 部署,省去了手动申请证书,制作了一个 caddy 镜像,通过 -v 映射本地路径到证书路径,以免每次重启重复申请证书导致超出限制。