使用halo快速搭建应用文档中心
背景
之前我写了一篇,用gitbook搭建文档中心,gitbook是一款搭建博客的技术,是静态博客技术,不带后台管理系统、不带数据库,要发文章的话,是通过提供markdown文件,渲染成html,通过nginx对外访问。后来也给他们展示过其他静态博客技术如docsify搭建出来的样子,我自己还是蛮喜欢的,比较简洁,但是产品最终还是选择了带后台管理系统的方案-halo。
这个halo,属于动态博客技术,国产的,java开发的,数据库支持h2(内存数据库,重启丢数据,不要用于生产)、postgreSql、mysql。既然是动态博客技术,那就是带后台管理系统的,适合给不懂技术的人员使用,好些人还是不习惯markdown的,markdown的话,图床也是个问题(倒是可以用公司内部的oss服务)。
这个方案还是比较适合我们这边,为啥呢,因为我们现在在搞信创,数据库是国产的,国产数据库有几款是基于pg改的,我们的国产数据库就属于pg改的,所以这个方案也能满足信创要求。
本文只是简单记录下搭建过程以及部分踩坑过程以备忘。
halo简介
演示站点:https://docs.halo.run/#在线体验
文档:https://docs.halo.run/category/安装指南
我们搭建出来的效果最终大概这样(用的earth主题):

