
常用监控配置
挂载外部可用素材、配置文件等(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

除此外,homepage自带dash icons和mdi icons的支持,可通过Material Design Icons - Icon Library - Pictogrammers及Browse 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获取服务连接延迟

配置分组多服务监控
- 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映射的端口。
接下了将分步骤介绍具体配置过程。
1、生成双方可信的证书及密钥
基于tls密钥生成脚本可生成对应的服务端及客户端密钥,服务端用于受控端使用,client用于监控端使用
参考上述代码生成的ca签证公钥及ca-key签证私钥,接下来演示复用签证流程:
如图为生成示意图
ca信任根是公证机构的,类似公安局公章和私章。生成服务器
参照这个流程写出复用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
效果如下
