Compare commits

...

2 commits

Author SHA1 Message Date
7d1a057641
feat: add bandcamp-collection-downloader
Signed-off-by: Lander Van den Bulcke <landervandenbulcke@gmail.com>
2025-09-22 16:45:14 +02:00
95bf1530f5
feat: add wrtag
Signed-off-by: Lander Van den Bulcke <landervandenbulcke@gmail.com>
2025-09-22 14:39:20 +02:00
6 changed files with 144 additions and 7 deletions

View file

@ -81,7 +81,7 @@
); );
}; };
in in
{ rec {
# custom pkgs # custom pkgs
packages = forAllSystems (system: import ./pkgs nixpkgs.legacyPackages.${system}); packages = forAllSystems (system: import ./pkgs nixpkgs.legacyPackages.${system});
@ -191,8 +191,10 @@
imports = [ imports = [
inputs.disko.nixosModules.disko inputs.disko.nixosModules.disko
inputs.sops-nix.nixosModules.sops inputs.sops-nix.nixosModules.sops
inputs.self.nixosModules.namespaced-vpn nixosModules.bandcamp-collection-downloader
inputs.self.nixosModules.storagebox nixosModules.namespaced-vpn
nixosModules.storagebox
nixosModules.wrtagweb
./hosts/servers/common.nix ./hosts/servers/common.nix
@ -214,7 +216,7 @@
meta = { meta = {
nixpkgs = import nixpkgs { nixpkgs = import nixpkgs {
system = "aarch64-linux"; system = "aarch64-linux";
overlays = [ ]; overlays = [ overlays.unstable-packages ];
}; };
}; };
} }

View file

@ -1,5 +1,6 @@
{ {
config, config,
pkgs,
... ...
}: }:
{ {
@ -56,7 +57,11 @@
users.groups.storage = { users.groups.storage = {
name = "storage"; name = "storage";
gid = 491729; gid = 491729;
members = [ "slskd" ]; members = [
"slskd"
"wrtagweb"
"bandcamp-collection-downloader"
];
}; };
services.nginx.virtualHosts."sls.escapeangle.com" = { services.nginx.virtualHosts."sls.escapeangle.com" = {
@ -86,6 +91,21 @@
}; };
}; };
environment.systemPackages = with pkgs; [
unstable.wrtag
];
services.wrtagweb = {
enable = true;
settings.web-api-key = "test";
};
services.bandcamp-collection-downloader = {
enable = true;
bandcampUser = "lander";
cookiesFile = config.sops.secrets.bandcampcdCookieFile.path;
};
sops = { sops = {
defaultSopsFile = ./hosting-02.yaml; defaultSopsFile = ./hosting-02.yaml;
secrets = { secrets = {
@ -101,6 +121,9 @@
slskdEnvFile = { slskdEnvFile = {
owner = config.services.slskd.user; owner = config.services.slskd.user;
}; };
bandcampcdCookieFile = {
owner = "bandcampcd";
};
}; };
}; };

View file

@ -2,6 +2,7 @@ wireguardKey: ENC[AES256_GCM,data:Z239oQMzOp4C33pBePuANX3aPkmjTcrT+Z/UY0dnUCmMOs
storageboxKey: ENC[AES256_GCM,data:uWDkiWIk3OePRfoaqjllVlRVzW5+ryE4sIOs8qm6cS8JN/+YFbnkCsT5sdFeXSpJyQ7ymgD6uJJ75RWH6Y/iIARbmZN/x/9hnB3LORHSl/C0F3xMHUf6prXtYyPNLWe+ghCMygaLyvBuCBiEhleevRQANXLUJCysiODepSkXwyasAHKTKuKQUPU/T+1R7eXaQPDMehzD4/0o8SdLkqcZXBQzs3VRp+CbQyl7dx6znwoPWckmFH2W+9fZCE+AxFxBP3jPVjBPuOC3BviTYFSvZPEkmtH+lxYv+PXFAPpgYwmAEjCwWyDMDRy6bNVQIG6TKHn60TJv+GCfRwPJ46mVtbruyil23d7g/V7dhu8btPbgtvcBx/8EexJ0PHAVWcIZ1FJwr7inMCAghbSDD3CkGpOV8btaYgUZtosqfg9r5cd75jB+7RZPwyb8/1mrLWE3eL9Za2lZ6bC7a9AeIn1q3Cn6+aoMKqXp8q/sVwozNpUJj73yhjR146MGjCGpqoKJqK453qc3VCC50OZTOULV,iv:sEwA6zrK6FFqTmVJOMD77g0OuDjCHDLRBlirjhZBx/0=,tag:z1fX+7goXk4U6Di+4EK6Fw==,type:str] storageboxKey: ENC[AES256_GCM,data:uWDkiWIk3OePRfoaqjllVlRVzW5+ryE4sIOs8qm6cS8JN/+YFbnkCsT5sdFeXSpJyQ7ymgD6uJJ75RWH6Y/iIARbmZN/x/9hnB3LORHSl/C0F3xMHUf6prXtYyPNLWe+ghCMygaLyvBuCBiEhleevRQANXLUJCysiODepSkXwyasAHKTKuKQUPU/T+1R7eXaQPDMehzD4/0o8SdLkqcZXBQzs3VRp+CbQyl7dx6znwoPWckmFH2W+9fZCE+AxFxBP3jPVjBPuOC3BviTYFSvZPEkmtH+lxYv+PXFAPpgYwmAEjCwWyDMDRy6bNVQIG6TKHn60TJv+GCfRwPJ46mVtbruyil23d7g/V7dhu8btPbgtvcBx/8EexJ0PHAVWcIZ1FJwr7inMCAghbSDD3CkGpOV8btaYgUZtosqfg9r5cd75jB+7RZPwyb8/1mrLWE3eL9Za2lZ6bC7a9AeIn1q3Cn6+aoMKqXp8q/sVwozNpUJj73yhjR146MGjCGpqoKJqK453qc3VCC50OZTOULV,iv:sEwA6zrK6FFqTmVJOMD77g0OuDjCHDLRBlirjhZBx/0=,tag:z1fX+7goXk4U6Di+4EK6Fw==,type:str]
storageboxCryptKey: ENC[AES256_GCM,data:ryYOzFvdPaVkOHmypYbqw+KU6aB2OQutLw==,iv:FL4c7P36qxYR1KJlg7t0dvFHlKGMIrTlQG+CDkeJu9U=,tag:Ia4mhV9Ed/m1rRMCNnHqXw==,type:str] storageboxCryptKey: ENC[AES256_GCM,data:ryYOzFvdPaVkOHmypYbqw+KU6aB2OQutLw==,iv:FL4c7P36qxYR1KJlg7t0dvFHlKGMIrTlQG+CDkeJu9U=,tag:Ia4mhV9Ed/m1rRMCNnHqXw==,type:str]
slskdEnvFile: ENC[AES256_GCM,data:K1S1PXQMiBoEdbuM/NTBUYRrUSnAC/KBhm/PFzoCJATiLLPsstzgqzbe9vG8tnULb2driAH4Ytd03cmROp30V+9vW6J9eyCofWySWZNEYriRfY1y7y5AR8W13zQL0FGZOewUy/1T7YRvN8FjZFh4n7S3c0GREX3FSSNrmaHwOqgueDs=,iv:VziNMRpC2clhFyOMG8LRReMGUxhYqjUaZeA8gh599aM=,tag:H1tQBZ8nSgATSJB6nFSdlA==,type:str] slskdEnvFile: ENC[AES256_GCM,data:K1S1PXQMiBoEdbuM/NTBUYRrUSnAC/KBhm/PFzoCJATiLLPsstzgqzbe9vG8tnULb2driAH4Ytd03cmROp30V+9vW6J9eyCofWySWZNEYriRfY1y7y5AR8W13zQL0FGZOewUy/1T7YRvN8FjZFh4n7S3c0GREX3FSSNrmaHwOqgueDs=,iv:VziNMRpC2clhFyOMG8LRReMGUxhYqjUaZeA8gh599aM=,tag:H1tQBZ8nSgATSJB6nFSdlA==,type:str]
bandcampcdCookieFile: ENC[AES256_GCM,data:vHw7utB2mAUiys+zBNpGDW9URdSMkWbvv0bZyNUgbDwHkg0ZkbxHBbnspbU4gM5AmUc0OPKjgoqaLEfy+mrylfyXxdKyVlLWGVDwH/9SjsgLjNWBnZOfS0/JN0h8nD9DDfQ9+KVKwfnndIBDwc3Qr+/uQe88JOWeN27ZZoqMXAA7y92aHAn/cdjV9opJL3zq2Gk9ZSjW6pX0W382/+P2d+n5pvnJCGaVcz6NqYj36V7eu+jqtCdpN0ugb7bEQLBEPxN6vDkB1EaWiuI+JXUqPyAlyRqH/9D9IKFu+HWVjryz6WILkJ8rpAEKUtgr4DUDgW/ukTp8/gCe/w126YljuGYj283WYZOTJQHnNdqZFur1qmIosSRLzw4atnD1CAEpZzHFXGz19wMk5+U3OkPQkC/PxmzhqQlyKw7JQ8rNu+WTcHmF3YqYZjtPj1aayXxLqQ9IbZOwXwa0BLRZX7FOFJz/znQa7kR2VE5/Q8vbYA3sz0gBQiIcl8VSzGtQlVM7K+TtkiUSA4DwKH+deSlUnjauIsLldENlbOWwDdm+ckdIRUUuIXiHRq9VM+1UPJdxLGScsPUgsIMZckIkdcEXDyBo3HPdwvQ0lX2msqTIyJxgBMyvSC37Frb0l7hiE6j5HndLv0nfT8krik12WpfR9PKjJqy6kIl3fwSwTqNHA7yPeQKHR8QizGXmkwxEBtsYufKE0Oi1u7VUwwyJe9IU2Gkr0TQYiHo7Glg0lNtkrpPIM+hOjxJJE2MVRe+S117RluvvfEjAmEhyb9cjW+TAw3kQttwO2vMk+RHV3mFF5G2/0tmRbvpbou68eFDDOBQ8ILrUo35GuR8ziPXJeJ+5EuCgePGavEP4qX4FX/GpnMEo85b6m5Vow5EOu8dakHX4fcFTPQeCZ0FoLTGYzGxqUsMG4E8upsPZMw4xBxeVjQO35l4FVhwNyrsIaep1mZWf5vBgAN4q2FYyfJ7jnClJkSrNxg0zW8sEgqEZXIZcFfhPYC1DWZZRMII5n8zJXoeGHDLEIuT4zeIpoXRN3+S4X3AFL4I/gm6mAbFQv3IJ8+g/EOThTZh0PRl70v0Imd3EDetjy4rKphPDpeb6QJWPQkWnIcIeE7Nkg19VoOcWmL8UDxUpsD0NIL1QSZ5ElBuoFVsKuOlkBD5UucLOGZgF01n4BXQjZ9DIW1xBm3lWDDxzuwh4F1rf2MvgesZCEGVn/Y3VF3YMGgdhxLht4IHo4w6z7Rzuh53acf6TH+uZ+iOmFaBETlxA17n6YyaCVzjCuyBNxAxTvX0y+49saYctF9PExYwoKtKL2X9u8NR2OoZJi+TPVfLwBxSrrr9et7Kxhlqu2zxqzWRt7xQXUxWL28HqZljBZxpOxdhy9XLCr3Aj2aZa1mH7zFX5hincsT/RiHEMdOXNUtJoQvBFe/HZ+uquM42Q90qf0alO+VT7kpa5anHLMfzwRKub6W7eFbTe5CD9SybwRDnB503WyreTUmDgIJNwoqePC+WYrW1RnBhI8ebdGl+34ou5CuJldqa1UTEzJNeNqCWLzrP/ThAcJRqmZJ945na6mmQqxhRp2edGu5+tIP3FzoHK2hUOlPyv5CgWGwXLCE0E1kP9Acpex53Wz/NxEa5eTB3ZlwsXNeI2fx4rwyAgtTVMQbzvuf3bVgIAN73I5mRfHRdTeKyQqgShtbEIoz2Q5TGvFNl2ALJ4bJzOVRo2LkUYTGHHH2x623o29fN8Ij35DRabVJyt1y5QGwVNWco=,iv:dgV9d8sRSwyNlW3lWZ6ldWw9+Fxs0Wmn1jhRxg5Pkfs=,tag:ZY3frrrk5/bBgx5lRMYvGg==,type:str]
sops: sops:
age: age:
- recipient: age1hvrssz7k9akz66evj4kja53zvdtrss8k2ljxsh5myh2mru62sggqznlzrt - recipient: age1hvrssz7k9akz66evj4kja53zvdtrss8k2ljxsh5myh2mru62sggqznlzrt
@ -13,8 +14,8 @@ sops:
b1ZqUzZLUkFwNHJyVlhmK0FOZ1JFYUEKDU4NmBCHRY+ZK+RFK/LioGzjJTaOE1ky b1ZqUzZLUkFwNHJyVlhmK0FOZ1JFYUEKDU4NmBCHRY+ZK+RFK/LioGzjJTaOE1ky
MC6jxt7Y5RkCk0BBqeoEVLaNXNViPjwakbvyfH0w0P6l0KDJ4mNlYQ== MC6jxt7Y5RkCk0BBqeoEVLaNXNViPjwakbvyfH0w0P6l0KDJ4mNlYQ==
-----END AGE ENCRYPTED FILE----- -----END AGE ENCRYPTED FILE-----
lastmodified: "2025-09-20T23:35:47Z" lastmodified: "2025-09-22T13:13:34Z"
mac: ENC[AES256_GCM,data:idOk0S4lGYWOPHayOgqX0oKk8cWmm9YUXbAIDlojOmroE8qL45nBMNpb6npuA7wGoHWsg8kYCidi8v8Gz+dGnEMURdcT7NoqcgtDWisYxyw5sMQ52Wc+pNQzct34FGnIVcuQl/kFWEc5s7+jsXCiF5o0YbJLeyr6tyl1D2rWKkw=,iv:6n69rCiyETkV3hnGvAhxd3o+DcDI/Se7JMIs4fsDdag=,tag:Lf7lXw0dhgRqb7lnbJ2H6g==,type:str] mac: ENC[AES256_GCM,data:Dyy+fNjzpaYcQt5eBC5ibObkpW0qnsT47owGdHNUl1DqRpy4HtnjmHjAIyjeBJn+sE26KrlOS8t7UFUXmw6dRXii8By025YUSytuWUqmBQFS2lB3a8qlPfsxLh64VK0OEfpQleBQXhQV6tKXaCUF1hb0KkN6tyeKtGOK+lfKlUU=,iv:455vimOrZ69X5O6kwkMyZ5vEJNwGOqrZWyKXaOk6PAg=,tag:OVIDGC8dRi9CYwiQAM+hGg==,type:str]
pgp: pgp:
- created_at: "2025-09-18T21:32:42Z" - created_at: "2025-09-18T21:32:42Z"
enc: |- enc: |-

View file

@ -0,0 +1,56 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.services.bandcamp-collection-downloader;
in
{
options.services.bandcamp-collection-downloader = {
enable = mkEnableOption "Bandcamp Collection Downloader";
bandcampUser = mkOption {
type = types.str;
};
cookiesFile = mkOption {
type = types.path;
};
downloadFolder = mkOption {
type = types.str;
default = "/data/bandcamp";
};
audioFormat = mkOption {
type = types.str;
default = "flac";
};
};
config = mkIf cfg.enable {
users.users.bandcampcd = {
enable = true;
isSystemUser = true;
group = "bandcampcd";
};
users.groups.bandcampcd = { };
systemd.services."bandcamp-collection-downloader" = {
description = "Synchronize Bandcamp library";
requires = [ "network-online.target" ];
serviceConfig = {
Type = "oneshot";
ExecStart = pkgs.writers.writeBash "bandcamp-sync" ''
${pkgs.bandcamp-collection-downloader}/bin/bandcamp-collection-downloader ${cfg.bandcampUser} \
--cookies-file ${cfg.cookiesFile} \
--download-folder ${cfg.downloadFolder} \
--audio-format ${cfg.audioFormat}
'';
};
};
};
}

View file

@ -1,5 +1,7 @@
{ {
# my-module = import ./my-module.nix # my-module = import ./my-module.nix
bandcamp-collection-downloader = import ./bandcamp-collection-downloader.nix;
namespaced-vpn = import ./namespaced-vpn.nix; namespaced-vpn = import ./namespaced-vpn.nix;
storagebox = import ./storagebox.nix; storagebox = import ./storagebox.nix;
wrtagweb = import ./wrtagweb.nix;
} }

View file

@ -0,0 +1,53 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.wrtagweb;
settingsFormat = pkgs.formats.keyValue {
mkKeyValue = lib.generators.mkKeyValueDefault { } " ";
listsAsDuplicateKeys = true;
};
in
{
options = {
services.wrtagweb = {
enable = lib.mkEnableOption "wrtag web";
settings = lib.mkOption rec {
type = settingsFormat.type;
apply = lib.recursiveUpdate default;
default = {
web-listen-addr = "127.0.0.1:7373";
path-format = "/data/music/{{ artists .Release.Artists | sort | join \"; \" | safepath }}/({{ .Release.ReleaseGroup.FirstReleaseDate.Year }}) {{ .Release.Title | safepath }}{{ if not (eq .ReleaseDisambiguation \"\") }} ({{ .ReleaseDisambiguation | safepath }}){{ end }}/{{ pad0 2 .TrackNum }}.{{ len .Tracks | pad0 2 }} {{ if .IsCompilation }}{{ artistsString .Track.Artists | safepath }} - {{ end }}{{ .Track.Title | safepath }}{{ .Ext }}";
};
description = ''
Configuration for wrtagweb
'';
};
};
};
config = lib.mkIf cfg.enable {
users.users.wrtagweb = {
enable = true;
isSystemUser = true;
group = "wrtagweb";
};
users.groups.wrtagweb = { };
systemd.services.wrtagweb = {
description = "wrtagweb";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
User = "wrtagweb";
ExecStart = "${pkgs.unstable.wrtag}/bin/wrtagweb -config-path ${settingsFormat.generate "wrtagweb" cfg.settings}";
};
};
};
}