200字
Homepage配置服务监控
2026-01-30
2026-01-30

image-OSJi.png

常用监控配置

挂载外部可用素材、配置文件等(docker部署服务下采用)
volumes:
    - ./config:/app/config
    - /opt/1panel/public/icons:/app/public/icons
    - /opt/1panel/public/images:/app/public/images
    - /var/run/docker.sock:/var/run/docker.sock #此处为配置docker socket用于监控docker内服务状态

挂载的好处是配置文件及素材不与示例状态挂钩,即使删除重建也能保持开启后效果相同

此处挂载的icons为homepage可访问的地址,例如在icons下放好图片starbucks.svg

- My First Service:
        icon: /icons/starbucks.svg  # 输入自定义icons位置,也支持url资源
        href: http://192.168.31.132:8848/center # 跳转url

image-rgij.png

除此外,homepage自带dash icons和mdi icons的支持,可通过Material Design Icons - Icon Library - PictogrammersBrowse Icons | Free Dashboard Icons切换
例如dashboard有home-assistant,直接输入home-assistant.png或对应后缀(svg或jpg)
若是mdi的icons,则通过mid-{文件名},例如文件为yin,则 icons: mdi-yin

配置服务状态监控服务(ping url)
- My First Service:
      icon: /icons/starbucks.svg
      href: http://192.168.31.132:8848/center
      description: J4125    #服务描述
      siteMonitor: http://192.168.31.132:8848  #通过ping获取服务连接延迟

image.png

配置分组多服务监控
- MiGroup: #服务名称可以随意定
    - My First Service: # 第一个服务
        icon: /icons/starbucks.svg
        href: http://192.168.31.132:8848/center
        description: J4125
        siteMonitor: http://192.168.31.132:8848
    
    - Service:    #第二个服务
        icon: /icons/starbucks.svg
        href: http://192.168.31.132:8848/center
        description: J4125
        siteMonitor: http://192.168.31.132
layout配置选项切换显示监控服务状态

首先进入settings.yaml配置文件

layout:
  MiGroup: # 自己改板块标题名字
    tab: First #url后面增加这个后缀就可以分类访问这些标签,没这一行就是所有标签都有这个板块
    style: row #row 横排 column 列
    columns: 3 #每排列数,如果上面选的列这里就改成row,默认最多4列

随后进入services.yaml配置文件修改绑定到MiGroup的分组

- MiGroup:
    - My First Service:
        icon: /icons/starbucks.svg
        href: http://192.168.31.132:8848/center
        description: J4125
        siteMonitor: http://192.168.31.132:8848
    
    - Service:
        icon: /icons/starbucks.svg
        href: http://192.168.31.132:8848/center
        description: J4125
        siteMonitor: http://192.168.31.132
    
    - Service:
        icon: /icons/starbucks.svg
        href: http://192.168.31.132:8848/center
        description: J4125
        siteMonitor: http://192.168.31.132

此时切换First tab状态实现隐藏与显示(默认不在layout的不受控制)

Docker服务监控配置

本机docker监控

实现本机docker监控需要借助 /var/run/docker.sock,这是一个 Unix 域套接字(Unix domain socket),Docker 客户端通过它与 Docker 守护进程(dockerd)通信。在本地运行 **docker 命令时,实际上就是通过这个 socket 与后台的 Docker 服务进行交互。通过借助这个套接字,homepage可监控docker各容器实例服务的状态。

volumes:
    - ./config:/app/config
    - /opt/1panel/public/icons:/app/public/icons
    - /opt/1panel/public/images:/app/public/images
    - /var/run/docker.sock:/var/run/docker.sock
group_add:
    - 990 #配置权限,部分情况下可能docker内homepage无法访问到docker.sock,根据实际 GID 填写

通过volumes将docker.sock挂载到本机,同时,进入到docker.yaml配置

my-docker:
    socket: /var/run/docker.sock

在services.yaml绑定显示具体服务

- OrangePi:
    - homepage:
        icon: docker.png
        href: "http://192.168.31.54:80"
        description: "Docker Service 1"
        server: my-docker
        container: 1Panel-homepage-0ke6
        showStats: true
    - 微信编辑器:
        icon: yacht.png
        href: "http://192.168.31.54:5002"
        description: "wechatmarkdowneditor"
        server: my-docker  #对应docok配置的服务名
        container: 1Panel-wechatmarkdowneditor-qUn1  #对应容器实例名称
        showStats: true #显示监控状态
远程docker监控

