DataSource - tatfook/wikicraft GitHub Wiki

数据源逻辑设计

起草:LiXizhi, 请liyu补充UI部分设计, WXA一起Review文档和实现。

概述

在之前的方案中, 我们对数据源的存储方式如下

  1. 每个用户在用户设置中可以设置多个数据源(API URL和对应的Personal Access Token).
  2. 用户选择一个默认的数据源来存储所有的网站: 用户的网站路径在数据源中的位置是固定的:
    • KeepWork默认:http://git.keepwork.com/gitlab_[username]/keepworkdatasource/[username]/[sitename]/[pagename]
    • 第三方github/gitlab:baseurl/[username]/keepworkdatasource/[username]/[sitename]/[pagename]

我们希望调整后,与目前的默认keepwork存储是兼容的。 但是要支持单网站数据源以及路径可单独设置。 这样做的目的是

  1. 未来方便我们提供VIP,非VIP用户私有化和公有化网站切换。 因为GIT数据源的权限是针对整个repository,而不是子目录。
  2. 兼容GITHUB WIKI和github pages. 2017年开始github pages允许用户使用任何自定义的子目录作为网站根目录。
  3. 方便未来开通多人编译同一个数据源。 只要Personal Access Token可以编辑,就可以编辑。因为权限管理是由GIT数据源来管理的, keepwork最多是代理。
  4. 做到与目前的默认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

我们和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;
       }
}