2023.10.27日搭建

halo快速部署个人博客

技术方案

docker+docker-compose+nginx+mysql

halo简介

Halo是一款现代化的开源博客/CMS系统,所有代码开源在GitHub上且处于积极维护状态。它是基于 Java Spring Boot 构建的,易于部署,支持REST API、模板系统、附件系统和评论系统等功能。

Halo 作为一款好用又强大的开源建站工具,配合上不同的模板与插件,可以很好地帮助你构建你心中的理想站点。它可以是你公司的官方网站,可以是你的个人博客,也可以是团队共享的知识库,甚至可以是一个论坛、一个商城。

相关地址

开源仓库

halo-dev/halo: 强大易用的开源建站工具。 (github.com)

halo: 强大易用的开源建站工具。 (gitee.com)

中文文档

Halo 文档

社区

Halo 社区

官网

Halo 建站 - 强大易用的开源建站工具

主题仓库

应用市场 - Halo 建站 - 强大易用的开源建站工具

基础设置

关闭防火墙(docker启动之前关闭)

1
2
systemctl status firewalld
systemctl stop firewalld

docker

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1.卸载旧的版本
$sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.需要的安装包
$sudo yum install -y yum-utils
3.设置镜像的仓库(官方)
$sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo (官网速度慢)
$sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(推荐使用,阿里云速度快)
4.更新yum软件包索引
$sudo yum makecache fast
5.安装docker docker-ce 社区版 docker-ee 企业版
$sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
6.启动docker
$sudo systemctl start docker
7.查看docker是否安装成功
$sudo docker version

卸载

1
2
3
4
5
1.卸载依赖
$sudo yum remove docker-ce docker-ce-cli containerd.io
2.删除资源
$sudo rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径

阿里云镜像加速

1
2
3
4
5
6
7
8
9
10
配置镜像加速器
通过shell脚本追加文本内容
$sudo mkdir -p /etc/docker
$sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://f2k3b83v.mirror.aliyuncs.com"]
}
EOF
$sudo systemctl daemon-reload
$sudo systemctl restart docker

设置开机自动启动

1
#systemctl enable docker

查看docker服务状态

1
#systemctl status docker

查看docker具体信息

1
#docker info

docker-compose

这里采用离线安装,在线安装或多或少有各种问题

所有版本预览Releases · docker/compose (github.com)

1
2
3
4
5
6
7
8
9
10
#最好是进入到/usr/local/bin/目录下安装,我第一次在根目录下安装,报错docker-compose: command not found,第二次在上述目录下安装可以成功
#将文件上传到linux后,重命名
mv docker-compose-linux-x86_64.docker-compose-linux-x86_64 docker-compose


#添加可执行权限
chmod +x /usr/local/bin/docker-compose

#测试
docker-compose version

nginx反向代理配置

在系统任意位置创建一个 halo 文件夹,并创建多级目录

1
mkdir -p /halo/nginx/conf/

编写Nginx配置文件

1
2
3
4
vim /halo/nginx/conf/nginx.conf

vim: command not found
yum install vim -y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#user  root;
error_log /var/log/nginx/error.log notice;
worker_processes 1;

pid /var/run/nginx.pid;

events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 设置上传文件的最大值
client_max_body_size 256m;

upstream blog {
# 使用容器服务名
server halo:8090;
}

