Solo 拉取 GitHub 仓库和自动备份

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

本文是《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 构思 - 分布式社区网络)。

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

    1425 引用 • 10043 回帖 • 474 关注
  • 设计
    112 引用 • 797 回帖 • 1 关注
  • 文档
    56 引用 • 1288 回帖 • 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 更新了该帖

相关帖子

欢迎来到这里!

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

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

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

    1 回复
  • 其他回帖
  • 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

    这个是吗,

    [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 回复
  • mmzsblog

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

    1 回复
  • 查看全部回帖

推荐标签 标签

  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖 • 1 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 996
    13 引用 • 200 回帖 • 2 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 608 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 294 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 570 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 2 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 86 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 340 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 693 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 641 关注
  • Rust

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

    57 引用 • 22 回帖 • 3 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 10 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖
  • Elasticsearch

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

    116 引用 • 99 回帖 • 269 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 450 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 696 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 525 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 635 关注