💡 简介

Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。
这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
欢迎到 Solo 官方讨论区了解更多。同时也欢迎关注 B3log 开源社区微信公众号 B3log开源
notion image
notion image

✨ 功能

  • Markdown / Emoji
  • 自定义导航链接
  • 随机文章 / 相关文章 / 置顶 / 更新提醒
  • 自定义文章永久链接 / 签名档
  • 配置站点 SEO 参数 / 公告 / 页脚
  • 代码高亮 / 数学公式 / 流程图 / 五线谱
  • 多语言 / 国际化
  • 友情链接管理
  • 多用户写作,团队博客
  • SQL / JSON / Markdown 导出
  • Atom / RSS / Sitemap
  • CDN 静态资源分离

🛠️ 安装

Solo 支持“动静两用”:
  • 动态博客:在服务器上搭建,进程常驻内存运行,在线使用
  • 静态博客:在本地电脑运行,写作完成后生成导出静态站点

本地运行

本地运行主要用于试用或者生成静态站点,生成静态站点的用法请参考这里
下载最新的 Solo 包解压,进入解压目录执行:
  • Windows: java -cp "lib/*;." org.b3log.solo.Server
  • Unix-like: java -cp "lib/*:." org.b3log.solo.Server
如果你有 Java 开发环境,可参考这里通过源码构建运行。
本地运行

Docker 部署

Docker 方式部署是动态博客用法,主要用于在服务器上部署动态博客。

获取最新镜像

docker pull b3log/solo

启动容器

    • 使用 MySQL 先手动建库(库名 solo ,字符集使用 utf8mb4 ,排序规则 utf8mb4_general_ci ),然后启动容器:
      docker run --detach --name solo --network=host \ --env RUNTIME_DB="MYSQL" \ --env JDBC_USERNAME="root" \ --env JDBC_PASSWORD="123456" \ --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \ --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" \ b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=
      为了简单,使用了主机网络模式来连接主机上的 MySQL。
    • 使用 H2 Database
      docker run --detach --name solo --volume ~/solo_h2/:/opt/solo/h2/ --publish 8080:8080 \ --env RUNTIME_DB="H2" \ --env JDBC_USERNAME="root" \ --env JDBC_PASSWORD="123456" \ --env JDBC_DRIVER="org.h2.Driver" \ --env JDBC_URL="jdbc:h2:/opt/solo/h2/db;MODE=MYSQL" \ b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost --server_port=
启动参数说明:
  • --listen_port :进程监听端口
  • --server_scheme :最终访问协议,如果反代服务启用了 HTTPS 这里也需要改为 https
  • --server_host :最终访问域名或公网 IP,不要带端口
  • --server_port :最终访问端口,使用浏览器默认的 80 或者 443 的话值留空即可
完整启动参数的说明可以使用 -h 来查看。

日志配置

默认通过 log4j2 将日志打印到标准输出流,可以通过 docker logs solo 进行查看。如果需要覆盖 log4j 配置,可通过挂载文件实现:
--volume ~/log4j2.xml:/opt/solo/log4j2.xml

皮肤配置

如果要使用其他皮肤,可以挂载目录 skins(里面需要包含所需使用的所有皮肤):
--volume ~/skins/:/opt/solo/skins/

版本升级

  1. 拉取最新镜像
  1. 重启容器
可参考这里编写一个重启脚本,并通过 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 $http_host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 10m; }}
请务必配置
proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;
否则访问页面可能会出现“Latke 配置错误”;统计在线访客功能会不正常。

初始化后

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

信息配置

  • 博客基本信息:标题、子标题、SEO 信息
  • HTML head:可以配置脚本,比如百度统计
  • 公告:可以使用 HTML 和脚本进行配置
  • 页脚:主要用来放备案信息,也可以使用 HTML 和脚本进行配置

签名档

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

参数设置

下面是一些比较有特色或重要的参数:
  • 列表显示方式:仅标题/标题 + 摘要/标题 + 正文
  • 各种分页参数
  • 文章更新提示:启用后一旦某篇文章更新过,则会在文章标题处显示“有更新”的提示,并且排序靠前
  • 允许同步 GitHub 仓库:将文章数据自动导出到 GitHub 仓库,用于展示和备份

备份

安全第一,血泪的教训 😢
  • H2:备份用户 home 目录下的 solo_h2 文件夹
  • MySQL:使用 MySQL 相关备份工具
另外,如果开启了自动备份社区功能,则会定时 24 小时自动备份所有文章到社区,请参考 Solo 拉取 GitHub 仓库和自动备份

其他一些特性

多用户

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

RSS/Atom/Sitemap

提供两种订阅供稿:Atom 1.0、RSS 2.0:
  • Atom: /rss.xml
  • RSS: /atom.xml
不要用浏览器直接打开,请通过阅读器查看。另外,Solo 也能生成全站文章的 sitemap.xml。

前台皮肤切换

通过 URL 带参(比如 http://88250.b3log.org/?skin=Finding )来确定渲染使用的皮肤。
使用场景举例:
  • 在不安装 Solo 的情况下可以方便预览各个皮肤(在 Demo 上)
  • 方便二次开发时集成切换皮肤
  • 博主可以让访客体验到不同的效果,比如:这个皮肤好看?还是这个好看?
  1. 只有在首页( / )会取参数 skin=xxx
  1. 如果带有就记录到 Cookie 里面,如果带有 skin=default 或皮肤不存在则清空 Cookie
  1. 如果要切换成后台默认的皮肤,在首页带参 skin=default

站外相关文章

“站外相关文章”指的是其他人使用 Solo 发布的文章,该文章含有与你的文章相同的标签。该功能主要是为了加强各个 Solo 博客之间的互动性,让博客访问者可以更有效地访问到相关的内容。
这是 B3log 构思的一部分实现,请大家积极参与进来 🙏

FAQ

服务器内存太小?

可考虑使用 Solo 的静态站点支持,本地写作完成后导出静态站点,发布 GitHub Pages 等服务。
如果还是想使用动态博客的话,可使用内嵌的 H2 数据库代替 MySQL。但建议还是进行内存升级,然后使用 Docker 和 MySQL 部署,这样不仅可以通过更新镜像进行平滑升级,还能使用 MySQL 相关工具更方便地进行数据库运维。

获取社区文件存储服务上传凭证异常?

请参考这里进行配置。

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

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

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

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

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

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

如何插入广告展位?

可通过签名档、公告栏中插入 HTML、JS 代码来实现。

如何放置备案信息?

可通过在页脚配置中插入 HTML、JS 代码来实现。

如何使用 jsDelivr CDN 来加速?

启动时加入命令行参数:
--static_server_scheme=https--static_server_host=cdn.jsdelivr.net--static_server_port=--static_path=/gh/88250/solo/src/main/resources
请注意,以上配置仅支持内置皮肤,如果挂载了第三方皮肤的话请按需调整。
作者:88250链接:https://hacpai.com/article/1492881378588来源:黑客派协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/
badge