-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.monitoring.yml
More file actions
195 lines (188 loc) · 7.68 KB
/
Copy pathdocker-compose.monitoring.yml
File metadata and controls
195 lines (188 loc) · 7.68 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
x-logging: &default-logging
driver: "local"
options:
max-size: "${LOG_MAX_SIZE:-150m}"
max-file: "${LOG_MAX_FILE:-5}"
services:
# Logging and monitoring stack
dozzle:
image: amir20/dozzle:v10.2.1
restart: always
logging: *default-logging
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
DOZZLE_BASE: /dozzle
DOZZLE_AUTH_PROVIDER: forward-proxy
DOZZLE_AUTH_HEADER_USER: X-WEBAUTH-USER
DOZZLE_AUTH_HEADER_EMAIL: X-WEBAUTH-EMAIL
DOZZLE_AUTH_HEADER_NAME: X-WEBAUTH-NAME
# DOZZLE_ENABLE_SHELL: true
deploy:
resources:
limits:
memory: ${DOZZLE_MEM_LIMIT:-64m}
cpus: "${DOZZLE_CPU_LIMIT:-0.25}"
loki:
image: grafana/loki:3.7.1
restart: always
logging: *default-logging
# -validation.discover-log-levels=false WYLACZA wbudowana detekcje poziomu
# logu w Loki. Bez tego dzialaja DWA niezalezne detektory piszace pod ta sama
# nazwe: Loki dokleja `detected_level` jako structured metadata (slownik
# trace/debug/info/warn/error/fatal/critical), a Alloy wstawia stream label
# o tej samej nazwie. Efekt: dropdown "Log Level" w Grafanie pokazywal sume
# obu slownikow (9 wartosci, m.in. rownolegle `warn` i `warning`), a w
# szczegolach linii pojawial sie `detected_level_extracted` — Loki dokleja
# sufiks `_extracted`, gdy stream label i structured metadata maja ta sama
# nazwe. Zrodlem poziomu jest teraz WYLACZNIE Alloy (defaults/alloy/config.alloy),
# bo tylko on umie odczytac trafienia WAF-a.
#
# FLAGA, a nie klucz w local-config.yaml, CELOWO: ten plik jest kopiowany
# przez copy_if_missing (operator stroi w nim retencje), wiec zmiana w nim
# nigdy nie dotarlaby na istniejaca instalacje. Compose jest wersjonowany
# w repo, wiec `git pull && make up` wystarcza. W Loki plik YAML nadpisuje
# flagi tylko dla kluczy w NIM obecnych — stare local-config.yaml nie zna
# `discover_log_levels`, wiec wartosc z flagi zostaje (sprawdzone na 3.7.1
# przez endpoint /config).
# -querier.split-*-by-interval: Loki domyslnie tnie kazde zapytanie metryczne
# na kawalki PO GODZINIE i puszcza je rownolegle. Przy dashboardzie liczacym
# `count_over_time(...[$__range])` nad zakresem kilku tygodni to tysiace
# podzapytan na JEDEN panel. Gdy przegladarka je anuluje (przerysowanie
# panelu, zmiana zakresu), Loki loguje KAZDY anulowany shard osobno:
#
# level=warn msg="failed mapping AST" err="context canceled" query="..."
#
# — czyli setki linii szumu za jedno odswiezenie dashboardu. Rownoleglosc
# i tak nie ma tu co dac: to Loki w trybie single-binary na jednym hoscie,
# nie klaster, wiec 1400 shardow to sam narzut. 24h tnie ich liczbe 24x.
command: >
-config.file=/etc/loki/local-config.yaml
-log.level=warn
-validation.discover-log-levels=false
-querier.split-queries-by-interval=24h
-querier.split-instant-metric-queries-by-interval=24h
volumes:
- loki_data:/loki
# Bind-mount tylko samego pliku config (nie calego /etc/loki) - w obrazie
# moga byc inne pliki tam, ktorych nie chcemy nadpisac.
- ${BPP_CONFIGS_DIR}/loki/local-config.yaml:/etc/loki/local-config.yaml:ro
deploy:
resources:
limits:
memory: ${LOKI_MEM_LIMIT:-512m}
cpus: "${LOKI_CPU_LIMIT:-0.5}"
grafana:
image: grafana/grafana:12.4.2
restart: always
logging: *default-logging
environment:
- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana/
- GF_SECURITY_ADMIN_USER=admin
- GF_SERVER_SERVE_FROM_SUB_PATH=true
- GF_AUTH_PROXY_ENABLED=true
- GF_AUTH_PROXY_HEADER_NAME=X-WEBAUTH-USER
- GF_AUTH_PROXY_HEADER_PROPERTY=username
- GF_AUTH_PROXY_AUTO_SIGN_UP=true
- GF_AUTH_PROXY_HEADERS=Email:X-WEBAUTH-EMAIL Name:X-WEBAUTH-NAME
- GF_USERS_AUTO_ASSIGN_ORG_ROLE=Admin
- GF_LOG_LEVEL=error # śmieci logami okrutnie
volumes:
- grafana_data:/var/lib/grafana
- ${BPP_CONFIGS_DIR}/grafana/provisioning:/etc/grafana/provisioning:ro
depends_on:
- loki
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
deploy:
resources:
limits:
memory: ${GRAFANA_MEM_LIMIT:-192m}
cpus: "${GRAFANA_CPU_LIMIT:-1.0}"
alloy:
image: grafana/alloy:v1.15.0
restart: always
logging: *default-logging
command: >
run /etc/alloy/config.alloy
--server.http.listen-addr=0.0.0.0:12345
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${BPP_CONFIGS_DIR}/alloy:/etc/alloy:ro
depends_on:
- loki
deploy:
resources:
limits:
memory: ${ALLOY_MEM_LIMIT:-192m}
cpus: "${ALLOY_CPU_LIMIT:-0.5}"
netdata:
image: netdata/netdata:v2.10.3
hostname: ${DJANGO_BPP_HOSTNAME:-bpp}
restart: always
logging: *default-logging
pid: host
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
environment:
# NTFY_TOPIC eksportowany do agenta - health_alarm_notify.conf
# interpoluje go w `DEFAULT_RECIPIENT_NTFY` (sourced as bash).
- NTFY_TOPIC=${NTFY_TOPIC:-}
- NTFY_SERVER=${DJANGO_BPP_NTFY_SERVER:-https://ntfy.sh}
# Wylacz anonimowa telemetrie Netdaty do netdata.cloud.
- DO_NOT_TRACK=1
- DISABLE_TELEMETRY=1
# Wylacz klienta Cloud calkowicie - bez tego dashboard pokazuje
# dialog "please connect your agent" przy pierwszym wejsciu.
- NETDATA_DISABLE_CLOUD=1
volumes:
# Configi (bind-mount z BPP_CONFIGS_DIR, RO).
- ${BPP_CONFIGS_DIR}/netdata/netdata.conf:/etc/netdata/netdata.conf:ro
- ${BPP_CONFIGS_DIR}/netdata/go.d:/etc/netdata/go.d:ro
- ${BPP_CONFIGS_DIR}/netdata/health_alarm_notify.conf:/etc/netdata/health_alarm_notify.conf:ro
- ${BPP_CONFIGS_DIR}/netdata/health.d:/etc/netdata/health.d:ro
# Persistent state (named volumes).
- netdata_lib:/var/lib/netdata
- netdata_cache:/var/cache/netdata
# Host visibility (RO).
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /etc/localtime:/etc/localtime:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
- /var/log:/host/var/log:ro
# Root filesystem hosta (RO) — kolektor diskspace.plugin liczy
# zajetosc WSZYSTKICH partycji hosta (df: used/avail/% per mountpoint).
# Bez tego netdata widzi tylko filesystemy kontenera (overlay + volumes).
# `rslave` propaguje mounty pojawiajace sie po starcie kontenera.
# NETDATA_HOST_PREFIX NIE ustawiamy — obraz zna konwencje /host/root.
- /:/host/root:ro,rslave
# Docker socket dla auto-discovery kontenerow + cgroup metryk.
- /var/run/docker.sock:/var/run/docker.sock:ro
# Access log nginx (RO) dla kolektora web_log — patrz go.d/web_log.conf.
# Wolumen zadeklarowany w docker-compose.infrastructure.yml (webserver
# pisze, netdata czyta).
- nginx_access_log:/var/log/nginx-shared:ro
# Healthcheck: celowo NIE nadpisujemy — obraz ma wbudowany
# HEALTHCHECK /usr/sbin/health.sh (utrzymywany przez netdate, zna
# NETDATA_HEALTHCHECK_TARGET, uzywa curl). Poprzedni custom override
# wolal `wget`, ktorego w obrazie NIE MA (jest tylko curl/nc) -> kontener
# zawsze raportowal `unhealthy` mimo dzialajacej netdaty.
deploy:
resources:
limits:
memory: ${NETDATA_MEM_LIMIT:-768m}
cpus: "${NETDATA_CPU_LIMIT:-1.0}"
volumes:
grafana_data:
loki_data:
netdata_lib:
netdata_cache: