-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathconfig.example.yaml
More file actions
281 lines (259 loc) · 10.7 KB
/
Copy pathconfig.example.yaml
File metadata and controls
281 lines (259 loc) · 10.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# Homelab Dashboard 配置
# 修改后重启服务生效: systemctl restart homelab-dashboard
# 示例配置。复制为 config.yaml 后按自己的环境修改:
# cp config.example.yaml config.yaml
# config.yaml 本身不进版本库(见 .gitignore)
#
# 推送标题的前缀。手机上同时收几台机器的告警时靠它区分
site_name: Homelab
server:
host: "0.0.0.0"
port: 8770
# 各采集器执行间隔(秒)。慢操作放大间隔,避免拖慢面板
intervals:
host: 10 # CPU/内存/负载
network: 5 # 网卡速率
containers: 15 # Docker 容器
services: 60 # 服务健康探针
crowdsec: 30 # 安全告警
storage: 300 # 磁盘/快照(btrfs 扫描慢)
certs: 3600 # 证书到期
remote: 60 # 远程主机采集
nodes: 60 # 被管理节点(SSH 采集)
ports: 120 # 端口暴露审计
disks: 1800 # 硬盘 SMART(会唤醒休眠盘,间隔放大)
engine: 60 # CrowdSec 引擎状态
# 存储卷。warn/crit 是使用率告警阈值(百分比)
storage:
volumes:
# Docker 部署下宿主机根分区挂在 /hostfs,不能直接写 /
- label: 系统盘
path: /hostfs
warn: 80
crit: 90
# - label: data
# path: /hostfs/mnt/data
# warn: 80
# crit: 90
# btrfs 快照扫描的挂载点。非 btrfs 留空即可
snapshot_mounts: []
# 服务健康探针。expect 为期望的 HTTP 状态码列表,任一命中即算健康。
# 探针在本机发起,填 127.0.0.1 即可,不必绕公网一圈
services:
- name: NAS 面板
url: https://127.0.0.1:5001/
expect: [200, 302, 401]
verify_tls: false
- name: 反向代理
url: http://127.0.0.1:16601/
expect: [200, 302, 401, 404]
- name: Grafana
url: http://127.0.0.1:3000/api/health
expect: [200]
# 证书到期检查。warn_days 内变黄,crit_days 内变红
certs:
warn_days: 30
crit_days: 7
targets:
- host: nas.example.com
port: 443
- host: dav.example.com
port: 443
# 网卡。留空自动选择流量最大的物理网卡
network:
interface: ""
crowdsec:
# 数据源优先级: 封禁走 LAPI > SQLite > cscli,告警走 SQLite > cscli
# SQLite 已能取到全部数据,api_key 可留空(避免密钥进版本库)
lapi_url: http://127.0.0.1:8080
api_key: ""
db_path: /var/lib/crowdsec/data/crowdsec.db
# 用本地城市库把攻击来源显示为中文省市,不会把攻击 IP 发给第三方
geoip_city_db: /var/lib/crowdsec/data/GeoLite2-City.mmdb
metrics_url: http://127.0.0.1:6060/metrics
# 封禁/解封用。直接复用 crowdsec agent 的 machine 凭据,
# compose 里只读挂载,密钥不进版本库
credentials_file: /etc/crowdsec/local_api_credentials.yaml
# 额外的不可封禁网段。内网段和 Tailscale 段代码里已硬保护,这里只做补充
protected_networks: []
# 面板登录。用户名和密码都填了才生效,少填一个当作没配。
#
# 单机跑的时候它是可选的;一旦接入多个 CrowdSec 节点就该打开——
# 那时同一个页面能操作全部机器的防火墙,无认证等于把整套基础设施挂在网上。
auth:
enabled: true
username: ""
# 明文和散列都认。散列用下面这条命令生成,然后整串填进来:
# docker exec homelab-dashboard python -m backend.hashpw '你的密码'
# 建议用散列——config.yaml 常会被贴出来排查问题,散列贴出去不算泄漏。
password: ""
# 会话有效期。session 存在内存里,面板重启即失效
session_hours: 168
# 同一 IP 连续失败这么多次就锁定,锁定期间连密码都不校验
max_fails: 5
lock_minutes: 15
firewall:
# 关掉则面板只读,封禁接口一律 403
enabled: true
# 给脚本调用用的令牌。带 X-Panel-Token 头的请求不需要登录也能写,
# 省得 curl 封个 IP 还要先换 cookie。前端也会多出一个令牌输入框。
# 开了上面的 auth 就不必再配这个
write_token: ""
# 既没开 auth 也没配 write_token 时,写操作一律拒绝——面板能封 IP
# 能重启容器,"不配就放行"等于留一个无认证的后门。
# 只有确认它仅暴露于可信内网、且不接多节点时,才改成 true
allow_anonymous_write: false
# 安全中心只聚合现有防护,默认不会改 1Panel/OpenResty、iptables 或代理链路。
security_center:
enabled: true
# 攻击态势地图。本地 Natural Earth 矢量底图随仓库分发,默认完全不出网。
map:
# false = 连本地 geojson 都不加载,页面退回国家/区域排行榜,用的是同一份数据
enabled: true
# 外部瓦片默认关闭。打开才会向 tile_url 发请求——国内网络访问不到 OSM 时,
# 整张攻击地图会拖成空白,而那正是这个功能最该管用的场景(出了事才来看)。
# 打开后若瓦片连续加载失败,会自动退回本地简图,右下角有状态提示。
external_tiles: false
# 开了 external_tiles 才用得上。建议换成自建或已授权的 XYZ 地址
tile_url: ""
attribution: ""
max_zoom: 12
# 可选:把 1Panel OpenResty 的 1pwaf/data 目录只读挂载到这里后,
# 页面会显示已有 WAF 规则能力与统计;未挂载时安全降级为“不可用”。
onepanel_waf:
path: /app/security/1panel-waf
# 当前已有 1Panel WAF 时保持 false,避免两个 WAF 串在 80/443 上。
# 将来单独验证 CrowdSec AppSec 时再在观察模式启用。
crowdsec_appsec:
enabled: false
listen: ""
cti:
# API key 放 .env 的 HOMELAB_CROWDSEC_CTI_KEY,不写进配置仓库。
cache_seconds: 21600
# 非标准端口上的数据库/管理服务可在这里补充,安全中心会按高风险监听提示。
# sensitive_ports:
# 58379: Redis
# 指标与事件历史。落 SQLite,容器里挂在 /app/data
history:
enabled: true
path: /app/data/homelab.db
retain_days: 90
# 告警推送。支持 Server 酱和 ntfy 两种渠道
notify:
# 推送渠道: serverchan (默认) 或 ntfy
provider: serverchan
# 留空则"配置了凭据就自动启用";显式写 false 可强制关掉推送
# enabled: true
# 敏感凭据建议放 .env 通过 env_file 注入,避免密钥进版本库
# --- Server 酱配置 (provider: serverchan) ---
# SendKey 放 .env 的 HOMELAB_SENDKEY
sendkey: ""
# Server 酱的通道号,留空用默认通道
channel: ""
# --- ntfy 配置 (provider: ntfy) ---
# topic URL,如 https://ntfy.sh/your-topic 或自建实例地址,也可放 .env 的 HOMELAB_NTFY_URL
ntfy_url: ""
# 可选:ntfy 认证 Token (若 topic 受保护),建议放 .env 的 HOMELAB_NTFY_TOKEN
ntfy_token: ""
# 低于此级别不推送: info < warn < crit
min_level: warn
# 封禁通知按时段汇总,不再一条一推。
#
# 一条一推在手机上太吵:被扫一轮能收几十条,而单条封禁本身几乎不需要当场
# 做什么——决策已经自动下发到所有节点了。攒到固定时段发一条汇总,既知道
# 发生了什么,又不会一直被打断。
#
# 只影响封禁通知。磁盘写满、证书到期、服务掉线这些仍然即时推送,
# 那些是要立刻动手的,攒到下一个时段就晚了。
ban_digest:
enabled: true
# 24 小时制,本地时区(容器挂了宿主机的 /etc/localtime)。
# 默认这三个时段的含义:早上看昨晚的,中午看上午的,睡前看白天的。
# 时段之间没有封禁就不发,不会每天雷打不动来三条空通知。
times: ["08:00", "11:30", "22:00"]
alerts:
enabled: true
# 异常必须连续存在这么久才推送,压掉探针偶发超时造成的误报
sustain_seconds: 120
# 同一个问题没解决时,隔多久重复提醒一次
repeat_hours: 12
# 问题消失时补一条恢复通知
notify_recovery: true
rules:
storage:
enabled: true
warn: 80
crit: 90
service:
enabled: true
cert:
enabled: true
warn_days: 30
crit_days: 7
host:
enabled: true
cpu_percent: 90
mem_percent: 92
temp_c: 75
# 新增封禁时提醒。只报本地检出和手动封的,
# 社区黑名单每次同步几百条,报了就是刷屏
new_ban:
enabled: true
# 硬盘坏道与老化。没有冗余,这类告警必须收到
disk:
enabled: true
# 采集器自身失败
collector:
enabled: true
# 端口暴露审计
ports:
# 可选。如果你用一个 iptables 脚本管理放行端口,且脚本里有形如
# PORTS="22,80,443"
# 的一行,填它的路径,面板会据此区分端口是"内网可达"还是"仅本机"。
# 容器内宿主机根挂在 /hostfs 下。留空或文件不存在则跳过,不影响其他功能
homeguard_path: ""
# 确实对公网开放的端口,会被标红提示。反代或路由器映射出去的填这里
public_ports: []
# 端口 -> 名称。services 里配过的会自动认领,这里只补充剩下的
labels:
22: SSH
445: SMB
8770: Homelab 面板
# 硬盘健康。重映射/待处理扇区一旦非零立刻标红,通电时长超过 warn_hours 标黄
disks:
warn_hours: 35000 # 约 4 年
# 容器操作
actions:
enabled: true
# 除了代码里硬保护的 homelab-dashboard 和 crowdsec,还想保护谁填这里
protected_containers: []
log_lines: 200
# 远程主机采集。通过 SSH 拉另一台机器的 CPU/内存/负载。
# ssh_key 需在本机存在,且公钥已加入对方 authorized_keys
remote_hosts: []
# - name: 树莓派
# host: 192.168.1.100
# port: 22
# user: root
# ssh_key: /root/.ssh/id_remote
# # npu: 采集昇腾 NPU; basic: 只采 CPU/内存/负载
# probes: [basic]
# 被管理的节点。面板通过 SSH 拉取它们的状态:负载、内存、磁盘、容器、
# 监听端口、CrowdSec 本机拦截数。
#
# 必须配合受限密钥使用——在节点的 authorized_keys 里写:
# command="/opt/homelab/node-collect.sh",restrict ssh-ed25519 AAAA...
# 这样这把钥匙只能跑那一个采集脚本,登不了 shell 也开不了隧道。
# 面板持有所有节点的私钥,没有这层限制,钥匙泄漏等于整个机群失守。
#
# 采集脚本在 scripts/node-collect.sh,装到节点的 /opt/homelab/ 下。
# 配置只认 SSH 目标,不绑定网络方案——走 VPN、内网还是公网,面板不需要知道。
nodes: []
# - name: node1
# host: root@10.0.0.2
# key: /app/secrets/id_panel
# - name: node2
# host: root@10.0.0.3
# port: 4522 # 非标准 SSH 端口
# key: /app/secrets/id_panel
# timeout: 30 # 单节点采集超时(秒)