DataSource - tatfook/wikicraft GitHub Wiki
数据源逻辑设计
起草:LiXizhi, 请liyu补充UI部分设计, WXA一起Review文档和实现。
概述
在之前的方案中, 我们对数据源的存储方式如下
- 每个用户在用户设置中可以设置多个数据源(API URL和对应的Personal Access Token).
- 用户选择一个默认的数据源来存储所有的网站: 用户的网站路径在数据源中的位置是固定的:
- KeepWork默认:
http://git.keepwork.com/gitlab_[username]/keepworkdatasource/[username]/[sitename]/[pagename] - 第三方github/gitlab:
baseurl/[username]/keepworkdatasource/[username]/[sitename]/[pagename]
- KeepWork默认:
我们希望调整后,与目前的默认keepwork存储是兼容的。 但是要支持单网站数据源以及路径可单独设置。 这样做的目的是
- 未来方便我们提供VIP,非VIP用户私有化和公有化网站切换。 因为GIT数据源的权限是针对整个repository,而不是子目录。
- 兼容GITHUB WIKI和github pages. 2017年开始github pages允许用户使用任何自定义的子目录作为网站根目录。
- 方便未来开通多人编译同一个数据源。 只要Personal Access Token可以编辑,就可以编辑。因为权限管理是由GIT数据源来管理的, keepwork最多是代理。
- 做到与目前的默认keepwork存储是兼容的。
keepworkdatasource/[username]/[sitename]/[pagename]这种设计除了无法用GIT进行权限管理外, 是更科学的存储方式, 类似evernote和有道云笔记,方便用户统一管理, 所以仍然作为默认的存储方式。理由是:一个人一生所能分享的有价值的个人内容是很有限的, 没有必要分成多个git库,造成不必要的管理成本。
最终的方案
数据库层面, 我们要为每个[username+project]新增存储下列数据
- 数据源API url + 数据源用户名: 通过两者可查数据源列表中的personal access token。注意@liyu: 用户修改数据源时,请补充对应的逻辑。
- 如果为空, 为keepwork内置
- 数据源类型: github 或 gitlab 或 keepwork默认。 如果为空, 为keepwork内置
- 数据源下的存储路径:
- 如果为空,则和目前一样:
[username]/keepworkdatasource/[username]/[sitename]/[pagename] - 否则,可以指定:
[username]/[repo_name]/[sub_path(s)], 注意对于多人编辑,这里的username可能不是用户自己
- 如果为空,则和目前一样:
- 是否为私有: boolean, 默认为公有. 私有项目的存储路径一定不是空. 一般默认是
http://git.keepwork.com/gitlab_[username]/keepwork_[sitename]/[pagename], 如果再次公有化, 这个路径也不会变了。
- CNAME: 0个,一个或多个
访问网站
对于正常访问网站, 需要先请求网站的[username+project]信息, 获得API-URL, 数据源类型, 数据源下的存储路径, 如果是私有项目,还要access token.
编辑网站
- 需要先请求网站的[username+project]信息, 获得API-URL, 数据源类型, 数据源下的存储路径,
- 再请求personal access token.
网站列表
编辑模式下, 网站列表,并不展开里面的页面。 只有当用户强制展开时,才通过git API,从数据源上获得对应级别的tree object,而不是recursive tree objects. Keepwork本身不存储数据源目录下的文件列表,改为通过数据源读取。
图片或二进制文件上传
- 如果路径是默认路径,存到默认数据源的
username/Keepworkdatasource/images - 如果用户指定了路径,存到
[指定路径]/images - [optional] 目前的绝对路径是:
http://git.keepwork.com/gitlab_lixizhi/keepworkDataSource/raw/master/images/img_1493284743601.png- 未来对于特殊URL,可用HTTP redirect做一些CDN加速,例如redirect到
http://cdn.keepwork.com/gitlab_lixizhi/img_1493284743601.png
- 未来对于特殊URL,可用HTTP redirect做一些CDN加速,例如redirect到
我们和GITHUB采用类似的方式,用户所有的图片放在同一个仓库中存储。 这样的好处是:
- 即时用户反复上传同一个图片, 虽然文件名不同,但是二进制数据在GIT数据库中永远只有一个Copy。GITHUB是所有用户图片共享一个空间。我们是同一个用户的所有图片共享一个空间。
- 未来对于所有Keepworkdatasource/images url的请求,方便我们做缓存或CDN加速。
- 用户网站全部是代码,占用空间小, 方便备份,打包。
私有化项目 展望
项目私有化,需要Copy内容到一个私有仓库, 之前的图片URL无法私有化了。 所以要建议用户在创建项目时就确定是否是私有化的项目。 开始, 我们甚至可以禁止用户将公有项目变成私有的,必须新建私有项目。 私有化项目中上传的图片也是私有的。
多人编辑 展望
多人编辑主要看personal access token. 默认数据源都是存在一起的,无法区别权限。 如果用户需要单个项目多人编辑,需要指定独立的git repository路径。
开发计划
这个调整比较大, 可按照下面次序做:
- 让每个项目有自己的数据源,以及数据源路径。
- 新建网站时,增加一个地方,可配置数据源路径 (@liyu设计下, 包括网站管理中)
- 编辑器中,pages列表从数据源读取。
- 图片上传,对于有数据源路径的项目要存到/images下。
后面私有化, 多人编辑等具体策划文档。
数据源服务器配置
gitlab数据源配置实例
编辑配置文件/etc/gitlab/gitlab.rb(默认路径), 做如下更改(存在替换,不存在添加):
- external_url 'http://git.keepwork.com' # 将external_url 改为服务器的访问地址
- nginx['custom_gitlab_server_config'] = "location ~ ^/[^a][^p][^i].\.md$ {\n proxy_cache gitlab;\n proxy_pass http://gitlab-workhorse; \n add_header Access-Control-Allow-Origin '';\n}\n" # 增加前端对文件的跨域访问
keepwork nginx配置实例
添加nginx虚拟主机配置
# dev 测试环境配置
server {
listen 80;
server_name dev.keepwork.com *.dev.keepwork.com;
location / {
proxy_pass http://127.0.0.1:8900;
include proxy_params;
}
}
# 正式环境配置
server {
listen 80;
server_name ~ .*;
if ($host = "www.keepwork.com") {
rewrite ^(.*) http://keepwork.com$1 permanent;
}
location / {
proxy_pass http://127.0.0.1:8099;
include proxy_params;
}
}