准备
Halo 官方部署参考文档:
https://docs.halo.run/getting-started/install/docker-compose?current=halo-mysql
https://docs.halo.run/getting-started/install/other/traefik阿里云安装 docker compose
https://help.aliyun.com/zh/terraform/install-and-use-docker#ba0b2951bb2ay 阿里云我使用
Rocck Linux 9.8发行版为例。
阿里云控制台设置DNS 解析
同时也将traefik.你的域名 解析到你的公网IP上,便于后面通过域名访问traefik dashboard 。
准备 traefik 、MySQL镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/traefik:v3.6.2
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/traefik:v3.6.2 docker.io/traefik:v3.6.2拉取
MySQL 8.0镜像,略
部署traefik
创建halo项目路径,创建acme.json 存储traefik创建的证书信息
mkdir ~/halo
cd halo
touch acme.json
chmod 600 acme.json安装 httpd-tools为trafik dashboard创建加密用户名密码
sudo dnf install -y httpd-tools
[root@RockyLinux9 ~]htpasswd -nb admin mypassword1234 | sed -e 's/\$/$$/g'
admin:$$apr1$$KHASXqV7$$41yIaNanzzf1yqlq9BhwI
[root@RockyLinux9 ~]将加密后的
admin:$$apr1$$KHASXqV7$$41yIaNanzzf1yqlq9BhwI写到traefik.yaml中。
在 halo/ 中创建traefik.yaml 文件
networks:
traefik:
name: traefik
attachable: true
services:
traefik:
image: traefik:v3.6.2
container_name: traefik
networks:
- traefik
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./acme.json:/acme.json
command: >
--api.dashboard=true
--entrypoints.web.address=:80
--entrypoints.websecure.address=:443
--entrypoints.web.http.redirections.entrypoint.to=websecure
--entrypoints.web.http.redirections.entrypoint.scheme=https
--providers.docker=true
--providers.docker.endpoint=unix:///var/run/docker.sock
--providers.docker.watch=true
--providers.docker.exposedByDefault=false
--certificatesResolvers.myresolver.acme.httpChallenge.entryPoint=web
--certificatesresolvers.myresolver.acme.email=邮箱
--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory
labels:
traefik.enable: "true"
traefik.docker.network: traefik
traefik.http.routers.dashboard.rule: Host(`traefik.你的域名`)
traefik.http.routers.dashboard.tls: "true"
traefik.http.routers.dashboard.tls.certresolver: myresolver
traefik.http.routers.dashboard.service: "api@internal"
traefik.http.routers.dashboard.middlewares: auth
# 账号密码 admin/mypassword1234 生成 echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
traefik.http.middlewares.auth.basicauth.users: "admin:$$apr1$$KHASXqV7$$41yIaNanzzf1yqlq9BhwI"修改
yaml文件中的域名和邮箱,以及下面的traefik dashboard用户名密码
部署 halo 和 MySQL
networks:
traefik:
external: true # 使用外部已存在的 traefik 网络
halo_network:
name: halo_network # 内部网络,用于 halo 和 halodb 通信
services:
# ============ MySQL 数据库 ============
halodb:
image: mysql:latest
container_name: halodb
restart: "on-failure:3"
networks:
- halo_network # 只加入 halo_network,不暴露给 traefik
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
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
- MYSQL_ROOT_PASSWORD=mysqlpasswd123 #
- MYSQL_DATABASE=halo
# ============ Halo 博客 ============
halo:
image: registry.fit2cloud.com/halo/halo:2.25
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
volumes:
- ./halo2:/root/.halo2
networks:
- traefik # 加入 traefik 网络,接收外部流量
- halo_network # 加入 halo_network,连接数据库
# 移除 ports 映射,由 Traefik 代理
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
- --spring.r2dbc.password=o#DwN&JSa546
- --spring.sql.init.platform=mysql
# ⭐ 修改为你的域名
- --halo.external-url=https://你的域名
labels:
# ⭐ Traefik 路由配置
traefik.enable: "true"
traefik.docker.network: traefik
# ⭐ 修改为你的域名
traefik.http.routers.halo.rule: Host(`你的域名`)
traefik.http.routers.halo.tls: "true"
traefik.http.routers.halo.tls.certresolver: myresolver
traefik.http.services.halo.loadbalancer.server.port: 8090修改你的密码和域名
运行容器
docker compose -f traefik.yaml up -d
docker compose -f halo_mysql.yaml up -d需要先启动
traefik,因为halo和MySQL需要依赖 traefik创建的docker nertwork 运行
博客初始化
容器都正常启动后就可以通过域名访问博客进行初始化了。
官方参考文档:https://docs.halo.run/getting-started/setup

初始化过程中云服务器负载会升高。
附
DBeaver 链接云服务器中的MySQL容器
因为MySQL 容器没有对外暴露端口映射,所以这里使用更加安全的SSH 隧道转发连接数据库。
首先保证云服务器本地可以正常访问操作数据库
[root@RockyLinux9 ~/halo]docker exec -it halodb mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1468
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
telnet 数据库容器内 IP 也是通的
[root@RockyLinux9 ~]docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 20ef13c4cd1d
172.20.0.2
[root@RockyLinux9 ~]telnet 172.20.0.2 3306
Trying 172.20.0.2...
Connected to 172.20.0.2.
Escape character is '^]'.
连接数据库,新建数据库连接

【主要】选项卡,本地端口号,数据库用户名密码

【SSH】选项卡,填写 SSH 用户名密码,高级设置

本地端口
0:DBear 会用win本地空闲端口号远程端口
3306:容器内MySQL 监听的端口号
访问 traefik dashbord
https://traefik.域名/dashboard/