相较于本机 Docker,远程监控 Docker 服务配置会更为复杂。直接暴露 docker.sock 是极高危操作**(等同于开放 root 权限),因此实现远程监控务必满足以下前提:**

✅ 仅限可信内网环境(如家庭局域网)
✅ 双向 TLS 认证(mTLS)强制校验双方身份
✅ 受控端防火墙严格限制访问源 IP
✅ 代理层限制 API 权限(仅开放只读接口)

⚠️ 重要提醒**:生产环境强烈建议改用 SSH 隧道(**ssh -L)或专用监控 Agent(如 cAdvisor + Prometheus),避免直接暴露 Docker API。
本方案采用双方tls互信的方式实现docker.sock远程暴露,且受控端严格配置仅监控方ip才能访问docker.sock映射的端口。

sequenceDiagram participant C as 客户端 participant S as 服务器 Note over S: 持有 server-key.pem (私钥) Note over S: 持有 server-cert.pem (证书) C->>S: 发起 TLS 握手 S->>C: 发送 server-cert.pem Note over C: 1. 用 CA 公钥验证证书签名<br/>2. 从证书中提取公钥 C->>S: 用证书中的公钥加密"预主密钥" S->>S: 用 server-key.pem (私钥) 解密预主密钥 Note over C,S: 后续通信使用协商出的对称密钥

接下了将分步骤介绍具体配置过程。

1、生成双方可信的证书及密钥

基于tls密钥生成脚本可生成对应的服务端及客户端密钥,服务端用于受控端使用,client用于监控端使用

参考上述代码生成的ca签证公钥及ca-key签证私钥,接下来演示复用签证流程:

如图为生成示意图

graphviz.svg

ca信任根是公证机构的,类似公安局公章和私章。生成服务器

flowchart TD %% 🔐 CA 信任根(复用!不动老配置) CA1[ca.pem<br/>“公安局公章”] CA2[ca-key.pem<br/>“公安局私章”] %% 🆕 新服务器专属(全新生成) K[server-key.pem<br/>私钥 · 随机生成 🔒] CSR[server.csr<br/>证书签名请求<br/>(含公钥 + CN=IP)] CNF[extfile.cnf<br/>SAN 声明<br/>IP:192.168.x.x] %% ✍️ 签名动作 SIGN[openssl x509 -req<br/>CA 盖章认证] CERT[server-cert.pem<br/>✅ 正式身份证] K --> CSR CSR --> SIGN CNF --> SIGN CA1 --> SIGN CA2 --> SIGN SIGN --> CERT classDef reuse fill:#e1f5fe,stroke:#01579b classDef new fill:#e8f5e8,stroke:#1b5e20 classDef action fill:#fff3e0,stroke:#e65100 class CA1,CA2 reuse class K,CSR,CNF,CERT new class SIGN action

参照这个流程写出复用ca和ca-key生成server-cert的脚本如下

#!/bin/bash
# safe-cert-reuse-interactive.sh - 交互式增量证书签发工具

set -e

echo "🔐 安全证书增量签发工具(交互式配置版)"
echo "=========================================="
echo "本工具将为新服务器签发证书,全程复用现有 CA,不改动任何已有配置"
echo ""

# ===== 默认配置 =====
DEFAULT_NEW_SERVER_IP="192.168.31.55"
DEFAULT_EXISTING_CA_DIR="./docker-tls-certs-fixed/server"
DEFAULT_OUTPUT_DIR="./new-server-certs"

# ===== 交互式配置收集 =====
read -p "▸ 新服务器 IP [$DEFAULT_NEW_SERVER_IP]: " NEW_SERVER_IP
NEW_SERVER_IP="${NEW_SERVER_IP:-$DEFAULT_NEW_SERVER_IP}"

while true; do
    read -p "▸ 现有 CA 目录(含 ca.pem + ca-key.pem)[$DEFAULT_EXISTING_CA_DIR]: " EXISTING_CA_DIR
    EXISTING_CA_DIR="${EXISTING_CA_DIR:-$DEFAULT_EXISTING_CA_DIR}"
    
    if [[ ! -f "$EXISTING_CA_DIR/ca.pem" ]] || [[ ! -f "$EXISTING_CA_DIR/ca-key.pem" ]]; then
        echo "❌ 错误:指定目录缺少必要文件(需同时包含 ca.pem 和 ca-key.pem)"
        echo "   当前路径内容:"
        ls -lh "$EXISTING_CA_DIR" 2>/dev/null || echo "   (目录不存在或无法访问)"
        read -p "▸ 继续使用此路径?(y/n) [n]: " confirm
        [[ "${confirm:-n}" == "y" ]] && break
    else
        echo "✓ CA 证书文件验证通过"
        break
    fi
