Compare commits

...

11 Commits

Author SHA1 Message Date
Øystein Tveit
4521d404ae WIP 2024-12-22 23:50:35 +01:00
h7x4
f498b82b07 WIP: backup mysql 2024-09-01 03:53:49 +02:00
h7x4
9034a71927 WIP: backup postgresql 2024-09-01 03:53:45 +02:00
h7x4
f85d18769f common: clean /tmp on boot by default 2024-09-01 03:29:46 +02:00
h7x4
b47a626427 common/openssh: socket activate 2024-09-01 03:21:13 +02:00
h7x4
4d65b9fd1d common/sudo: misc config 2024-09-01 03:17:15 +02:00
h7x4
f3e094520e common/postfix: init 2024-09-01 03:13:18 +02:00
h7x4
69f98933a4 common/smartd: add smartctl to environment packages 2024-09-01 01:55:38 +02:00
h7x4
bf2959c68d common/nix: flesh out 2024-09-01 01:44:59 +02:00
h7x4
17f0268d12 common/irqbalance: init 2024-09-01 01:39:35 +02:00
h7x4
ebce0eb67a common/smartd: init 2024-09-01 01:23:15 +02:00
8 changed files with 185 additions and 23 deletions

View File

@@ -1,4 +1,4 @@
{ pkgs, ... }: { pkgs, lib, ... }:
{ {
imports = [ imports = [
@@ -10,12 +10,17 @@
./services/acme.nix ./services/acme.nix
./services/auto-upgrade.nix ./services/auto-upgrade.nix
./services/irqbalance.nix
./services/logrotate.nix ./services/logrotate.nix
./services/nginx.nix ./services/nginx.nix
./services/openssh.nix ./services/openssh.nix
./services/postfix.nix
./services/smartd.nix
./services/thermald.nix ./services/thermald.nix
]; ];
boot.tmp.cleanOnBoot = lib.mkDefault true;
time.timeZone = "Europe/Oslo"; time.timeZone = "Europe/Oslo";
i18n.defaultLocale = "en_US.UTF-8"; i18n.defaultLocale = "en_US.UTF-8";
@@ -42,6 +47,11 @@
programs.zsh.enable = true; programs.zsh.enable = true;
security.sudo.execWheelOnly = true;
security.sudo.extraConfig = ''
Defaults lecture = never
'';
users.groups."drift".name = "drift"; users.groups."drift".name = "drift";
# Trusted users on the nix builder machines # Trusted users on the nix builder machines

View File

@@ -1,8 +1,19 @@
{ inputs, ... }: { inputs, ... }:
{ {
nix.gc.automatic = true; nix = {
nix.gc.options = "--delete-older-than 2d"; gc = {
nix.settings.experimental-features = [ "nix-command" "flakes" ]; automatic = true;
options = "--delete-older-than 2d";
};
settings = {
allow-dirty = true;
auto-optimise-store = true;
builders-use-substitutes = true;
experimental-features = [ "nix-command" "flakes" ];
log-lines = 50;
use-xdg-base-directories = true;
};
/* This makes commandline tools like /* This makes commandline tools like
** nix run nixpkgs#hello ** nix run nixpkgs#hello
@@ -10,8 +21,10 @@
** use the same channel the system ** use the same channel the system
** was built with ** was built with
*/ */
nix.registry = { registry = {
nixpkgs.flake = inputs.nixpkgs; "nixpkgs".flake = inputs.nixpkgs;
"pvv-nix".flake = inputs.self;
};
nixPath = [ "nixpkgs=${inputs.nixpkgs}" ];
}; };
nix.nixPath = [ "nixpkgs=${inputs.nixpkgs}" ];
} }

View File

@@ -0,0 +1,4 @@
{ ... }:
{
services.irqbalance.enable = true;
}

View File

@@ -2,6 +2,7 @@
{ {
services.openssh = { services.openssh = {
enable = true; enable = true;
startWhenNeeded = true;
extraConfig = '' extraConfig = ''
PubkeyAcceptedAlgorithms=+ssh-rsa PubkeyAcceptedAlgorithms=+ssh-rsa
Match Group wheel Match Group wheel

23
base/services/postfix.nix Normal file
View File

@@ -0,0 +1,23 @@
{ config, pkgs, lib, ... }:
let
cfg = config.services.postfix;
in
{
services.postfix = {
enable = true;
hostname = "${config.networking.hostName}.pvv.ntnu.no";
domain = "pvv.ntnu.no";
relayHost = "smtp.pvv.ntnu.no";
relayPort = 465;
config = {
smtp_tls_wrappermode = "yes";
smtp_tls_security_level = "encrypt";
};
# Nothing should be delivered to this machine
destination = [ ];
};
}

8
base/services/smartd.nix Normal file
View File

@@ -0,0 +1,8 @@
{ config, pkgs, lib, ... }:
{
services.smartd.enable = lib.mkDefault true;
environment.systemPackages = lib.optionals config.services.smartd.enable (with pkgs; [
smartmontools
]);
}

View File

@@ -1,4 +1,7 @@
{ pkgs, lib, config, values, ... }: { pkgs, lib, config, values, ... }:
let
backupDir = "/var/lib/mysql/backups";
in
{ {
sops.secrets."mysql/password" = { sops.secrets."mysql/password" = {
owner = "mysql"; owner = "mysql";
@@ -36,11 +39,6 @@
}]; }];
}; };
services.mysqlBackup = {
enable = true;
location = "/var/lib/mysql/backups";
};
networking.firewall.allowedTCPPorts = [ 3306 ]; networking.firewall.allowedTCPPorts = [ 3306 ];
systemd.services.mysql.serviceConfig = { systemd.services.mysql.serviceConfig = {
@@ -50,4 +48,58 @@
values.ipv6-space values.ipv6-space
]; ];
}; };
# NOTE: instead of having the upstream nixpkgs postgres backup unit trigger
# another unit, it was easier to just make one ourselves
systemd.services."backup-mysql" = {
description = "Backup MySQL data";
requires = [ "mysql.service" ];
path = [
pkgs.coreutils
pkgs.rsync
pkgs.gzip
config.services.mysql.package
];
script = let
rotations = 10;
# rsyncTarget = "root@isvegg.pvv.ntnu.no:/mnt/backup1/bicep/mysql";
rsyncTarget = "/data/backup/mysql";
in ''
set -eo pipefail
mysqldump --all-databases | gzip -c -9 --rsyncable > "${backupDir}/$(date --iso-8601)-dump.sql.gz"
while [ $(ls -1 "${backupDir}" | wc -l) -gt ${toString rotations} ]; do
rm $(find "${backupDir}" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d' ' -f2)
done
rsync -avz --delete "${backupDir}" '${rsyncTarget}'
'';
serviceConfig = {
Type = "oneshot";
User = "mysql";
Group = "mysql";
UMask = "0077";
Nice = 19;
IOSchedulingClass = "best-effort";
IOSchedulingPriority = 7;
ReadWritePaths = [
backupDir
"/data/backup/mysql" # NOTE: should not be part of this option once rsyncTarget is remote
];
};
startAt = "*-*-* 02:15:00";
};
systemd.tmpfiles.settings."10-mysql-backup".${backupDir}.d = {
user = "mysql";
group = "mysql";
mode = "700";
};
} }

