标题有点微妙对吧,涉及的东西太多了我也不太确定怎么拟标题。
架构
接下来围绕几个问题做一点讨论:
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</pre>
几点说明:
- 由于我用的是Mkdocs,所以用了一个预装Mkdocs环境的docker容器,至于怎么做一个这样的容器,其实是非常简单的。 可以参见https://github.com/jsjyhzy/mkdocs-materials-pipeline 和https://cloud.docker.com/u/kitakami/repository/docker/kitakami/mkdocs-materials-pipeline, 看看什么叫做蓐资本主义的羊毛。
- upload阶段的acl: public-read务必不要漏掉,否则即使bucket设置为公共读, 文件也是私有属性的(因为默认行为不是继承Bucket ACL,而是直接Private)。
- notify阶段的端口号记得设置,感觉他们歪果仁的邮件服务器默认端口跟我国的不一样。
3.OSS与CDN的配置(*配置点2)
网页UI它老改来改去,就不上截图了,几点说明:
- Bucket配置静态首页与404页后就开启了静态网站模式。在此模式下任何以斜杠结尾的请求将返回配置的静态首页。
- 也因为此Mkdocs用户需要注意配置文件中设置 use_directory_urls: false 以启用经典URL模式。
- Bucket的权限设置为公共读,这是因为当CDN配置为私有Bucket回源时访问以斜杠结尾的URL会被当作签名访问根目录,而不返回静态首页
- 由于Bucket的权限为公共读,为了防止直接对Bucket的访问可以考虑设置Referer,并禁止无Referer访问, 同时在CDN回源的HTTP头上追加Referer。Referer可以是任何值,比如说一段随机的16进制数。
-1.使用
将灵感注入本地的Markdown文件后,git push,不到一分钟就能收到通知邮件,静态网站就更新完成了。