"简介 [链接] 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的[链接],文章自动推送到社区后可以让很多人看到,产生丰富的交流互动。 安装 本地试用 [链接]最新的 Solo 包解压,进入解压目录执行: Windows: java -cp 'WEB-INF/lib/*;WEB-INF/classes .."

Solo 用户指南

简介

Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,文章自动推送到社区后可以让很多人看到,产生丰富的交流互动。

安装

本地试用

下载最新的 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

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

浏览器直接打开可能会出现编码,可使用阅读器查看。

Sitemap

自动生成全站文章的 sitemap.xml,有利于 SEO。

前台皮肤切换

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

使用场景举例:

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

站外相关文章

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

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

FAQ

服务器内存太小?

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

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

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

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

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

如何指定移动端皮肤

可在 solo.props 中配置 mobile.skin 来指定移动端访问时的皮肤。请配置成目录名,区分大小写。

结语

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

感谢    关注    收藏    赞同    反对    举报    分享
228 回帖    
请输入回帖内容...
  • 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   1 感谢      

    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   1 感谢            

    额, 还是同样的问题 下面 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

    感谢    赞同    反对    举报    分享       评论    回复
  • Vanessa   1 感谢            
    感谢    赞同    反对    举报    分享       评论    回复
请输入回帖内容...