"简介 [链接] 是一款小而美的开源博客系统,专为程序员设计。 Solo 有着非常活跃的[链接],可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。 这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单! 具体细节请浏览 [链接] 安装 本地试用 [链接]最新的 Solo 包解压,进入解压目录执行 .."

Solo 用户指南

简介

Solo 是一款小而美的开源博客系统,专为程序员设计。

Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
具体细节请浏览 B3log 构思

安装

本地试用

下载最新的 Solo 包解压,进入解压目录执行:

如果你有 Java 开发环境,可参考这里通过源码构建运行。

请注意:我们不建议通过 war 发布包或者源码构建部署,因为这样的部署方式在将来有新版本发布时升级会比较麻烦。
这两种方式请仅用于本地试用,线上生产环境建议通过 Docker 部署。

Docker 部署

获取最新镜像:

docker pull b3log/solo

启动参数说明:

完整启动参数的说明可以使用 -h 来查看。

Docker 升级

  1. 拉取最新镜像
  2. 重启容器

可参考这里编写一个重启脚本,并通过 crontab 每日凌晨运行来实现自动更新。

NGINX 反代

upstream backend {
    server localhost:8080; # Solo 监听端口
}

server {
    listen       80;
    server_name  88250.b3log.org; # 博客域名

    access_log off;

    location / {
        proxy_pass http://backend$request_uri;
        proxy_set_header  Host $host:$server_port;
        proxy_set_header  X-Real-IP  $remote_addr;
        client_max_body_size  10m;
    }
}

初始化后

初始化成功后请务必查看自动发布的第一篇文章,里面有一些必要的操作,请务必完成。然后请到管理后台 -> 工具 -> 偏好设定中进行一下博客的细节配置。

信息配置

签名档

最多可以配置 3 个签名档,发布文章的时候选择一个使用,可以使用 HTML 和脚本进行配置。

参数设置

下面是一些比较有特色或重要的参数:

导入 Markdown

请参考 Solo 支持 Hexo/Jekyll 数据导入

备份

安全第一,血泪的教训 😢

其他一些特性

多用户

可以几个用户同时使用一个博客发布文章,主要用在团队博客这个场景。权限方面做了简单隔离,非管理员用户可以看到其他用户的博文 / 评论列表,但是不能进行操作。

RSS/Atom/Sitemap

提供两种订阅供稿:Atom 1.0、RSS 2.0:

不要用浏览器直接打开,请通过阅读器查看。另外,Solo 也能生成全站文章的 sitemap.xml。

前台皮肤切换

