ildkule: replace stateful (😤) baka uptime-kuma with stateless (🤤) gatus #145

Open
oysteikt wants to merge 3 commits from ildkule-gatus into main
4 changed files with 234 additions and 45 deletions
@@ -2,10 +2,10 @@
{
imports = [
./gatus
./grafana.nix
./loki.nix
./prometheus
./scrutiny.nix
./uptime-kuma.nix
];
}
@@ -0,0 +1,155 @@
{ config, lib, ... }:
let
cfg = config.services.gatus;
in
{
imports = [
./minecraft-checker.nix
];
services.gatus = {
enable = true;
settings = {
felixalb marked this conversation as resolved Outdated
Outdated
Review

Kommer vi til å måtte overskrive veldig mye av denne modulen her for å bruke secrets? Hvis vi f.eks. vil ha matrix-notifs må den få auth tokenen sin fra noe sted.

Dokumentasjonen sier

If GATUS_CONFIG_PATH points to a directory, all *.yaml and *.yml files inside said directory and its subdirectories are merged

så vi kan kanskje wrappe den så den får både den vanlige configen og hemmelig config fra sops kopiert/linket inn i samme mappe før oppstart?

Kommer vi til å måtte overskrive veldig mye av denne modulen her for å bruke secrets? Hvis vi f.eks. vil ha matrix-notifs må den få auth tokenen sin fra noe sted. Dokumentasjonen sier > If GATUS_CONFIG_PATH points to a directory, all *.yaml and *.yml files inside said directory and its subdirectories are merged så vi kan kanskje wrappe den så den får både den vanlige configen og hemmelig config fra sops kopiert/linket inn i samme mappe før oppstart?
Outdated
Review

Nvm, modulen har services.gatus.environmentFile, så vi kan sikkert bare bruke den

Nvm, modulen har [services.gatus.environmentFile](https://search.nixos.org/options?channel=26.05&query=gatus#show=option%253Aservices.gatus.environmentFile), så vi kan sikkert bare bruke den
web = {
address = "127.0.0.1";
port = 19283;
};
storage = {
Outdated
Review

Får vi historikk lenger tilbake i tid om vi øker storage.maximum-number-of-results og storage.maximum-number-of-events en hel del? Defaultsa høres lave ut.

Får vi historikk lenger tilbake i tid om vi øker `storage.maximum-number-of-results` og `storage.maximum-number-of-events` en hel del? Defaultsa høres lave ut.
Outdated
Review

Tror ikke det? Det er litt uklart for meg om dette er max retention som kun gjelder under cleanup eller om det er noe max limits på endpoints med flere kombinerte resultater

https://github.com/TwiN/gatus/blob/4566e746f35cb02145bbf191bf6b4afad5800c1c/storage/store/sql/sql.go#L27-L66

Tror ikke det? Det er litt uklart for meg om dette er max retention som kun gjelder under cleanup eller om det er noe max limits på endpoints med flere kombinerte resultater https://github.com/TwiN/gatus/blob/4566e746f35cb02145bbf191bf6b4afad5800c1c/storage/store/sql/sql.go#L27-L66
type = "sqlite";
path = "/var/lib/gatus/data.db";
};
ui = {
title = "PVV Nede!?";
header = "😭😭😭";
dashboard-heading = "PVV Nede!?";
dashboard-subheading = "Kan noen ringe drift?";
};
endpoints = let
mkMachine = name: {
inherit name;
group = "Machines";
url = "icmp://${name}.pvv.ntnu.no";
conditions = [
"[CONNECTED] == true"
];
};
mkWebsite = name: url: {
inherit name url;
group = "Websites";
method = "GET";
conditions = [
"[STATUS] == 200"
];
};
mkService = name: url: {
inherit name url;
group = "Services";
conditions = [
"[CONNECTED] == true"
];
};
in (lib.sortOn (m: m.name) [
(mkMachine "ambidextrous")
(mkMachine "bekkalokk")
(mkMachine "bicep")
(mkMachine "bikkje")
(mkMachine "brzeczyszczykiewicz")
(mkMachine "georg")
(mkMachine "gluttony")
(mkMachine "ildkule")
(mkMachine "kana")
(mkMachine "kommode")
(mkMachine "lupine-1")
(mkMachine "lupine-2")
(mkMachine "lupine-3")
(mkMachine "lupine-4")
(mkMachine "lupine-5")
(mkMachine "skrot")
(mkMachine "temmie")
(mkMachine "wenche")
oysteikt marked this conversation as resolved Outdated
Outdated
Review
+ (mkMachine "ambidextrous")
```diff + (mkMachine "ambidextrous") ```
(mkMachine "balduzius")
(mkMachine "blossom")
(mkMachine "bubbles")
(mkMachine "buskerud")
(mkMachine "buttercup")
(mkMachine "demiurgen")
(mkMachine "drolsum")
(mkMachine "hildring")
oysteikt marked this conversation as resolved Outdated
Outdated
Review
+ (mkMachine "kana")
```diff + (mkMachine "kana") ```
(mkMachine "innovation")
(mkMachine "isvegg")
(mkMachine "knutsen")
(mkMachine "ludvigsen" // {
url = "icmp://ludvigsen-tap.pvv.ntnu.no";
})
(mkMachine "microbel")
(mkMachine "mirage")
(mkMachine "orchid")
(mkMachine "principal")
(mkMachine "sleipner")
(mkMachine "smask")
(mkMachine "tom")
(mkMachine "wegonke")
]) ++ [
(mkWebsite "Bluemap" "https://minecraft.pvv.ntnu.no")
(mkWebsite "Element Web" "https://chat.pvv.ntnu.no")
(mkWebsite "Gitea" "https://git.pvv.ntnu.no/api/healthz" // {
conditions = [
"[STATUS] == 200"
"[BODY].status == pass"
];
})
(mkWebsite "Grafana" "https://grafana.pvv.ntnu.no/api/health" // {
conditions = [
"[STATUS] == 200"
"[BODY].database == ok"
];
})
(mkWebsite "Grzegorz - Brzeczyszczykiewicz" "https://brzeczyszczykiewicz.pvv.ntnu.no")
(mkWebsite "Grzegorz - Georg" "https://georg.pvv.ntnu.no")
(mkWebsite "IDP" "https://idp.pvv.ntnu.no")
(mkWebsite "Mailing Lists" "http://list.pvv.ntnu.no")
(mkWebsite "Mapcrafter" "http://isvegg.pvv.ntnu.no/kart")
(mkWebsite "PVV-Nettsiden" "https://www.pvv.ntnu.no")
(mkWebsite "Roundcube" "https://webmail.pvv.ntnu.no/roundcube")
(mkWebsite "Scrutiny" "https://scrutiny.pvv.ntnu.no")
(mkWebsite "Snappymail" "http://snappymail.pvv.ntnu.no")
(mkWebsite "Userweb - Temmie" "https://temmie.pvv.ntnu.no/~oysteikt")
(mkWebsite "Userweb - Tom" "https://www.pvv.ntnu.no/~oysteikt")
(mkWebsite "Vaultwarden" "https://pw.pvv.ntnu.no/alive")
(mkWebsite "Wiki" "https://wiki.pvv.ntnu.no/w/api.php?action=query&format=json")
felixalb marked this conversation as resolved Outdated
Outdated
Review

Databasene er ganske kritisk, mer enn det meste annet, så postgres og mysql på bicep bør inn her

Databasene er ganske kritisk, mer enn det meste annet, så postgres og mysql på bicep bør inn her
Outdated
Review

Skal sette opp litt mer gjennomført monitoring av databasene senere, som ikke bare sjekker at de hører på en port men også at resten er i stand. Enn så lenge så vil nettsiden og sikkert wiki gi 5xx når mariadb er nede, mens alt dauer når postgres er nede.

Skal sette opp litt mer gjennomført monitoring av databasene senere, som ikke bare sjekker at de hører på en port men også at resten er i stand. Enn så lenge så vil nettsiden og sikkert wiki gi 5xx når mariadb er nede, mens alt dauer når postgres er nede.
Outdated
Review

Mener du at de gode databasesjekkene også skal være i Gatus, eller helt separat? Hvis de skal inn i Gatus; OK, resolved.

Hvis ikke er jeg skeptisk, til og med en tls/tcp-checkin er bedre enn ingenting, siden databasefeil står for en relativt stor andel av feilrapportene våre, og de kommer ofte fra nye folk eller ikke-driftere, og peker derfor på et symptom heller enn årsaken. Folk (kanskje mest nye folk i fremtiden) vil nok like å ha ett samlet dashboard å sjekke helt først i feilsøkingen, og en kjemperask "postgres er helt død" er en ganske nyttig speedup.

Mener du at de gode databasesjekkene også skal være i Gatus, eller helt separat? Hvis de skal inn i Gatus; OK, resolved. Hvis ikke er jeg skeptisk, til og med en tls/tcp-checkin er bedre enn ingenting, siden databasefeil står for en relativt stor andel av feilrapportene våre, og de kommer ofte fra nye folk eller ikke-driftere, og peker derfor på et symptom heller enn årsaken. Folk (kanskje mest nye folk i fremtiden) vil nok like å ha ett samlet dashboard å sjekke helt først i feilsøkingen, og en kjemperask "postgres er helt død" er en ganske nyttig speedup.
Outdated
Review

tls/tcp checking sjekker bare at noe listener på porten, men det er nesten aldri det som feiler. Og når det feiler, så slår det ut på resten av tjenestene, så det er egt dekka.

Ønsker meg en handler a la minecraft sjekkeren som faktisk logger inn med en bruker og kjører noen raske sql statements for begge databasene.

tls/tcp checking sjekker bare at noe listener på porten, men det er nesten aldri det som feiler. Og når det feiler, så slår det ut på resten av tjenestene, så det er egt dekka. Ønsker meg en handler a la minecraft sjekkeren som faktisk logger inn med en bruker og kjører noen raske sql statements for begge databasene.
Outdated
Review

Jodjoda, skjønner det, jeg ville bare være sikker på at du mente at den databasejsekkene også skal ende opp i gatus-dashboardet (som minecraft-greia) og ikke være helt utenfor.

Jodjoda, skjønner det, jeg ville bare være sikker på at du mente at den databasejsekkene også skal ende opp i gatus-dashboardet (som minecraft-greia) og ikke være helt utenfor.
(mkService "Gitea SSH" "ssh://git.pvv.ntnu.no:2222")
(mkService "QoTD" "tcp://bekkalokk.pvv.ntnu.no:17")
(mkService "Minecraft" "http://localhost:1337" // {
conditions = [
"[STATUS] == 200"
"[BODY].ok == true"
];
oysteikt marked this conversation as resolved Outdated
Outdated
Review

De relevante her burde være tls:// i stedet for tcp:// (og de har også starttls://)

De relevante her burde være `tls://` i stedet for `tcp://` (og de har også `starttls://`)
})
(mkService "Email (SMTP)" "starttls://mail.pvv.ntnu.no:587")
(mkService "Email (POP3)" "tls://mail.pvv.ntnu.no:995")
(mkService "Email (IMAP)" "tls://mail.pvv.ntnu.no:993")
(mkService "Matrix Synapse" "https://matrix.pvv.ntnu.no/_matrix/client/versions" // {
method = "GET";
conditions = [
"[STATUS] == 200"
];
})
];
};
};
felixalb marked this conversation as resolved Outdated
Outdated
Review