server {
listen 80;
# 可进行域名绑定
server_name nwth.xyz;
location / {
# 设置反向代理的地址(实际是请求转发)
proxy_pass http://blog;
# 设置HTTP请求头
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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

Docker-compose部署halo,mysql,nginx

1
vim /halo/compose.yaml

修改的自定义配置,找到下面的参数所在位置修改:

服务器或虚拟机ip:halo.external-url 中的 ip 设置,修改为自己的服务器ip地址。

超级管理员账号密码
账号 halo.security.initializer.superadminusername,我写的配置中是 admin
密码 halo.security.initializer.superadminpassword ,我写的配置中是 123456
mysql的root用户密码,以下两个参数的值都需要修改且必须保持一致
spring.r2dbc.password,我写的配置中是 123456
MYSQL_ROOT_PASSWORD,我写的配置中是 123456

==建议本地编辑再上传==

记得用notepad++打开编辑完成后,格式修改为UTF-8无BOM编码格式

要不然报错

parsing /root/halo/compose.yaml: yaml: invalid leading UTF-8 octet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
services:
halo:
image: halohub/halo:2.10
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=123456
- --spring.sql.init.platform=mysql
# 外部访问地址,我的服务器 ip 为8.130.97.145,此处需要修改为你自己的服务器或虚拟机 ip
- --halo.external-url=http://192.168.101.128:80/
# 初始化的超级管理员用户名
- --halo.security.initializer.superadminusername=admin
# 初始化的超级管理员密码
- --halo.security.initializer.superadminpassword=123456

halodb:
image: mysql:8.1.0
container_name: halodb
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:
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=halo

halonginx: # 服务名称,用户自定义
image: nginx:1.24.0 # 镜像版本
container_name: halonginx
# 链接到其它容器,能在 nginx.conf 反向代理配置时使用
links:
- halo
networks:
halo_network:
ports:
- 80:80 # 暴露端口
volumes: # 挂载
- /halo/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
privileged: true # 这个必须要,解决nginx的文件调用的权限问题

networks:
halo_network:

容器编排

1
2
3
4
5
6
7
8
# 1.进入 halo 目录
cd /halo

# 2.容器编排
启动并访问服务
docker-compose up -d
关停服务
docker-compose down
1
查看状态:docker ps

访问测试

http://【服务器或虚拟机ip】

初次访问有点慢

账号密码为compose.yml中填写的超级管理员的账号密码

admin/123456

基础操作

参考用户指南 | Halo 文档

主题

2.10版本加入了应用市场,可在其中下载安装喜欢的主题

Sakura

番外:有界面的反向代理神器 Nginx Proxy Manager

创建一个docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '8080:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

一键启动

1
docker-compose up -d

登录到管理界面

当docker容器跑起来后, 连接到81端口即可访问管理界面。有时候需要稍等一会儿。

访问:http://你的服务器IP:80

第一次登录的默认管理员账户:

1
2
Email:    admin@example.com
Password: changeme

第一次登陆后,你会立刻被要求修改登录密码和一些重要信息。

番外:twikoo部署

云函数部署 | Twikoo 文档

Halo Twikoo 插件以及 ssl 部署 | L’s Blog (liuocean.com)

ssl证书

cer和key

https://freessl.cn/

ACME v2证书自动化快速入门 (freessl.cn)

参考文章

Let’s Encrypt泛域名证书生成 acme.sh免费申请使用_letsencrypt泛域名-CSDN博客

https://guozh.net/acme-sh-gen-lets-encrypt-domain-ssl-tutorial/

番外:错误集锦

下面两处错误主要是nginx和nginx proxy端口冲突

Error response from daemon: driver failed programming external connectivity on endpo int nginx-proxy-manager-app-1 (b39ad26f01f7599bcee2fc11c042ea357c4b33369ccdd9effcdb7 97a92ce94e4): Bind for 0.0.0.0:80 failed: port is already allocated

1
2
3
4
5
6
7
8
9
10
查看docker 代理占用的端口
ps -aux | grep -v grep | grep docker-proxy
关闭docker 服务
sudo service docker stop
### 重启docker服务

sudo service docker start
还不行的话就
docker rm $(docker ps -aq)
sudo rm /var/lib/docker/network/files/local-kv.db

Error response from daemon: failed to update store for object type *libnetwork.endpointCnt: Key not found in store

1
2
3
4
5
# pkill docker
# iptables -t nat -F
# ifconfig docker0 down
# brctl delbr docker0
# service docker restart