Compare commits
45 commits
376a622549
...
5abcc66191
Author | SHA1 | Date | |
---|---|---|---|
Bruno BELANYI | 5abcc66191 | ||
Bruno BELANYI | c7fc4c2c67 | ||
Bruno BELANYI | 489802efbe | ||
Bruno BELANYI | ac9eeea26d | ||
Bruno BELANYI | a0b91a5d18 | ||
Bruno BELANYI | 6b78d89065 | ||
Bruno BELANYI | 4c12fc0094 | ||
Bruno BELANYI | 217c69cc9f | ||
Bruno BELANYI | 31c20c5b1b | ||
Bruno BELANYI | 795026e918 | ||
Bruno BELANYI | b376366d7b | ||
Bruno BELANYI | 1f6c40c3eb | ||
Bruno BELANYI | aa6baa82e8 | ||
Bruno BELANYI | f860452c1c | ||
Bruno BELANYI | a1bc64cf48 | ||
Bruno BELANYI | b8325e8ea7 | ||
Bruno BELANYI | 0dccde9edf | ||
Bruno BELANYI | 260f1e9b5c | ||
Bruno BELANYI | 178f6825c0 | ||
Bruno BELANYI | 629e5d99f5 | ||
Bruno BELANYI | 370c8354da | ||
Bruno BELANYI | c7cc887322 | ||
Bruno BELANYI | 6f27b15781 | ||
Bruno BELANYI | e4916ddb88 | ||
Bruno BELANYI | 4569fe8a29 | ||
Bruno BELANYI | b8f4dd33ee | ||
Bruno BELANYI | fc98fe2b3e | ||
Bruno BELANYI | 82e56bf80c | ||
Bruno BELANYI | bdc008d0fc | ||
Bruno BELANYI | 5f607efee8 | ||
Bruno BELANYI | 5c5738e1d8 | ||
Bruno BELANYI | 7d8a18c968 | ||
Bruno BELANYI | 4fb2447648 | ||
Bruno BELANYI | ef88c7561b | ||
Bruno BELANYI | 4e2055da7f | ||
Bruno BELANYI | 2f3b9950e1 | ||
Bruno BELANYI | 8607b3c577 | ||
Bruno BELANYI | 257c0675e2 | ||
Bruno BELANYI | 55fd694c69 | ||
Bruno BELANYI | 2a20ecbd1e | ||
Bruno BELANYI | fa732c88e4 | ||
Bruno BELANYI | 99a3bd2587 | ||
Bruno BELANYI | e40247ed81 | ||
Bruno BELANYI | 1dcf5a1f1c | ||
Bruno BELANYI | 7b21943693 |
17
flake.lock
17
flake.lock
|
@ -150,6 +150,22 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"impermanence": {
|
||||
"locked": {
|
||||
"lastModified": 1697303681,
|
||||
"narHash": "sha256-caJ0rXeagaih+xTgRduYtYKL1rZ9ylh06CIrt1w5B4g=",
|
||||
"owner": "nix-community",
|
||||
"repo": "impermanence",
|
||||
"rev": "0f317c2e9e56550ce12323eb39302d251618f5b5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "master",
|
||||
"repo": "impermanence",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1732521221,
|
||||
|
@ -214,6 +230,7 @@
|
|||
"flake-parts": "flake-parts",
|
||||
"futils": "futils",
|
||||
"home-manager": "home-manager",
|
||||
"impermanence": "impermanence",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nur": "nur",
|
||||
"pre-commit-hooks": "pre-commit-hooks",
|
||||
|
|
|
@ -43,6 +43,13 @@
|
|||
};
|
||||
};
|
||||
|
||||
impermanence = {
|
||||
type = "github";
|
||||
owner = "nix-community";
|
||||
repo = "impermanence";
|
||||
ref = "master";
|
||||
};
|
||||
|
||||
nixpkgs = {
|
||||
type = "github";
|
||||
owner = "NixOS";
|
||||
|
|
|
@ -18,6 +18,13 @@ in
|
|||
services.blueman.enable = true;
|
||||
}
|
||||
|
||||
# Persist bluetooth files
|
||||
{
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/bluetooth"
|
||||
];
|
||||
}
|
||||
|
||||
# Support for additional bluetooth codecs
|
||||
(lib.mkIf cfg.loadExtraCodecs {
|
||||
hardware.pulseaudio = {
|
||||
|
|
|
@ -22,6 +22,18 @@ in
|
|||
config = lib.mkMerge [
|
||||
(lib.mkIf cfg.wireless.enable {
|
||||
networking.networkmanager.enable = true;
|
||||
|
||||
# IWD needs persistence if enabled
|
||||
|
||||
# Persist NetworkManager files
|
||||
my.system.persist.files = [
|
||||
"/var/lib/NetworkManager/secret_key"
|
||||
"/var/lib/NetworkManager/seen-bssids"
|
||||
"/var/lib/NetworkManager/timestamps"
|
||||
];
|
||||
my.system.persist.directories = [
|
||||
"/etc/NetworkManager/system-connections"
|
||||
];
|
||||
})
|
||||
];
|
||||
}
|
||||
|
|
|
@ -69,6 +69,11 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
cfg.downloadDir
|
||||
"/var/lib/aria2"
|
||||
];
|
||||
|
||||
# NOTE: unfortunately aria2 does not log connection failures for fail2ban
|
||||
};
|
||||
}
|
||||
|
|
|
@ -34,6 +34,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/${config.services.audiobookshelf.dataDir}"
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
audiobookshelf = ''
|
||||
enabled = true
|
||||
|
|
|
@ -41,5 +41,12 @@ in
|
|||
|
||||
# Those are all subdomains, no problem
|
||||
my.services.nginx.virtualHosts = hostsInfo;
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/www/blog"
|
||||
"/var/www/cv"
|
||||
"/var/www/dev"
|
||||
"/var/www/key"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -53,6 +53,11 @@ in
|
|||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/${config.services.calibre-web.dataDir}"
|
||||
cfg.libraryPath
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
calibre-web = ''
|
||||
enabled = true
|
||||
|
|
|
@ -39,5 +39,7 @@ in
|
|||
extraGroups = [ "docker" ]; # Give access to the daemon
|
||||
};
|
||||
users.groups.drone-runner-docker = { };
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
|
@ -63,5 +63,7 @@ in
|
|||
group = "drone-runner-exec";
|
||||
};
|
||||
users.groups.drone-runner-exec = { };
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
|
@ -50,5 +50,7 @@ in
|
|||
inherit (cfg) port;
|
||||
};
|
||||
};
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
|
@ -33,5 +33,9 @@ in
|
|||
bantime = "10m";
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/fail2ban"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -28,6 +28,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/flood"
|
||||
];
|
||||
|
||||
# NOTE: unfortunately flood does not log connection failures for fail2ban
|
||||
};
|
||||
}
|
||||
|
|
|
@ -147,6 +147,11 @@ in
|
|||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.forgejo.lfs.contentDir
|
||||
config.services.forgejo.repositoryRoot
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
forgejo = ''
|
||||
enabled = true
|
||||
|
|
|
@ -131,6 +131,11 @@ in
|
|||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.gitea.lfs.contentDir
|
||||
config.services.gitea.repositoryRoot
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
gitea = ''
|
||||
enabled = true
|
||||
|
|
|
@ -37,6 +37,16 @@ in
|
|||
useACMEHost = config.networking.domain;
|
||||
};
|
||||
|
||||
my.services.backup = {
|
||||
paths = [
|
||||
config.services.grocy.dataDir
|
||||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.grocy.dataDir
|
||||
];
|
||||
|
||||
# NOTE: unfortunately grocy does not log connection failures for fail2ban
|
||||
};
|
||||
}
|
||||
|
|
|
@ -33,6 +33,10 @@ in
|
|||
port = jackettPort;
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.jackett.dataDir
|
||||
];
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.nzbhydra.enable {
|
||||
|
@ -45,6 +49,10 @@ in
|
|||
port = nzbhydraPort;
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.nzbhydra2.dataDir
|
||||
];
|
||||
})
|
||||
|
||||
(lib.mkIf cfg.prowlarr.enable {
|
||||
|
@ -58,6 +66,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/prowlarr"
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
prowlarr = ''
|
||||
enabled = true
|
||||
|
|
|
@ -38,6 +38,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/jellyfin"
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
jellyfin = ''
|
||||
enabled = true
|
||||
|
|
|
@ -36,6 +36,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.komga.stateDir
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
komga = ''
|
||||
enabled = true
|
||||
|
|
|
@ -107,5 +107,9 @@ in
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/lohr"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -214,5 +214,9 @@ in
|
|||
config.services.matrix-synapse.dataDir
|
||||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.matrix-synapse.dataDir
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -72,6 +72,12 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.services.backup = {
|
||||
paths = [
|
||||
"/var/lib/mealie"
|
||||
];
|
||||
};
|
||||
|
||||
services.fail2ban.jails = {
|
||||
mealie = ''
|
||||
enabled = true
|
||||
|
|
|
@ -130,5 +130,10 @@ in
|
|||
inherit (cfg.grafana) port;
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.grafana.dataDir
|
||||
"/var/lib/${config.services.prometheus.stateDir}"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -53,6 +53,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/navidrome"
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
navidrome = ''
|
||||
enabled = true
|
||||
|
|
|
@ -46,5 +46,7 @@ in
|
|||
];
|
||||
};
|
||||
};
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
|
@ -92,6 +92,10 @@ in
|
|||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.nextcloud.home
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
nextcloud = ''
|
||||
enabled = true
|
||||
|
|
|
@ -486,5 +486,9 @@ in
|
|||
}
|
||||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/acme"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -146,5 +146,10 @@ in
|
|||
config.services.paperless.mediaDir
|
||||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.paperless.dataDir
|
||||
config.services.paperless.mediaDir
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -54,6 +54,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/stirling-pdf"
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
stirling-pdf = ''
|
||||
enabled = true
|
||||
|
|
|
@ -51,5 +51,10 @@ in
|
|||
inherit (cfg) port;
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.systemd.services.podgrab.environment.CONFIG
|
||||
config.systemd.services.podgrab.environment.DATA
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -24,5 +24,9 @@ in
|
|||
(config.services.postgresqlBackup.location + "/*.prev.sql.gz")
|
||||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.postgresqlBackup.location
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -18,6 +18,13 @@ in
|
|||
};
|
||||
})
|
||||
|
||||
# Only persist directory if the actual service is enabled
|
||||
(lib.mkIf config.services.postgresql.enable {
|
||||
my.system.persist.directories = [
|
||||
config.services.postgresql.dataDir
|
||||
];
|
||||
})
|
||||
|
||||
# Taken from the manual
|
||||
(lib.mkIf cfg.upgradeScript {
|
||||
environment.systemPackages =
|
||||
|
|
|
@ -53,6 +53,11 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
cfg.downloadDirectory
|
||||
"/var/lib/pyload"
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
pyload = ''
|
||||
enabled = true
|
||||
|
|
|
@ -46,5 +46,9 @@ in
|
|||
# Because Quassel does not use the socket, I simply trust its connection
|
||||
authentication = "host quassel quassel localhost trust";
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.quassel.dataDir
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -22,5 +22,9 @@ in
|
|||
forceSSL = true;
|
||||
useACMEHost = config.networking.domain;
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.rss-bridge.dataDir
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -24,6 +24,10 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.system.persist.files = [
|
||||
config.services.sabnzbd.configFile
|
||||
];
|
||||
|
||||
services.fail2ban.jails = {
|
||||
sabnzbd = ''
|
||||
enabled = true
|
||||
|
|
|
@ -19,6 +19,16 @@ let
|
|||
enable = true;
|
||||
group = "media";
|
||||
};
|
||||
|
||||
my.system.persist.directories =
|
||||
let
|
||||
# Bazarr breaks the mold unfortunately
|
||||
dataDir =
|
||||
if service != "bazarr"
|
||||
then config.services.${service}.dataDir
|
||||
else "/var/lib/bazarr";
|
||||
in
|
||||
[ dataDir ];
|
||||
};
|
||||
|
||||
mkRedirection = service: {
|
||||
|
|
|
@ -20,6 +20,13 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
# Persist SSH keys
|
||||
my.system.persist.files =
|
||||
let
|
||||
pubAndPrivKey = key: [ key.path "${key.path}.pub" ];
|
||||
in
|
||||
lib.concatMap pubAndPrivKey config.services.openssh.hostKeys;
|
||||
|
||||
# Opens the relevant UDP ports.
|
||||
programs.mosh.enable = true;
|
||||
};
|
||||
|
|
|
@ -83,6 +83,16 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
my.services.backup = {
|
||||
paths = [
|
||||
"/var/lib/tandoor-recipes"
|
||||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/tandoor-recipes"
|
||||
];
|
||||
|
||||
# NOTE: unfortunately tandoor-recipes does not log connection failures for fail2ban
|
||||
};
|
||||
}
|
||||
|
|
|
@ -91,6 +91,11 @@ in
|
|||
allowedUDPPorts = [ cfg.peerPort ];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
cfg.downloadBase
|
||||
config.services.transmission.home
|
||||
];
|
||||
|
||||
# NOTE: unfortunately transmission does not log connection failures for fail2ban
|
||||
};
|
||||
}
|
||||
|
|
|
@ -100,6 +100,10 @@ in
|
|||
];
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
config.services.vikunja.settings.files.basepath
|
||||
];
|
||||
|
||||
# NOTE: unfortunately vikunja does not log connection failures for fail2ban
|
||||
};
|
||||
}
|
||||
|
|
|
@ -38,5 +38,7 @@ in
|
|||
];
|
||||
};
|
||||
};
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
|
@ -62,5 +62,7 @@ in
|
|||
];
|
||||
};
|
||||
};
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
|
@ -61,5 +61,7 @@ in
|
|||
port = cfg.rpcPort;
|
||||
};
|
||||
};
|
||||
|
||||
# FIXME: persistence
|
||||
};
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
./language
|
||||
./nix
|
||||
./packages
|
||||
./persist
|
||||
./podman
|
||||
./polkit
|
||||
./printing
|
||||
|
|
|
@ -23,5 +23,9 @@ in
|
|||
];
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/docker"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
70
modules/nixos/system/persist/default.nix
Normal file
70
modules/nixos/system/persist/default.nix
Normal file
|
@ -0,0 +1,70 @@
|
|||
# Ephemeral root configuration
|
||||
{ config, inputs, lib, ... }:
|
||||
let
|
||||
cfg = config.my.system.persist;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
inputs.impermanence.nixosModules.impermanence
|
||||
];
|
||||
|
||||
options.my.system.persist = with lib; {
|
||||
enable = mkEnableOption "stateless system configuration";
|
||||
|
||||
mountPoint = lib.mkOption {
|
||||
type = types.str;
|
||||
default = "/persistent";
|
||||
example = "/etc/nix/persist";
|
||||
description = ''
|
||||
Which mount point should be used to persist this system's files and
|
||||
directories.
|
||||
'';
|
||||
};
|
||||
|
||||
files = lib.mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [ ];
|
||||
example = [
|
||||
"/etc/nix/id_rsa"
|
||||
];
|
||||
description = ''
|
||||
Additional files in the root to link to persistent storage.
|
||||
'';
|
||||
};
|
||||
|
||||
directories = lib.mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [ ];
|
||||
example = [
|
||||
"/var/lib/libvirt"
|
||||
];
|
||||
description = ''
|
||||
Additional directories in the root to link to persistent storage.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.persistence."${cfg.mountPoint}" = {
|
||||
files = [
|
||||
"/etc/machine-id" # Machine-specific ID
|
||||
"/etc/adjtime" # Clock drift factor and offsets
|
||||
]
|
||||
++ lib.unique cfg.files
|
||||
;
|
||||
|
||||
directories = [
|
||||
"/etc/nixos" # In case it's storage directory of our configuration
|
||||
"/var/log" # Logs
|
||||
"/var/lib/nixos" # UID/GID maps
|
||||
"/var/lib/systemd/coredump" # Coredumps
|
||||
|
||||
"/var/lib/systemd" # FIXME: needed?
|
||||
"/var/spool" # FIXME: needed?
|
||||
"/var/tmp" # FIXME: needed?
|
||||
]
|
||||
++ lib.unique cfg.directories
|
||||
;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -44,5 +44,9 @@ in
|
|||
];
|
||||
};
|
||||
};
|
||||
|
||||
my.system.persist.directories = [
|
||||
"/var/lib/containers"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -65,5 +65,7 @@ in
|
|||
# Allow resolution of '.local' addresses
|
||||
nssmdns4 = true;
|
||||
};
|
||||
|
||||
# FIXME: persistence?
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue