3841 字
8 分钟
一键部署并管理 Halo 博客与 Nginx
Docker 运维实战:一键部署并管理 Halo 博客与 Nginx Proxy Manager
前言
在运维个人服务器或开发环境时,管理多个 docker-compose 项目往往比较繁琐。为了提高效率,我将 Halo 博客系统(基于 Java/Spring Boot)与 Nginx Proxy Manager (NPM) 整合到了一个 Shell 脚本中。
这种方案实现了:
- 自动化配置:自动创建目录并生成 YAML 文件。
- 环境隔离:通过 Docker 网络实现 NPM 与 Halo 的安全通信。
- 集中管理:一个脚本搞定启动、停止、日志查看和容器进入。
架构设计
- 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: true 的 npm 网络,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/ 部分信息可能已经过时









