ithuang
ithuang
发布于 2025-05-18 / 2 阅读
0

Docker Compose 部署 Halo

Docker Compose 部署 Halo

  1. 服务器初始设置(系统选择、安全加固)
  2. 环境安装(Docker、Docker Compose)
  3. 规划部署架构(目录结构、网络)
  4. 编写 Halo 的 docker-compose.yaml
  5. 配置反向代理与 SSL(使用 Nginx Proxy Manager)
  6. 启动服务与初始化 Halo

1. 服务器初始设置

1.1 选择操作系统

建议选择 Ubuntu 22.04 LTS(长期支持版),软件源丰富,社区活跃。

1.2 登录并创建普通用户

使用阿里云控制台的 远程连接 或 SSH 登录为 root:

ssh root@你的公网IP

创建一个普通用户(例如 ithuang)并设置密码:

adduser halo

按照提示输入密码(其余信息可回车跳过)。

将用户加入 sudo 组,以便获得管理员权限:

usermod -aG sudo halo

测试 sudo 权限:

su - halo
sudo whoami   # 应返回 root

1.3 禁止 root 远程登录

编辑 SSH 配置:

sudo vi /etc/ssh/sshd_config

找到 PermitRootLogin yes,改为 no:

PermitRootLogin no

保存后重启 SSH 服务:

sudo systemctl restart sshd

重要:保持当前窗口不动,另开一个终端测试用 halo 能否登录,确认无误后再关闭 root 会话。

1.4 配置阿里云安全组

在阿里云 ECS 控制台的安全组规则中,入方向放行以下端口:

  • 22 (SSH)
  • 80 (HTTP,用于反向代理)
  • 443 (HTTPS,用于 SSL)
  • 8090 (Halo 默认端口,初始测试用,后期可关闭)

2. 安装 Docker 和 Docker Compose

Ubuntu 下使用官方脚本一键安装,简单可靠:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

将当前用户加入 docker 组,避免每次使用 sudo:

sudo usermod -aG docker $USER

如果拉取镜像时速度慢,可以配置国内镜像加速器

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

退出当前 SSH 会话并重新登录,使组权限生效。验证安装:

docker --version
docker compose version
# 验证
sudo docker run --rm hello-world

3. 规划部署架构

我们将 Halo 的所有数据放在 /opt/halo 目录下,并使用两个 Docker 网络:

  • halo_network:内部网络,用于 Halo 和数据库通信。
  • npm_network:反向代理网络,用于 Nginx Proxy Manager 与 Halo 通信。

3.1 创建目录和网络

sudo mkdir -p /opt/halo
sudo chown -R $USER:$USER /opt/halo
cd /opt/halo

创建外部网络(稍后 NPM 也需要加入该网络):

docker network create npm_network

4. 编写 Halo 的 docker-compose.yaml

在 /opt/halo 下创建 docker-compose.yaml:

vi docker-compose.yaml

输入以下内容(使用 PostgreSQL 方案):

version: "3"

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.24   # 固定版本
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      - halo_network
      - npm_network                               # 让 NPM 能访问
    volumes:
      - ./halo2:/root/.halo2
    ports:
      - "8090:8090"                               # 可保留用于测试
    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:postgresql://halodb:5432/halo
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=替换为你的强密码
      - --spring.sql.init.platform=postgresql
      - --halo.external-url=https://你的域名
      # 注意:external-url 需填写最终访问地址(HTTPS+域名),
      # 若暂时没有域名可先填 http://公网IP:8090,后续再改

  halodb:
    image: postgres:15.4
    container_name: halodb
    restart: on-failure:3
    networks:
      - halo_network                              # 不加入 npm_network,更安全
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=替换为你的强密码        # 与上方 halo 密码一致
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo

networks:
  halo_network:
  npm_network:
    external: true

注意:

  • 务必修改两处密码,并保持一致。
  • 暂时没有域名时,可先填写 http://你的公网IP:8090,后续配置完反代和 SSL 后再改。

5. 配置反向代理与 SSL(Nginx Proxy Manager)

5.1 部署 Nginx Proxy Manager

在 /opt/npm 下创建另一个 docker-compose.yaml:

sudo mkdir -p /opt/npm
sudo chown halo:halo /opt/npm
cd /opt/npm
vi docker-compose.yaml

填入:

version: "3"
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "81:81"      # NPM 管理界面
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - npm_network

networks:
  npm_network:
    external: true

启动 NPM:

docker compose up -d

访问 http://你的公网IP:81,使用默认账户登录:

  • 邮箱:admin@example.com
  • 密码:changeme
    登录后会强制要求修改密码和邮箱。

5.2 添加 Halo 的代理规则

  1. 点击 Proxy Hosts → Add Proxy Host。
  2. Details 标签:
    • Domain Names:填写你的域名(如 blog.yourdomain.com)
    • Forward Hostname / IP:填写 halo(因为 NPM 和 Halo 同属 npm_network,可以直接用容器名)
    • Forward Port:8090
  3. 保存后,点击该规则右侧的 Edit,切换到 SSL 标签。
  4. 选择 Request a new SSL Certificate。
  5. 勾选 Force SSL,输入你的邮箱,点击 Save。
    NPM 会自动申请 Let's Encrypt 证书,并配置 HTTPS 重定向。

5.3 域名解析

在阿里云 DNS 控制台,为你的域名添加一条 A 记录,将 blog(或你使用的主机记录)指向 ECS 的公网 IP。

等待几分钟,访问 https://你的域名 应能打开 Halo 的初始化页面。


6. 启动 Halo 并初始化

6.1 启动 Halo 与数据库

返回 /opt/halo 目录:

cd /opt/halo
docker compose up -d

检查服务状态:

docker compose ps

确保 halo 和 halodb 均为 healthy 状态。

6.2 访问并完成初始化

在浏览器中打开 https://你的域名/console,按照引导设置:

  • 站点名称、管理员邮箱、用户名、密码等。
  • 初始化完成后即可登录 Halo 管理后台。

7. 后续优化与维护

7.1 关闭 8090 端口

初始化完成且反向代理正常工作后,可以在安全组中移除对 8090 端口的放行,只保留 80 和 443,提升安全性。也可以修改 docker-compose.yaml 将 ports: - "8090:8090" 去掉(仅保留内部网络即可,因为 NPM 通过 npm_network 直接访问容器)。

7.2 更新 Halo 版本

cd /opt/halo
# 备份数据(先停止服务)
docker compose stop
sudo cp -r /opt/halo /opt/halo_backup_$(date +%F)
# 修改 docker-compose.yaml 中的镜像版本号
vi docker-compose.yaml
docker compose up -d

7.3 日常管理命令

  • 查看日志:docker compose logs -f halo
  • 重启服务:docker compose restart
  • 停止所有:docker compose down