From 10a7103c4a94afddc859393782b6a6a6a2057367 Mon Sep 17 00:00:00 2001 From: Bray Date: Thu, 26 Mar 2026 17:30:29 -0400 Subject: [PATCH] Update configs (gcloud) --- .env.example | 20 - .gitattributes | 2 - .gitignore | 2 - README.md | 124 -- docs.md | 124 -- infra-api/Dockerfile | 5 - infra-api/docker-compose.yml | 18 - infra-api/output/generateNginx.js | 0 infra-api/output/generatePihole.js | 0 infra-api/package-lock.json | 1444 ----------------- infra-api/package.json | 6 - infra-api/routes/domains.js | 53 - infra-api/server.js | 27 - infra-api/utils/dockerInspector.js | 69 - monitoring/docker-compose.yml | 26 + monitoring/prometheus/prometheus.yml | 30 + nodes/docker-compose.node.yml | 16 + pi/Dockerfile.alertmanager | 19 - .../alertmanager/alertmanager.template.yml | 14 - pi/configs/alertmanager/alertmanager.yml | 14 - pi/configs/loki/loki-config.yml | 53 - pi/configs/prometheus/prometheus.yml | 19 - pi/configs/promtail/positions.yaml | 10 - pi/configs/promtail/promtail.yml | 18 - pi/docker-compose.yml | 87 - pi/stack-status.sh | 27 - pi/start.sh | 16 - ubuntu-1/Dockerfile.alertmanager | 19 - .../alertmanager/alertmanager.template.yml | 14 - .../configs/alertmanager/alertmanager.yml | 14 - ubuntu-1/configs/loki/loki-config.yml | 53 - ubuntu-1/configs/prometheus/prometheus.yml | 19 - ubuntu-1/configs/promtail/positions.yaml | 10 - ubuntu-1/configs/promtail/promtail.yml | 18 - ubuntu-1/docker-compose.yml | 68 - ubuntu-1/stack-status.sh | 27 - ubuntu-1/start.sh | 16 - ubuntu-2/Dockerfile.alertmanager | 19 - .../alertmanager/alertmanager.template.yml | 14 - .../configs/alertmanager/alertmanager.yml | 14 - ubuntu-2/configs/loki/loki-config.yml | 53 - ubuntu-2/configs/prometheus/prometheus.yml | 19 - ubuntu-2/configs/promtail/positions.yaml | 9 - ubuntu-2/configs/promtail/promtail.yml | 18 - ubuntu-2/docker-compose.yml | 68 - ubuntu-2/stack-status.sh | 27 - ubuntu-2/start.sh | 16 - unraid/Dockerfile.alertmanager | 19 - .../alertmanager/alertmanager.template.yml | 14 - unraid/configs/alertmanager/alertmanager.yml | 14 - unraid/configs/grafana/grafana.ini | 0 unraid/configs/loki/loki-config.yml | 53 - unraid/configs/nginx/default.conf | 0 unraid/configs/prometheus/prometheus.yml | 0 unraid/configs/promtail/promtail.yml | 18 - unraid/docker-compose.yml | 94 -- unraid/stack-status.sh | 27 - unraid/start.sh | 16 - 58 files changed, 72 insertions(+), 2941 deletions(-) delete mode 100644 .env.example delete mode 100644 .gitattributes delete mode 100644 README.md delete mode 100644 docs.md delete mode 100644 infra-api/Dockerfile delete mode 100644 infra-api/docker-compose.yml delete mode 100644 infra-api/output/generateNginx.js delete mode 100644 infra-api/output/generatePihole.js delete mode 100644 infra-api/package-lock.json delete mode 100644 infra-api/package.json delete mode 100644 infra-api/routes/domains.js delete mode 100644 infra-api/server.js delete mode 100644 infra-api/utils/dockerInspector.js create mode 100644 monitoring/docker-compose.yml create mode 100644 monitoring/prometheus/prometheus.yml create mode 100644 nodes/docker-compose.node.yml delete mode 100644 pi/Dockerfile.alertmanager delete mode 100644 pi/configs/alertmanager/alertmanager.template.yml delete mode 100644 pi/configs/alertmanager/alertmanager.yml delete mode 100644 pi/configs/loki/loki-config.yml delete mode 100644 pi/configs/prometheus/prometheus.yml delete mode 100644 pi/configs/promtail/positions.yaml delete mode 100644 pi/configs/promtail/promtail.yml delete mode 100644 pi/docker-compose.yml delete mode 100755 pi/stack-status.sh delete mode 100755 pi/start.sh delete mode 100644 ubuntu-1/Dockerfile.alertmanager delete mode 100644 ubuntu-1/configs/alertmanager/alertmanager.template.yml delete mode 100644 ubuntu-1/configs/alertmanager/alertmanager.yml delete mode 100644 ubuntu-1/configs/loki/loki-config.yml delete mode 100644 ubuntu-1/configs/prometheus/prometheus.yml delete mode 100644 ubuntu-1/configs/promtail/positions.yaml delete mode 100644 ubuntu-1/configs/promtail/promtail.yml delete mode 100644 ubuntu-1/docker-compose.yml delete mode 100755 ubuntu-1/stack-status.sh delete mode 100755 ubuntu-1/start.sh delete mode 100644 ubuntu-2/Dockerfile.alertmanager delete mode 100644 ubuntu-2/configs/alertmanager/alertmanager.template.yml delete mode 100644 ubuntu-2/configs/alertmanager/alertmanager.yml delete mode 100644 ubuntu-2/configs/loki/loki-config.yml delete mode 100644 ubuntu-2/configs/prometheus/prometheus.yml delete mode 100644 ubuntu-2/configs/promtail/positions.yaml delete mode 100644 ubuntu-2/configs/promtail/promtail.yml delete mode 100644 ubuntu-2/docker-compose.yml delete mode 100755 ubuntu-2/stack-status.sh delete mode 100755 ubuntu-2/start.sh delete mode 100644 unraid/Dockerfile.alertmanager delete mode 100644 unraid/configs/alertmanager/alertmanager.template.yml delete mode 100644 unraid/configs/alertmanager/alertmanager.yml delete mode 100644 unraid/configs/grafana/grafana.ini delete mode 100644 unraid/configs/loki/loki-config.yml delete mode 100644 unraid/configs/nginx/default.conf delete mode 100644 unraid/configs/prometheus/prometheus.yml delete mode 100644 unraid/configs/promtail/promtail.yml delete mode 100644 unraid/docker-compose.yml delete mode 100755 unraid/stack-status.sh delete mode 100755 unraid/start.sh diff --git a/.env.example b/.env.example deleted file mode 100644 index 236eaa7..0000000 --- a/.env.example +++ /dev/null @@ -1,20 +0,0 @@ -# ---- Port Bindings ---- -PROMETHEUS_PORT=9390 -ALERTMANAGER_PORT=9043 -LOKI_PORT=4100 -NODE_EXPORTER_PORT=9112 -DOCKER_EXPORTER_PORT=9487 -PIHOLE_WEB_PORT=8040 -PIHOLE_DNS_PORT=53 -PIHOLE_HTTPS_PORT=443 - -# ---- Pihole Config ---- -PIHOLE_PASSWORD= -TZ=America/Toronto -WEBPASSWORD= - -# ---- Alertmanager ---- -DISCORD_WEBHOOK= - -# ---- Metadata ---- -HOSTNAME= \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe0770..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.gitignore b/.gitignore index 97aca2e..e69de29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +0,0 @@ -.env -node_modules \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 69224f2..0000000 --- a/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# ๐Ÿง  Infrastructure Usage Guide - -This guide explains how to use the new Docker-based infrastructure stack deployed on **Unraid**, **Raspberry Pi**, and **Ubuntu**. - ---- - -## ๐Ÿš€ Starting the Monitoring Stack - -Each machine has a `start.sh` wrapper script that: -- Runs `docker compose up -d` -- Waits a few seconds for container readiness -- Logs container IPs, ports, and web URLs - -To start: - -```bash -chmod +x start.sh -./start.sh -``` - ---- - -## ๐Ÿ“œ Service Overview - -The following services are deployed (excluding Pi-hole on Ubuntu): - -| Service | Unraid | Pi | Ubuntu | -|------------------|--------|----|-------| -| Grafana | โœ… | โŒ | โŒ | -| Prometheus | โœ… | โœ… | โœ… | -| Loki | โœ… | โœ… | โœ… | -| Promtail | โœ… | โœ… | โœ… | -| Alertmanager | โœ… | โœ… | โœ… | -| Node Exporter | โœ… | โœ… | โœ… | -| Docker Exporter | โœ… | โœ… | โœ… | -| NGINX | โœ… | โŒ | โŒ | -| Pi-hole | โŒ | โœ… | โŒ | - ---- - -## ๐ŸŒ Defining IPs in Pi-hole - -Pi-hole is used for internal DNS routing of your infrastructure services. - -1. Open the **Pi-hole Admin Panel** -2. Go to **Local DNS > DNS Records** -3. Add A records like: - -``` -grafana.wyvern.bray.io -> 192.168.2.16 -prometheus.unraid.bray.io -> 192.168.2.28 -``` - -> ๐Ÿ’ก You can verify entries with `dig grafana.wyvern.bray.io`. - ---- - -## ๐ŸŒ Defining IPs in NGINX - -NGINX is used to expose internal services via friendly URLs (e.g. `https://grafana.wyvern.bray.io`). - -1. Go to: `configs/nginx/conf.d/` -2. Create or modify `.conf` files like: - -```nginx -server { - listen 443 ssl; - server_name grafana.wyvern.bray.io; - - ssl_certificate /etc/nginx/ssl/fullchain.pem; - ssl_certificate_key /etc/nginx/ssl/privkey.pem; - - location / { - proxy_pass http://192.168.2.16:3000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - } -} -``` - -3. Reload NGINX (or restart the container): - -```bash -docker restart nginx -``` - ---- - -## ๐Ÿ“ฆ Adding New Services - -1. Add a new service to `docker-compose.yml` -2. Assign a static IP if needed -3. Add a DNS record in Pi-hole -4. Add a reverse proxy entry in NGINX - ---- - -## ๐Ÿงผ Resetting the Stack - -You can bring down and rebuild everything: - -```bash -docker compose down -docker compose up -d --build -``` - -This will recreate containers with preserved volumes. If you wipe volumes, services will reset. - ---- - -## โœ… Final Tip: Keep a Network Sheet - -Keep a `infra-ip-map.md` or spreadsheet like: - -| Container | Host | Static IP | Port | Domain | -|----------------|---------|----------------|------|-----------------------------------| -| Grafana | Unraid | 192.168.2.16 | 3000 | grafana.wyvern.bray.io | -| Prometheus | Pi | 192.168.2.28 | 9090 | prometheus.pi.bray.io | -| Loki | Ubuntu | 192.168.2.26 | 3100 | loki.ubuntu.bray.io | -| ... | ... | ... | ... | ... | - ---- - -Happy hacking ๐Ÿ› ๏ธ diff --git a/docs.md b/docs.md deleted file mode 100644 index a52acca..0000000 --- a/docs.md +++ /dev/null @@ -1,124 +0,0 @@ -# ๐Ÿง  Infrastructure Usage Guide - -This guide explains how to use the new Docker-based infrastructure stack deployed on **Unraid**, **Raspberry Pi**, and **Ubuntu**. - ---- - -## ๐Ÿš€ Starting the Monitoring Stack - -Each machine has a `start.sh` wrapper script that: -- Runs `docker compose up -d` -- Waits a few seconds for container readiness -- Logs container IPs, ports, and web URLs - -To start: - -```bash -chmod +x start.sh -./start.sh -``` - ---- - -## ๐Ÿ“œ Service Overview - -The following services are deployed (excluding Pi-hole on Ubuntu): - -| Service | Unraid | Pi | Ubuntu | -|------------------|--------|----|-------| -| Grafana | โœ… | โŒ | โŒ | -| Prometheus | โœ… | โœ… | โœ… | -| Loki | โœ… | โœ… | โœ… | -| Promtail | โœ… | โœ… | โœ… | -| Alertmanager | โœ… | โœ… | โœ… | -| Node Exporter | โœ… | โœ… | โœ… | -| Docker Exporter | โœ… | โœ… | โœ… | -| NGINX | โœ… | โŒ | โŒ | -| Pi-hole | โŒ | โœ… | โŒ | - ---- - -## ๐ŸŒ Defining IPs in Pi-hole - -Pi-hole is used for internal DNS routing of your infrastructure services. - -1. Open the **Pi-hole Admin Panel** -2. Go to **Local DNS > DNS Records** -3. Add A records like: - -``` -grafana.wyvern.bray.io -> 192.168.2.16 -prometheus.unraid.bray.io -> 192.168.2.28 -``` - -> ๐Ÿ’ก You can verify entries with `dig grafana.wyvern.bray.io`. - ---- - -## ๐ŸŒ Defining IPs in NGINX - -NGINX is used to expose internal services via friendly URLs (e.g. `https://grafana.wyvern.bray.io`). - -1. Go to: `configs/nginx/conf.d/` -2. Create or modify `.conf` files like: - -```nginx -server { - listen 443 ssl; - server_name grafana.wyvern.bray.io; - - ssl_certificate /etc/nginx/ssl/fullchain.pem; - ssl_certificate_key /etc/nginx/ssl/privkey.pem; - - location / { - proxy_pass http://192.168.2.16:3000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - } -} -``` - -3. Reload NGINX (or restart the container): - -```bash -docker restart nginx -``` - ---- - -## ๐Ÿ“ฆ Adding New Services - -1. Add a new service to `docker-compose.yml` -2. Assign a static IP if needed -3. Add a DNS record in Pi-hole -4. Add a reverse proxy entry in NGINX - ---- - -## ๐Ÿงผ Resetting the Stack - -You can bring down and rebuild everything: - -```bash -docker compose down -docker compose up -d --build -``` - -This will recreate containers with preserved volumes. If you wipe volumes, services will reset. - ---- - -## โœ… Final Tip: Keep a Network Sheet - -Keep a `infra-ip-map.md` or spreadsheet like: - -| Container | Host | Static IP | Port | Domain | -|----------------|---------|----------------|------|-----------------------------------| -| Grafana | Unraid | 192.168.2.16 | 3000 | grafana.wyvern.bray.io | -| Prometheus | Pi | 192.168.2.28 | 9090 | prometheus.pi.bray.io | -| Loki | Ubuntu | 192.168.2.26 | 3100 | loki.ubuntu.bray.io | -| ... | ... | ... | ... | ... | - ---- - -Happy hacking ๐Ÿ› ๏ธ \ No newline at end of file diff --git a/infra-api/Dockerfile b/infra-api/Dockerfile deleted file mode 100644 index 06ae3e3..0000000 --- a/infra-api/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM node:18-alpine -WORKDIR /app -COPY . . -RUN npm install -CMD ["node", "server.js"] \ No newline at end of file diff --git a/infra-api/docker-compose.yml b/infra-api/docker-compose.yml deleted file mode 100644 index b96021d..0000000 --- a/infra-api/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: '3.8' - -services: - infra-api: - image: node:18 - container_name: infra-api - working_dir: /app - volumes: - - ./:/app - - /var/run/docker.sock:/var/run/docker.sock - command: > - sh -c "npm install && node server.js" - ports: - - "8686:8686" - restart: unless-stopped - environment: - - NODE_ENV=production - network_mode: ${USE_HOST_NETWORK} \ No newline at end of file diff --git a/infra-api/output/generateNginx.js b/infra-api/output/generateNginx.js deleted file mode 100644 index e69de29..0000000 diff --git a/infra-api/output/generatePihole.js b/infra-api/output/generatePihole.js deleted file mode 100644 index e69de29..0000000 diff --git a/infra-api/package-lock.json b/infra-api/package-lock.json deleted file mode 100644 index 6f57ed6..0000000 --- a/infra-api/package-lock.json +++ /dev/null @@ -1,1444 +0,0 @@ -{ - "name": "app", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "dockerode": "^4.0.6", - "express": "^5.1.0" - } - }, - "node_modules/@balena/dockerignore": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", - "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", - "license": "Apache-2.0" - }, - "node_modules/@grpc/grpc-js": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", - "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@types/node": { - "version": "22.15.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.28.tgz", - "integrity": "sha512-I0okKVDmyKR281I0UIFV7EWAWRnR0gkuSKob5wVcByyyhr7Px/slhkQapcYX4u00ekzNWaS1gznKZnuzxwo4pw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buildcheck": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", - "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", - "optional": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cpu-features": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", - "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "buildcheck": "~0.0.6", - "nan": "^2.19.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/docker-modem": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz", - "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.1", - "readable-stream": "^3.5.0", - "split-ca": "^1.0.1", - "ssh2": "^1.15.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/dockerode": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.6.tgz", - "integrity": "sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==", - "license": "Apache-2.0", - "dependencies": { - "@balena/dockerignore": "^1.0.2", - "@grpc/grpc-js": "^1.11.1", - "@grpc/proto-loader": "^0.7.13", - "docker-modem": "^5.0.6", - "protobufjs": "^7.3.2", - "tar-fs": "~2.1.2", - "uuid": "^10.0.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", - "license": "MIT", - "optional": true - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/protobufjs": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", - "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/split-ca": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", - "license": "ISC" - }, - "node_modules/ssh2": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", - "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", - "hasInstallScript": true, - "dependencies": { - "asn1": "^0.2.6", - "bcrypt-pbkdf": "^1.0.2" - }, - "engines": { - "node": ">=10.16.0" - }, - "optionalDependencies": { - "cpu-features": "~0.0.10", - "nan": "^2.20.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense" - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - } - } -} diff --git a/infra-api/package.json b/infra-api/package.json deleted file mode 100644 index 4dffb68..0000000 --- a/infra-api/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "dockerode": "^4.0.6", - "express": "^5.1.0" - } -} diff --git a/infra-api/routes/domains.js b/infra-api/routes/domains.js deleted file mode 100644 index b25ad6c..0000000 --- a/infra-api/routes/domains.js +++ /dev/null @@ -1,53 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const { getContainerData } = require('../utils/dockerInspector'); -const os = require('os'); - -router.get('/', async (req, res) => { - try { - const containers = await getContainerData(); - const hostInterfaces = os.networkInterfaces(); - const ip = - hostInterfaces.en0?.find(i => i.family === 'IPv4')?.address || - hostInterfaces.eth0?.find(i => i.family === 'IPv4')?.address || - '127.0.0.1'; - - const rows = containers - .map(c => { - const [host, container] = c.name.split('-', 2); - if (!host || !container) return null; - - const safeContainer = container.replace(/_/g, ''); - const safeHost = host.replace(/_/g, ''); - const hasPorts = c.ports && c.ports.length > 0; - const url = hasPorts ? `${ip}:${c.ports[0]}` : null; - const domain = `${safeContainer}.${safeHost}.bray.io`; - - if (!url) return null; - - return { - name: safeContainer, - url, - domain, - }; - }) - .filter(Boolean); - - // Create a pretty text table - const header = `NAME | URL | DOMAIN`; - const divider = `--------------------|------------------------|-----------------------------`; - const lines = rows.map(row => - `${row.name.padEnd(20)}| ${row.url.padEnd(24)}| ${row.domain}` - ); - - const output = [header, divider, ...lines].join('\n'); - - res.setHeader('Content-Type', 'text/plain'); - res.send(output); - } catch (err) { - console.error('Error building domain list:', err); - res.status(500).send('Failed to generate domain mappings'); - } -}); - -module.exports = router; \ No newline at end of file diff --git a/infra-api/server.js b/infra-api/server.js deleted file mode 100644 index 3ed378f..0000000 --- a/infra-api/server.js +++ /dev/null @@ -1,27 +0,0 @@ -const express = require('express'); -const os = require('os'); -const { getContainerData } = require('./utils/dockerInspector'); - -const app = express(); -const PORT = process.env.PORT || 8686; -const hostname = os.hostname().toLowerCase(); // used in domain mapping - -// Endpoint to list all containers and their info -app.get('/containers', async (req, res) => { - try { - const containers = await getContainerData(); - res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify(containers, null, 2)); // Pretty print JSON - } catch (err) { - console.error('Error fetching containers:', err); - res.status(500).send('Internal Server Error'); - } -}); - -const domainRoutes = require('./routes/domains'); -app.use('/domains', domainRoutes); - -// Start server -app.listen(8686, '0.0.0.0', () => { - console.log('Infra API listening at http://localhost:8686'); -}); \ No newline at end of file diff --git a/infra-api/utils/dockerInspector.js b/infra-api/utils/dockerInspector.js deleted file mode 100644 index 1e24166..0000000 --- a/infra-api/utils/dockerInspector.js +++ /dev/null @@ -1,69 +0,0 @@ -const Docker = require('dockerode'); -const os = require('os'); - -const docker = new Docker(); - -// Helper to detect the host IP (e.g. 192.168.x.x) -function getHostIP() { - const interfaces = os.networkInterfaces(); - for (const iface of Object.values(interfaces)) { - for (const net of iface) { - if (net.family === 'IPv4' && !net.internal && net.address.startsWith('192.')) { - return net.address; - } - } - } - return 'localhost'; // Fallback -} - -async function getContainerData() { - const containers = await docker.listContainers({ all: true }); - const hostname = os.hostname(); - const hostIp = getHostIP(); - - const output = []; - - for (const containerInfo of containers) { - const container = docker.getContainer(containerInfo.Id); - const inspect = await container.inspect(); - - const rawName = inspect.Name || containerInfo.Names?.[0] || ''; - const name = rawName.replace(/^\//, ''); - - const networks = inspect.NetworkSettings.Networks || {}; - let staticIP = null; - - // Try to find a meaningful internal Docker-assigned static IP - for (const netName in networks) { - const ip = networks[netName].IPAddress; - if (ip && (ip.startsWith('192.') || ip.startsWith('10.'))) { - staticIP = ip; - break; - } - } - - const rawPorts = Object.values(inspect.NetworkSettings.Ports || {}) - .flat() - .filter(Boolean); - const ports = rawPorts.map(p => p.HostPort); - - // Prefer static IP if available, fallback to host IP - let url = '(none)'; - if (ports.length > 0) { - const accessIP = staticIP || hostIp; - url = `http://${accessIP}:${ports[0]}`; - } - - output.push({ - name, - ip: staticIP || 'N/A', - ports, - hostname, - url, - }); - } - - return output; -} - -module.exports = { getContainerData }; \ No newline at end of file diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml new file mode 100644 index 0000000..961db7e --- /dev/null +++ b/monitoring/docker-compose.yml @@ -0,0 +1,26 @@ +services: + prometheus: + image: prom/prometheus:latest + container_name: prometheus + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + - prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + ports: + - "9090:9090" + restart: unless-stopped + + grafana: + image: grafana/grafana:latest + container_name: grafana + ports: + - "3000:3000" + volumes: + - grafana_data:/var/lib/grafana + restart: unless-stopped + +volumes: + prometheus_data: + grafana_data: \ No newline at end of file diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml new file mode 100644 index 0000000..57ad9ba --- /dev/null +++ b/monitoring/prometheus/prometheus.yml @@ -0,0 +1,30 @@ +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: 'mystic-infrastructure' + static_configs: + - targets: ['100.109.59.41:9100'] + labels: + instance: 'mystic-database' + role: 'database' + env: 'prod' + + - targets: ['100.120.171.124:9100'] + labels: + instance: 'mystic-passwords' + role: 'vault' + env: 'prod' + + - targets: ['100.98.158.31:9100'] + labels: + instance: 'mystic-git' + role: 'git' + env: 'prod' + + - targets: ['100.80.179.128:9100'] + labels: + instance: 'mystic-cloud' + role: 'monitoring' + env: 'prod' \ No newline at end of file diff --git a/nodes/docker-compose.node.yml b/nodes/docker-compose.node.yml new file mode 100644 index 0000000..2a000bc --- /dev/null +++ b/nodes/docker-compose.node.yml @@ -0,0 +1,16 @@ +services: + node-exporter: + image: prom/node-exporter:latest + container_name: node-exporter + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + command: + - '--path.procfs=/host/proc' + - '--path.rootfs=/rootfs' + - '--path.sysfs=/host/sys' + - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' + ports: + - "9100:9100" + restart: unless-stopped \ No newline at end of file diff --git a/pi/Dockerfile.alertmanager b/pi/Dockerfile.alertmanager deleted file mode 100644 index 3ce7e1b..0000000 --- a/pi/Dockerfile.alertmanager +++ /dev/null @@ -1,19 +0,0 @@ -# Stage 1: Pull original Alertmanager binary -FROM prom/alertmanager:latest as upstream - -# Stage 2: Alpine + envsubst -FROM alpine:latest - -# Install envsubst and ca-certificates -RUN apk add --no-cache gettext ca-certificates - -# Create directories -RUN mkdir -p /etc/alertmanager /alertmanager - -# Copy Alertmanager binary from upstream -COPY --from=upstream /bin/alertmanager /bin/alertmanager -COPY --from=upstream /etc/alertmanager /etc/alertmanager - -# Default config will be overwritten by volume mount -ENTRYPOINT ["/bin/sh", "-c"] -CMD ["envsubst < /etc/alertmanager/alertmanager.template.yml > /etc/alertmanager/alertmanager.yml && /bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml"] \ No newline at end of file diff --git a/pi/configs/alertmanager/alertmanager.template.yml b/pi/configs/alertmanager/alertmanager.template.yml deleted file mode 100644 index 245316d..0000000 --- a/pi/configs/alertmanager/alertmanager.template.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/pi/configs/alertmanager/alertmanager.yml b/pi/configs/alertmanager/alertmanager.yml deleted file mode 100644 index 245316d..0000000 --- a/pi/configs/alertmanager/alertmanager.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/pi/configs/loki/loki-config.yml b/pi/configs/loki/loki-config.yml deleted file mode 100644 index adfd773..0000000 --- a/pi/configs/loki/loki-config.yml +++ /dev/null @@ -1,53 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - grpc_listen_port: 9095 - -ingester: - lifecycler: - ring: - kvstore: - store: inmemory - replication_factor: 1 - chunk_idle_period: 5m - chunk_retain_period: 30s - wal: - dir: /loki/wal - -limits_config: - reject_old_samples: true - reject_old_samples_max_age: 168h - allow_structured_metadata: false - -schema_config: - configs: - - from: 2024-01-01 - store: boltdb-shipper - object_store: filesystem - schema: v12 - index: - prefix: index_ - period: 24h - -storage_config: - boltdb_shipper: - active_index_directory: /loki/index - cache_location: /loki/cache - filesystem: - directory: /loki/chunks - -ruler: - storage: - type: local - local: - directory: /loki/rules - rule_path: /loki/rules-temp - alertmanager_url: http://localhost:9093 - ring: - kvstore: - store: inmemory - enable_api: true - -compactor: - working_directory: /loki/compactor \ No newline at end of file diff --git a/pi/configs/prometheus/prometheus.yml b/pi/configs/prometheus/prometheus.yml deleted file mode 100644 index c05e6a4..0000000 --- a/pi/configs/prometheus/prometheus.yml +++ /dev/null @@ -1,19 +0,0 @@ -global: - scrape_interval: 15s - -scrape_configs: - - job_name: 'prometheus' - static_configs: - - targets: ['localhost:9090'] - - - job_name: 'node_exporter' - static_configs: - - targets: ['localhost:9100'] - - - job_name: 'docker_exporter' - static_configs: - - targets: ['localhost:9487'] - - - job_name: 'pi_services' - static_configs: - - targets: ['localhost:3100', 'localhost:9093'] \ No newline at end of file diff --git a/pi/configs/promtail/positions.yaml b/pi/configs/promtail/positions.yaml deleted file mode 100644 index c423e3f..0000000 --- a/pi/configs/promtail/positions.yaml +++ /dev/null @@ -1,10 +0,0 @@ -positions: - /var/log/acroUpdaterTools.log: "16567" - /var/log/alf.log: "0" - /var/log/fsck_apfs.log: "23880" - /var/log/fsck_apfs_error.log: "676" - /var/log/fsck_hfs.log: "4044" - /var/log/install.log: "3856377" - /var/log/shutdown_monitor.log: "1971" - /var/log/system.log: "6579" - /var/log/wifi.log: "1164834" diff --git a/pi/configs/promtail/promtail.yml b/pi/configs/promtail/promtail.yml deleted file mode 100644 index 19dfa5f..0000000 --- a/pi/configs/promtail/promtail.yml +++ /dev/null @@ -1,18 +0,0 @@ -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -positions: - filename: /etc/promtail/positions.yaml - -clients: - - url: http://loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: system - static_configs: - - targets: - - localhost - labels: - job: varlogs - __path__: /var/log/*.log \ No newline at end of file diff --git a/pi/docker-compose.yml b/pi/docker-compose.yml deleted file mode 100644 index d8cb688..0000000 --- a/pi/docker-compose.yml +++ /dev/null @@ -1,87 +0,0 @@ -services: - prometheus: - image: prom/prometheus:latest - container_name: ${HOSTNAME}-prometheus - ports: - - "${PROMETHEUS_PORT}:9090" - volumes: - - ./configs/prometheus:/etc/prometheus - - prometheus-data:/prometheus - command: - - --config.file=/etc/prometheus/prometheus.yml - restart: unless-stopped - - alertmanager: - build: - context: . - dockerfile: Dockerfile.alertmanager - container_name: ${HOSTNAME}-alertmanager - ports: - - "${ALERTMANAGER_PORT}:9093" - volumes: - - ./configs/alertmanager:/etc/alertmanager - environment: - - DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL} - restart: unless-stopped - - loki: - image: grafana/loki:latest - container_name: ${HOSTNAME}-loki - ports: - - "${LOKI_PORT}:3100" - volumes: - - ./configs/loki:/etc/loki - - loki-data:/loki - command: ["-config.file=/etc/loki/loki-config.yml", "-config.expand-env=true"] - restart: unless-stopped - - promtail: - image: grafana/promtail:latest - container_name: ${HOSTNAME}-promtail - volumes: - - /var/log:/var/log:ro - - ./configs/promtail:/etc/promtail - command: -config.file=/etc/promtail/promtail.yml - restart: unless-stopped - - node_exporter: - image: prom/node-exporter:latest - container_name: ${HOSTNAME}-node_exporter - ports: - - "${NODE_EXPORTER_PORT}:9100" - command: - - --web.listen-address=:${NODE_EXPORTER_PORT} - restart: unless-stopped - - docker_exporter: - image: prometheusnet/docker_exporter - container_name: ${HOSTNAME}-docker_exporter - ports: - - "${DOCKER_EXPORTER_PORT}:9487" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - restart: unless-stopped - - pihole: - image: pihole/pihole:latest - container_name: ${HOSTNAME}-pihole - hostname: ${HOSTNAME} - ports: - - "${PIHOLE_WEB_PORT}:80" - - "${PIHOLE_HTTPS_PORT}:443" - - "${PIHOLE_DNS_PORT}:53/udp" - environment: - TZ: ${TZ} - WEBPASSWORD: ${WEBPASSWORD} - volumes: - - pihole-config:/etc/pihole - - dnsmasq-config:/etc/dnsmasq.d - cap_add: - - NET_ADMIN - restart: unless-stopped - -volumes: - prometheus-data: - loki-data: - pihole-config: - dnsmasq-config: \ No newline at end of file diff --git a/pi/stack-status.sh b/pi/stack-status.sh deleted file mode 100755 index 5dbb1c0..0000000 --- a/pi/stack-status.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Optional base hostname (e.g., monitor.local) -BASE_HOST="${NGINX_HOST:-localhost}" - -printf "%-20s | %-15s | %-25s | %-40s\n" "Service" "IP Address" "Port Bindings" "URL" -printf "%s\n" "---------------------------------------------------------------------------------------------------------------" - -for container in $(docker ps --format '{{.Names}}'); do - ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container") - - ports=$(docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}{{$conf | json}}{{end}}{{end}}' "$container" \ - | jq -r '.[] | "\(.HostPort)"' 2>/dev/null | paste -sd "," -) - - if [ -z "$ports" ]; then - ports="(none)" - url="(none)" - else - # Just use the first port for URL - first_port=$(echo "$ports" | cut -d',' -f1) - scheme="http" - [ "$first_port" = "443" ] && scheme="https" - url="$scheme://$BASE_HOST:$first_port" - fi - - printf "%-20s | %-15s | %-25s | %-40s\n" "$container" "$ip" "$ports" "$url" -done \ No newline at end of file diff --git a/pi/start.sh b/pi/start.sh deleted file mode 100755 index 31422b4..0000000 --- a/pi/start.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -echo "๐Ÿš€ Starting monitoring stack..." -docker-compose up -d - -if [ $? -ne 0 ]; then - echo "โŒ Failed to start containers. Check docker-compose logs." - exit 1 -fi - -echo "โœ… Containers started. Waiting a few seconds for services to boot..." -sleep 5 - -echo "" -echo "๐Ÿ” Gathering service info:" -./stack-status.sh \ No newline at end of file diff --git a/ubuntu-1/Dockerfile.alertmanager b/ubuntu-1/Dockerfile.alertmanager deleted file mode 100644 index 3ce7e1b..0000000 --- a/ubuntu-1/Dockerfile.alertmanager +++ /dev/null @@ -1,19 +0,0 @@ -# Stage 1: Pull original Alertmanager binary -FROM prom/alertmanager:latest as upstream - -# Stage 2: Alpine + envsubst -FROM alpine:latest - -# Install envsubst and ca-certificates -RUN apk add --no-cache gettext ca-certificates - -# Create directories -RUN mkdir -p /etc/alertmanager /alertmanager - -# Copy Alertmanager binary from upstream -COPY --from=upstream /bin/alertmanager /bin/alertmanager -COPY --from=upstream /etc/alertmanager /etc/alertmanager - -# Default config will be overwritten by volume mount -ENTRYPOINT ["/bin/sh", "-c"] -CMD ["envsubst < /etc/alertmanager/alertmanager.template.yml > /etc/alertmanager/alertmanager.yml && /bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml"] \ No newline at end of file diff --git a/ubuntu-1/configs/alertmanager/alertmanager.template.yml b/ubuntu-1/configs/alertmanager/alertmanager.template.yml deleted file mode 100644 index 245316d..0000000 --- a/ubuntu-1/configs/alertmanager/alertmanager.template.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/ubuntu-1/configs/alertmanager/alertmanager.yml b/ubuntu-1/configs/alertmanager/alertmanager.yml deleted file mode 100644 index 245316d..0000000 --- a/ubuntu-1/configs/alertmanager/alertmanager.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/ubuntu-1/configs/loki/loki-config.yml b/ubuntu-1/configs/loki/loki-config.yml deleted file mode 100644 index adfd773..0000000 --- a/ubuntu-1/configs/loki/loki-config.yml +++ /dev/null @@ -1,53 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - grpc_listen_port: 9095 - -ingester: - lifecycler: - ring: - kvstore: - store: inmemory - replication_factor: 1 - chunk_idle_period: 5m - chunk_retain_period: 30s - wal: - dir: /loki/wal - -limits_config: - reject_old_samples: true - reject_old_samples_max_age: 168h - allow_structured_metadata: false - -schema_config: - configs: - - from: 2024-01-01 - store: boltdb-shipper - object_store: filesystem - schema: v12 - index: - prefix: index_ - period: 24h - -storage_config: - boltdb_shipper: - active_index_directory: /loki/index - cache_location: /loki/cache - filesystem: - directory: /loki/chunks - -ruler: - storage: - type: local - local: - directory: /loki/rules - rule_path: /loki/rules-temp - alertmanager_url: http://localhost:9093 - ring: - kvstore: - store: inmemory - enable_api: true - -compactor: - working_directory: /loki/compactor \ No newline at end of file diff --git a/ubuntu-1/configs/prometheus/prometheus.yml b/ubuntu-1/configs/prometheus/prometheus.yml deleted file mode 100644 index c05e6a4..0000000 --- a/ubuntu-1/configs/prometheus/prometheus.yml +++ /dev/null @@ -1,19 +0,0 @@ -global: - scrape_interval: 15s - -scrape_configs: - - job_name: 'prometheus' - static_configs: - - targets: ['localhost:9090'] - - - job_name: 'node_exporter' - static_configs: - - targets: ['localhost:9100'] - - - job_name: 'docker_exporter' - static_configs: - - targets: ['localhost:9487'] - - - job_name: 'pi_services' - static_configs: - - targets: ['localhost:3100', 'localhost:9093'] \ No newline at end of file diff --git a/ubuntu-1/configs/promtail/positions.yaml b/ubuntu-1/configs/promtail/positions.yaml deleted file mode 100644 index c423e3f..0000000 --- a/ubuntu-1/configs/promtail/positions.yaml +++ /dev/null @@ -1,10 +0,0 @@ -positions: - /var/log/acroUpdaterTools.log: "16567" - /var/log/alf.log: "0" - /var/log/fsck_apfs.log: "23880" - /var/log/fsck_apfs_error.log: "676" - /var/log/fsck_hfs.log: "4044" - /var/log/install.log: "3856377" - /var/log/shutdown_monitor.log: "1971" - /var/log/system.log: "6579" - /var/log/wifi.log: "1164834" diff --git a/ubuntu-1/configs/promtail/promtail.yml b/ubuntu-1/configs/promtail/promtail.yml deleted file mode 100644 index 19dfa5f..0000000 --- a/ubuntu-1/configs/promtail/promtail.yml +++ /dev/null @@ -1,18 +0,0 @@ -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -positions: - filename: /etc/promtail/positions.yaml - -clients: - - url: http://loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: system - static_configs: - - targets: - - localhost - labels: - job: varlogs - __path__: /var/log/*.log \ No newline at end of file diff --git a/ubuntu-1/docker-compose.yml b/ubuntu-1/docker-compose.yml deleted file mode 100644 index b99713b..0000000 --- a/ubuntu-1/docker-compose.yml +++ /dev/null @@ -1,68 +0,0 @@ -services: - prometheus: - image: prom/prometheus:latest - container_name: ${HOSTNAME}-prometheus - ports: - - "${PROMETHEUS_PORT}:9090" - volumes: - - ./configs/prometheus:/etc/prometheus - - prometheus-data:/prometheus - command: - - --config.file=/etc/prometheus/prometheus.yml - restart: unless-stopped - - alertmanager: - build: - context: . - dockerfile: Dockerfile.alertmanager - container_name: ${HOSTNAME}-alertmanager - ports: - - "${ALERTMANAGER_PORT}:9093" - volumes: - - ./configs/alertmanager:/etc/alertmanager - environment: - - DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL} - restart: unless-stopped - - loki: - image: grafana/loki:latest - container_name: ${HOSTNAME}-loki - ports: - - "${LOKI_PORT}:3100" - volumes: - - ./configs/loki:/etc/loki - - loki-data:/loki - command: ["-config.file=/etc/loki/loki-config.yml", "-config.expand-env=true"] - restart: unless-stopped - - promtail: - image: grafana/promtail:latest - container_name: ${HOSTNAME}-promtail - volumes: - - /var/log:/var/log:ro - - ./configs/promtail:/etc/promtail - command: -config.file=/etc/promtail/promtail.yml - restart: unless-stopped - - node_exporter: - image: prom/node-exporter:latest - container_name: ${HOSTNAME}-node_exporter - ports: - - "${NODE_EXPORTER_PORT}:9100" - command: - - --web.listen-address=:${NODE_EXPORTER_PORT} - restart: unless-stopped - - docker_exporter: - image: prometheusnet/docker_exporter - container_name: ${HOSTNAME}-docker_exporter - ports: - - "${DOCKER_EXPORTER_PORT}:9487" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - restart: unless-stopped - - -volumes: - prometheus-data: - loki-data: \ No newline at end of file diff --git a/ubuntu-1/stack-status.sh b/ubuntu-1/stack-status.sh deleted file mode 100755 index 5dbb1c0..0000000 --- a/ubuntu-1/stack-status.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Optional base hostname (e.g., monitor.local) -BASE_HOST="${NGINX_HOST:-localhost}" - -printf "%-20s | %-15s | %-25s | %-40s\n" "Service" "IP Address" "Port Bindings" "URL" -printf "%s\n" "---------------------------------------------------------------------------------------------------------------" - -for container in $(docker ps --format '{{.Names}}'); do - ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container") - - ports=$(docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}{{$conf | json}}{{end}}{{end}}' "$container" \ - | jq -r '.[] | "\(.HostPort)"' 2>/dev/null | paste -sd "," -) - - if [ -z "$ports" ]; then - ports="(none)" - url="(none)" - else - # Just use the first port for URL - first_port=$(echo "$ports" | cut -d',' -f1) - scheme="http" - [ "$first_port" = "443" ] && scheme="https" - url="$scheme://$BASE_HOST:$first_port" - fi - - printf "%-20s | %-15s | %-25s | %-40s\n" "$container" "$ip" "$ports" "$url" -done \ No newline at end of file diff --git a/ubuntu-1/start.sh b/ubuntu-1/start.sh deleted file mode 100755 index 31422b4..0000000 --- a/ubuntu-1/start.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -echo "๐Ÿš€ Starting monitoring stack..." -docker-compose up -d - -if [ $? -ne 0 ]; then - echo "โŒ Failed to start containers. Check docker-compose logs." - exit 1 -fi - -echo "โœ… Containers started. Waiting a few seconds for services to boot..." -sleep 5 - -echo "" -echo "๐Ÿ” Gathering service info:" -./stack-status.sh \ No newline at end of file diff --git a/ubuntu-2/Dockerfile.alertmanager b/ubuntu-2/Dockerfile.alertmanager deleted file mode 100644 index 3ce7e1b..0000000 --- a/ubuntu-2/Dockerfile.alertmanager +++ /dev/null @@ -1,19 +0,0 @@ -# Stage 1: Pull original Alertmanager binary -FROM prom/alertmanager:latest as upstream - -# Stage 2: Alpine + envsubst -FROM alpine:latest - -# Install envsubst and ca-certificates -RUN apk add --no-cache gettext ca-certificates - -# Create directories -RUN mkdir -p /etc/alertmanager /alertmanager - -# Copy Alertmanager binary from upstream -COPY --from=upstream /bin/alertmanager /bin/alertmanager -COPY --from=upstream /etc/alertmanager /etc/alertmanager - -# Default config will be overwritten by volume mount -ENTRYPOINT ["/bin/sh", "-c"] -CMD ["envsubst < /etc/alertmanager/alertmanager.template.yml > /etc/alertmanager/alertmanager.yml && /bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml"] \ No newline at end of file diff --git a/ubuntu-2/configs/alertmanager/alertmanager.template.yml b/ubuntu-2/configs/alertmanager/alertmanager.template.yml deleted file mode 100644 index 245316d..0000000 --- a/ubuntu-2/configs/alertmanager/alertmanager.template.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/ubuntu-2/configs/alertmanager/alertmanager.yml b/ubuntu-2/configs/alertmanager/alertmanager.yml deleted file mode 100644 index 245316d..0000000 --- a/ubuntu-2/configs/alertmanager/alertmanager.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/ubuntu-2/configs/loki/loki-config.yml b/ubuntu-2/configs/loki/loki-config.yml deleted file mode 100644 index adfd773..0000000 --- a/ubuntu-2/configs/loki/loki-config.yml +++ /dev/null @@ -1,53 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - grpc_listen_port: 9095 - -ingester: - lifecycler: - ring: - kvstore: - store: inmemory - replication_factor: 1 - chunk_idle_period: 5m - chunk_retain_period: 30s - wal: - dir: /loki/wal - -limits_config: - reject_old_samples: true - reject_old_samples_max_age: 168h - allow_structured_metadata: false - -schema_config: - configs: - - from: 2024-01-01 - store: boltdb-shipper - object_store: filesystem - schema: v12 - index: - prefix: index_ - period: 24h - -storage_config: - boltdb_shipper: - active_index_directory: /loki/index - cache_location: /loki/cache - filesystem: - directory: /loki/chunks - -ruler: - storage: - type: local - local: - directory: /loki/rules - rule_path: /loki/rules-temp - alertmanager_url: http://localhost:9093 - ring: - kvstore: - store: inmemory - enable_api: true - -compactor: - working_directory: /loki/compactor \ No newline at end of file diff --git a/ubuntu-2/configs/prometheus/prometheus.yml b/ubuntu-2/configs/prometheus/prometheus.yml deleted file mode 100644 index c05e6a4..0000000 --- a/ubuntu-2/configs/prometheus/prometheus.yml +++ /dev/null @@ -1,19 +0,0 @@ -global: - scrape_interval: 15s - -scrape_configs: - - job_name: 'prometheus' - static_configs: - - targets: ['localhost:9090'] - - - job_name: 'node_exporter' - static_configs: - - targets: ['localhost:9100'] - - - job_name: 'docker_exporter' - static_configs: - - targets: ['localhost:9487'] - - - job_name: 'pi_services' - static_configs: - - targets: ['localhost:3100', 'localhost:9093'] \ No newline at end of file diff --git a/ubuntu-2/configs/promtail/positions.yaml b/ubuntu-2/configs/promtail/positions.yaml deleted file mode 100644 index 7e9da9b..0000000 --- a/ubuntu-2/configs/promtail/positions.yaml +++ /dev/null @@ -1,9 +0,0 @@ -positions: - /var/log/alf.log: "0" - /var/log/fsck_apfs.log: "23880" - /var/log/fsck_apfs_error.log: "676" - /var/log/fsck_hfs.log: "4044" - /var/log/install.log: "3800109" - /var/log/shutdown_monitor.log: "1971" - /var/log/system.log: "6069" - /var/log/wifi.log: "1107090" diff --git a/ubuntu-2/configs/promtail/promtail.yml b/ubuntu-2/configs/promtail/promtail.yml deleted file mode 100644 index 19dfa5f..0000000 --- a/ubuntu-2/configs/promtail/promtail.yml +++ /dev/null @@ -1,18 +0,0 @@ -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -positions: - filename: /etc/promtail/positions.yaml - -clients: - - url: http://loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: system - static_configs: - - targets: - - localhost - labels: - job: varlogs - __path__: /var/log/*.log \ No newline at end of file diff --git a/ubuntu-2/docker-compose.yml b/ubuntu-2/docker-compose.yml deleted file mode 100644 index b99713b..0000000 --- a/ubuntu-2/docker-compose.yml +++ /dev/null @@ -1,68 +0,0 @@ -services: - prometheus: - image: prom/prometheus:latest - container_name: ${HOSTNAME}-prometheus - ports: - - "${PROMETHEUS_PORT}:9090" - volumes: - - ./configs/prometheus:/etc/prometheus - - prometheus-data:/prometheus - command: - - --config.file=/etc/prometheus/prometheus.yml - restart: unless-stopped - - alertmanager: - build: - context: . - dockerfile: Dockerfile.alertmanager - container_name: ${HOSTNAME}-alertmanager - ports: - - "${ALERTMANAGER_PORT}:9093" - volumes: - - ./configs/alertmanager:/etc/alertmanager - environment: - - DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL} - restart: unless-stopped - - loki: - image: grafana/loki:latest - container_name: ${HOSTNAME}-loki - ports: - - "${LOKI_PORT}:3100" - volumes: - - ./configs/loki:/etc/loki - - loki-data:/loki - command: ["-config.file=/etc/loki/loki-config.yml", "-config.expand-env=true"] - restart: unless-stopped - - promtail: - image: grafana/promtail:latest - container_name: ${HOSTNAME}-promtail - volumes: - - /var/log:/var/log:ro - - ./configs/promtail:/etc/promtail - command: -config.file=/etc/promtail/promtail.yml - restart: unless-stopped - - node_exporter: - image: prom/node-exporter:latest - container_name: ${HOSTNAME}-node_exporter - ports: - - "${NODE_EXPORTER_PORT}:9100" - command: - - --web.listen-address=:${NODE_EXPORTER_PORT} - restart: unless-stopped - - docker_exporter: - image: prometheusnet/docker_exporter - container_name: ${HOSTNAME}-docker_exporter - ports: - - "${DOCKER_EXPORTER_PORT}:9487" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - restart: unless-stopped - - -volumes: - prometheus-data: - loki-data: \ No newline at end of file diff --git a/ubuntu-2/stack-status.sh b/ubuntu-2/stack-status.sh deleted file mode 100755 index 5dbb1c0..0000000 --- a/ubuntu-2/stack-status.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Optional base hostname (e.g., monitor.local) -BASE_HOST="${NGINX_HOST:-localhost}" - -printf "%-20s | %-15s | %-25s | %-40s\n" "Service" "IP Address" "Port Bindings" "URL" -printf "%s\n" "---------------------------------------------------------------------------------------------------------------" - -for container in $(docker ps --format '{{.Names}}'); do - ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container") - - ports=$(docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}{{$conf | json}}{{end}}{{end}}' "$container" \ - | jq -r '.[] | "\(.HostPort)"' 2>/dev/null | paste -sd "," -) - - if [ -z "$ports" ]; then - ports="(none)" - url="(none)" - else - # Just use the first port for URL - first_port=$(echo "$ports" | cut -d',' -f1) - scheme="http" - [ "$first_port" = "443" ] && scheme="https" - url="$scheme://$BASE_HOST:$first_port" - fi - - printf "%-20s | %-15s | %-25s | %-40s\n" "$container" "$ip" "$ports" "$url" -done \ No newline at end of file diff --git a/ubuntu-2/start.sh b/ubuntu-2/start.sh deleted file mode 100755 index 31422b4..0000000 --- a/ubuntu-2/start.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -echo "๐Ÿš€ Starting monitoring stack..." -docker-compose up -d - -if [ $? -ne 0 ]; then - echo "โŒ Failed to start containers. Check docker-compose logs." - exit 1 -fi - -echo "โœ… Containers started. Waiting a few seconds for services to boot..." -sleep 5 - -echo "" -echo "๐Ÿ” Gathering service info:" -./stack-status.sh \ No newline at end of file diff --git a/unraid/Dockerfile.alertmanager b/unraid/Dockerfile.alertmanager deleted file mode 100644 index 3ce7e1b..0000000 --- a/unraid/Dockerfile.alertmanager +++ /dev/null @@ -1,19 +0,0 @@ -# Stage 1: Pull original Alertmanager binary -FROM prom/alertmanager:latest as upstream - -# Stage 2: Alpine + envsubst -FROM alpine:latest - -# Install envsubst and ca-certificates -RUN apk add --no-cache gettext ca-certificates - -# Create directories -RUN mkdir -p /etc/alertmanager /alertmanager - -# Copy Alertmanager binary from upstream -COPY --from=upstream /bin/alertmanager /bin/alertmanager -COPY --from=upstream /etc/alertmanager /etc/alertmanager - -# Default config will be overwritten by volume mount -ENTRYPOINT ["/bin/sh", "-c"] -CMD ["envsubst < /etc/alertmanager/alertmanager.template.yml > /etc/alertmanager/alertmanager.yml && /bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml"] \ No newline at end of file diff --git a/unraid/configs/alertmanager/alertmanager.template.yml b/unraid/configs/alertmanager/alertmanager.template.yml deleted file mode 100644 index 50c1c7b..0000000 --- a/unraid/configs/alertmanager/alertmanager.template.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: '${DISCORD_ALERT_WEBHOOK}' - send_resolved: true \ No newline at end of file diff --git a/unraid/configs/alertmanager/alertmanager.yml b/unraid/configs/alertmanager/alertmanager.yml deleted file mode 100644 index 245316d..0000000 --- a/unraid/configs/alertmanager/alertmanager.yml +++ /dev/null @@ -1,14 +0,0 @@ -global: - resolve_timeout: 5m - -route: - receiver: 'discord' - group_wait: 10s - group_interval: 30s - repeat_interval: 1h - -receivers: - - name: 'discord' - webhook_configs: - - url: 'https://discord.com/api/webhooks/1367657026280226907/vRMRq22mikrAAJerUBAcxWPbRgZeY5fF3YE_3u0fZnGCEzNIPot36fBLP7yZ4i55IMSz' - send_resolved: true \ No newline at end of file diff --git a/unraid/configs/grafana/grafana.ini b/unraid/configs/grafana/grafana.ini deleted file mode 100644 index e69de29..0000000 diff --git a/unraid/configs/loki/loki-config.yml b/unraid/configs/loki/loki-config.yml deleted file mode 100644 index adfd773..0000000 --- a/unraid/configs/loki/loki-config.yml +++ /dev/null @@ -1,53 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - grpc_listen_port: 9095 - -ingester: - lifecycler: - ring: - kvstore: - store: inmemory - replication_factor: 1 - chunk_idle_period: 5m - chunk_retain_period: 30s - wal: - dir: /loki/wal - -limits_config: - reject_old_samples: true - reject_old_samples_max_age: 168h - allow_structured_metadata: false - -schema_config: - configs: - - from: 2024-01-01 - store: boltdb-shipper - object_store: filesystem - schema: v12 - index: - prefix: index_ - period: 24h - -storage_config: - boltdb_shipper: - active_index_directory: /loki/index - cache_location: /loki/cache - filesystem: - directory: /loki/chunks - -ruler: - storage: - type: local - local: - directory: /loki/rules - rule_path: /loki/rules-temp - alertmanager_url: http://localhost:9093 - ring: - kvstore: - store: inmemory - enable_api: true - -compactor: - working_directory: /loki/compactor \ No newline at end of file diff --git a/unraid/configs/nginx/default.conf b/unraid/configs/nginx/default.conf deleted file mode 100644 index e69de29..0000000 diff --git a/unraid/configs/prometheus/prometheus.yml b/unraid/configs/prometheus/prometheus.yml deleted file mode 100644 index e69de29..0000000 diff --git a/unraid/configs/promtail/promtail.yml b/unraid/configs/promtail/promtail.yml deleted file mode 100644 index 9f384f1..0000000 --- a/unraid/configs/promtail/promtail.yml +++ /dev/null @@ -1,18 +0,0 @@ -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -positions: - filename: /tmp/positions.yaml - -clients: - - url: http://loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: system - static_configs: - - targets: - - localhost - labels: - job: varlogs - __path__: /var/log/*.log \ No newline at end of file diff --git a/unraid/docker-compose.yml b/unraid/docker-compose.yml deleted file mode 100644 index 36bb5b6..0000000 --- a/unraid/docker-compose.yml +++ /dev/null @@ -1,94 +0,0 @@ -version: "3.8" - -services: - alertmanager: - build: - context: . - dockerfile: Dockerfile.alertmanager - container_name: ${HOSTNAME}-alertmanager - ports: - - "9093:9093" - volumes: - - ./configs/alertmanager:/etc/alertmanager - environment: - - DISCORD_ALERT_WEBHOOK=${DISCORD_ALERT_WEBHOOK} - restart: unless-stopped - grafana: - image: grafana/grafana:latest - container_name: ${HOSTNAME}-grafana - ports: - - "${GRAFANA_PORT}:3000" - environment: - - GF_SECURITY_ADMIN_USER=${GRAFANA_USER} - - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASS} - volumes: - - ./configs/grafana:/etc/grafana - - grafana-data:/var/lib/grafana - restart: unless-stopped - - prometheus: - image: prom/prometheus:latest - container_name: ${HOSTNAME}-prometheus - ports: - - "${PROMETHEUS_PORT}:9090" - volumes: - - ./configs/prometheus:/etc/prometheus - - prometheus-data:/prometheus - command: - - --config.file=/etc/prometheus/prometheus.yml - restart: unless-stopped - - loki: - image: grafana/loki:latest - container_name: ${HOSTNAME}-loki - ports: - - "${LOKI_PORT}:3100" - volumes: - - ./configs/loki:/etc/loki - - loki-data:/loki - command: ["-config.file=/etc/loki/loki-config.yml", "-config.expand-env=true"] - restart: unless-stopped - - promtail: - image: grafana/promtail:latest - container_name: ${HOSTNAME}-promtail - volumes: - - /var/log:/var/log:ro - - ./configs/promtail:/etc/promtail - command: -config.file=/etc/promtail/promtail.yml - restart: unless-stopped - - docker_exporter: - image: prometheusnet/docker_exporter - container_name: ${HOSTNAME}-docker_exporter - ports: - - "${DOCKER_EXPORTER_PORT}:9487" - volumes: - - /var/run/docker.sock:/var/run/docker.sock - restart: unless-stopped - - node_exporter: - image: prom/node-exporter:latest - container_name: ${HOSTNAME}-node_exporter - ports: - - "${NODE_EXPORTER_PORT}:9100" - command: - - --web.listen-address=:${NODE_EXPORTER_PORT} - restart: unless-stopped - - nginx: - image: nginx:latest - container_name: ${HOSTNAME}-nginx - ports: - - "${NGINX_HTTP_PORT}:80" - - "${NGINX_HTTPS_PORT}:443" - volumes: - - ./configs/nginx:/etc/nginx/conf.d - - ./configs/nginx/ssl:/etc/nginx/ssl - - ./configs/nginx/html:/usr/share/nginx/html - restart: unless-stopped - -volumes: - grafana-data: - prometheus-data: - loki-data: \ No newline at end of file diff --git a/unraid/stack-status.sh b/unraid/stack-status.sh deleted file mode 100755 index 5dbb1c0..0000000 --- a/unraid/stack-status.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Optional base hostname (e.g., monitor.local) -BASE_HOST="${NGINX_HOST:-localhost}" - -printf "%-20s | %-15s | %-25s | %-40s\n" "Service" "IP Address" "Port Bindings" "URL" -printf "%s\n" "---------------------------------------------------------------------------------------------------------------" - -for container in $(docker ps --format '{{.Names}}'); do - ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container") - - ports=$(docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}{{$conf | json}}{{end}}{{end}}' "$container" \ - | jq -r '.[] | "\(.HostPort)"' 2>/dev/null | paste -sd "," -) - - if [ -z "$ports" ]; then - ports="(none)" - url="(none)" - else - # Just use the first port for URL - first_port=$(echo "$ports" | cut -d',' -f1) - scheme="http" - [ "$first_port" = "443" ] && scheme="https" - url="$scheme://$BASE_HOST:$first_port" - fi - - printf "%-20s | %-15s | %-25s | %-40s\n" "$container" "$ip" "$ports" "$url" -done \ No newline at end of file diff --git a/unraid/start.sh b/unraid/start.sh deleted file mode 100755 index 31422b4..0000000 --- a/unraid/start.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -echo "๐Ÿš€ Starting monitoring stack..." -docker-compose up -d - -if [ $? -ne 0 ]; then - echo "โŒ Failed to start containers. Check docker-compose logs." - exit 1 -fi - -echo "โœ… Containers started. Waiting a few seconds for services to boot..." -sleep 5 - -echo "" -echo "๐Ÿ” Gathering service info:" -./stack-status.sh \ No newline at end of file