Docker Compose 部署 Halo
- 服务器初始设置(系统选择、安全加固)
- 环境安装(Docker、Docker Compose)
- 规划部署架构(目录结构、网络)
- 编写 Halo 的 docker-compose.yaml
- 配置反向代理与 SSL(使用 Nginx Proxy Manager)
- 启动服务与初始化 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 的代理规则
- 点击 Proxy Hosts → Add Proxy Host。
- Details 标签:
- Domain Names:填写你的域名(如
blog.yourdomain.com) - Forward Hostname / IP:填写
halo(因为 NPM 和 Halo 同属npm_network,可以直接用容器名) - Forward Port:
8090
- Domain Names:填写你的域名(如
- 保存后,点击该规则右侧的 Edit,切换到 SSL 标签。
- 选择 Request a new SSL Certificate。
- 勾选 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