ildkule: replace stateful (😤) baka uptime-kuma with stateless (🤤) gatus #145
@@ -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
|
||||
web = {
|
||||
address = "127.0.0.1";
|
||||
port = 19283;
|
||||
};
|
||||
|
||||
storage = {
|
||||
|
felixalb
commented
Får vi historikk lenger tilbake i tid om vi øker 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.
oysteikt
commented
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 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
felixalb
commented
```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
felixalb
commented
```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
felixalb
commented
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
oysteikt
commented
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.
felixalb
commented
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.
oysteikt
commented
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.
felixalb
commented
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
felixalb
commented
De relevante her burde være 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
felixalb
commented
Vi har noen sånne 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?
oysteikt
commented
Tror det er smak og behag. Du kan slutte å include fila, eller du kan sette 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
felixalb
commented
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?
oysteikt
commented
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
felixalb
commented
/s ```
[root@ildkule:~]# systemd-analyze security gatus-minecraft-checker.service | tail -n1
→ Overall exposure level for gatus-minecraft-checker.service: 9.0 UNSAFE 😨
```
/s
oysteikt
commented
なぬっ!😨 なぬっ!😨
|
||||
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";
|
||||
|
felixalb
commented
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";
|
||||
};
|
||||
};
|
||||
}
|
||||
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
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?
Nvm, modulen har services.gatus.environmentFile, så vi kan sikkert bare bruke den