说明
使用Halo快速搭建自己的博客网站
尝试了一下2.2.1版本,感觉不是很满意,2.x版本进行了暴力升级,和1.x不兼容
对我来说最主要的一点是2.x版本存储格式的变化,2.x版本文章会使用html格式存储
我希望的还是能保留markdown格式
环境
地址
- Halo1.6.1版本
- docker镜像地址:halohub/halo Tags | Docker Hub
- github地址:Release 1.6.1 · halo-dev/halo (github.com)
搭建环境
- centos7.9
- docker: 20.10.10
- Docker Compose version v2.15.1
- mysql: 5.7
- nginx version: openresty/1.19.9.1
搭建
官方
官方docker-compose将mysql和halo放在一起
由于我已经有mysql数据库了,就不采用这种方式了
version: "3"
services:
halo_server:
image: halohub/halo:1.6.0
container_name: halo_server
restart: on-failure:3
depends_on:
- halo_mysql
networks:
halo_network:
volumes:
- ./:/root/.halo
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8090:8090"
environment:
- SERVER_PORT=8090
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_DATASOURCE_URL=jdbc:mysql://halo_mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=o#DwN&JSa56
- HALO_ADMIN_PATH=admin
- HALO_CACHE=memory
halo_mysql:
image: mysql:8.0.27
container_name: halo_mysql
restart: on-failure:3
networks:
halo_network:
command: --default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
volumes:
- /etc/localtime:/etc/localtime:ro
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_DATASOURCE_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=o#DwN&JSa56
- MYSQL_DATABASE=halodb
networks:
halo_network:
mysql5.7
已存在的mysql5.7搭建方式: mysql - Official Image | Docker Hub
创建Halo需要的数据库
create database halodb character set utf8mb4 collate utf8mb4_bin;
Halo1.6.1
mkdir -p /opt/halo/data && cd /opt/halo
vim docker-compose.yml
version: "3"
services:
halo_server:
image: halohub/halo:1.6.1
container_name: halo
networks:
- halo_network
- mysql_network
volumes:
- ./data/:/root/.halo
ports:
- "8160:8090"
environment:
- TZ=Asia/Shanghai
- SERVER_PORT=8090
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql57:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=11xxOOxx
- HALO_ADMIN_PATH=admin
- HALO_CACHE=memory
networks:
halo_network:
57_mysql_network: # 默认网络名字
external: true
注意
- 修改数据库密码为你自己设置的密码
- 将halo加入MySQL的网络,就可以使用容器名称链接了
- MySQL的网络名称是 文件夹名字_网络名,具体可以用
docker network ls
查看具体名称 external: true
代表是外部网络
启动
docker-compose up -d
查看log
docker logs -f halo
连接数据库发现已经有表结构了
nginx配置
官方给出的代理
upstream halo {
server 127.0.0.1:8090;
}
server {
listen 80;
listen [::]:80;
server_name www.yourdomain.com;
client_max_body_size 1024m;
location / {
proxy_pass http://halo;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我开启了https,这里稍作修改,并且我配置了 www.sixmillions.cn
也跳转到 sixmillions.cn
server {
listen 443 ssl;
server_name sixmillions.cn;
ssl_certificate /root/.acme.sh/sixmillions.cn/fullchain.cer;
ssl_certificate_key /root/.acme.sh/sixmillions.cn/sixmillions.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
client_max_body_size 1024m;
location / {
proxy_pass http://127.0.0.1:8160;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location = /robots.txt {
default_type text/plain;
content_by_lua_block {
-- ngx.say('User-agent: *\nDisallow: /');
ngx.say('User-agent: *\nAllow: /');
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /uri {
stub_status;
}
}
server {
listen 80;
server_name sixmillions.cn www.sixmillions.cn;
rewrite ^/(.*)$ https://sixmillions.cn/$1 permanent;
}
server {
listen 443 ssl;
server_name www.sixmillions.cn;
ssl_certificate /root/.acme.sh/sixmillions.cn/fullchain.cer;
ssl_certificate_key /root/.acme.sh/sixmillions.cn/sixmillions.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
return 301 https://sixmillions.cn$request_uri;
}
修改后重启 nginx
初始化
访问halo地址
ip:端口号
域名:sixmillions.cn
填写信息后直接安装,安装后登录
进入就是博客的后端了
点击右上角跳转到首页,就能看到博客首页了
设置
附件设置
图片等附件默认上传到halo的本地,这里我们采用第三方存储
例如:阿里云OSS,腾讯云OSS,青云OSS等等
我这里使用的是自建的OSS:MinIO
修改目录
我想将附件按照年月日传入不同的文件夹,所以每天需要修改 minio_source
这个配置
设置一个定时任务,每天凌晨执行
直接调用api
1 0 * * * /opt/halo/change-oss-dir.sh >> halo_cron.log
#! /bin/bash -xv
echo "开始:$(date +%Y%m%d_%H%M%S)"
# 账号密码
username='admin'
password='admin123'
# 获取token
response1=$(curl -s -X POST "https://sixmillions.cn/api/admin/login" -H "Content-Type: application/json" -d "{\"username\":\"${username}\",\"password\":\"${password}\"}")
token=$(echo ${response1} | jq -r '.data.access_token')
# 修改oss的目录
today=$(date +%Y/%m/%d)
res=$(curl -s -X POST "https://sixmillions.cn/api/admin/options/map_view/saving" -H "Admin-Authorization: ${token}" -H "Content-Type: application/json" -d "{\"minio_source\": \"${today}\"}")
echo $res
echo "结束:$(date +%Y%m%d_%H%M%S)"
下面这个方法不好用
1 0 * * * /opt/halo/sql/exec.sh >> halo_cron.log
具体内容
mkdir /opt/halo/sql
vim exec.sh
#! /bin/bash -xv
SCRIPT_FILE=/opt/halo/sql/update_oss_config.sql
#执行sql
echo "开始:$(date +%Y%m%d_%H%M%S)"
cat ${SCRIPT_FILE} | grep -Ev '^$|#|--' > /tmp/tmp_$$.sql
echo '复制sql'
docker cp /tmp/tmp_$$.sql mysql57:/tmp/tmp.sql
echo '执行sql'
# 脚本中一定要加-u root,否则执行失败
docker exec -u root mysql57 sh -c "mysql -uroot -p11xxOOxx -Dhalodb < /tmp/tmp.sql"
echo '重启博客'
# 重启博客去掉缓存,其实不建议这么做,但是自己的博客无所谓了
docker-compose -f /opt/halo/docker-compose.yml restart
echo '删除临时文件'
rm -rf /tmp/tmp_$$.*
echo '结束:$(date +%Y%m%d_%H%M%S)'
具体执行sql: update_oss_config.sql
--每天更新一下图存储位置
UPDATE `options` SET option_value = DATE_FORMAT(CURDATE(), '%Y/%m/%d'), update_time = NOW() WHERE option_key = 'minio_source';
主题
xue
预览地址:https://github.com/xzhuz/halo-theme-xue/issues/67
介绍:https://halo.run/archives/theme-xue
仓库:https://github.com/xzhuz/halo-theme-xue
我的下载地址:https://s.sixmillions.cn/pkg/zip/halo-theme-xue-1.4.4.zip
版本说明
这里安装的是1.4.4版本
https://github.com/xzhuz/halo-theme-xue/archive/refs/tags/1.4.4.zip
joe2.0
预览地址:https://bbchin.com/
仓库:https://github.com/qinhua/halo-theme-joe2.0
我的下载地址:https://s.sixmillions.cn/pkg/zip/halo-theme-joe2.0-1.0.10.zip
作者写的使用文档
🌈 Halo-theme-joe2.0 食用文档 (bbchin.com)
🍭 Joe2.0 样式指南 (bbchin.com)
这里安装的是
https://github.com/qinhua/halo-theme-joe2.0/archive/refs/tags/1.0.10.zip
安装后需要设置密钥
- 安装主题后请务必到
后台管理 - 博客设置 - 高级选项
中开启API服务
并配置Access key
为joe2.0
(切记要和主题设置中的AccessKey
一致),不然部分用到Content API
的页面会请求失败并报错。(请参考以下报错)
“API has been disabled by blogger currently” —— 后台管理中未开启API服务
“API access key is mismatch” —— 主题中的 AccessKey 和后台管理中的不一致
-
如果你后台管理中之前已经配置了其它的
Access Key
(内容不是joe2.0
),那么需要你到本主题设置中的基本设置-AccessKey<必填>
同步一下这个Access key
,保证和后台中的一致即可(切记一致才行,且不要填写中文或特殊字符)。 -
有时,主题升级后配置项变化较大,直接访问博客可能会报错,导致页面渲染不出来。此时,只需要进入当前主题的设置界面执行一下保存操作来更新旧的配置,然后再访问页面即可;
-
有时,明明已经提示主题更新成功了,但访问博客时页面还是加载的旧版本的文件,可能是由于
主题激活状态不正常
或主题缓存的问题
导致的。此时,只需要先启用其他主题再启用本主题即可,建议每次更新主题之后都做一下这个操作(目前后台管理系统还不太完善)。 -
强烈建议每次更新主题后,务必先清空一下浏览器缓存,保证加载的资源都是最新版本的,不然可能有各种报错(你可以通过
Ctrl + F5
强制刷新或者Ctrl + Shift + DEL
情况浏览器所有缓存)。
修改图标
例如:
电子邮件服务
配置SMTP服务后,通过电子邮件及时收到消息,例如评论回复
头像
注册一个Gravatar头像,这样在支持Gravatar的博客就会显示你自己的头像
效果:
如果加载 https://cn.gravatar.com/
过慢,可以换 https://cravatar.cn
试一下
图标
可以从ali图标网下载一些图标当作博客标签或者文章的封面
下载后,通过后台的附件
传上去
评论区