Solo 拉取 GitHub 仓库和自动备份

本贴最后更新于 1644 天前,其中的信息可能已经时移世改

本文是《Solo 从设计到实现》的一个章节,该系列文章将介绍 Solo 这款 Java 博客系统是如何从无到有的,希望大家能通过它对 Solo 从设计到实现有个直观地了解、能为想参与贡献的人介绍清楚项目,也希望能为给重复发明重新定义博客系统的人做个参考 ❤️

  1. 拉取 GitHub 仓库:每 24 小时定时拉取用户 GitHub 账号下的公有仓库,然后生成一篇文章并在加入到导航中,实际效果请参看这里
  2. 自动备份:每 24 小时定时导出用户的公开文章到社区账号下(注意仅包含文章,不包含其他数据)。

拉取并展示仓库

仓库数据是通过社区接口获取的, GitHubs#getGitHubRepos

public static JSONArray getGitHubRepos(final String githubUserId) {
    try {
        final HttpResponse res = HttpRequest.get("https://hacpai.com/github/repos?id=" + githubUserId).trustAllCerts(true).
                connectionTimeout(3000).timeout(7000).header("User-Agent", Solos.USER_AGENT).send();
        if (HttpServletResponse.SC_OK != res.statusCode()) {
            return null;
        }
        res.charset("UTF-8");
        final JSONObject result = new JSONObject(res.bodyText());
        if (0 != result.optInt(Keys.STATUS_CODE)) {
            return null;
        }
        final JSONObject data = result.optJSONObject(Common.DATA);
        final JSONArray ret = data.optJSONArray("githubrepos");

        return ret;
    } catch (final Exception e) {
        LOGGER.log(Level.ERROR, "Gets GitHub repos failed", e);

        return null;
    }
}

社区会定时调用 GitHub Repos API 获取用户仓库数据,然后持久化到数据库中,Solo 请求数据时查库返回。

自动备份

  1. 登录博客后台,在工具 -> 偏好设定 -> 参数设置中勾选 备份所有文章到社区
  2. 程序启动后会进行第一次同步,后续每 24 小时触发一次
  3. 在社区个人设置 - B3 中可下载备份包

