编写 `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