🎸 B3log 分布式社区的 Java 博客端节点系统,欢迎加入下一代社区网络。B3log distributed community blog-end node based on Java, welcome to join the next generation community network.
Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。
这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
欢迎到 Solo 官方讨论区了解更多。同时也欢迎关注 B3log 开源社区微信公众号 B3log开源
:
目前内置的皮肤如下,可点击进行预览:
欢迎在这里推荐好看的皮肤,我们会尽量进行制作。
Solo 支持“动静两用”:
更多视频教程陆续制作中,欢迎到 B 站关注我:报废程序员D。
本地运行主要用于试用或者生成静态站点,生成静态站点的用法请参考这里。
(视频演示教程请看这里)
下载最新的 Solo 包解压,进入解压目录执行:
java -cp "lib/*;." org.b3log.solo.Server
java -cp "lib/*:." org.b3log.solo.Server
如果你有 Java 开发环境,可参考这里通过源码构建运行(视频演示教程请看这里)。
Docker 方式部署是动态博客用法,主要用于在服务器上部署动态博客。
(视频演示教程请看这里)
docker pull b3log/solo
注意:对于如下命令,如果你不确定如何使用 \
来进行换行,就不要换行了,一行内写完整条命令。
使用 MySQL
手动建库(库名 solo
,字符集使用 utf8mb4
,排序规则 utf8mb4_general_ci
):
create database solo default character set utf8mb4 collate utf8mb4_general_ci;
create user 'root'@'127.0.0.1' identified by '123456';
grant all privileges on *.* to 'root'@'127.0.0.1';
flush privileges;
启动容器:
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,目录结构请参考原版 skins:
--volume ~/skins/:/opt/solo/skins/
可参考这里编写一个重启脚本,并通过 crontab 每日凌晨运行来实现自动更新。
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 配置错误”或者样式异常;统计在线访客功能会不正常。
Solo 使用 木兰宽松许可证, 第2版 开源协议。
初始化成功后请务必查看自动发布的第一篇文章,里面有一些必要的操作,请务必完成。然后请到管理后台 -> 工具 -> 偏好设定中进行一下博客的细节配置。
最多可以配置 3 个签名档,发布文章的时候选择一个使用,可以使用 HTML 和脚本进行配置。
下面是一些比较有特色或重要的参数:
安全第一,血泪的教训 😢
可在工具 - 偏好设定 - 参数设置中勾选“备份所有文章到社区”,开启后将每隔 24 小时自动备份所有文章(包括草稿和加密文章)到社区,具体细节请参考 Solo 拉取 GitHub 仓库和自动备份。
可在工具 - 偏好设定 - 参数设置中填写 GitHub token,填写后将每隔 24 小时自动备份公开文章(不包括草稿和加密文章)到你的 GitHub 仓库 solo-blog
,具体细节请参考 solo-blog 仓库同步功能回来了。
可以几个用户同时使用一个博客发布文章,主要用在团队博客这个场景。权限方面做了简单隔离,非管理员用户可以看到其他用户的博文/评论列表,但是不能进行操作。
提供两种订阅供稿:Atom 1.0、RSS 2.0:
不要用浏览器直接打开,请通过阅读器查看。另外,Solo 也能生成全站文章的 sitemap.xml。
通过 URL 带参(比如 http://88250.b3log.org/?skin=Finding
)来确定渲染使用的皮肤。
使用场景举例:
/
)会取参数 skin=xxx
skin=default
或皮肤不存在则清空 Cookieskin=default
“站外相关文章”指的是其他人使用 Solo 发布的文章,该文章含有与你的文章相同的标签。该功能主要是为了加强各个 Solo 博客之间的互动性,让博客访问者可以更有效地访问到相关的内容。
这是 B3log 构思的一部分实现,请大家积极参与进来 🙏
Solo 和 Pipe 的定位是 B3log 分布式社区的博客端节点,并不是通常意义上的独立博客,所以账号体系需要进行统一,否则带来的问题会很多,这也是一路下来探索的,具体经历细节请看这里。
在 Solo v3 之前一直是独立账号体系,但经过长时间验证效果并不理想:
这两个问题是矛盾的,所以为了解决它需要将账号在 B3log 网络中进行唯一化。一开始的设计方案是通过公私钥(类似区块链的钱包原理),但这个方案在现阶段过于复杂,用户使用门槛有点高所以暂时放弃了。公私钥的方案在星火项目里进行过测试验证,技术上应该没问题,以后的鱼塘项目可能会采用这个方案。
所以再次重申一下,Solo 和 Pipe 是 B3log 分布式社区的博客端节点。举个最容易理解的例子,这就好比某些厂商的软件,没有这个厂商的账号是用不了的。打通其他网络的方案是在博客端或者社区端接入其他网络的账号,目前已经在链滴社区上接入 GitHub 登录(可在账号设置中绑定),Solo 可通过 GitHub token 来将文章同步到自己的仓库,避免整个 B3log 网络过度封闭内卷。
最后,希望目前加入到 B3log 的用户是认可这个设计的,如果不认可的话其实就没必要加入使用了,节省自己时间同时也能保护 B3log。当然,不排除以后设计还会有所变化,欢迎参与思考讨论,谢谢。
可考虑使用 Solo 的静态站点支持,本地写作完成后导出静态站点,发布 GitHub Pages 等服务。
如果还是想使用动态博客的话,可使用内嵌的 H2 数据库代替 MySQL。但建议还是进行内存升级,然后使用 Docker 和 MySQL 部署,这样不仅可以通过更新镜像进行平滑升级,还能使用 MySQL 相关工具更方便地进行数据库运维。
请在 pom.xml 中搜索 maven-assembly-plugin
的注释进行配置即可。请注意:使用 jar 运行不支持:
建议尽量不要打 jar 部署,服务器上请通过 Docker 部署。
请参考这里进行配置。
请通过 NGINX 反代静态资源实现。
Solo 默认是使用内建的 flexmark 进行 md 渲染,可能对有的场景下的渲染效果不是很好。如果你想要获得更好的 md 渲染效果请参考这里。
在线访问计数是通过访问者 IP 去重的,每 10 分钟定时刷新一次。如果用了反向代理,请在代理配置部分加入客户端地址标头。比如 NGINX 需要加入如下配置:
proxy_set_header X-Real-IP $remote_addr;
可通过签名档、公告栏中插入 HTML、JS 代码来实现。
可通过在页脚配置中插入 HTML、JS 代码来实现。
启动时加入命令行参数:
--static_server_scheme=https
--static_server_host=cdn.jsdelivr.net
--static_server_port=
--static_path=/gh/88250/solo/src/main/resources
请注意:
Solo 的第一个版本发布于 2010
年,永不断更 😼
Solo 从第一版开始就支持平滑升级,从 v3.0.0 开始支持跨版本升级。在程序升级、数据兼容迁移方面我们做了很多工作。另外,Solo 还支持将数据导出成多种格式,所有的这些努力为的就是让大家能够免去后顾之忧,将精力更多放在创作和分享上。
如果你在使用 Solo 过程中碰到问题或者有需求要提,欢迎跟帖,我们会在第一时间回复;如果你对 Solo 开发方面感兴趣,请参考 Solo 从设计到实现。