通过 URL 带参(比如 http://88250.b3log.org/?skin=Finding)来确定渲染使用的皮肤。

使用场景举例:

  1. 只有在首页(/)会取参数skin=xxx
  2. 如果带有就记录到 Cookie 里面,如果带有skin=default或皮肤不存在则清空 Cookie
  3. 如果要切换成后台默认的皮肤,在首页带参skin=default

站外相关文章

“站外相关文章”指的是其他人使用 Solo 发布的文章,该文章含有与你的文章相同的标签。该功能主要是为了加强各个 Solo 博客之间的互动性,让博客访问者可以更有效地访问到相关的内容。

这是 B3log 构思的一部分实现,请大家积极参与进来 🙏

自动同步 GitHub 仓库

自动同步仓库包含了两个功能:

  1. 每 24 小时定时拉取用户 GitHub 账号下的公有仓库,然后生成一篇文章并在加入到导航中,实际效果请参看这里
  2. 每 24 小时定时导出用户的公开文章到用户的 GitHub 仓库(solo-blog),实际效果请参考这里

FAQ

服务器内存太小?

可以考虑使用内嵌的 H2 数据库代替 MySQL。如果一台服务器上要部署多个 Solo,可以考虑通过 war 包方式将它们部署到同一个 Tomcat/Jetty 中运行。

但建议还是进行内存升级,然后使用 Docker 和 MySQL 部署,这样不仅可以通过更新镜像进行平滑升级,还能使用 MySQL 相关工具更方便地进行数据库运维。

如何引入自定义静态资源,比如 .mp3?

请通过 NGINX 反代静态资源实现。

如何获得更好的 Markdown 渲染效果?

Solo 默认是使用内建的 flexmark 进行 md 渲染,可能对有的场景下的渲染效果不是很好。如果你想要获得更好的 md 渲染效果请参考这里

为什么在线访问计数一直都是 1?

在线访问计数是通过访问者 IP 去重的,每 10 分钟定时刷新一次。如果用了反向代理,请在代理配置部分加入客户端地址标头。比如 NGINX 需要加入如下配置:

proxy_set_header  X-Real-IP  $remote_addr;

Solo 会一直维护下去么?

Solo 的第一个版本发布于 2010 年,永不断更 😼

Solo 从第一版开始就支持平滑升级,从 v3.0.0 开始支持跨版本升级。在程序升级、数据兼容迁移方面我们做了很多工作。另外,Solo 还支持将数据导出成多种格式,所有的这些努力为的就是让大家能够免去后顾之忧,将自己的精力放在记录和分享上。

当然,也欢迎大家一起来学习、折腾 Solo 程序本身,因为开源项目参与者越多,说明这个项目生命力越旺盛 ❤️

结语

如果你在使用 Solo 过程中碰到问题或者有需求要提,欢迎跟帖,我们会在第一时间回复。另外,如果你想对 Solo 进行定制开发,请参考 Solo 从设计到实现

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。

    Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
    具体细节请浏览 B3log 构思

    629 引用 • 4803 回帖 • 719 关注
  • 安装

    你若安好,便是晴天。

    52 引用 • 749 回帖
  • 文档
    51 引用 • 912 回帖 • 1 关注
233 回帖   
请输入回帖内容...
  • Jackson    

    可以了,是生成的证书认证有问题,我改用另外的生成方式了,🙏

  • Uambiguous  

    使用 marked 端口也存活,还需要其他什么步骤才能实现前端 Markdown 渲染效果吗?

    1 回复
  • 88250    

    重启 Solo,日志会打印出当前的 markdown 引擎。

    1 回复
  • Uambiguous    

    可以修改渲染样式吗?

    1 回复
  • 88250    

    改代码吧。

  • qingsi  

    [org.b3log.latke.Latkes:878]: Read skin configuration error[msg=null]
    [org.b3log.solo.SoloServletListener:304]: Can't load the default skins, please make sure skin [Jane] is under skins directory and structure correctly
    楼主,我在启动的时候没有读到这个配置文件有点奇怪,可以帮忙看看不

    不好意思,我原来皮肤放在了另外的仓库了。我再看看,不好意思。

  • weiweihacpai  

    你好,服务器只有 IP 没有域名不能部署吗,已经在配置文件中将服务器指向云主机的 IP 了,可是用 IP 访问显示配置错误

    1 回复
  • 88250    

    可以配置为 IP 的,具体请 F12 查看网络请求。

  • hwj19941028  

    D 老师, 你好. 我用 Nginx 代理 8080 端口以后. 部分字体和看板娘出现了跨域问题, 访问不到. 修改了半天 nginx 配置文件, 还是没有解决. 这块应该怎么设置

    imagepng

    1 回复
  • samye  

    支持泛域名解析吗?比如 A 博客自定义使用域名 a.blog.solo.org,B 博客自定义使用 b.blog.solo.org 访问,不自定义的,通过 blog.solo.org/a,blog/solo.org/b 访问

    1 回复
  • 88250    

    NGINX 上配置跨域头,网上搜搜能解决。

  • 88250    

    Solo 主要是单人、团队博客,不是博客平台。如果要搭建多人独立博客的话,可以部署多个 Solo 在同一个容器,然后配置容器的“虚拟主机”。

    1 回复
  • samye    

    😂 我一直以为是多用户的博客平台,pipe 也是单人 / 团队博客平台吧?

    1 回复
  • 88250    

    Pipe 是多用户博客平台。

  • smq  

    D 大,貌似不能自动建库啊。

    imagepng

    1 回复
  • 88250    

    初始化完了才自动建,等有空我调整一下。

    1 回复
  • smq    

    😳 这回复也太快了吧 [手动捂脸]

  • mindops  

    配置里的staticServePath是不是拼写错了,不应该是staticServerPath吗?
    还有一个问题,nginx 反向代理如何优雅配置 "contextPath", 现在通过域名访问,必须要输入 contextPath 才能访问到,latke.properties 里配置了 contextPath 页面都打不开了,返回空白。

    1 回复
  • 88250    

    1. staticServePath 没有错
    2. Latke 配置剖析

  • niuniu  

    D 大, 我博客改地址了, 在使用新的地址采用 github 授权登录时, 总显示 "403 Forbidden!", 我去 github 中将授权的 b3blog 删除重新授权也不行, 总显示 Forbidden. 主要是不打算换 github 邮箱. 博客地址从 http://niuniu.hicp.net 改到了 http://blogs.gicp.net , 不管怎么操作都无法正常使用 github 登录, 求救啊, 多谢!

    1 回复
  • zxniuniu    

    D 大, 对, 用户名, 邮箱两边都一样, 连密码都一样, 还是不行, 很是尴尬啊.

    1 回复
  • 88250    

    博客设置里面要打开开放注册。

  • zxniuniu  

    感谢 D 大, 大新年的, 还这么敬业😄 , 我博客是开放注册的, 采用域名 http://blogs.gicp.net 还是不行, 不过我采用 https 后, 使用域名 https://fuyiyi.imdo.co 就可以了, 所以准备把博客 http://niuniu.hicp.net 迁移到 https://fuyiyi.imdo.co 中. 再次感谢 D 大!😂

  • zxniuniu  

    D 大, 再请教个问题, 如果文件上传采用的是本地, 即配置了 uploadDir 参数的本地路径, 那在搭建 solo 集群时如何解决这个文件同步问题. 目前可选的方案, 如 smb,ftp 等, 均需要改文件上传的方法 (这个方法版本更新后又得编译),D 大有没有推荐的方法.

    1 回复
  • 88250    

    挂共享文件存储。另外,Solo 的会话不支持集群,还有缓存也会不一致。个人博客怕是没必要上集群高可用吧 😂

  • haoran  

    Found lambda method reference impl method failed!
    19 年更新的 solo 发布不成功,老铁们帮忙看看啥情况啊

    1 回复
  • 88250    

    使用 JDK8+

    1 回复
  • haoran        

    该内容仅作者和楼主可见。

    该回帖仅作者和楼主可见,回帖作者和楼主可点击展开浏览
  • jruguang      

    该内容仅作者和楼主可见。

    该回帖仅作者和楼主可见,回帖作者和楼主可点击展开浏览
    1 回复
  • 88250    

    感谢反馈,是个缺陷,麻烦拉一下最新代码进行构建。

    1 回复
  • jruguang        

    该内容仅作者和楼主可见。

    该回帖仅作者和楼主可见,回帖作者和楼主可点击展开浏览
    1 回复
  • javaFile  

    初始化失败

    1 回复
  • 88250    

    现在应该可以用了吧。

  • 88250    

    麻烦贴一下错误日志,暂时不要使用截图,谢谢。

  • javaFile      

    该内容仅作者和楼主可见。

    该回帖仅作者和楼主可见,回帖作者和楼主可点击展开浏览
  • 912317966  

    [org.b3log.latke.plugin.PluginManager:148]: Load plugin under directory[/plugins/list/] failed
    java.lang.NullPointerException
    at java.base/java.util.ArrayDeque.addLast(ArrayDeque.java:304)
    at java.base/java.util.ArrayDeque.add(ArrayDeque.java:495)
    at java.base/jdk.internal.loader.URLClassPath.(URLClassPath.java:154)
    at java.base/jdk.internal.loader.URLClassPath.(URLClassPath.java:171)
    at java.base/java.net.URLClassLoader.(URLClassLoader.java:120)
    你好,请问这个 plugin 加载不了是怎么回事

    1 回复
  • 88250    

    有可能是打包问题,请问是你自己打包的还是下载的发布包?

    1 回复
  • 912317966    

    我下载的是发布包 3.0.0 版本的

  • shenmueta  

    同 @912317966 问题,github 拉的代码, 使用 tomcat 启动加载插件时报
    ava.lang.NullPointerException
    at java.base/java.util.ArrayDeque.addLast(ArrayDeque.java:304)
    at java.base/java.util.ArrayDeque.add(ArrayDeque.java:495)
    at java.base/jdk.internal.loader.URLClassPath.(URLClassPath.java:154)
    at java.base/jdk.internal.loader.URLClassPath.(URLClassPath.java:171)
    at java.base/java.net.URLClassLoader.(URLClassLoader.java:120)
    at org.b3log.latke.plugin.PluginManager.load(PluginManager.java:185)
    at org.b3log.latke.plugin.PluginManager.load(PluginManager.java:142)
    at org.b3log.solo.SoloServletListener.contextInitialized(SoloServletListener.java:114)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4579)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5041)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:742)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:718)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
    具体异常处见图
    TIM图片20190220174842.png

    1 回复
  • 88250    

    这个问题有点不好定位,能使用 mvn jetty:run 启动看看吗?

    1 回复
  • shenmueta    

    额, 还是同样的问题 下面
    plugin = kanbanniang
    而 servletContext.getResource("/plugins/" + plugin + "classes");
    尝试寻找 /plugins/kanbanniangclasses
    /plugins/kanbanniang/ 目录没有 kanbanniangclasses 导致
    不知对不对

            String plugin = StringUtils.substringAfter(pluginDirPath, "/plugins");
            plugin = plugin.replace("/", "");
    
            final File file = Latkes.getWebFile("/plugins/" + plugin + "/plugin.properties");
            props.load(new FileInputStream(file));
    
            final URL defaultClassesFileDirURL = servletContext.getResource("/plugins/" + plugin + "classes");
    
    1 回复
  • 88250    

    感谢反馈,稍后我再仔细看下。

  • julee  

    为什么没有看到正常的移动端皮肤?

    1 回复
  • 88250    

    基本所有皮肤都是自适应移动端的,如果需要指定移动端皮肤,可以通过配置 solo.props 中的 mobile.skin

  • Uambiguous  

    MySQL 的版本还是只能用 5.5 吗?支持 5.7 不?

    1 回复
  • 88250    

    建议用 MySQL 8

  • Volong

    D 大,复杂的数学公式不显示,typora 跟 cmdmarkdown 都可以显示出来。

    md 如下:

    $$
    N = \sum_r d_r \cdot N_r
    $$
    
    $$
    P(w_i|w_{i-1}) = \begin{cases} 
    f(w_i|w_{i-1}) \,\,\,\qquad \, \#(w_{i-1}, w_i) \ge T \\
    f_{gt}(w_i|w{i-1}) \quad \, 0 \lt \#(w_{i-1, w_i}) \lt T \\
    Q(w_{i-1}) \cdot f(w_i) \,\,\, 其它
    \end{cases}
    $$
    

    solo 显示如下:
    image.png

    3 回复
  • 88250    

    收到,稍后改进。
    @Vanessa

请输入回帖内容...