编写 `ocker-compose.yml`文件


version: '3.8'

services:
  # Traefik反向代理
  traefik:
    image: traefik:v2.9
    container_name: traefik
    restart: on-failure:3
    depends_on:
      halo:
        condition: service_healthy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/config:/config
      - ./acme.json:/acme.json
    environment:
      - ALICLOUD_ACCESS_KEY=${ALICLOUD_ACCESS_KEY}
      - ALICLOUD_SECRET_KEY=${ALICLOUD_SECRET_KEY}
    command:
      - --log.level=INFO
      - --api.dashboard=true
      - --api.insecure=false
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.file.directory=/config
      - --providers.file.watch=true
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.alidns.acme.email=${EMAIL}
      - --certificatesresolvers.alidns.acme.storage=/acme.json
      - --certificatesresolvers.alidns.acme.dnschallenge.provider=alidns
    labels:
      - traefik.enable=true
      - traefik.http.routers.dashboard.rule=Host(`traefik.${DOMAIN}`)
      - traefik.http.routers.dashboard.entrypoints=websecure
      - traefik.http.routers.dashboard.tls.certresolver=alidns
      - traefik.http.routers.dashboard.service=api@internal
    networks:
      halo_network:

  # MySQL数据库
  mysql:
    image: mysql:8.1.0
    container_name: mysql
    restart: on-failure:3
    command:
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --explicit_defaults_for_timestamp=true
    volumes:
      - ./mysql:/var/lib/mysql
      - ./mysqlBackup:/data/mysqlBackup
    environment:
      # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      halo_network:

  # Halo博客应用
  halo:
    image: registry.fit2cloud.com/halo/halo:2.20.21
    container_name: halo
    restart: on-failure:3
    depends_on:
      mysql:
        condition: service_healthy
    volumes:
      - ./halo2:/root/.halo2
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness" ]
      interval: 30s
      timeout: 5s
      retries: 5
    networks:
      halo_network:
    environment:
      # JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:mysql://mysql:3306/${MYSQL_DATABASE}
      - --spring.r2dbc.username=root
      # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=${MYSQL_ROOT_PASSWORD}
      - --spring.sql.init.platform=mysql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=https://${DOMAIN}
    labels:
      - traefik.enable=true
      - traefik.http.routers.halo.rule=Host(`${DOMAIN}`)
      - traefik.http.routers.halo.entrypoints=websecure
      - traefik.http.routers.halo.tls.certresolver=alidns
      - traefik.http.routers.halo.middlewares=compression
      - traefik.http.middlewares.compression.compress=true
      - traefik.http.services.halo.loadbalancer.server.port=8090

networks:
  halo_network:

编写 `.env`文件

# 域名配置
DOMAIN=youdomain.top

# 联系邮箱(用于Let's Encrypt证书)
EMAIL=xxxx@qq.com

# 阿里云API凭证
ALICLOUD_ACCESS_KEY=xxxx
ALICLOUD_SECRET_KEY=xxxx

# MySQL配置
MYSQL_ROOT_PASSWORD=youpassword
MYSQL_DATABASE=halo