请注意

  • 如果没有生成备份,请查看日志输出,并确认是否打开备份开关、域名配置是否正确( serverHost 不能用 localhost 或者 IP 地址)以及是否指定为生产环境( runtimeMode=PRODUCTION

实现流程:

  1. 博客端定时触发同步请求,将所有文章(包括草稿和加密文章)导出 md 打 zip 包
  2. 将包发送至社区服务器,由社区服务器上传到云存储完成备份

代码实现请参考 ExportService#exportHacPai

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1434 引用 • 10054 回帖 • 490 关注
  • 设计
    114 引用 • 797 回帖 • 1 关注
  • 文档
    56 引用 • 1289 回帖 • 2 关注
4 操作
88250 在 2020-05-22 12:14:29 更新了该帖
88250 在 2020-05-17 19:53:17 更新了该帖
88250 在 2020-01-14 10:36:20 更新了该帖
88250 在 2019-12-15 11:16:59 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • mmzsblog

    使用 tomcat 部署的项目,但是没有自动同步到 github 社区?是不是因为我设置了多个管理员的原因呢?

    1 回复
  • 88250

    可以看下日志中是否有报错或者其他信息。

    1 回复
  • mmzsblog

    日志打印了 Github repo syncing....这句话;将 github 的公开仓库同步到了博客;但是博客的文章没有同步到 github

    1 回复
  • 88250

    社区服务器上的日志能找到最近一次同步成功的记录是 8 月 5 号,后面就没有同步请求过来了。我估计是因为 Solo 博客端没有发出同步推送请求,你看下是不是如下几个原因导致没有发送同步请求:

    • 设置中是否勾选“允许同步 GitHub 仓库”
    • server host 不能是 localhost 或者 IP
    • runtime mode 必须是生产模式
    1 回复
  • mmzsblog

    谢谢您,解决了;

    原因是 runtime mode 没有修改成生产模式

    1 回复
  • iwang-peng

    runtime mode 这个是在哪修改呢???

    1 回复
  • 88250

    docker 部署的话带参数,war 部署的话改 latke.props。

  • happinesslijian

    自动同步到 github 上的这个功能已经废弃了吗?不用了吗?

    1 回复
  • 88250

    请看这里

  • liu-yanyang

    为什么我现在在 GitHub 上面找不到 war 包了呀?

  • liu-yanyang

    GitHub 上面现在只有 zip 和源码包了,在哪里可以找到 war 包

    1 回复
  • Rainsheep

    我想问下,拉取 GitHub 功能无法使用了吗,我的很久没有更新过了,设置中勾选了拉取 GitHub 仓库信息

    1 回复
  • 88250

    https://hacpai.com/settings/account 重新绑定一下 GitHub 账号。

    1 回复
  • Rainsheep

    还不行,是生产模式的原因?生产模式怎么设置

    1 回复
  • 88250

    如果你不是自己构建源码部署的话默认就是生产模式了。试下通过 GitHub 重新登录社区看看是否会更新。

    1 回复
  • Rainsheep

    重新登录 然后重启了 solo 并没有更新。.

    1 回复
  • 88250

    有出现异常日志么?

    1 回复
  • Rainsheep

    这个是吗,

    [ERROR]-[2020-02-14 07:15:54]-[org.b3log.latke.http.renderer.StaticFileRenderer:76]: Renders static file failed
    java.io.FileNotFoundException: File '/opt/solo/js/comm.js' does not exist
    	at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:297) ~[commons-io-2.6.jar:2.6]
    	at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:1851) ~[commons-io-2.6.jar:2.6]
    	at org.b3log.latke.http.renderer.StaticFileRenderer.render(StaticFileRenderer.java:65) [latke-core-3.2.7.jar:?]
    	at org.b3log.latke.http.Dispatcher.renderResponse(Dispatcher.java:124) [latke-core-3.2.7.jar:?]
    	at org.b3log.latke.http.Dispatcher.handle(Dispatcher.java:96) [latke-core-3.2.7.jar:?]
    	at org.b3log.latke.http.ServerHandler.channelRead0(ServerHandler.java:84) [latke-core-3.2.7.jar:?]
    	at org.b3log.latke.http.ServerHandler.channelRead0(ServerHandler.java:38) [latke-core-3.2.7.jar:?]
    	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) [netty-transport-4.1.45.Final.jar:4.1.45.Final]
    
    

    还有这个:

    [ERROR]-[2020-02-13 07:51:06]-[org.b3log.latke.http.Request:230]: Parses request [uri=/otsmobile/app/mgs/mgw.htm, remoteAddr=/127.0.0.1:36250, body=null] failed: invalid hex byte '�t index 255 of '!��A�M��C$�P��g>SJ_�����by�'
    l�9"�O@�zq_��Z��c�p�    ��      �x<��W�ϻ     �|�)���7���FCb��
    "����^yP��,u�Ţ���(�zL"������(=�f������0�J��,Дု��;��.��F'�I?/��Xo�)Q
                                            �i
    "
    S?�I)"�������X�(��oT��h�,6F�ߘ_	��X��~�&�g��'_�&��:�S����@%��d73-����rp'
    
    
    1 回复
  • 88250

    第一个异常可以忽略,前端请求了一个不存在的文件;第二个异常看上去像是一个攻击请求。这两个请求和拉取仓库信息都不相关。拉取仓库是 Solo 作为客户端请求社区接口的,是个定时任务,重启后大约 30s 会发起第一次请求,以后每隔 24 小时发起一次。

    我刚刚检查了下社区数据库,你的仓库信息才刷新过,数据是正常的。估计还是客户端请求异常导致,你在日志里面 grep 一下这句 Gets GitHub repos failed 看看有没有结果。

    1 回复
  • Rainsheep
    [root@yuyang ~]# docker logs solo | grep Gets GitHub repos failed
    grep: GitHub: No such file or directory
    grep: repos: No such file or directory
    grep: failed: No such file or directory
    [root@yuyang ~]# docker logs solo | grep GitHub
    [root@yuyang ~]# 
    
    

    并没有结果

    1 回复
  • 88250

    基础命令要使用对啊,不然不好排查问题。

    docker logs solo | grep 'Gets GitHub repos failed'

    2 回复
  • Rainsheep
    [root@yuyang ~]# docker logs solo | grep 'Gets GitHub repos failed'
    [root@yuyang ~]# docker logs solo | grep 'Gets GitHub repos failed'
    [root@yuyang ~]# ^C
    

    没有错误

  • Rainsheep

    我 GitHub 有三个仓库,博客端只有一个,那一个是很久前更新的,以前博客自动备份到 GitHub 上的那个仓库,剩下两个仓库都是自己建的

    1 回复
  • 88250

    刚刚重头检查了一遍代码,社区端有个 bug 导致了这个问题,感谢你帮忙一起进行排查 ❤️

    麻烦重启一下博客端,数据应该会刷新了。

    1 回复
  • Rainsheep

    可以了可以了 谢谢 感谢社区提供了这么好的一个博客系统

  • wangdy

    使用的 solo-docker,日志太多,磁盘满了,备份功能不知道咋没生效,导致 MySQL 的 db 文件损坏了,这个能修复吗

    1 回复
  • 88250

    社区端没有备份文件么?没有的话可能是博客端没有推送上传。恢复数据估计只能从博客端 MySQL 上想想办法了。

    1 回复
  • wangdy

    社区端没看到有备份,db 文件有办法修复吗

    1 回复
  • 88250

    研究一下 MySQL binlog 恢复,也许有救。

    1 回复
  • wangdy

    已经恢复了,我想问下,pipe 没有备份文章到社区的功能吗?我想用 pipe

    1 回复
  • 88250

    Pipe 没有这个功能。

  • @88250 您好~在备份的时候,能不能考虑把图片也下载下来呀~~

    1 回复
  • 88250

    暂时不能哦,社区图床比较稳定的,如果不信任的话可以使用其他图床,谢谢支持。

  • zipfang

    感谢社区提供了一个这么方便好用的系统

请输入回帖内容 ...

推荐标签 标签

  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 384 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    153 引用 • 3783 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    543 引用 • 672 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    47 引用 • 25 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 629 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    943 引用 • 943 回帖
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 510 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 344 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 71 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 4 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 211 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 762 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    340 引用 • 708 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 680 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 474 关注
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 5 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