Administrator
发布于 2026-07-22 / 12 阅读
0
0

阿里云部署Halo

准备

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

准备 traefikMySQL镜像

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-toolstrafik 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,因为 haloMySQL 需要依赖 traefik创建的docker nertwork 运行

博客初始化

容器都正常启动后就可以通过域名访问博客进行初始化了。

官方参考文档:https://docs.halo.run/getting-started/setup

初始化过程中云服务器负载会升高。

DBeaver 链接云服务器中的MySQL容器

因为MySQL 容器没有对外暴露端口映射,所以这里使用更加安全的SSH 隧道转发连接数据库。

  1. 首先保证云服务器本地可以正常访问操作数据库

[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 '^]'.

  1. 连接数据库,新建数据库连接

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

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

  • 本地端口0:DBear 会用win本地空闲端口号

  • 远程端口3306:容器内MySQL 监听的端口号

访问 traefik dashbord

https://traefik.域名/dashboard/


评论