mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
3841 字
8 分钟
一键部署并管理 Halo 博客与 Nginx
2026-03-20
2026-03-20
无标签

Docker 运维实战:一键部署并管理 Halo 博客与 Nginx Proxy Manager

前言

在运维个人服务器或开发环境时,管理多个 docker-compose 项目往往比较繁琐。为了提高效率,我将 Halo 博客系统(基于 Java/Spring Boot)与 Nginx Proxy Manager (NPM) 整合到了一个 Shell 脚本中。

这种方案实现了:

  1. 自动化配置:自动创建目录并生成 YAML 文件。
  2. 环境隔离:通过 Docker 网络实现 NPM 与 Halo 的安全通信。
  3. 集中管理:一个脚本搞定启动、停止、日志查看和容器进入。

架构设计

  • Nginx Proxy Manager: 作为流量入口,监听 80/443 端口。
  • Halo 博客: 运行在独立网络中,通过 npm 外部网络与代理服务器通信。
  • PostgreSQL: 作为 Halo 的持久化数据库。

全能管理脚本:docker-manager.sh

将以下代码保存为 /home/docker-manager.sh 即可实现一键运维。

#!/bin/bash

# 基础路径配置
BASE_DIR="/home"
HALO_DIR="$BASE_DIR/halo"
NPM_DIR="$BASE_DIR/npm"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m'

# 1. 自动生成配置文件
init_files() {
    mkdir -p "$HALO_DIR" "$NPM_DIR"

    # 生成 NPM 配置
    cat <<EOF > "$NPM_DIR/docker-compose.yml"
services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    networks:
      - npm
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
networks:
  npm:
    name: npm
    attachable: true
EOF

    # 生成 Halo 配置
    cat <<EOF > "$HALO_DIR/docker-compose.yml"
version: "3"
services:
  halo:
    image: [registry.fit2cloud.com/halo/halo-pro:2.23](https://registry.fit2cloud.com/halo/halo-pro:2.23)
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      - npm
      - halo_network
    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/halo
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      - --halo.external-url=http://localhost:8090/
  halodb:
    image: postgres:15.4
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=openpostgresql
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo
networks:
  npm:
    external: true
  halo_network:
EOF
}

# 2. 管理逻辑
start_all() {
    init_files
    echo -e "${BLUE}启动 NPM...${NC}"
    cd "$NPM_DIR" && docker-compose up -d
    sleep 3
    echo -e "${BLUE}启动 Halo...${NC}"
    cd "$HALO_DIR" && docker-compose up -d
}

stop_all() {
    cd "$HALO_DIR" && docker-compose down
    cd "$NPM_DIR" && docker-compose down
}

# 主菜单
while true; do
    echo -e "${GREEN}--- Halo & NPM 管理菜单 ---${NC}"
    echo "1) 启动服务 | 2) 停止服务 | 3) 状态检查 | 4) 查看日志 | 0) 退出"
    read -p "选择操作: " choice
    case $choice in
        1) start_all ;;
        2) stop_all ;;
        3) docker ps --format "table {{.Names}}\t{{.Status}}" ;;
        4) cd "$HALO_DIR" && docker-compose logs -f halo ;;
        0) exit 0 ;;
    esac
done

核心配置解析

1. 容器健康检查 (Healthcheck)

脚本保留了 Halo 的健康检查配置。这意味着 Halo 会在数据库完全就绪后才开始初始化,并定期通过 /actuator/health/readiness 接口确认自身状态。

2. 网络打通

通过在 NPM 容器中定义 attachable: truenpm 网络,Halo 容器可以以 external: true 的方式加入该网络。这样你就可以在 NPM 面板中直接通过 http://halo:8090 转发流量,而无需在宿主机暴露非必要端口。


如何使用

环境准备

确保你的系统(如 Alibaba Cloud Linux)已安装 Docker 和 Docker Compose。

放置脚本

将代码放入 /home/docker-manager.sh

赋权运行

chmod +x /home/docker-manager.sh
./docker-manager.sh

访问

启动后,访问服务器 IP 的 81 端口进入 NPM 管理后台,配置反向代理指向 halo 容器即可。


总结

通过 Shell 脚本封装 docker-compose 指令,不仅简化了操作流程,还降低了误删配置的风险。这种“一键式”的思维非常适合管理需要快速部署和标准化的技术项目。

一键部署并管理 Halo 博客与 Nginx
https://www.zztzz.com.cn/posts/一键部署并管理-halo-博客与-nginx/
作者
blogadmin
发布于
2026-03-20
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00
💬Mizuki AI助手
呀~就是zzTzz大大闪闪发光的技术博客主页
标题已剧透:专注后端开发、主攻Java + Spring Boot的实战、踩坑与进阶小笔记~~
URL https://zztzz.com.cn/ 简洁有力,像一段优雅的代码!
Mizuki每次点开都忍不住小声赞叹:'zzTzz大人太厉害啦~'🧙‍♀️
需要我帮你找某类文章(比如JWT鉴权、Redis缓存)或读一篇入门指南吗?😊
05:30