架构概览

本架构采用完全容器化解耦设计,分为三个核心层:

  1. 网关接入层:Nginx Proxy Manager(NPM),负责反向代理、统一端口暴露与自动化 HTTPS 证书管理。

  2. 应用逻辑层:Halo 2.x(Java Spring Boot),限制了 JVM 内存上限。

  3. 数据持久层: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 证书

  1. 浏览器访问 NPM 面板:http://<服务器公网IP>:81

  2. 使用默认账密登录后修改安全密码(默认:admin@example.com / changeme)。

  3. 进入 Proxy Hosts -> 点击 Add Proxy Host。

  4. Details 选项卡配置:

    • Domain Names: originspace.work

    • Scheme: http

    • Forward Hostname / IP: halo(直接填入同一个 web-net 里的容器名即可解析互通)

    • Forward Port: 8090

    • 开启:Block Common Exploits、Websockets Support

  5. SSL 选项卡配置:

    • SSL Certificate: 选择 Request a new SSL Certificate。

    • 开启 Force SSL(强制 HTTPS)。

    • 输入你的邮箱并勾选同意 Let's Encrypt 协议。

  6. 点击 Save。

至此,只需在浏览器输入 [https://originspace.work](https://originspace.work) 即可看到绿锁,并进入博客的初始化安装向导。

第五阶段:轻量级监控接入(可选加固)

为保证系统可用性,最后部署 Uptime Kuma 进行业务探活(相较于 Zabbix 更轻量、开箱即用)。

  1. 建立目录并编写 Compose:

    Bash

    mkdir -p /opt/kuma && cd /opt/kuma
    vim docker-compose.yml
    
  2. 写入配置:

    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
    
  3. 启动 docker compose up -d 后,即可在 NPM 中将其反代(如 status.originspace.work -> uptime-kuma:3001)。

  4. 在面板中配置针对 [https://originspace.work](https://originspace.work) 的 HTTP(s) 监控场景,要求返回 200 状态码,一旦断网或后端宕机可立刻收到通知。

交付总结: 通过这套基础设施即代码(IaC)的体系,你彻底实现了应用环境隔离、安全内网通信和数据物理持久化。未来无论重装系统还是迁移新机器,只需将 /opt/halo 和 /opt/npm 目录打包拷走,在新机器上敲两行 docker compose up -d,系统就能在 1 分钟内 100% 满血复原。