done

read -p "▸ 新证书输出目录 [$DEFAULT_OUTPUT_DIR]: " OUTPUT_DIR
OUTPUT_DIR="${OUTPUT_DIR:-$DEFAULT_OUTPUT_DIR}"

# ===== 配置预览与最终确认 =====
echo ""
echo "=========================================="
echo "▸▸▸ 配置预览 ◂◂◂"
echo "------------------------------------------"
echo "新服务器 IP       : $NEW_SERVER_IP"
echo "现有 CA 目录      : $EXISTING_CA_DIR"
echo "  ├─ ca.pem       : $(test -f "$EXISTING_CA_DIR/ca.pem" && echo "✓ 存在" || echo "⚠ 不存在")"
echo "  └─ ca-key.pem   : $(test -f "$EXISTING_CA_DIR/ca-key.pem" && echo "✓ 存在" || echo "⚠ 不存在")"
echo "输出目录          : $OUTPUT_DIR"
echo "------------------------------------------"
echo "⚠️  安全提示:"
echo "   • 本操作不会修改任何现有证书或 CA 私钥"
echo "   • CA 私钥 (ca-key.pem) 仅用于签名,不会被复制到输出目录"
echo "   • 原有服务器配置完全不受影响"
echo "=========================================="

read -p "▸ 确认使用以上配置执行证书签发?(yes/no) [no]: " final_confirm
if [[ "${final_confirm:-no}" != "yes" ]]; then
    echo "🛑 操作已取消"
    exit 1
fi

# ===== 执行区 =====
echo ""
echo ">>> 为新服务器 $NEW_SERVER_IP 增量签发证书"
mkdir -p "$OUTPUT_DIR"

# 1. 复制 CA 证书(只读,不移动原文件!)
cp "$EXISTING_CA_DIR/ca.pem" "$OUTPUT_DIR/ca.pem"
echo "✓ 复用现有 CA 证书"

# 2. 生成新服务端密钥 + 证书
openssl genrsa -out "$OUTPUT_DIR/server-key.pem" 4096 >/dev/null 2>&1
openssl req -subj "/CN=$NEW_SERVER_IP" -sha256 -new \
  -key "$OUTPUT_DIR/server-key.pem" -out "$OUTPUT_DIR/server.csr" >/dev/null 2>&1

echo "subjectAltName = IP:$NEW_SERVER_IP" > "$OUTPUT_DIR/extfile.cnf"
openssl x509 -req -days 365 -sha256 \
  -in "$OUTPUT_DIR/server.csr" \
  -CA "$EXISTING_CA_DIR/ca.pem" \
  -CAkey "$EXISTING_CA_DIR/ca-key.pem" \
  -CAcreateserial -out "$OUTPUT_DIR/server-cert.pem" \
  -extfile "$OUTPUT_DIR/extfile.cnf" >/dev/null 2>&1

rm -f "$OUTPUT_DIR/server.csr" "$OUTPUT_DIR/extfile.cnf"

# 3. 权限加固
chmod 400 "$OUTPUT_DIR/server-key.pem"
chmod 444 "$OUTPUT_DIR/server-cert.pem" "$OUTPUT_DIR/ca.pem"

# 4. 生成部署清单
cat > "$OUTPUT_DIR/DEPLOY_INSTRUCTIONS.txt" <<EOF
=== 新服务器证书部署清单 ===
服务器 IP: $NEW_SERVER_IP

【需上传到新服务器的文件】
  - server-cert.pem   → 放入 /path/to/certs/
  - server-key.pem    → 放入 /path/to/certs/ (权限 400)
  - ca.pem            → 放入 /path/to/certs/

【Homepage 无需改动】
  - 复用现有客户端证书 (cert.pem / key.pem / ca.pem)
  - 仅需在 docker.yaml 新增一个 server 配置(见下方示例)

【Homepage docker.yaml 新增配置示例】
new-server:
  host: https://$NEW_SERVER_IP:2376
  caCert: /app/config/certs/ca.pem      # ← 复用现有 ca.pem
  cert: /app/config/certs/cert.pem      # ← 复用现有客户端证书
  key: /app/config/certs/key.pem        # ← 复用现有客户端私钥
EOF

