diff --git a/src/alert/alertmanager/build/Dockerfile b/src/alert/alertmanager/build/Dockerfile index d986e31..a606569 100644 --- a/src/alert/alertmanager/build/Dockerfile +++ b/src/alert/alertmanager/build/Dockerfile @@ -19,8 +19,11 @@ RUN wget https://github.com/prometheus/alertmanager/releases/download/v${ALERTMA rm alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz ENV ALERTMANAGER_BASE_PATH=/private/argus/alert/alertmanager -ENV ARGUS_UID=2133 -ENV ARGUS_GID=2015 + +ARG ARGUS_UID=2133 +ARG ARGUS_GID=2015 +ENV ARGUS_UID=${ARGUS_UID} +ENV ARGUS_GID=${ARGUS_GID} RUN mkdir -p /usr/share/alertmanager && \ mkdir -p ${ALERTMANAGER_BASE_PATH} && \ diff --git a/src/alert/alertmanager/build/build.sh b/src/alert/alertmanager/build/build.sh new file mode 100644 index 0000000..bbfadc6 --- /dev/null +++ b/src/alert/alertmanager/build/build.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -euo pipefail +docker pull ubuntu:24.04 + +source src/alert/tests/.env + +docker build \ + --build-arg ARGUS_UID=${ARGUS_UID} \ + --build-arg ARGUS_GID=${ARGUS_GID} \ + -f src/alert/alertmanager/build/Dockerfile \ + -t argus-alertmanager:latest . + +docker save -o argus-alertmanager.tar argus-alertmanager:latest \ No newline at end of file diff --git a/src/alert/alertmanager/build/start-am-supervised.sh b/src/alert/alertmanager/build/start-am-supervised.sh index 467d7fe..76bbb8a 100644 --- a/src/alert/alertmanager/build/start-am-supervised.sh +++ b/src/alert/alertmanager/build/start-am-supervised.sh @@ -18,6 +18,7 @@ DOMAIN=alertmanager.alert.argus.com IP=$(ifconfig | grep -A 1 eth0 | grep inet | awk '{print $2}') echo "current IP: ${IP}" echo "${IP}" > /private/argus/etc/${DOMAIN} +chmod 755 /private/argus/etc/${DOMAIN} echo "[INFO] Starting Alertmanager process..." diff --git a/src/alert/alertmanager/config/rule_files/README.md b/src/alert/alertmanager/config/rule_files/README.md index 778f332..be5762b 100644 --- a/src/alert/alertmanager/config/rule_files/README.md +++ b/src/alert/alertmanager/config/rule_files/README.md @@ -55,6 +55,6 @@ alerting: alertmanagers: - static_configs: - targets: - - "localhost:9093" # Alertmanager 地址 + - "alertmanager.alert.argus.com:9093" # Alertmanager 地址 ``` \ No newline at end of file diff --git a/src/alert/tests/.env b/src/alert/tests/.env new file mode 100644 index 0000000..00f4b76 --- /dev/null +++ b/src/alert/tests/.env @@ -0,0 +1,5 @@ +DATA_ROOT=/home/argus/tmp/private/argus +ARGUS_UID=1048 +ARGUS_GID=1048 + +USE_INTRANET=false diff --git a/src/alert/tests/data/alertmanager/alertmanager.yml b/src/alert/tests/data/alertmanager/alertmanager.yml deleted file mode 100644 index 26060aa..0000000 --- a/src/alert/tests/data/alertmanager/alertmanager.yml +++ /dev/null @@ -1,19 +0,0 @@ -global: - resolve_timeout: 5m - -route: - group_by: ['alertname', 'instance'] # 分组:相同 alertname + instance 的告警合并 - group_wait: 30s # 第一个告警后,等 30s 看是否有同组告警一起发 - group_interval: 5m # 同组告警变化后,至少 5 分钟再发一次 - repeat_interval: 3h # 相同告警,3 小时重复提醒一次 - receiver: 'null' - -receivers: - - name: 'null' - -inhibit_rules: - - source_match: - severity: 'critical' # critical 告警存在时 - target_match: - severity: 'warning' # 抑制相同 instance 的 warning 告警 - equal: ['instance'] diff --git a/src/alert/tests/data/alertmanager/nflog b/src/alert/tests/data/alertmanager/nflog deleted file mode 100644 index e69de29..0000000 diff --git a/src/alert/tests/data/alertmanager/silences b/src/alert/tests/data/alertmanager/silences deleted file mode 100644 index e69de29..0000000 diff --git a/src/alert/tests/data/etc/alertmanager.alert.argus.com b/src/alert/tests/data/etc/alertmanager.alert.argus.com deleted file mode 100644 index cd339f9..0000000 --- a/src/alert/tests/data/etc/alertmanager.alert.argus.com +++ /dev/null @@ -1 +0,0 @@ -172.18.0.2 diff --git a/src/alert/tests/docker-compose.yml b/src/alert/tests/docker-compose.yml index cef0204..63b9f40 100644 --- a/src/alert/tests/docker-compose.yml +++ b/src/alert/tests/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.8' services: alertmanager: build: @@ -17,20 +16,21 @@ services: ports: - "${ARGUS_PORT:-9093}:9093" volumes: - - ${DATA_ROOT:-./data}/alertmanager:/private/argus/alert/alertmanager + - ${DATA_ROOT:-./data}/alert/alertmanager:/private/argus/alert/alertmanager - ${DATA_ROOT:-./data}/etc:/private/argus/etc networks: - - argus-network + - argus-debug-net restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" + networks: - argus-network: + argus-debug-net: driver: bridge - name: argus-network + name: argus-debug-net volumes: alertmanager_data: diff --git a/src/web/build_tools/frontend/Dockerfile b/src/web/build_tools/frontend/Dockerfile index 13c8d6a..3c87684 100644 --- a/src/web/build_tools/frontend/Dockerfile +++ b/src/web/build_tools/frontend/Dockerfile @@ -24,8 +24,10 @@ RUN apt-get update && \ apt-get clean && rm -rf /var/lib/apt/lists/* ENV FRONTEND_BASE_PATH=/private/argus/web/frontend -ENV ARGUS_UID=2133 -ENV ARGUS_GID=2015 +ARG ARGUS_UID=2133 +ARG ARGUS_GID=2015 +ENV ARGUS_UID=${ARGUS_UID} +ENV ARGUS_GID=${ARGUS_GID} RUN mkdir -p ${FRONTEND_BASE_PATH} && \ mkdir -p /private/argus/etc @@ -82,7 +84,7 @@ COPY src/web/build_tools/frontend/health-check.sh /usr/local/bin/health-check.sh RUN chmod +x /usr/local/bin/health-check.sh # 暴露端口 -EXPOSE 80 +EXPOSE 8080 # 保持 root 用户,由 supervisor 控制 user 切换 USER root diff --git a/src/web/build_tools/frontend/build.sh b/src/web/build_tools/frontend/build.sh index 31bf953..f4b5281 100644 --- a/src/web/build_tools/frontend/build.sh +++ b/src/web/build_tools/frontend/build.sh @@ -1,4 +1,7 @@ docker pull node:20 docker pull ubuntu:24.04 -docker build -f src/web/build_tools/frontend/Dockerfile -t argus-web:0.1.1 . -rm -f argus-web-0.1.1.tar && sudo docker image save argus-web:0.1.1 > argus-web-0.1.1.tar +export ARGUS_UID=1048 +export ARGUS_GID=1048 + +docker build -f src/web/build_tools/frontend/Dockerfile -t argus-web-frontend:latest . +docker save -o argus-web-frontend-latest.tar argus-web-frontend:latest diff --git a/src/web/build_tools/frontend/health-check.sh b/src/web/build_tools/frontend/health-check.sh index e993031..1c18c1d 100644 --- a/src/web/build_tools/frontend/health-check.sh +++ b/src/web/build_tools/frontend/health-check.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -URL="http://127.0.0.1:80" +URL="http://127.0.0.1:8080" echo "[INFO] Starting Argus web health check loop for $URL..." diff --git a/src/web/build_tools/frontend/nginx.conf b/src/web/build_tools/frontend/nginx.conf index 4d2cecb..96c6c35 100644 --- a/src/web/build_tools/frontend/nginx.conf +++ b/src/web/build_tools/frontend/nginx.conf @@ -12,7 +12,7 @@ http { # React 前端服务 server { - listen 80; + listen 8080; server_name web.argus.com; root /usr/share/nginx/html; @@ -24,33 +24,4 @@ http { } } - - # Master 服务,需要增加 CORS 支持 - server { - listen 80; - server_name master.argus.com; - - location / { - proxy_pass http://master.argus.com; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # CORS 支持 - add_header 'Access-Control-Allow-Origin' 'http://web.argus.com' always; - add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always; - - if ($request_method = OPTIONS) { - add_header 'Access-Control-Allow-Origin' 'http://web.argus.com' always; - add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always; - add_header 'Content-Length' 0; - add_header 'Content-Type' 'text/plain'; - return 204; - } - } -} - } diff --git a/src/web/build_tools/frontend/start-web-supervised.sh b/src/web/build_tools/frontend/start-web-supervised.sh index 8e94777..94e7a93 100644 --- a/src/web/build_tools/frontend/start-web-supervised.sh +++ b/src/web/build_tools/frontend/start-web-supervised.sh @@ -8,21 +8,12 @@ DNS_SCRIPT="${DNS_DIR}/update-dns.sh" DOMAIN=web.argus.com WEB_DOMAIN_FILE="${DNS_DIR}/${DOMAIN}" RUNTIME_USER="${ARGUS_RUNTIME_USER:-argus}" -RUNTIME_UID="${ARGUS_BUILD_UID:-2133}" -RUNTIME_GID="${ARGUS_BUILD_GID:-2015}" +RUNTIME_UID="${ARGUS_UID:-2133}" +RUNTIME_GID="${ARGUS_GID:-2015}" mkdir -p "$DNS_DIR" chown -R "$RUNTIME_UID:$RUNTIME_GID" "$DNS_DIR" 2>/dev/null || true -if [[ -x "$DNS_SCRIPT" ]]; then - echo "[INFO] Running update-dns.sh before master starts" - # 若脚本存在则执行,保证容器使用 bind 作为 DNS - "$DNS_SCRIPT" || echo "[WARN] update-dns.sh execution failed" -else - echo "[WARN] DNS update script not found or not executable: $DNS_SCRIPT" -fi - - # 记录容器 IP IP=$(ifconfig | grep -A 1 eth0 | grep inet | awk '{print $2}' || true) if [[ -n "${IP}" ]]; then @@ -32,6 +23,7 @@ if [[ -n "${IP}" ]]; then else echo "[WARN] Failed to detect web IP via ifconfig" fi +chmod 755 "$WEB_DOMAIN_FILE" echo "[INFO] Launching nginx..." diff --git a/src/web/build_tools/proxy/Dockerfile b/src/web/build_tools/proxy/Dockerfile index ba58515..e43e36f 100644 --- a/src/web/build_tools/proxy/Dockerfile +++ b/src/web/build_tools/proxy/Dockerfile @@ -8,8 +8,10 @@ RUN apt-get update && \ apt-get clean && rm -rf /var/lib/apt/lists/* ENV FRONTEND_BASE_PATH=/private/argus/web/proxy -ENV ARGUS_UID=2133 -ENV ARGUS_GID=2015 +ARG ARGUS_UID=2133 +ARG ARGUS_GID=2015 +ENV ARGUS_UID=${ARGUS_UID} +ENV ARGUS_GID=${ARGUS_GID} RUN mkdir -p ${FRONTEND_BASE_PATH} && \ mkdir -p /private/argus/etc diff --git a/src/web/build_tools/proxy/build.sh b/src/web/build_tools/proxy/build.sh new file mode 100644 index 0000000..46d2626 --- /dev/null +++ b/src/web/build_tools/proxy/build.sh @@ -0,0 +1,6 @@ +docker pull ubuntu:24.04 +export ARGUS_UID=1048 +export ARGUS_GID=1048 + +docker build -f src/web/build_tools/proxy/Dockerfile -t argus-web-proxy:latest . +docker save -o argus-web-proxy-latest.tar argus-web-proxy:latest diff --git a/src/web/build_tools/proxy/conf.d/alert.conf b/src/web/build_tools/proxy/conf.d/alert.conf index 4b770cd..1aa9224 100644 --- a/src/web/build_tools/proxy/conf.d/alert.conf +++ b/src/web/build_tools/proxy/conf.d/alert.conf @@ -3,6 +3,7 @@ server { server_name alertmanager.alert.argus.com; location / { - proxy_pass http://alertmanager.alert.argus.com:9093; + set $alert_backend http://alertmanager.alert.argus.com:9093; + proxy_pass $alert_backend; } } diff --git a/src/web/build_tools/proxy/conf.d/log.conf b/src/web/build_tools/proxy/conf.d/log.conf index 97858cc..0441bb5 100644 --- a/src/web/build_tools/proxy/conf.d/log.conf +++ b/src/web/build_tools/proxy/conf.d/log.conf @@ -4,7 +4,8 @@ server { server_name es.log.argus.com; location / { - proxy_pass http://es.log.argus.com; + set $es_backend http://es.log.argus.com:9200; + proxy_pass $es_backend; } } @@ -14,6 +15,7 @@ server { server_name kibana.log.argus.com; location / { - proxy_pass http://kibana.log.argus.com; + set $kibana_backend http://kibana.log.argus.com:5601; + proxy_pass $kibana_backend; } } diff --git a/src/web/build_tools/proxy/conf.d/master.conf b/src/web/build_tools/proxy/conf.d/master.conf index 96a19b5..a85a99f 100644 --- a/src/web/build_tools/proxy/conf.d/master.conf +++ b/src/web/build_tools/proxy/conf.d/master.conf @@ -3,25 +3,25 @@ server { server_name master.argus.com; location / { - # proxy_pass http://master.argus.com; - proxy_pass http://master.argus.com; - # proxy_set_header Host $host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; + set $master_backend http://master.argus.com:3000; + proxy_pass $master_backend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; - # # CORS 支持 - # add_header 'Access-Control-Allow-Origin' 'http://web.argus.com' always; - # add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - # add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always; + # CORS 支持 + add_header 'Access-Control-Allow-Origin' 'http://web.argus.com' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always; - # if ($request_method = OPTIONS) { - # add_header 'Access-Control-Allow-Origin' 'http://web.argus.com' always; - # add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; - # add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always; - # add_header 'Content-Length' 0; - # add_header 'Content-Type' 'text/plain'; - # return 204; - # } + if ($request_method = OPTIONS) { + add_header 'Access-Control-Allow-Origin' 'http://web.argus.com' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization' always; + add_header 'Content-Length' 0; + add_header 'Content-Type' 'text/plain'; + return 204; + } } } diff --git a/src/web/build_tools/proxy/conf.d/metric.conf b/src/web/build_tools/proxy/conf.d/metric.conf index beb8c0e..81d68c2 100644 --- a/src/web/build_tools/proxy/conf.d/metric.conf +++ b/src/web/build_tools/proxy/conf.d/metric.conf @@ -4,16 +4,18 @@ server { server_name prometheus.metric.argus.com; location / { - proxy_pass http://prom.metric.argus.com; + set $prom_backend http://prom.metric.argus.com:9090; + proxy_pass $prom_backend; } } -# # Grafana -# server { -# listen 80; -# server_name grafana.metric.argus.com; +# Grafana +server { + listen 80; + server_name grafana.metric.argus.com; -# location / { -# proxy_pass http://grafana.metric.argus.com; -# } -# } + location / { + set $grafana_backend http://grafana.metric.argus.com:3000; + proxy_pass $grafana_backend; + } +} diff --git a/src/web/build_tools/proxy/conf.d/web.conf b/src/web/build_tools/proxy/conf.d/web.conf index c810710..27397d0 100644 --- a/src/web/build_tools/proxy/conf.d/web.conf +++ b/src/web/build_tools/proxy/conf.d/web.conf @@ -3,6 +3,7 @@ server { server_name web.argus.com; location / { - proxy_pass http://web.argus.com:80; + set $web_backend http://web.argus.com:8080; + proxy_pass $web_backend; } } diff --git a/src/web/build_tools/proxy/nginx.conf.template b/src/web/build_tools/proxy/nginx.conf.template index a7c6a19..41e29ec 100644 --- a/src/web/build_tools/proxy/nginx.conf.template +++ b/src/web/build_tools/proxy/nginx.conf.template @@ -5,14 +5,6 @@ events { worker_connections 1024; } -server { - listen 80 default_server; - server_name _; - - location / { - proxy_pass http://web.argus.com:80; - } -} http { include mime.types; @@ -32,5 +24,16 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + server { + listen 80 default_server; + server_name _; + + location / { + set $web_backend http://web.argus.com:8080; + proxy_pass $web_backend; + } + } + + include /etc/nginx/conf.d/*.conf; } diff --git a/src/web/build_tools/proxy/start-proxy-supervised.sh b/src/web/build_tools/proxy/start-proxy-supervised.sh index ac276dd..51c2b7b 100644 --- a/src/web/build_tools/proxy/start-proxy-supervised.sh +++ b/src/web/build_tools/proxy/start-proxy-supervised.sh @@ -9,8 +9,8 @@ DNS_CONF_PRIVATE="/private/argus/etc/dns.conf" DNS_CONF_SYSTEM="/etc/resolv.conf" DNS_DIR="/private/argus/etc" DNS_SCRIPT="${DNS_DIR}/update-dns.sh" -RUNTIME_UID="${ARGUS_BUILD_UID:-2133}" -RUNTIME_GID="${ARGUS_BUILD_GID:-2015}" +RUNTIME_UID="${ARGUS_UID:-2133}" +RUNTIME_GID="${ARGUS_GID:-2015}" mkdir -p "$DNS_DIR" chown -R "$RUNTIME_UID:$RUNTIME_GID" "$DNS_DIR" 2>/dev/null || true diff --git a/src/web/src/components/AlertFilters.jsx b/src/web/src/components/AlertFilters.jsx index 73a8a6f..dac24b2 100644 --- a/src/web/src/components/AlertFilters.jsx +++ b/src/web/src/components/AlertFilters.jsx @@ -8,10 +8,10 @@ export function AlertFilters({ filters, setFilters, nodeOptions }) { value={filters.severity} onChange={(value) => setFilters((f) => ({ ...f, severity: value }))} data={[ - { value: "all", label: "全部" }, - { value: "critical", label: "严重" }, - { value: "warning", label: "警告" }, - { value: "info", label: "信息" }, + { value: "all", label: "all" }, + { value: "critical", label: "critical" }, + { value: "warning", label: "warning" }, + { value: "info", label: "info" }, ]} w={150} /> @@ -20,7 +20,7 @@ export function AlertFilters({ filters, setFilters, nodeOptions }) { value={filters.state} onChange={(value) => setFilters((f) => ({ ...f, state: value }))} data={[ - { value: "all", label: "全部" }, + { value: "all", label: "all" }, { value: "active", label: "Active" }, { value: "resolved", label: "Resolved" }, ]} diff --git a/src/web/src/components/AlertTable.jsx b/src/web/src/components/AlertTable.jsx index 9bc2219..ef73228 100644 --- a/src/web/src/components/AlertTable.jsx +++ b/src/web/src/components/AlertTable.jsx @@ -1,5 +1,6 @@ -import { Table, Group, ActionIcon, Button } from "@mantine/core"; -import { IconChevronUp, IconChevronDown } from "@tabler/icons-react"; +import { Table, Group, ActionIcon, Button, Code } from "@mantine/core"; +import { IconChevronUp, IconChevronDown, IconInfoCircle } from "@tabler/icons-react"; +import { useState } from "react"; export function AlertTable({ alerts, @@ -16,6 +17,11 @@ export function AlertTable({ formatRelativeTime, }) { const totalPages = Math.ceil(sortedAlerts.length / pageSize); + const [expandedRow, setExpandedRow] = useState(null); + + const toggleExpand = (index) => { + setExpandedRow(expandedRow === index ? null : index); + }; return ( <> @@ -47,24 +53,52 @@ export function AlertTable({ ))} +
{k}
:{v}
+