搭建过程
docker安装
之前也写了个内网环境没网如何用rpm搭建docker的文章,后来有好心人提示我可以用更简单的办法。
可以参考官网这里,https://docs.docker.com/engine/install/binaries/
这个是直接利用静态链接的方式,把docker需要的所有的二进制都搞到这一个压缩包里了,比如说,大家安装nginx的时候,经常提示大家缺少了openssl、pcre等动态库,这种就属于动态链接了,其实你也可以不依赖系统的动态库,直接指定openssl、pcre的源码,然后直接编译进最终的nginx的二进制文件里,这种就是静态链接了,这种的问题是,如果运维统一升级了openssl这些,但你自己编译的这个nginx还是老版本,就会有风险,这里的这种docker安装方式,也是同样道理。
但是我这边反正是用这种方式,文档中心也不怎么重要,内网也很少遇到需要升级这些基础组件的场景,开整。
https://download.docker.com/linux/static/stable/x86_64/
下载了 docker-24.0.7.tgz
tar xzvf docker-24.0.7.tgz
cp docker/* /usr/bin/
[root@AppDevPlatform3 upload]# docker -v
Docker version 24.0.7, build afdd53b
启动:
dockerd &
检查:
[root@AppDevPlatform3 upload]# ps -ef|grep docker
root 1101154 1005806 1 15:34 pts/0 00:00:00 dockerd
root 1101163 1101154 0 15:34 ? 00:00:00 containerd --config /var/run/docker/containerd/containerd.toml
如果生产安装的话,可以再多搞点事,比如开机自启动、非root用户启动:
https://docs.docker.com/engine/install/linux-postinstall/
加载halo的image
有网络的话,这个就行:
https://hub.docker.com/r/halohub/halo
docker pull halohub/halo
内网机器没网的话,我是先在有网的机器上把镜像拉下来后,用docker save后传输到内网机器后,docker load来解决这个问题。(公司内docker私服ok也行,但是生产上我们这边是完全没网,估计还是得这样)

[root@xxx local-image]# docker load <halo.tar
01d4e4b4f381: Loading layer [==================================================>] 80.35MB/80.35MB
...
3.072kB/3.072kB
创建数据库
这个就大家自己弄吧,假设建了个库叫test,url为:1.1.1.1:5432/test
启动docker
我这边是没打算用docker compose方式,因为安装docker compose还要多费点事情,然后docker compose的话,是会自己给我们整一个halo进程 + mysql/postgre进程,我这边都有外置的db了,单跑个docker足矣。
docker run -it -d --privileged --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 halohub/halo:2.10
--server.port=8090
--spring.r2dbc.url=r2dbc:pool:postgresql://1.1.1.1/test?currentSchema=test
--spring.r2dbc.username=abc
--spring.r2dbc.password=def
--spring.sql.init.platform=postgresql
这块主要是数据库相关的参数,我这个是连接pg库的,参数的详细信息,大家参考官网文档:
https://docs.halo.run/getting-started/install/docker
我这边加了个--privileged参数,是因为我遇到个什么报错来着,启动不了,加了后就ok了。
参数详解:https://www.python100.com/html/100478.html
使用docker-compose启动(可选)
如果还是选择用docker-compose,这里也简单记录下,安装docker-compose插件:
https://docs.docker.com/compose/install/linux/#install-the-plugin-manually
然后就照着这里弄吧:
https://docs.halo.run/getting-started/install/docker-compose
我贴下我的配置:
docker-compose.yaml
version: "3"
services:
halo:
image: halohub/halo:2.10
container_name: halo
restart: on-failure:3
network_mode: "host"
volumes:
- ./halo2:/root/.halo2
ports:
- "8090:8090"
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://1.1.1.15432/test?currentSchema=abc
- --spring.r2dbc.username=abc
- --spring.r2dbc.password=def
- --spring.sql.init.platform=postgresql
- --server.port=8090
docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml logs -f
访问网站及后台
访问对应的ip:8090端口即可。
安装markdown插件
在内网服务器上安装会失败,因为这个需要请求外网服务器

离线安装markdown插件:
插件首页:
https://www.halo.run/store/apps/app-HTyhC


安装主题

如果安装报错,请检查“本地未安装”中是否存在未安装成功的主题。
备份恢复
这个功能对我很重要,我在开发环境搭好后,就是产品自己去搞成自己想要的效果了,为了避免转测试、上线后,他需要再重复弄,这个整站的迁移功能就很重要,省了我很多事。
https://docs.halo.run/user-guide/backup
使用该机制,可以快速备份环境再导入新环境,不用手动重新配置一遍。
搭建过程中涉及国产db的一个小坑
创建数据库时,我是新建了一个专门的用户,然后把新建的库分给这个用户。结果这个halo连上后,启动时,一直说用户名密码错误,但是同样的用户名密码,用dbeaver都是可以连接的,报错的就是程序会报错,当时还以为halo程序有问题。
后来也是抓包解决了:

是国产库那边,说,密码第一次设置后,首次使用的话,必须要再改一次还是怎么的,我改来改去都有问题。后来把问题反馈给那边,那边说这个首次使用的密码必须强制修改的机制可以关闭,也是坑爹。
遗留问题
我们现在要上生产的话,数据库密码必须是配置成加密的,所以,我这个上线部署方案估计都有点问题,后面可能还是要看下halo的代码,我大概知道是用spring boot 3.x + jdk 17搞的,密码加密不知道支持不,不支持的话,到时候还得二开一下。
结语
大概就是这些了,成都马上又迎来几个月的冬天了,瑟瑟发抖。
使用halo快速搭建应用文档中心的更多相关文章
- IDEA快速搭建 SpringCloud 注册中心与
第一步:创建 注册中心(eureka)项目 按照以下步骤一步一步来(只是对于IDEA的初学者来说) (我这里选择maven项目.比较方便) 给注册中心项目 取上可爱的名称 第二步配置 eureka的p ...
- 推荐一个vuepress模板,一键快速搭建文档站
介绍 vuepress-template是一个简单的VuePress案例模板,目的是让用户可以直接clone这个仓库,作为初始化一个VuePress网站启动项目,然后在这个项目的基础上新增自定义配置和 ...
- EpiiAdmin 开源的php交互性管理后台框架, 让复杂的交互变得更简单!Phper快速搭建交互性平台的开发框架,基于Thinkphp5.1+Adminlte3.0+Require.js。
EpiiAdmin EpiiAdmin php开源交互性管理后台框架,基于Thinkphp5.1+Adminlte3.0+Require.js, 让复杂的交互变得更简单!Phper快速搭建交互性平台的 ...
- spring boot / cloud (十七) 快速搭建注册中心和配置中心
spring boot / cloud (十七) 快速搭建注册中心和配置中心 本文将使用spring cloud的eureka和config server来搭建. 然后搭建的模式,有很多种,本文主要聊 ...
- .NetCore快速搭建ELK分布式日志中心
懒人必备:.NetCore快速搭建ELK分布式日志中心 该篇内容由个人博客点击跳转同步更新!转载请注明出处! 前言 ELK是什么 它是一个分布式日志解决方案,是Logstash.Elastaics ...
- 使用Docker快速搭建Halo个人博客到阿里云服务器上[附加主题和使用域名访问]
一.前言 小编买了一个服务器也是一直想整个网站,一直在摸索,看了能够快速搭建博客系统的教程.总结了有以下几种方式,大家按照自己喜欢的去搭建: halo wordpress hexo vuepress ...
- 搭建SpringCloud-Eureka 注册中心以及服务提供与调用 快速了解 SpringCloud-Eureka
原文地址: 搭建SpringCloud-Eureka 注册中心以及服务提供与调用 纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于spr ...
- 【Elastic-1】ELK基本概念、环境搭建、快速开始文档
TODO 快速开始文档 SpringBoot整合ELK(Logstash收集日志.应用主动向ES写入) ELK接入Kafka 基本概念 ElasticSearch 什么是ElasticSearch? ...
- Dubbo应用文档
Dubbo应用文档 Dubbo简介 概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架, ...
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...
随机推荐
- Python类型提示
摘自:Python 类型提示简介 - FastAPI (tiangolo.com) 快速入门 类型提示用于声明一个变量的类型,在Python 3.6+版本的时候引入. 示例: def get_full ...
- 调试linux内核(1): 环境准备和原理介绍
开篇 现在流行的开源项目经历了长时间的开发, 积累了大量的代码, 想要一行一行地阅读代码去学习开源项目, 需要的时间成本是巨大的. 所以, 我们也需要用一种高效的方式去"阅读"代码 ...
- Trino418版本动态加载catalog不需要重启集群修改思路及实现
熟悉Trino 的同学应该都知道Trino新增.删除 catalog 都需要重启集群,这个生产环境里如果需要频繁增加数据源的场景是非常不友好的操作. 网上关于动态加载Catalog ...
- 详情讲解canvas实现电子签名
签名的实现功能 我们要实现签名: 1.我们首先要鼠标按下,移动,抬起.经过这三个步骤. 我们可以实现一笔或者连笔. 按下的时候我们需要移动画笔,可以使用 moveTo 来移动画笔. e.pageX,e ...
- 《SQLi-Labs》02. Less 6~10
@ 目录 索引 Less-6 题解 原理 Less-7 题解 Less-8 题解 Less-9 题解 原理 Less-10 题解 sqli.开启新坑. 索引 Less-6:布尔盲注,字符型[" ...
- 手写raft(三) 实现日志压缩
手写raft(三) 实现日志压缩 在上一篇博客中MyRaft实现了日志复制功能,按照计划接下来需要实现日志压缩. 手写raft(一) 实现leader选举 手写raft(二) 实现日志复制 1. 什么 ...
- 淘宝详情api接口的应用
淘宝详情API接口是一个基于HTTP协议的接口服务,可用于获取淘宝商品的具体信息.下面将介绍如何调用淘宝详情API接口获取淘宝商品数据的步骤. 1.注册账号并创建应用 首先,我们需要进行账号注册.实名 ...
- 想让你的工作轻松高效吗?揭秘Java + React导出Excel/PDF的绝妙技巧!
前言 在B/S架构中,服务端导出是一种高效的方式.它将导出的逻辑放在服务端,前端仅需发起请求即可.通过在服务端完成导出后,前端再下载文件完成整个导出过程.服务端导出具有许多优点,如数据安全.适用于大规 ...
- Golang日志新选择:slog
go1.21中,slog这一被Go语言团队精心设计的结构化日志包正式落地,本文将带领读者上手slog,体会其与传统log的差异. WHY 在日志处理上,我们从前使用的log包缺乏结构化的输出,导致信息 ...
- mysql触发器使用教程-六种触发器
参考:https://zhuanlan.zhihu.com/p/439273702 触发器(Trigger)是 MySQL 中非常实用的一个功能,它可以在操作者对表进行「增删改」 之前(或之后)被触发 ...