echo -e "\n✅ 新证书生成完成!"
echo "📁 输出目录: $OUTPUT_DIR"
echo "📄 部署指南: $OUTPUT_DIR/DEPLOY_INSTRUCTIONS.txt"
echo -e "\n💡 安全审计摘要:"
echo "   • 原有服务器证书:未改动 ✓"
echo "   • CA 私钥位置:始终保留在 $EXISTING_CA_DIR ✓"
echo "   • 新证书隔离:所有新文件仅存在于 $OUTPUT_DIR ✓"
echo "   • 客户端兼容性:Homepage 可直接复用现有客户端证书监控新服务器 ✓"

2、配置受控端dock-sock-proxy代理,配置端口映射
选择存放docker compose文件的目录,创建如下结构文件

docker-socket-proxy/
├── certs
│   ├── ca.pem
│   ├── DEPLOY_INSTRUCTIONS.txt #非必须
│   ├── server-cert.pem
│   └── server-key.pem
├── docker-compose.yml
└── nginx-stream.conf

certs内上传步骤1生成的服务端证书文件
docker-compose.yml为docker配置定义文件,内容如下

# /opt/1panel/docker/compose/docker-socket-proxy/docker-compose.yml
services:
  socket-proxy:
    image: tecnativa/docker-socket-proxy:latest
    container_name: docker-socket-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro # 只读socket
    environment:  #以下是权限控制参数,这也是使用docker-socket-proxy的原因,限制服务状态只读
      - CONTAINERS=1
      - NETWORKS=0
      - VOLUMES=0
      - IMAGES=0
      - BUILD=0
      - AUTH=0
      - POST=0
      - DELETE=0
    restart: unless-stopped
    networks:  # ← 关键修复:显式加入 proxy-net
      - proxy-net
    # ⚠️ 注意:不再需要 volume 挂载!它只监听 2375 TCP

  nginx-tls:
    image: openresty/openresty:alpine
    container_name: nginx-docker-tls
    ports:
      - "2376:2376"  # 外网暴露端口
    volumes:
      - ./certs:/etc/nginx/certs:ro
      - ./nginx-stream.conf:/usr/local/openresty/nginx/conf/nginx.conf:ro
    restart: unless-stopped
    depends_on:
      - socket-proxy
    networks:
      - proxy-net  # 确保在同一网络

networks:
  proxy-net:
    driver: bridge

nginx-stream.conf配置如下,主要配置docker socket tls代理

# nginx-stream.conf - Docker Socket TLS 代理
worker_processes auto;

events {
    worker_connections 1024;
}

stream {
    # 定义上游:指向 socket-proxy 容器的 2375 端口
    upstream docker_backend {
        server socket-proxy:2375;  # 通过 Docker DNS 解析
    }

    # 外网暴露的 TLS 端口
    server {
        listen 2376 ssl;  # 启用 SSL/TLS
        
        # 代理到上游
        proxy_pass docker_backend;
        proxy_connect_timeout 30s;
        proxy_timeout 10m;              # 关键修复,减少连接失败报错
        proxy_socket_keepalive on;      # 防断连

        # TLS 证书配置
        ssl_certificate     /etc/nginx/certs/server-cert.pem;   # 服务端证书
        ssl_certificate_key /etc/nginx/certs/server-key.pem;    # 服务端私钥
        ssl_client_certificate /etc/nginx/certs/ca.pem;         # 客户端 CA 证书
        ssl_verify_client on;                                   # 启用双向 TLS
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
    }
}

3、配置监控端homepage
将步骤1生成的客户端密钥放到合适位置挂载(我的配置是复用config目录,将其放到config/tls中)

config/
├── bookmarks.yaml
├── custom.css
├── custom.js
├── docker.yaml
├── kubernetes.yaml
├── logs
│   └── homepage.log
├── proxmox.yaml
├── services.yaml
├── settings.yaml
├── tls
│   ├── ca.pem
│   ├── cert.pem
│   └── key.pem
└── widgets.yaml

修改docker.yaml配置

remote-docker:
    host: 192.168.31.185
    port: 2376
    tls:
        keyFile: tls/key.pem
        caFile: tls/ca.pem
        certFile: tls/cert.pem
    insecureSkipVerify: true

同时在services.yaml写入相关服务监控

- gitea:
        icon: yacht.png
        href: "http://192.168.31.185:4000"
        description: "gitea"
        server: remote-docker
        container: 1Panel-gitea-27Hv
        showStats: true

效果如下

image-mSpJ.png

Glances服务监控配置(待续)

Homepage配置服务监控
Author
Administrator
Published at
2026-01-30
License
CC BY-NC-SA 4.0

Comment