Solo 拉取 GitHub 仓库和自动备份

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

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

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

    1424 引用 • 10041 回帖 • 469 关注
  • 设计
    111 引用 • 796 回帖 • 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 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 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 回复
  • 其他回帖
  • wangdy

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

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

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

    1 回复
  • 查看全部回帖

推荐标签 标签

  • V2Ray
    1 引用 • 15 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 1 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 346 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖 • 2 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 25 关注
  • PHP

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

    164 引用 • 406 回帖 • 523 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 249 关注
  • CodeMirror
    1 引用 • 2 回帖 • 108 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 9 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖
  • React

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

    192 引用 • 291 回帖 • 443 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 66 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 177 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1738 回帖 • 2 关注
  • Rust

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

    57 引用 • 22 回帖
  • DNSPod

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

    6 引用 • 26 回帖 • 518 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 591 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 370 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 791 回帖 • 1 关注
  • InfluxDB

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

    2 引用 • 47 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 22 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 321 关注
  • 互联网

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

    96 引用 • 330 回帖
  • 微服务

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

    96 引用 • 155 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    21 引用 • 22 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 339 关注