nix/maskiner/node/configuration.nix

264 lines
7.1 KiB
Nix

# This is your system's configuration file.
# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix)
{
inputs,
lib,
config,
pkgs,
myhostname,
...
}:
let
modulesDirectory = ../../moduler;
backupScript = pkgs.writeShellScript "rclone-backups" ''
set -euo pipefail
declare -A SOURCES=(
[vaultwarden]="/var/lib/vaultwarden/"
[tailscale]="/var/lib/tailscale/"
[kitchenowl]="/var/lib/kitchenowl/"
)
REMOTE_BASE="gdrive:backups"
NOW="$(date +%Y-%m-%d_%H%M)"
for name in "''${!SOURCES[@]}"; do
SRC="''${SOURCES[$name]}"
DEST="''${REMOTE_BASE}/''${name}/''${NOW}"
rclone copy "''${SRC}" "''${DEST}" --create-empty-src-dirs \
--config /root/.config/rclone/rclone.conf
mapfile -t dirs < <(
rclone lsf "''${REMOTE_BASE}/''${name}" --dirs-only --format p \
--config /root/.config/rclone/rclone.conf | sort
)
if [ "''${#dirs[@]}" -gt 7 ]; then
remove_count=$(( ''${#dirs[@]} - 7 ))
for d in "''${dirs[@]:0:''${remove_count}}"; do
rclone purge "''${REMOTE_BASE}/''${name}/''${d%/}" \
--config /root/.config/rclone/rclone.conf
done
fi
done
'';
in
{
# You can import other NixOS modules here
imports = [
./hardware-configuration.nix
(modulesDirectory + /users.nix)
(modulesDirectory + /kitchenowl.nix)
# (modulesDirectory + /radicale.nix)
(modulesDirectory + /vaultwarden.nix)
(modulesDirectory + /uptime-kuma.nix)
(modulesDirectory + /wedding.nix)
(modulesDirectory + /services/base)
(modulesDirectory + /services/monitoring)
(modulesDirectory + /services/headscale)
(modulesDirectory + /services/mpd)
(modulesDirectory + /services/actual)
(modulesDirectory + /services/forgejo)
(modulesDirectory + /services/wishlist)
(modulesDirectory + /services/glance)
(modulesDirectory + /services/gotify)
(modulesDirectory + /services/kanboard)
(modulesDirectory + /services/immich)
(modulesDirectory + /services/paperless)
(modulesDirectory + /services/filebrowser)
(modulesDirectory + /services/mediamtx)
];
sops.defaultSopsFile = ../../secrets/sops.yaml;
sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
sops.secrets.gandi_key = {
path = "/run/secrets/gandi_key";
owner = "root";
mode = "0440";
};
environment.systemPackages = with pkgs; [
git
vim
rsync
rclone
fuse
];
programs.fuse.userAllowOther = true;
systemd.tmpfiles.rules = [
"d /mnt/gdrive 0755 root root - -"
"d /mnt/gdrive/backups 0755 root root - -"
];
systemd.services.rclone-gdrive = {
description = "Rclone mount for Google Drive";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
serviceConfig = {
Type = "simple";
ExecStart = ''
${pkgs.rclone}/bin/rclone mount \
gdrive: /mnt/gdrive \
--config /root/.config/rclone/rclone.conf \
--allow-other \
--dir-cache-time 12h \
--vfs-cache-mode writes
'';
ExecStop = "${pkgs.fuse}/bin/fusermount -u /mnt/gdrive";
Restart = "on-failure";
RestartSec = "10s";
};
wantedBy = [ "multi-user.target" ];
};
systemd.services.rsync-backups = {
description = "Rclone snapshot backups to Google Drive";
serviceConfig = {
Type = "oneshot";
ExecStart = backupScript;
User = "root";
};
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
path = [
pkgs.coreutils
pkgs.findutils
pkgs.rclone
];
};
systemd.timers.rsync-backups = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = "*-*-* 00,06,12,18:00:00";
Persistent = true;
};
};
home-manager.users.fw = {
# imports = [
# (modulesDirectory + /programs/beets)
# ];
home.username = "fw";
home.homeDirectory = "/home/fw";
home.stateVersion = "26.05";
systemd.user.startServices = "sd-switch";
};
services.nginx = {
enable = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
virtualHosts."router.wastring.com" = {
enableACME = true;
forceSSL = true;
locations."/" = {
proxyPass = "https://192.168.1.1";
proxyWebsockets = true;
extraConfig = "proxy_ssl_server_name on;" + "proxy_pass_header Authorization;";
};
};
};
immich = {
enable = true;
};
paperless = {
enable = false;
};
kanboard = {
enable = true;
host = "127.0.0.1";
port = 3128;
domain = "kanboard.wastring.com";
};
gotify = {
enable = true;
host = "127.0.0.1";
port = 8121;
domain = "message.wastring.com";
};
filebrowser = {
enable = false;
host = "127.0.0.1";
port = 8126;
domain = "files.wastring.com";
};
mediamtx = {
enable = true;
host = "0.0.0.0";
rtspPort = 8554;
};
glance = {
enable = false;
host = "127.0.0.1";
domain = "home.wastring.com";
};
wishlist = {
enable = true;
host = "127.0.0.1";
domain = "wish.wastring.com";
};
wedding = {
enable = true;
};
forgejo = {
enable = false;
};
actual = {
enable = true;
};
# grafana = {
# enable = true;
# host = "127.0.0.1";
# domain = "grafana.wastring.com";
# };
headscale = {
enable = true;
};
prometheus = {
enable = false;
exporters.enable = true;
};
loki = {
enable = false;
};
alloy = {
enable = false;
configPath = ./alloy-systemd.yaml;
};
nix.settings = {
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
];
require-sigs = false;
};
security.sudo.wheelNeedsPassword = false;
users.users.root.openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDALsdpwvC0w/Aj+1fWtzJyyWoUrGkdh8o2thVHeQQBNo0D7cmVberYmi4Cv9gWGX6PaElrnOl0KRdGyro2wxOYokSxgk2VgWW67BFITAQAbKyG2NhXXPbhb4jccDo7WH7TtOG8IofuJTPRu1Duda6k4RN0I0CkyAN6LGX+zy49cq0qKf9ijXYhCDYNih3+Fu/ig0aW/SYmsVoUl2VFTWdI5x5/wLvIjTEZhmAtYIeYADaLnom356cFrUysZa++FUujQAz3Ow236BvP95XZdTsqvfWNZFNIpC9VYF72JeIDCs5wDIr0GFmanF2On1nar+jJpoOE8SdHt357p5g/PqXV5TisN2xQRkqVwO9tWtMl4sF84jA4ULnY2gQWv9jErMxymUQ1IwuPUzDDlbRHCtfexAtkBy7wv6xslKAzG1QahvF/btNs5Caj3LN31rgAuxyooCbKGKTeBP3kHPKcz1iupgidfbO/QqVXBRQJTEdGyAKa8hVmLQZZPC/XUhxESAk= fw@fw-nix"
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8ku8iCb7tXd/tfxYDW+Tj8K9kpfrYZciYUZ6tBpO80inm4EImtfyEeJTuqDWMKov2BftUKs8brNeTBCXUEvU1P0+cpOP9RtYA5tfBXf3su+iVSswJJStIxNboXHrEGKdJJRNsTv/9agshDSUBy6G5TI1cXhv/updornfA4fwOMqOmtlYEn6XCRnsrO6NBLc/uLckdbF75HOsoLvezRvuqTLjpapjaUKGVPrgNXiclIKHmuOx71kgD4FX3rSz9FgKjnfu3a7DBbrHsf/g+N9PjNF1muN9UOV6nK3WwiO9BMWi7NpAWfzJOeZg9chqzI+U6CcsqYVeESgL41so+dnv3 fw@laptop"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP34dnsZSnWdDvd+3BXDwcw7wP0PjPEx2eCdBQJyGD6O fw@laptop"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII60tdNsG0z9q2jHmoTKvkeLQE6OF0bmTsDX1bpqpoG7 fw@jobb"
];
networking.hostName = myhostname;
system.stateVersion = "25.05";
}