diff --git a/flake.nix b/flake.nix index b1fa3fe..5811732 100644 --- a/flake.nix +++ b/flake.nix @@ -81,7 +81,7 @@ ); }; in - { + rec { # custom pkgs packages = forAllSystems (system: import ./pkgs nixpkgs.legacyPackages.${system}); @@ -191,8 +191,10 @@ imports = [ inputs.disko.nixosModules.disko inputs.sops-nix.nixosModules.sops - inputs.self.nixosModules.namespaced-vpn - inputs.self.nixosModules.storagebox + nixosModules.bandcamp-collection-downloader + nixosModules.namespaced-vpn + nixosModules.storagebox + nixosModules.wrtagweb ./hosts/servers/common.nix @@ -214,7 +216,7 @@ meta = { nixpkgs = import nixpkgs { system = "aarch64-linux"; - overlays = [ ]; + overlays = [ overlays.unstable-packages ]; }; }; } diff --git a/hosts/servers/hosting-02.nix b/hosts/servers/hosting-02.nix index b6eb4d8..4b0993e 100644 --- a/hosts/servers/hosting-02.nix +++ b/hosts/servers/hosting-02.nix @@ -1,5 +1,6 @@ { config, + pkgs, ... }: { @@ -56,7 +57,11 @@ users.groups.storage = { name = "storage"; gid = 491729; - members = [ "slskd" ]; + members = [ + "slskd" + "wrtagweb" + "bandcamp-collection-downloader" + ]; }; 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 = { defaultSopsFile = ./hosting-02.yaml; secrets = { @@ -101,6 +121,9 @@ slskdEnvFile = { owner = config.services.slskd.user; }; + bandcampcdCookieFile = { + owner = "bandcampcd"; + }; }; }; diff --git a/hosts/servers/hosting-02.yaml b/hosts/servers/hosting-02.yaml index a210d37..8fc7c8a 100644 --- a/hosts/servers/hosting-02.yaml +++ b/hosts/servers/hosting-02.yaml @@ -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] 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] +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: age: - recipient: age1hvrssz7k9akz66evj4kja53zvdtrss8k2ljxsh5myh2mru62sggqznlzrt @@ -13,8 +14,8 @@ sops: b1ZqUzZLUkFwNHJyVlhmK0FOZ1JFYUEKDU4NmBCHRY+ZK+RFK/LioGzjJTaOE1ky MC6jxt7Y5RkCk0BBqeoEVLaNXNViPjwakbvyfH0w0P6l0KDJ4mNlYQ== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-09-20T23:35:47Z" - mac: ENC[AES256_GCM,data:idOk0S4lGYWOPHayOgqX0oKk8cWmm9YUXbAIDlojOmroE8qL45nBMNpb6npuA7wGoHWsg8kYCidi8v8Gz+dGnEMURdcT7NoqcgtDWisYxyw5sMQ52Wc+pNQzct34FGnIVcuQl/kFWEc5s7+jsXCiF5o0YbJLeyr6tyl1D2rWKkw=,iv:6n69rCiyETkV3hnGvAhxd3o+DcDI/Se7JMIs4fsDdag=,tag:Lf7lXw0dhgRqb7lnbJ2H6g==,type:str] + lastmodified: "2025-09-22T13:13:34Z" + mac: ENC[AES256_GCM,data:Dyy+fNjzpaYcQt5eBC5ibObkpW0qnsT47owGdHNUl1DqRpy4HtnjmHjAIyjeBJn+sE26KrlOS8t7UFUXmw6dRXii8By025YUSytuWUqmBQFS2lB3a8qlPfsxLh64VK0OEfpQleBQXhQV6tKXaCUF1hb0KkN6tyeKtGOK+lfKlUU=,iv:455vimOrZ69X5O6kwkMyZ5vEJNwGOqrZWyKXaOk6PAg=,tag:OVIDGC8dRi9CYwiQAM+hGg==,type:str] pgp: - created_at: "2025-09-18T21:32:42Z" enc: |- diff --git a/modules/nixos/bandcamp-collection-downloader.nix b/modules/nixos/bandcamp-collection-downloader.nix new file mode 100644 index 0000000..b0654d0 --- /dev/null +++ b/modules/nixos/bandcamp-collection-downloader.nix @@ -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} + ''; + }; + }; + }; +} diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 9647026..157829c 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -1,5 +1,7 @@ { # my-module = import ./my-module.nix + bandcamp-collection-downloader = import ./bandcamp-collection-downloader.nix; namespaced-vpn = import ./namespaced-vpn.nix; storagebox = import ./storagebox.nix; + wrtagweb = import ./wrtagweb.nix; } diff --git a/modules/nixos/wrtagweb.nix b/modules/nixos/wrtagweb.nix new file mode 100644 index 0000000..f998b64 --- /dev/null +++ b/modules/nixos/wrtagweb.nix @@ -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}"; + }; + }; + }; +}