标题有点微妙对吧,涉及的东西太多了我也不太确定怎么拟标题。

架构

接下来围绕几个问题做一点讨论:

1.为什么要海外VPS

因为drone ci需要拉取docker镜像,而国内访问Docker Hub存在一些小小但却令人抓狂的问题。当然如果本地访问Docker Hub一点问题都没有,那gogs和drone ci部署在本地就行了。此外需要注意一个海外VPS是否能正确连通国内的对象储存Endpoint,否则需要配置海外对象储存Endpoint,此举可能导致费用上升(虽然5GB以内倒是费用下降了)。

2.为什么要Gogs

现在Github的私有仓库不设数量限制,当然用GitHub是非常好的,数据将会更安全(从数据可用性意义上)。但因为历史遗留问题,以及个人偏好(我比较喜欢把自己的数据放在自己枕边),选了gogs

3.为什么要对象储存

对象储存是按量计费的,通常每GB每月费用不超过1¥,相比搞一个轻量型云服务器,或者虚拟主机之类,其成本几乎可以忽略不计。另一方面对象储存允许配置为静态网站模式,为这个工作流提供了可能性。

4.为什么要内容分发网络(CDN)

注意,首先假设使用的是国内的对象储存Endpoint。
不使用CDN的话,首先需要配置SSL证书托管,否则直接用Bucket.Endpoint访问首页倒是可以用HTTPS,但浏览器行为会变成下载网页,同时流量费用是属于外网流出(一般而言应该用忙时的价格)0.5¥/GB,请求费用是0.01¥/万次
而使用CDN,首先SSL证书可以配置为自动免费证书,同时流量费用分两个部分:CDN回源流量0.15¥/GB+CDN按流量付费0.24¥/GB≤0.39¥/GB,请求费用是0.05¥/万次(自动SSL证书的代价吗😭)

假设每次请求是 x GB/req,CDN部分流量费按上界计,不难根据不等式0.5+0.01/x ≤ 0.39+0.05/x得到 x≤0.36 GB/req。亦即只要每次请求流量不大于0.36GB的话,用CDN+OSS总是比单用OSS便宜。同理用CDN流量费用下界计算,可以得到只要每次请求流量不大于0.15GB。

结论就是,静态内容变动得不勤快,只要每次请求静态内容大小不大于0.15GB,或者很勤快,那么只要不大于0.36GB,使用CDN+OSS总是优于单用OSS。

实例

The best way to learn something is to build it yourself.

沃·梓季·硕德

在此以我自己的有机化学cookbook为例。

1.Drone CI的部署

目前drone 1.0还处在RC阶段,最好还是根据文档部署,详见https://docs.drone.io/

2.Drone CI 配置文件(*配置点1)

默认drone会从代码仓库的根目录读取一个名叫 .drone.yml 文件作为持续集成的配置文件,当然这也是可以自定义的。以下是一个范例配置文件

workspace:
  base: /data
  path: .

pipeline:
  build:
    image: kitakami/mkdocs-materials-pipeline
    commands:
      - mkdocs build -s

  upload:
    image: plugins/s3
    endpoint: yourendpoint
    bucket: yourbucketname
    access_key:
      from_secret: access_key_id
    secret_key:
      from_secret: secret_access_key
    strip_prefix: site/
    source: site/**/*
    target: .
    acl: public-read

  notify:
    image: drillster/drone-email
    host: smtp.mxhichina.com
    port: 465
    username: 
      from_secret: username
    password: 
      from_secret: password
    from: some@example.com
    recipients: [ admin@example.com ]
    when:
      branch: master

几点说明:

  1. 由于我用的是Mkdocs,所以用了一个预装Mkdocs环境的docker容器,至于怎么做一个这样的容器,其实是非常简单的。可以参见https://github.com/jsjyhzy/mkdocs-materials-pipelinehttps://cloud.docker.com/u/kitakami/repository/docker/kitakami/mkdocs-materials-pipeline,看看什么叫做蓐资本主义的羊毛。
  2. upload阶段的acl: public-read务必不要漏掉,否则即使bucket设置为公共读,文件也是私有属性的(因为默认行为不是继承Bucket ACL,而是直接Private)。
  3. notify阶段的端口号记得设置,感觉他们歪果仁的邮件服务器默认端口跟我国的不一样。

3.OSS与CDN的配置(*配置点2)

网页UI它老改来改去,就不上截图了,几点说明:

  1. Bucket配置静态首页与404页后就开启了静态网站模式。在此模式下任何以斜杠结尾的请求将返回配置的静态首页。
    1. 也因为此Mkdocs用户需要注意配置文件中设置
      use_directory_urls: false 以启用经典URL模式。
  2. Bucket的权限设置为公共读,这是因为当CDN配置为私有Bucket回源时访问以斜杠结尾的URL会被当作签名访问根目录,而不返回静态首页
  3. 由于Bucket的权限为公共读,为了防止直接对Bucket的访问可以考虑设置Referer,并禁止无Referer访问,同时在CDN回源的HTTP头上追加Referer。Referer可以是任何值,比如说一段随机的16进制数。

-1.使用

将灵感注入本地的Markdown文件后,git push,不到一分钟就能收到通知邮件,静态网站就更新完成了。

留下评论