"简介 [链接] 是一款一个命令就能搭建好的 Java 开源博客系统,并内置了 15+ 套精心制作的皮肤。除此之外,Solo 还有着非常活跃的[链接],文章分享到社区后可以让很多人看到,产生丰富的交流互动。 Solo 的第一个版本发布于 2010 年,至今已经非常成熟稳定,请放心使用 安装 安装前先准备好 Java 环境 .."

Solo 用户指南

简介

Solo 是一款一个命令就能搭建好的 Java 开源博客系统,并内置了 15+ 套精心制作的皮肤。除此之外,Solo 还有着非常活跃的社区,文章分享到社区后可以让很多人看到,产生丰富的交流互动。

Solo 的第一个版本发布于 2010 年,至今已经非常成熟稳定,请放心使用 😼

安装

安装前先准备好 Java 环境,请使用 JDK8 或以上版本。war 包可以自行通过 maven 构建或者下载我们构建好的包。

Solo 提供了两种部署模式,分别是独立模式和容器模式。数据库默认是使用内嵌的 H2 数据库,也支持 MySQL,稍后会详细介绍。

对于系统内存要求,最低 512M,推荐 1G。

独立模式

独立模式使用内嵌的 Jetty 容器进行部署,解压 war 包后仅需要一个命令就能启动:

启动正常的话打开浏览器访问 http://localhost:8080 就可以看到初始化向导界面了。如果要修改监听端口或者覆盖 latke.props 配置项,请参考 -h 帮助。

注意:上面的命令都是前台运行的,退出 shell 后会被终止。比如 Linux 上不中断运行需要使用 nohup,比如这样 nohup java -cp WEB-INF/lib/*:WEB-INF/classes org.b3log.solo.Starter >/dev/null 2>&1 &

容器模式

使用 Jetty 或者 Tomcat(版本要求至少 9)进行部署,将 war 包放到容器的 webapps 目录下即可。访问时需要带上下文路径(容器自动解压 war 后的目录名),比如 http://localhost:8080/solo

独立 vs 容器

两种模式各有千秋:

Docker

推荐使用 MySQL 作为数据库。如果你使用 H2,数据库文件将会自动保存在 docker 卷 中。

docker volume create solo_datas && docker run --name solo --restart=unless-stopped -p 8080:8080 -v solo_datas:/opt/b3log/backup/ -d b3log/solo
环境变量 描述 可选值 默认值
DATABASE_TYPE 数据库类型, H2 或 MySQL h2, mysql h2
DATABASE_HOST 数据库地址或 IP, 针对 MySQL localhost
DATABASE_PORT 数据库端口, 针对 MySQL 3306
DATABASE_NAME 数据库名称, 针对 MySQL solo
DATABASE_USERNAME 数据库用户名, 针对 MySQL root
DATABASE_PASSWORD 数据库密码, 针对 MySQL
SERVER_SCHMEA Server schema https,http http
SERVER_NAME 服务器名称或域名 localhost

细节配置

主要的配置文件有两个,它们都存放在 WEB-INF/classes 目录下。

另外,千万不要手动修改数据库,否则可能会引发各种莫名其妙的问题。

CDN 加速

我们提供了 Solo 静态资源的 CDN 加速,如果你正在使用 最新版本 的 Solo,可以在 latke.props 中加上如下配置:

staticServerScheme=https
staticServerHost=static-solo.b3log.org

皮肤

下载的 war 包中自带了所有官方皮肤,如果你是自己拉源码构建的,可以到这里下载皮肤。

皮肤放到 skins 目录下后重启服务,在工具 -> 偏好设定 -> 皮肤中选择使用即可。

NGINX 示例

upstream backend {
    server localhost:8080; # Tomcat/Jetty 监听端口
}

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 数据导入

备份

安全第一,血泪的教训 😢

war 包

如果你修改过代码请记得备份整体的 war 包,如果没有修改过则只用备份下面的配置文件。

配置文件

进行版本升级时需要,建议备份 WEB-INF/classes/ 目录下的这两个配置文件

数据库

强烈建议定时备份数据!!!

升级

使用在跑着的老版本的配置文件覆盖新版本 war 中的(或者重新再配置一次),然后直接部署就好,启动时会自动进行升级。要确认升级是否成功的话留意一下日志,或者查看 option 表中的 version 行。

注意:v3 之前不支持跨版本升级,下面是两位用户升级 Solo 的经验分享,请参考一下:

v3 之后支持跨版本升级,可直接部署最新版,会从当前版本自动升级到最新版。升级过程可能会需要重启服务,请留意日志输出。

其他一些特性

多用户

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

RSS/Atom

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

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

Sitemap

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

前台皮肤切换

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

使用场景举例:

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

站外相关文章

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

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

FAQ

初始化卡住

如果初始化向导页面已经正常显示,但是填完表单后点击“初始化”按钮后卡住,说明可能是 serverPort 、或者 serverHost 没有配置正确。域名和端口必须配置为浏览器访问时候的域名和端口,请注意端口并不是容器启动的监听端口;域名要注意是否带了 www,否则会引起跨域问题导致 JS 异常。

请在浏览器中 F12 查看网络请求来定位该问题。

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

请参考 WEB-INF/static-resources.xml 中的配置,加入自定义资源的路径匹配后重启。

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

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

移动端访问时皮肤不好看

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

结语

如果你在使用 Solo 过程中碰到问题或者有需求要提,欢迎跟帖,我们会在第一时间回复,让我们一起度过一段美好的时光。另外,如果你想对 Solo 进行定制开发,请参考 Solo 开发指南

感谢    关注    收藏    赞同    反对    举报    分享
206 回帖    
请输入回帖内容...
  • Vanessa            

    in commonmark, \符号 会被转译,因此需要需再多一个斜杠即可。

    $$
    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}
    $$
    

    $$ 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} $$

    1 回复 
    感谢    赞同    反对    举报    分享       回复
  • Volong            

    除了这个,还有其他的解决办法吗?如果这样操作的话,我要将之前的公式都这样改一遍😭

    1 回复 
    感谢    赞同    反对    举报    分享       回复
  • Vanessa            

    写个程序批量替换下?

    1 回复 
    感谢    赞同    反对    举报    分享       回复
  • Volong            

    doge

    感谢    赞同    反对    举报    分享       回复