Migrated from multi repos to monorepo architecture.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
# To test
|
||||
./disk-space.nix
|
||||
./smart.nix
|
||||
./smtp.nix
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.numbus-server.services.disk-space-checker;
|
||||
|
||||
disk_space_notifier = pkgs.writeScript "disk-space-notifier.sh" ''
|
||||
#!${pkgs.bash}/bin/bash
|
||||
|
||||
ALERT_FILE="/var/lib/numbus-server/disk_alert.env"
|
||||
if [ ! -f "$ALERT_FILE" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
source "$ALERT_FILE"
|
||||
rm "$ALERT_FILE"
|
||||
|
||||
# Update the timestamp for this specific path to prevent spamming
|
||||
SAFE_PATH=$(echo "$DISK_ALERT_PATH" | tr '/' '_')
|
||||
date +%s > "/var/lib/numbus-server/last_alert_$SAFE_PATH.ts"
|
||||
|
||||
ADMIN_EMAIL="${config.numbus-server.mail.adminAddress}"
|
||||
USER_EMAIL="${config.numbus-server.mail.userAddress}"
|
||||
OWNER_NAME="${config.numbus-server.owner}"
|
||||
|
||||
SUBJECT="Numbus Server Alert: Low Disk Space Detected"
|
||||
|
||||
TECH_BODY="
|
||||
Disk Space Alert:
|
||||
Server owner: $OWNER_NAME
|
||||
|
||||
The following mount point has exceeded the safety threshold:
|
||||
Mount: $DISK_ALERT_PATH
|
||||
Usage: $DISK_ALERT_USAGE%
|
||||
|
||||
Full partition details:
|
||||
$(df -h "$DISK_ALERT_PATH")
|
||||
|
||||
Action required: Please investigate and clear space or expand the storage capacity.
|
||||
"
|
||||
|
||||
FRIENDLY_BODY="Cher/Chère $OWNER_NAME,
|
||||
|
||||
L'espace de stockage de votre serveur Numbus est presque saturé.
|
||||
Disque concerné : $DISK_ALERT_PATH ($DISK_ALERT_USAGE% utilisé)
|
||||
|
||||
Votre administrateur a été notifié avec les détails techniques.
|
||||
Nous vous conseillons d'éviter d'ajouter des fichiers volumineux pour garantir le bon fonctionnement de vos services.
|
||||
Contactez votre administrateur afin d'évoquer les possibilités d'expansion du stockage.
|
||||
"
|
||||
|
||||
printf "Subject: [ADMIN] %s\n\n%s" "$SUBJECT" "$TECH_BODY" | /run/wrappers/bin/sendmail -t "$ADMIN_EMAIL"
|
||||
printf "Subject: [Alerte] Espace disque presque saturé sur votre serveur Numbus\n\n%s\n\nMerci de votre confiance,\nL'équipe de support,\nNumbus-Server." "$FRIENDLY_BODY" | /run/wrappers/bin/sendmail -t "$USER_EMAIL"
|
||||
'';
|
||||
|
||||
disk_space_checker = pkgs.writeScript "disk-space-checker.sh" ''
|
||||
#!${pkgs.bash}/bin/bash
|
||||
|
||||
# Safety threshold in percentage
|
||||
THRESHOLD=90
|
||||
# Paths to monitor (Root and MergerFS data pool)
|
||||
PATHS=("/" "/mnt/data")
|
||||
ALERT_FILE="/var/lib/numbus-server/disk_alert.env"
|
||||
|
||||
for path in "''${PATHS[@]}"; do
|
||||
# Skip if path does not exist (e.g. if mergerfs is not mounted yet)
|
||||
if [ ! -d "$path" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Anti-spam logic: Check if we alerted on this path recently (7 days = 604800 seconds)
|
||||
SAFE_PATH=$(echo "$path" | tr '/' '_')
|
||||
TS_FILE="/var/lib/numbus-server/last_alert_$SAFE_PATH.ts"
|
||||
NOW=$(date +%s)
|
||||
|
||||
if [ -f "$TS_FILE" ]; then
|
||||
LAST_SENT=$(cat "$TS_FILE")
|
||||
DIFF=$((NOW - LAST_SENT))
|
||||
if [ "$DIFF" -lt 604800 ]; then
|
||||
echo "Alert for $path was sent recently. Skipping notification to avoid spam."
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
# Extract usage percentage using df
|
||||
USAGE=$(df -h "$path" | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||
|
||||
if [ "$USAGE" -ge "$THRESHOLD" ]; then
|
||||
echo "DISK_ALERT_PATH=$path" > "$ALERT_FILE"
|
||||
echo "DISK_ALERT_USAGE=$USAGE" >> "$ALERT_FILE"
|
||||
|
||||
echo "Threshold exceeded for $path ($USAGE%). Triggering notification."
|
||||
|
||||
# Trigger the notification service
|
||||
/run/current-system/sw/bin/systemctl start disk-space-notifier.service
|
||||
|
||||
# We exit after the first alert to avoid multiple overlapping emails in one run
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
'';
|
||||
in
|
||||
|
||||
{
|
||||
config = mkIf cfg.enable {
|
||||
systemd.services.disk-space-notifier = {
|
||||
description = "Email notification for low disk space";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${disk_space_notifier}";
|
||||
};
|
||||
};
|
||||
systemd.services.disk-space-checker = {
|
||||
description = "Check for low disk space";
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${disk_space_checker}";
|
||||
};
|
||||
};
|
||||
systemd.timers.disk-space-checker = {
|
||||
description = "Run disk space check every day";
|
||||
timerConfig = {
|
||||
OnCalendar = "daily";
|
||||
Persistent = true;
|
||||
};
|
||||
wantedBy = [ "timers.target" ];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
smartd_notifier = pkgs.writeScript "smartd-notify.sh" ''
|
||||
#!${pkgs.bash}/bin/bash
|
||||
|
||||
# 1. Send Technical Email to Admin
|
||||
ADMIN_EMAIL="${config.numbus-server.mail.adminAddress}"
|
||||
SUBJECT="Numbus Server Alert: $SMARTD_FAILTYPE on $SMARTD_DEVICE"
|
||||
|
||||
TECH_BODY="
|
||||
SMARTD Alert Details:
|
||||
Server owner: $OWNER_NAME
|
||||
Device: $SMARTD_DEVICE
|
||||
Type: $SMARTD_DEVICETYPE
|
||||
Failure Type: $SMARTD_FAILTYPE
|
||||
Message: $SMARTD_MESSAGE
|
||||
|
||||
Full Message:
|
||||
$SMARTD_FULLMESSAGE
|
||||
"
|
||||
printf "Subject: [ADMIN] $SUBJECT\n\n$TECH_BODY" | /run/wrappers/bin/sendmail -t "$ADMIN_EMAIL"
|
||||
|
||||
# 2. Send Friendly Email to Owner
|
||||
USER_EMAIL="${config.numbus-server.mail.userAddress}"
|
||||
OWNER_NAME="${config.numbus-server.owner}"
|
||||
|
||||
FRIENDLY_BODY="Cher/Chère $OWNER_NAME,
|
||||
|
||||
Votre serveur a automatiquement détecté une panne matérielle de disque dur.
|
||||
Ce genre de panne est tout à fait normal selon l'âge de votre matériel et n'entraîne
|
||||
dans la grande majorité des cas aucune perte de données grâce au système de
|
||||
stockage redondant préventif.
|
||||
|
||||
Votre administrateur a été notifié de cette panne. Il vous recontactera dans de très
|
||||
brefs délais afin de procéder au remplacement, si nécessaire, du disque dur défaillant.
|
||||
|
||||
Merci de votre confiance,
|
||||
L'équipe de support,
|
||||
Numbus-Server."
|
||||
|
||||
printf "Subject: [Alerte] Défaillance matérielle sur votre serveur Numbus\n\n$FRIENDLY_BODY" | /run/wrappers/bin/sendmail -t "$USER_EMAIL"
|
||||
'';
|
||||
in
|
||||
|
||||
{
|
||||
services.smartd = {
|
||||
enable = true;
|
||||
defaults.autodetected = "-a -o on -S on -s (S/../.././00|L/../../6/01) -n standby,q -M exec ${smartd_notifier}";
|
||||
notifications = {
|
||||
wall = {
|
||||
enable = true;
|
||||
};
|
||||
mail = {
|
||||
enable = true;
|
||||
sender = config.numbus-server.mail.fromAddress;
|
||||
recipient = "${config.numbus-server.mail.userAddress},${config.numbus-server.mail.adminAddress}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.numbus.mail;
|
||||
in
|
||||
|
||||
{
|
||||
options.numbus.mail = {
|
||||
enable = mkEnableOption "Email sending functionality";
|
||||
|
||||
userAddress = mkOption {
|
||||
description = "The address of the user this server will send emails to";
|
||||
type = types.str;
|
||||
example = "user@your-domain.com";
|
||||
};
|
||||
|
||||
adminAddress = mkOption {
|
||||
description = "The address of the admin this server will send emails to";
|
||||
type = types.str;
|
||||
example = "admin@your-domain.com";
|
||||
};
|
||||
|
||||
smtpUsername = mkOption {
|
||||
description = "The username/email that will be use to authenticate to the SMTP server";
|
||||
type = types.str;
|
||||
example = "your-smtp-enabled-address@your-domain.com";
|
||||
};
|
||||
|
||||
smtpPasswordPath = mkOption {
|
||||
description = "The path to a file containing the password that will be use to authenticate to the SMTP server";
|
||||
type = types.path;
|
||||
example = /run/secrets/system/mail/smtpPassword;
|
||||
};
|
||||
|
||||
fromAddress = mkOption {
|
||||
description = "This server will send emails from this address";
|
||||
type = types.str;
|
||||
default = "numbus-server-noreply@${config.numbus.services.domain}";
|
||||
example = "numbus-server-noreply@your-domain.com";
|
||||
};
|
||||
|
||||
smtpServer = mkOption {
|
||||
description = "The SMTP server address your server will use to send emails";
|
||||
type = types.str;
|
||||
default = "smtp.gmail.com";
|
||||
example = "smtp.your-provider.com";
|
||||
};
|
||||
|
||||
smtpPort = mkOption {
|
||||
description = "The SMTP port your server will connect to to send emails";
|
||||
type = types.port;
|
||||
default = 587;
|
||||
example = 587;
|
||||
};
|
||||
|
||||
smtpEncryption = mkOption {
|
||||
description = "The encryption method for SMTP : NONE (NOT RECOMMENDED), TLS (port 465, also called SSL), or STARTTLS (port 587). STARTTLS is recommended.";
|
||||
type = types.enum [ "NONE" "TLS" "STARTTLS" ];
|
||||
default = "STARTTLS";
|
||||
example = "STARTTLS";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
sops.secrets."smtpPassword" = {
|
||||
sopsFile = /etc/nixos/secrets/system/mail.yaml;
|
||||
owner = "numbus-admin";
|
||||
mode = "0600";
|
||||
};
|
||||
|
||||
environment.etc."aliases" ={
|
||||
mode = "0440";
|
||||
text = ''
|
||||
root: ${cfg.userAddress}, ${cfg.adminAddress}
|
||||
'';
|
||||
};
|
||||
|
||||
programs.msmtp = {
|
||||
enable = true;
|
||||
defaults = {
|
||||
aliases = "/etc/aliases";
|
||||
timeout = 60;
|
||||
syslog = "on";
|
||||
};
|
||||
accounts.default = {
|
||||
auth = true;
|
||||
host = cfg.smtpServer;
|
||||
port = cfg.smtpPort;
|
||||
from = cfg.fromAddress;
|
||||
user = cfg.smtpUsername;
|
||||
tls = true;
|
||||
tls_starttls = true;
|
||||
passwordeval = "${pkgs.coreutils}/bin/cat ${cfg.smtpPasswordPath}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user