Vi har noen sånne mkIfs noen random steder rundt om, men er de nyttige utenfor /base og /modules? Vil vi ikke bare slutte å include hele denne fila hvis vi skal disable tjenesten?

Vi har noen sånne `mkIf`s noen random steder rundt om, men er de nyttige utenfor `/base` og `/modules`? Vil vi ikke bare slutte å include hele denne fila hvis vi skal disable tjenesten?
Outdated
Review

Tror det er smak og behag. Du kan slutte å include fila, eller du kan sette enable = false. Tror ikke mkIfsa koster noe særlig, om ikke annet blir de dokumentasjon for implisitte antagelser, stemmer for å bare ha dem.

Tror det er smak og behag. Du kan slutte å include fila, eller du kan sette `enable = false`. Tror ikke `mkIf`sa koster noe særlig, om ikke annet blir de dokumentasjon for implisitte antagelser, stemmer for å bare ha dem.
services.nginx.virtualHosts."status.pvv.ntnu.no" = lib.mkIf cfg.enable {
enableACME = true;
forceSSL = true;
kTLS = true;
locations."/".proxyPass = "http://localhost:${toString cfg.settings.web.port}";
};
}
@@ -0,0 +1,78 @@
{ lib, pkgs, ... }:
{
systemd.sockets."gatus-minecraft-checker" = {
wantedBy = [ "sockets.target" ];
listenStreams = [ "127.0.0.1:1337" ];
oysteikt marked this conversation as resolved Outdated
Outdated
Review

Kan vi bruke en annen port enn dette? Og hvis det ikke brukes av noen andre, kan vi lytte lokalt og ikke på 0.0.0.0? F.eks. 127.0.1.2:25566?

Kan vi bruke en annen port enn dette? Og hvis det ikke brukes av noen andre, kan vi lytte lokalt og ikke på 0.0.0.0? F.eks. 127.0.1.2:25566?
Outdated
Review

Flytta til 127.0.0.1:1337

Flytta til 127.0.0.1:1337
socketConfig = {
Accept = false;
};
};
systemd.services."gatus-minecraft-checker" = {
oysteikt marked this conversation as resolved
Review
[root@ildkule:~]# systemd-analyze security gatus-minecraft-checker.service | tail -n1
→ Overall exposure level for gatus-minecraft-checker.service: 9.0 UNSAFE 😨

/s

``` [root@ildkule:~]# systemd-analyze security gatus-minecraft-checker.service | tail -n1 → Overall exposure level for gatus-minecraft-checker.service: 9.0 UNSAFE 😨 ``` /s
Review

なぬっ!😨

なぬっ!😨
serviceConfig = {
ExecStart = lib.getExe (pkgs.writers.writePython3Bin "gatus-minecraft-checker" {
libraries = with pkgs.python3Packages; [
# sdnotify
mcstatus
];
flakeIgnore = [ "E501" "E704" ];
} ''
import socket
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from mcstatus import JavaServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
try:
mcserver = JavaServer.lookup("minecraft.pvv.ntnu.no")
status = mcserver.status()
body = {
"ok": True,
"players": status.players.online,
"version": status.version.name,
"latency": status.latency,
}
data = json.dumps(body).encode()
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(data)))
self.end_headers()
self.wfile.write(data)
except Exception as e:
data = json.dumps({"ok": False, "error": str(e)}).encode()
self.send_response(500)
self.end_headers()
self.wfile.write(data)
class NoBindHTTPServer(HTTPServer):
def server_bind(): pass
def server_activate(): pass
def main():
httpd = NoBindHTTPServer(
("", 0),
Handler,
bind_and_activate=False,
)
httpd.socket = socket.fromfd(3, socket.AF_INET, socket.SOCK_STREAM)
httpd.serve_forever()
if __name__ == '__main__':
main()
'');
NoNewPrivileges = true;
PrivateTmp = true;
};
};
}
@@ -1,44 +0,0 @@
{ config, pkgs, lib, values, ... }:
let
cfg = config.services.uptime-kuma;
domain = "status.pvv.ntnu.no";
stateDir = "/data/monitoring/uptime-kuma";
Outdated
Review

Husk å eventuelt slette denne etterpå

Husk å eventuelt slette denne etterpå
in {
services.uptime-kuma = {
enable = true;
settings = {
PORT = "5059";
HOST = "127.0.1.2";
};
};
services.nginx.virtualHosts.${domain} = {
enableACME = true;
forceSSL = true;
kTLS = true;
locations."/".proxyPass = "http://${cfg.settings.HOST}:${cfg.settings.PORT}";
};
fileSystems."/var/lib/private/uptime-kuma" = {
device = stateDir;
fsType = "bind";
options = [ "bind" ];
};
services.rsync-pull-targets = {
enable = true;
locations.${stateDir} = {
user = "root";
rrsyncArgs.ro = true;
authorizedKeysAttrs = [
"restrict"
"from=\"principal.pvv.ntnu.no,${values.hosts.principal.ipv6},${values.hosts.principal.ipv4}\""
"no-agent-forwarding"
"no-port-forwarding"
"no-pty"
"no-X11-forwarding"
];
publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJXzcDm6cVr4NmWzUSroy33FlielKqaG83wY0RCMC0p/ uptime_kuma rsync backup";
};
};
}