🚀 基于 Docker Compose 的高可用博客系统部署指南
架构概览
本架构采用完全容器化解耦设计,分为三个核心层:
网关接入层:Nginx Proxy Manager(NPM),负责反向代理、统一端口暴露与自动化 HTTPS 证书管理。
应用逻辑层:Halo 2.x(Java Spring Boot),限制了 JVM 内存上限。
数据持久层:MySQL 8.0,限制了缓冲池大小,避免低配主机 OOM。
第一阶段:服务器初始化与底层网络准备
1. 云安全组与环境配置
在阿里云 ECS 控制台,进入安全组规则,放行以下入方向端口:
80(HTTP)443(HTTPS)81(NPM 管理面板)
确保服务器已正确安装 Docker 引擎与 Docker Compose 插件。
(可选)开启代理软件的 TUN 模式(绕过大陆),确保顺畅拉取 GitHub (GHCR) 等境外镜像源。
2. 创建全局内部通信网络
为了让各个独立部署的容器能够互相通过“容器名”解析内网 IP,且不暴露数据库端口,需预先创建一个全局自定义桥接网络:
Bash
docker network create web-net
3. 规划主机数据挂载目录
在服务器上创建标准化的目录结构,用于存放配置和持久化数据:
Bash
mkdir -p /opt/halo/mysql-data
mkdir -p /opt/halo/data
mkdir -p /opt/npm/data
mkdir -p /opt/npm/letsencrypt
第二阶段:部署接入层(Nginx Proxy Manager)
NPM 作为全局的流量入口,优先将其启动。
1. 编写网关编排文件
Bash
cd /opt/npm
vim docker-compose.yml
填入以下标准配置:
YAML
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm-app-1
restart: unless-stopped
ports:
- '80:80' # 博客公网 HTTP 入口
- '81:81' # NPM 管理后台面板
- '443:443' # 博客公网 HTTPS 入口
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- default
networks:
default:
name: web-net
external: true
2. 启动网关服务
Bash
docker compose up -d
第三阶段:部署核心业务层(MySQL 8.0 + Halo 2.x)
这是整套系统最核心的部分,包含了严格的依赖顺序、方言绑定与资源硬约束。
1. 编写业务编排文件
Bash
cd /opt/halo
vim docker-compose.yml
填入以下经过深度资源调优的配置:
YAML
services:
halo-mysql:
image: mysql:8.0
container_name: halo-mysql
restart: unless-stopped
security_opt:
- seccomp:unconfined
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --innodb-buffer-pool-size=256M # 严格限制内存消耗
- --max-connections=50 # 限制连接池上限
environment:
MYSQL_ROOT_PASSWORD: "HaloUser123456"
MYSQL_DATABASE: halo
MYSQL_USER: halo
MYSQL_PASSWORD: "HaloUser123456"
healthcheck: # 健康检查:确保数据库就绪后再拉起博客
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 5s
timeout: 5s
retries: 30
start_period: 30s
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- default
halo:
image: ghcr.io/halo-dev/halo:2.24.2
container_name: halo
restart: unless-stopped
depends_on:
halo-mysql:
condition: service_healthy # 依赖于 MySQL 健康检查通过
volumes:
- ./data:/root/.halo2
environment:
- JVM_OPTS=-Xms256m -Xmx512m # JVM 内存上限硬约束,防止 OOM
- SPRING_R2DBC_URL=r2dbc:pool:mysql://halo-mysql:3306/halo
- SPRING_R2DBC_USERNAME=halo
- SPRING_R2DBC_PASSWORD=HaloUser123456
- SPRING_SQL_INIT_PLATFORM=mysql # 显式锁定方言,规避迁移错误
- HALO_EXTERNAL_URL=https://originspace.work
networks:
- default
networks:
default:
name: web-net
external: true
2. 拉起并初始化业务环境
Bash
docker compose up -d
此时 Docker Compose 会先启动 halo-mysql,通过健康检查(约 10-30 秒)确认数据库可以建立连接后,才会启动 halo 容器,完美避免了连接拒绝报错。
第四阶段:域名解析与全站 HTTPS 部署
1. 域名解析(DNS)
在域名提供商(如阿里云/腾讯云)控制台,添加一条 A 记录,将你的域名(如 originspace.work)指向该云服务器的公网 IP。
2. 配置反向代理与 SSL 证书
浏览器访问 NPM 面板:
http://<服务器公网IP>:81使用默认账密登录后修改安全密码(默认:
admin@example.com/changeme)。进入 Proxy Hosts -> 点击 Add Proxy Host。
Details 选项卡配置:
Domain Names:
originspace.workScheme:
httpForward Hostname / IP:
halo(直接填入同一个web-net里的容器名即可解析互通)Forward Port:
8090开启:
Block Common Exploits、Websockets Support
SSL 选项卡配置:
SSL Certificate: 选择
Request a new SSL Certificate。开启
Force SSL(强制 HTTPS)。输入你的邮箱并勾选同意 Let's Encrypt 协议。
点击 Save。
至此,只需在浏览器输入 [https://originspace.work](https://originspace.work) 即可看到绿锁,并进入博客的初始化安装向导。
第五阶段:轻量级监控接入(可选加固)
为保证系统可用性,最后部署 Uptime Kuma 进行业务探活(相较于 Zabbix 更轻量、开箱即用)。
建立目录并编写 Compose:
Bash
mkdir -p /opt/kuma && cd /opt/kuma vim docker-compose.yml写入配置:
YAML
services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma restart: always volumes: - ./data:/app/data ports: - "3001:3001" networks: - default networks: default: name: web-net external: true启动
docker compose up -d后,即可在 NPM 中将其反代(如status.originspace.work -> uptime-kuma:3001)。在面板中配置针对
[https://originspace.work](https://originspace.work)的 HTTP(s) 监控场景,要求返回 200 状态码,一旦断网或后端宕机可立刻收到通知。
交付总结: 通过这套基础设施即代码(IaC)的体系,你彻底实现了应用环境隔离、安全内网通信和数据物理持久化。未来无论重装系统还是迁移新机器,只需将 /opt/halo 和 /opt/npm 目录打包拷走,在新机器上敲两行 docker compose up -d,系统就能在 1 分钟内 100% 满血复原。
🚀 基于 Docker Compose 的高可用博客系统部署指南
https://originspace.work/archives/ji-yu-docker-compose-de-gao-ke-yong-bo-ke-xi-tong-bu-shu-zhi-nan
评论