View File

@@ -1,4 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, lib, ... }:
let
backupDir = "/var/lib/postgresql/backups";
in
{ {
services.postgresql = { services.postgresql = {
enable = true; enable = true;
@@ -90,9 +93,57 @@
networking.firewall.allowedTCPPorts = [ 5432 ]; networking.firewall.allowedTCPPorts = [ 5432 ];
networking.firewall.allowedUDPPorts = [ 5432 ]; networking.firewall.allowedUDPPorts = [ 5432 ];
services.postgresqlBackup = { # NOTE: instead of having the upstream nixpkgs postgres backup unit trigger
enable = true; # another unit, it was easier to just make one ourselves
location = "/var/lib/postgres/backups"; systemd.services."backup-postgresql" = {
backupAll = true; description = "Backup PostgreSQL data";
requires = [ "postgresql.service" ];
path = [
pkgs.coreutils
pkgs.rsync
pkgs.gzip
config.services.postgresql.package
];
script = let
rotations = 10;
# rsyncTarget = "root@isvegg.pvv.ntnu.no:/mnt/backup1/bicep/postgresql";
rsyncTarget = "/data/backup/postgresql";
in ''
set -eo pipefail
pg_dumpall -U postgres | gzip -c -9 --rsyncable > "${backupDir}/$(date --iso-8601)-dump.sql.gz"
while [ $(ls -1 "${backupDir}" | wc -l) -gt ${toString rotations} ]; do
rm $(find "${backupDir}" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d' ' -f2)
done
rsync -avz --delete "${backupDir}" '${rsyncTarget}'
'';
serviceConfig = {
Type = "oneshot";
User = "postgres";
Group = "postgres";
UMask = "0077";
Nice = 19;
IOSchedulingClass = "best-effort";
IOSchedulingPriority = 7;
ReadWritePaths = [
backupDir
"/data/backup/postgresql" # NOTE: should not be part of this option once rsyncTarget is remote
];
};
startAt = "*-*-* 01:15:00";
};
systemd.tmpfiles.settings."10-postgresql-backup".${backupDir}.d = {
user = "postgres";
group = "postgres";
mode = "700";
}; };
} }