前言
之前在 Halo 1.0 时,是直接使用 jar 部署的,每次更新啥都还是有点麻烦,这次直接使用 Docker Compose 部署,省时省事,建站必备。
环境搭建
因为是使用 Docker Compose 部署,所以需要安装 Docker 和 Docker Compose 。
Docker 安装
主要是参考官方文档安装。
- Uninstall old versions
1
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
- Set up Docker’s apt repository
1
2
3
4
5
6
7
8
9
10
11
12
13# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update - Install the latest version Docker packages
1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- Verify that the Docker Engine installation
1
sudo docker --version
- Use docker without sudo
1
2
3sudo groupadd docker
sudo usermod -aG docker $USER
grep docker /etc/group
Docker Compose 安装
主要是参考官方文档安装。
- download and install the Compose CLI plugin可能服务器没法下载github的链接,可以本地下载 docker-compose-linux-x86_64 这个文件,改名字成 docker-compose ,然后 scp 传到服务器
1
curl -SL https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
/usr/local/lib/docker/cli-plugins/
这个路径下 - Apply executable permissions to the binary
1
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
- Test the installation
1
2docker compose version
Docker Compose version v2.23.0
创建容器组
- 在系统任意位置创建一个文件夹,我用的是之前 1.0 时候的 ~/halo
1
mkdir ~/halo && cd ~/halo
- 创建 docker-compose.yaml
这里创建 Halo + MySQL 的实例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
59version: "3"
services:
halo:
image: halohub/halo:2.10
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/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=o#DwN&JSa56
- --spring.sql.init.platform=mysql
# 外部访问地址,如果设置了域名反代直接写https://xxx.com,没有就先把localhost替换成服务器ip,后面设置了域名反代再修改
- --halo.external-url=http://localhost:8090/
halodb:
image: mysql:8.1.0
container_name: halodb
restart: on-failure:3
networks:
halo_network:
command:
- --default-authentication-plugin=caching_sha2_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=o#DwN&JSa56
- MYSQL_DATABASE=halo
networks:
halo_network: - 启动 Halo 服务
第一次会自动下载 halo 和 halodb 镜像1
2
3
4
5
6# 进入 ~/halo 目录下,启动 halo
docker compose up -d
# 关闭 halo
docker compose down
# 实时查看日志
docker compose logs -f - 用浏览器访问
http://ip:端口号/console
即可进入 Halo 管理页面,首次启动会进入初始化页面,可以设置密码、导入文件这些
Halo 1.0数据迁移
安装插件
因为 Halo 2.0 的底层架构变动,无法兼容 1.x 的数据,导致无法平滑升级。所以需要使用官方给的迁移插件,才能进行数据迁移。
点击侧边栏应用市场
,搜索安装一下几个插件:
- 站点迁移
- Markdown 编辑器插件
- 友情链接、日志、图库插件
导出 Halo 1.0 数据
在 Halo 1.0 后台,依次点击系统-小工具-博客备份-数据导出
,将json格式数据下载。
数据导入 Halo 2.0
- 安装完插件后,点击左侧菜单的迁移进入迁移页面。
- 点击
选择文件
按钮,选择在 Halo 1.0 导出的数据文件(JSON 格式)。 - 如果在 1.0 中使用了云存储,会弹出选择云存储的对话框,选择之前创建的存储策略即可。
- 最后点击页面下方的
执行导入
即可。
反向代理
做完上面的操作,你就可以通过http://ip:端口号/
来访问你的博客了,和之前 Halo 1.0 内容应该差别不大。但是你肯定不想暴露自己的ip和端口到公网,那就需要用到反代神器 Nginx Proxy Manager(NPM) 了。
NPM 介绍
顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。
即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。
Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。
NPM 安装
- 停止 nginx、apache2、halo 1.0,不然会占用端口
1
2
3
4
5
6
7
8# 关闭进程
sudo service nginx stop
sudo service apache2 stop
sudo service halo stop
# 禁止开机自启动
sudo systemctl disable nginx.service
sudo systemctl disable apache2.service
sudo systemctl disable halo.service - 创建一个文件夹来存放 NPM 的数据和证书
1
mkdir -p ~/data/docker_data/nginxproxymanager
- 修改上面 ~/halo/docker-compose.yaml 文件,将 NPM 和 Halo 部署放在同一个文件
1
2
3
4
5
6
7
8
9
10
11# 参考原来的布局,在services子类下添加
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ~/data/docker_data/nginxproxymanager/data:/data # 冒号左边是创建一个 data 目录,用于存放数据,如果不存在的话,会自动>创建
- ~/data/docker_data/nginxproxymanager/letsencrypt:/etc/letsencrypt # 创建一个 letsencrypt 目录,用于存放证书,如果不存在的话>,会自动创建 - 这样就可以通过
docker compose up -d
来启动 NPM 了
NPM 访问
浏览器输入ip:81
就可以访问 NPM 的网页端了。
默认登陆的用户名:admin@example.com
,密码:changeme
第一次登陆会提示更改用户名和密码,建议修改一个复杂一点的密码。
至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。
NPM 配置
依次点击Dashboard - Proxy Hosts - Add Proxy Host - Details
,分别填入以下信息
Domain Names
:填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上Scheme
:默认 http 即可,除非你有自签名证书Forward Hostname/IP
:填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)- 通过
ip addr show docker0
查看,inet 后面跟着的就是 Docker 容器内部的 IP
- 通过
Forward Port
:填入 Halo 映射出的端口,这边默认是 8090Cache Assets
:缓存,可以选择打开Block Common Exploits
:阻止常见的漏洞,可以选择打开Websockets Support
:WS 支持,可以选择打开
然后就是申请 SSL 证书。参考这篇文章进行申请,这里只讲怎么使用证书。
点击SSL
,SSL Certificate
选择上面申请的证书,打开Force SSL
,点击Save
即可。
至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!