From 448e1c58ae316f9fedbd137149523689fbb1cc48 Mon Sep 17 00:00:00 2001 From: materus Date: Thu, 12 Sep 2024 11:56:18 +0200 Subject: [PATCH] waffentrager: add maloja and multi-scrobbler, file restructure. valkyrie: reverse proxy (correct commit) --- .../host/valkyrie/secrets/private/default.nix | Bin 12958 -> 13561 bytes configurations/host/waffentrager/default.nix | 3 + .../services/multimedia/scrobbling.nix | 236 +++++++++++++----- .../services/storage/elements.nix | 23 +- 4 files changed, 198 insertions(+), 64 deletions(-) diff --git a/configurations/host/valkyrie/secrets/private/default.nix b/configurations/host/valkyrie/secrets/private/default.nix index e647eea0fe6b945645707cba45910e7d09486b56..ec004d844b8e6e3802071325f5fefd854bc57b1a 100644 GIT binary patch literal 13561 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 U4-3T$*j&FjnJS#$bsfEW{K_%-S^xk5 diff --git a/configurations/host/waffentrager/default.nix b/configurations/host/waffentrager/default.nix index 634375c..133cd26 100644 --- a/configurations/host/waffentrager/default.nix +++ b/configurations/host/waffentrager/default.nix @@ -10,6 +10,9 @@ virtualisation.podman.autoPrune.enable = true; virtualisation.podman.autoPrune.dates = "daily"; + virtualisation.podman.defaultNetwork.settings = { + default_subnet = "10.88.0.0/16"; + }; virtualisation.oci-containers.backend = "podman"; } diff --git a/configurations/host/waffentrager/services/multimedia/scrobbling.nix b/configurations/host/waffentrager/services/multimedia/scrobbling.nix index b57a606..a6e3d0d 100644 --- a/configurations/host/waffentrager/services/multimedia/scrobbling.nix +++ b/configurations/host/waffentrager/services/multimedia/scrobbling.nix @@ -11,71 +11,27 @@ in - #### MALOJA + #### MALOJA -------------------------------------------------------------------- lib.mkIf cfg.enable { sops.templates."maloja.env".content = '' MALOJA_DATA_DIRECTORY=/data - MALOJA_DIRECTORY_CONFIG=/data/config MALOJA_DIRECTORY_STATE=/data/state MALOJA_DIRECTORY_CACHE=/data/cache - MALOJA_NAME="Melody" - MALOJA_LASTFM_USERNAME=${config.sops.placeholder.lastfm-user} - MALOJA_LASTFM_PASSWORD=${config.sops.placeholder.lastfm-pass} - MALOJA_LASTFM_API_KEY=${config.sops.placeholder.lastfm-api} - MALOJA_LASTFM_API_SECRET=${config.sops.placeholder.lastfm-secret} - MALOJA_LASTFM_API_SK=${config.sops.placeholder.lastfm-token} + MALOJA_SKIP_SETUP=yes MALOJA_FORCE_PASSWORD=${config.sops.placeholder.maloja} MALOJA_SPOTIFY_API_ID=${config.sops.placeholder.spotify-client-id} MALOJA_SPOTIFY_API_SECRET=${config.sops.placeholder.spotify-client-secret} + + MALOJA_NAME=Melody + + MALOJA_WEEK_OFFSET=1 + + PUID=${builtins.toString config.users.users.scrobbler.uid} + PGID=${builtins.toString config.users.groups.scrobbler.gid} + TC=Europe/Warsaw + TIMEZONE=Europe/Warsaw ''; - - virtualisation.oci-containers.containers.maloja = { - image = "krateng/maloja:latest"; - ports = [ - "42010:42010" - ]; - volumes = [ - "${config.waffentragerService.elements.malojaDir}:/data" - ]; - environmentFiles = [ - config.sops.templates."maloja.env".path - ]; - }; - systemd.services."${config.virtualisation.oci-containers.backend}-maloja" = { - requires = [ "elements-mount.service" ]; - after = [ "elements-mount.service" ]; - }; - - #### MULTI SCROBBLER - sops.templates."multi-scrobbler.env".content = '' - BASE_URL="https://melody.materus.pl/multi-scrobbler" - TC=Europe/Warsaw - - JELLYFIN_SERVER="https://noot.materus.pl/" - SPOTIFY_CLIENT_ID=${config.sops.placeholder.spotify-client-id} - SPOTIFY_CLIENT_SECRET=${config.sops.placeholder.spotify-client-secret} - MALOJA_URL="https://melody.materus.pl" - MALOJA_API_KEY="${config.sops.placeholder.maloja-api}" - LASTFM_API_KEY=${config.sops.placeholder.lastfm-api} - LASTFM_SECRET=${config.sops.placeholder.lastfm-secret} - ''; - virtualisation.oci-containers.containers.multi-scrobbler = { - image = "foxxmd/multi-scrobbler:latest"; - ports = [ - "42011:9078" - ]; - volumes = [ - "${config.waffentragerService.elements.malojaDir}/multi-scrobbler:/data" - ]; - environmentFiles = [ - config.sops.templates."multi-scrobbler.env".path - ]; - }; - - - - #### Proxy services.nginx.virtualHosts = { "melody.materus.pl" = { sslTrustedCertificate = "/var/lib/mnt_acme/materus.pl/chain.pem"; @@ -84,7 +40,6 @@ addSSL = true; http2 = false; http3 = true; - # Maloja locations."/" = { proxyPass = "http://127.0.0.1:42010"; extraConfig = '' @@ -94,13 +49,156 @@ proxy_set_header X-Forwarded-Ssl on; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - + ''; }; - locations."/multi-scrobbler" = { + }; + + }; + + + virtualisation.oci-containers.containers.maloja = + { + + image = "krateng/maloja:latest"; + ports = [ + "42010:42010" + ]; + volumes = [ + "${config.waffentragerService.elements.malojaDir}:/data" + ]; + environmentFiles = [ + config.sops.templates."maloja.env".path + ]; + }; + systemd.services."${config.virtualisation.oci-containers.backend}-maloja" = + + let + malojaCfg = pkgs.writeText "settings.ini" ''[MALOJA] +directory_config = /data +lastfm_api_key = False +audiodb_api_key = False +spotify_api_id = False +spotify_api_secret = False +delimiters_feat = ["ft.","ft","feat.","feat","featuring","Ft.","Ft","Feat.","Feat","Featuring"] +delimiters_informal = ["vs.","vs","&","with"] +delimiters_formal = ["; ",";"] +metadata_providers = ["spotify","deezer","lastfm","audiodb","musicbrainz"] + +''; + in + { + requires = [ "elements-mount.service" ]; + after = [ "elements-mount.service" ]; + preStart = ''cp --update=none ${malojaCfg} ${config.waffentragerService.elements.malojaDir}/settings.ini''; + + }; + + #### MULTI SCROBBLER -------------------------------------------------------------------- + users.groups.scrobbler = { gid = 3000; }; + users.users.scrobbler = { + group = "scrobbler"; + uid = 3000; + isSystemUser = true; + }; + sops.templates."multi-scrobbler.env".content = '' + TC=Europe/Warsaw + CONFIG_DIR=/config + PUID=${builtins.toString config.users.users.scrobbler.uid} + PGID=${builtins.toString config.users.groups.scrobbler.gid} + ''; + sops.templates."multi-scrobbler.json".owner = "scrobbler"; + sops.templates."multi-scrobbler.json".group = "scrobbler"; + sops.templates."multi-scrobbler.json".content = builtins.toJSON { + baseUrl = "https://scrobbler.materus.pl"; + disableWeb = false; + debugMode = false; + sources = [ + { + name = "materus-spotify"; + enable = true; + clients = [ "maloja" ]; + data = { + clientId = "${config.sops.placeholder.spotify-client-id}"; + clientSecret = "${config.sops.placeholder.spotify-client-secret}"; + redirectUri = "https://scrobbler.materus.pl/callback"; + interval = 30; + }; + type = "spotify"; + } + { + name = "materus-jellyfin"; + enable = true; + clients = [ "maloja" ]; + data = { + users = [ + "materus" + ]; + servers = [ + "waffentrager" + ]; + }; + options = { + logPayload = false; + logFilterFailure = "warn"; + }; + type = "jellyfin"; + } + ]; + clients = [ + { + name = "maloja"; + enable = true; + data = { + url = "https://melody.materus.pl/"; + apiKey = "${config.sops.placeholder.maloja-api}"; + }; + type = "maloja"; + } + { + name = "materus-brainz"; + enable = true; + configureAs = "client"; + data = { + token = "${config.sops.placeholder.listenbrainz-api}"; + username = "materus"; + }; + type = "listenbrainz"; + } + { + name = "materus-lastfm"; + enable = true; + configureAs = "client"; + data = { + apiKey = "${config.sops.placeholder.lastfm-api}"; + secret = "${config.sops.placeholder.lastfm-secret}"; + redirectUri = "https://scrobbler.materus.pl/lastfm/callback"; + }; + type = "lastfm"; + } + + ]; + + }; + + + + + services.nginx.virtualHosts = { + "scrobbler.materus.pl" = { + sslTrustedCertificate = "/var/lib/mnt_acme/materus.pl/chain.pem"; + sslCertificateKey = "/var/lib/mnt_acme/materus.pl/key.pem"; + sslCertificate = "/var/lib/mnt_acme/materus.pl/fullchain.pem"; + addSSL = true; + http2 = false; + http3 = true; + locations."/" = { proxyPass = "http://127.0.0.1:42011"; extraConfig = '' + allow ${materusArg.ip-masks.wireguard.private}; + allow 192.168.100.0/24; + deny all; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; @@ -114,6 +212,28 @@ }; }; + systemd.services."${config.virtualisation.oci-containers.backend}-multi-scrobbler" = + { + preStart = ''cp -f ${config.sops.templates."multi-scrobbler.json".path} ${config.waffentragerService.elements.malojaDir}/multi-scrobbler/config.json''; + requires = [ "elements-mount.service" ]; + after = [ "elements-mount.service" ]; + }; + virtualisation.oci-containers.containers.multi-scrobbler = { + image = "foxxmd/multi-scrobbler:latest"; + ports = [ + "127.0.0.1:42011:9078" + ]; + volumes = [ + "${config.waffentragerService.elements.malojaDir}/multi-scrobbler:/config" + ]; + environmentFiles = [ + config.sops.templates."multi-scrobbler.env".path + ]; + }; + + + + }; diff --git a/configurations/host/waffentrager/services/storage/elements.nix b/configurations/host/waffentrager/services/storage/elements.nix index 1f6ec3e..15e3209 100644 --- a/configurations/host/waffentrager/services/storage/elements.nix +++ b/configurations/host/waffentrager/services/storage/elements.nix @@ -25,7 +25,22 @@ mkdir -p ${cfg.path} cryptsetup luksOpen /dev/disk/by-uuid/${cfg.uuid} elements -d ${config.sops.secrets.elements.path} mount /dev/mapper/elements ${cfg.path} - '' + lib.optionalString config.waffentragerService.postgresql.enable '' + '' + + ; + preStop = '' + umount ${cfg.path} + cryptsetup luksClose elements + ''; + }; + + systemd.services.elements-dirmake = { + description = "Create dirs in elements drive"; + path = [ pkgs.cryptsetup pkgs.coreutils pkgs.util-linux ]; + + serviceConfig.Type = "oneshot"; + serviceConfig.RemainAfterExit = false; + script = lib.optionalString config.waffentragerService.postgresql.enable '' mkdir -p ${cfg.postgresqlDir}/${config.waffentragerService.postgresql.version} chown -R postgres:postgres ${cfg.postgresqlDir} '' + lib.optionalString config.waffentragerService.nextcloud.enable '' @@ -39,15 +54,11 @@ chown -R materus:nextcloud ${cfg.jellyfinDir} '' + lib.optionalString config.waffentragerService.scrobbling.enable '' mkdir -p ${cfg.malojaDir}/multi-scrobbler - chown -R ${cfg.malojaDir} + chown -R scrobbler:scrobbler ${cfg.malojaDir} '' ; - preStop = '' - umount ${cfg.path} - cryptsetup luksClose elements - ''; }; };