mirror of
https://git.pvv.ntnu.no/Drift/pvv-nixos-config.git
synced 2026-07-21 20:41:25 +02:00
ildkule/gatus: add healthcheck for mariadb
This commit is contained in:
@@ -6,6 +6,7 @@ in
|
|||||||
imports = [
|
imports = [
|
||||||
./minecraft-checker.nix
|
./minecraft-checker.nix
|
||||||
./postgres-checker.nix
|
./postgres-checker.nix
|
||||||
|
./mariadb-checker.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
services.gatus = {
|
services.gatus = {
|
||||||
@@ -140,6 +141,12 @@ in
|
|||||||
"[BODY].ok == true"
|
"[BODY].ok == true"
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
|
(mkService "MariaDB" "http://localhost:1339" // {
|
||||||
|
conditions = [
|
||||||
|
"[STATUS] == 200"
|
||||||
|
"[BODY].ok == true"
|
||||||
|
];
|
||||||
|
})
|
||||||
(mkService "Email (SMTP)" "starttls://mail.pvv.ntnu.no:587")
|
(mkService "Email (SMTP)" "starttls://mail.pvv.ntnu.no:587")
|
||||||
(mkService "Email (POP3)" "tls://mail.pvv.ntnu.no:995")
|
(mkService "Email (POP3)" "tls://mail.pvv.ntnu.no:995")
|
||||||
(mkService "Email (IMAP)" "tls://mail.pvv.ntnu.no:993")
|
(mkService "Email (IMAP)" "tls://mail.pvv.ntnu.no:993")
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
sops.secrets."keys/gatus/mariadb" = {
|
||||||
|
restartUnits = [ "phh-gatus-mariadb-checker.service" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
sops.templates."gatus-mariadb-checker.env" = {
|
||||||
|
restartUnits = [ "phh-gatus-mariadb-checker.service" ];
|
||||||
|
content = ''
|
||||||
|
MYSQL_HOST=mysql.pvv.ntnu.no
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
MYSQL_DATABASE=mysql
|
||||||
|
MYSQL_USER=gatus_healthcheck
|
||||||
|
MYSQL_PASSWORD=${config.sops.placeholder."keys/gatus/mariadb"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.python-http-handlers."gatus-mariadb-checker" = {
|
||||||
|
listenStreams = [ "127.0.0.1:1339" ];
|
||||||
|
libraries = with pkgs.python3Packages; [
|
||||||
|
pymysql
|
||||||
|
];
|
||||||
|
serviceConfig = {
|
||||||
|
EnvironmentFile = config.sops.templates."gatus-mariadb-checker.env".path;
|
||||||
|
};
|
||||||
|
handler = ''
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pymysql
|
||||||
|
|
||||||
|
class Handler(BaseHTTPRequestHandler):
|
||||||
|
def do_GET(self):
|
||||||
|
try:
|
||||||
|
conn = pymysql.connect(
|
||||||
|
host=os.environ["MYSQL_HOST"],
|
||||||
|
port=int(os.environ.get("MYSQL_PORT", "3306")),
|
||||||
|
user=os.environ["MYSQL_USER"],
|
||||||
|
password=os.environ["MYSQL_PASSWORD"],
|
||||||
|
database=os.environ.get("MYSQL_DATABASE", "mysql"),
|
||||||
|
connect_timeout=5,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with conn.cursor() as cur:
|
||||||
|
cur.execute("SELECT VERSION();")
|
||||||
|
(version,) = cur.fetchone()
|
||||||
|
|
||||||
|
cur.execute("SHOW STATUS LIKE 'Threads_connected';")
|
||||||
|
(_, connections) = cur.fetchone()
|
||||||
|
|
||||||
|
cur.execute("SHOW DATABASES;")
|
||||||
|
databases = cur.fetchall()
|
||||||
|
finally:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
body = {
|
||||||
|
"ok": True,
|
||||||
|
"version": version,
|
||||||
|
"connections": int(connections),
|
||||||
|
"databases": len(databases),
|
||||||
|
}
|
||||||
|
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.send_header("Content-Type", "application/json")
|
||||||
|
self.send_header("Content-Length", str(len(data)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(data)
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user