From 4f1e579fa85d5acc1f93eeab62d8b6665a8811c5 Mon Sep 17 00:00:00 2001 From: sinavir Date: Wed, 6 Mar 2024 22:53:24 +0100 Subject: [PATCH] feat(castopod): big update --- machines/storage01/garage.nix | 5 +- machines/web01/castopod.nix | 3 +- patches/castopod.patch | 335 ++++++++++++++++++++++++++++------ 3 files changed, 285 insertions(+), 58 deletions(-) diff --git a/machines/storage01/garage.nix b/machines/storage01/garage.nix index 2687157..9433ded 100644 --- a/machines/storage01/garage.nix +++ b/machines/storage01/garage.nix @@ -7,7 +7,10 @@ let data_dir = "/data/slow/garage/data"; metadata_dir = "/data/fast/garage/meta"; - buckets = [ "peertube-videos-dgnum" ]; + buckets = [ + "castopod-dgnum" + "peertube-videos-dgnum" + ]; in { services.garage = { diff --git a/machines/web01/castopod.nix b/machines/web01/castopod.nix index d958f4a..20d57c1 100644 --- a/machines/web01/castopod.nix +++ b/machines/web01/castopod.nix @@ -3,8 +3,6 @@ let host = "podcasts.dgnum.eu"; in { - imports = [ ./castopod-head-proxy.nix ]; - services = { castopod = { enable = true; @@ -18,6 +16,7 @@ in "email.SMTPPort" = "587"; "media.fileManager" = "s3"; + "media.baseURL" = "https://castopod-dgnum.cdn.dgnum.eu/"; "media.s3.endpoint" = "https://s3.dgnum.eu/"; "media.s3.region" = "garage"; "media.s3.bucket" = "castopod-dgnum"; diff --git a/patches/castopod.patch b/patches/castopod.patch index 8858309..2acd493 100644 --- a/patches/castopod.patch +++ b/patches/castopod.patch @@ -1,8 +1,60 @@ +From 3b656cbdf40c6056983e95ac5c87839a68571096 Mon Sep 17 00:00:00 2001 +From: Alexander Tomokhov +Date: Tue, 3 Oct 2023 22:20:59 +0400 +Subject: [PATCH 1/8] castopod: 1.6.4 -> 1.6.5 + +--- + pkgs/applications/audio/castopod/default.nix | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/pkgs/applications/audio/castopod/default.nix b/pkgs/applications/audio/castopod/default.nix +index 9d9f83e2ecce40..83c70f9b36646d 100644 +--- a/pkgs/applications/audio/castopod/default.nix ++++ b/pkgs/applications/audio/castopod/default.nix +@@ -7,11 +7,11 @@ + }: + stdenv.mkDerivation { + pname = "castopod"; +- version = "1.6.4"; ++ version = "1.6.5"; + + src = fetchurl { +- url = "https://code.castopod.org/adaures/castopod/uploads/ce56d4f149242f12bedd20f9a2b0916d/castopod-1.6.4.tar.gz"; +- sha256 = "080jj91yxbn3xsbs0sywzwa2f5in9bp9qi2zwqcfqpaxlq9ga62v"; ++ url = "https://code.castopod.org/adaures/castopod/uploads/5aaaa6cf2edaed25bd7253449e5f8584/castopod-1.6.5.tar.gz"; ++ sha256 = "04gcq2vmfy5aa2fmsm1qqv1k8g024nikmysdrhy33wj460d529b5"; + }; + + dontBuild = true; + +From 4cd096c27c52ff9948bc7d9ebc05490147ca9675 Mon Sep 17 00:00:00 2001 +From: Alexander Tomokhov +Date: Tue, 3 Oct 2023 22:19:36 +0400 +Subject: [PATCH 2/8] nixos/castopod: fix startup, displaying images, uploads + up to 500 MiB + +- new maxUploadSize option +- new dataDir option (with ReadWritePaths systemd support) +- admin page reports correct free disk space (instead of /nix/store) +- fix example configuration in documentation +- now podcast creation and file upload are tested during NixOS test +- move castopod from audio to web-apps folder +- verbose logging from the browser test +--- + nixos/modules/module-list.nix | 2 +- + .../services/{audio => web-apps}/castopod.md | 11 +- + .../services/{audio => web-apps}/castopod.nix | 60 ++-- + nixos/tests/castopod.nix | 263 +++++++++++++----- + pkgs/applications/audio/castopod/default.nix | 13 +- + 5 files changed, 256 insertions(+), 93 deletions(-) + rename nixos/modules/services/{audio => web-apps}/castopod.md (72%) + rename nixos/modules/services/{audio => web-apps}/castopod.nix (80%) + diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix -index fee7c35ed8f4..f464b2e1dd0f 100644 +index 627427262da632..97043c965400c5 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix -@@ -329,7 +329,6 @@ +@@ -337,7 +337,6 @@ ./services/amqp/rabbitmq.nix ./services/audio/alsa.nix ./services/audio/botamusique.nix @@ -10,7 +62,7 @@ index fee7c35ed8f4..f464b2e1dd0f 100644 ./services/audio/gmediarender.nix ./services/audio/gonic.nix ./services/audio/goxlr-utility.nix -@@ -1249,6 +1248,7 @@ +@@ -1282,6 +1281,7 @@ ./services/web-apps/bookstack.nix ./services/web-apps/c2fmzq-server.nix ./services/web-apps/calibre-web.nix @@ -22,7 +74,7 @@ diff --git a/nixos/modules/services/audio/castopod.md b/nixos/modules/services/w similarity index 72% rename from nixos/modules/services/audio/castopod.md rename to nixos/modules/services/web-apps/castopod.md -index ee8590737a7c..f61bf1166a4d 100644 +index ee8590737a7c73..f61bf1166a4d24 100644 --- a/nixos/modules/services/audio/castopod.md +++ b/nixos/modules/services/web-apps/castopod.md @@ -4,6 +4,7 @@ Castopod is an open-source hosting platform made for podcasters who want to enga @@ -51,10 +103,10 @@ index ee8590737a7c..f61bf1166a4d 100644 ``` diff --git a/nixos/modules/services/audio/castopod.nix b/nixos/modules/services/web-apps/castopod.nix -similarity index 76% +similarity index 80% rename from nixos/modules/services/audio/castopod.nix rename to nixos/modules/services/web-apps/castopod.nix -index b782b5489147..53a4430d265d 100644 +index b782b548914795..7c99551c83183f 100644 --- a/nixos/modules/services/audio/castopod.nix +++ b/nixos/modules/services/web-apps/castopod.nix @@ -4,7 +4,6 @@ let @@ -81,23 +133,7 @@ index b782b5489147..53a4430d265d 100644 database = { createLocally = lib.mkOption { type = lib.types.bool; -@@ -59,6 +67,7 @@ in - description = lib.mdDoc '' - A file containing the password corresponding to - [](#opt-services.castopod.database.user). -+ This file is loaded using systemd LoadCredentials. - ''; - }; - }; -@@ -83,6 +92,7 @@ in - example = "/run/keys/castopod-env"; - description = lib.mdDoc '' - Environment file to inject e.g. secrets into the configuration. -+ This file is loaded using systemd LoadCredentials. - See [](https://code.castopod.org/adaures/castopod/-/blob/main/.env.example) - for available environment variables. - ''; -@@ -111,6 +121,18 @@ in +@@ -111,6 +119,18 @@ in Options for Castopod's PHP pool. See the documentation on `php-fpm.conf` for details on configuration directives. ''; }; @@ -116,7 +152,7 @@ index b782b5489147..53a4430d265d 100644 }; }; -@@ -120,13 +142,13 @@ in +@@ -120,13 +140,13 @@ in sslEnabled = with config.services.nginx.virtualHosts.${cfg.localDomain}; addSSL || forceSSL || onlySSL || enableACME || useACMEHost != null; baseURL = "http${lib.optionalString sslEnabled "s"}://${cfg.localDomain}"; in @@ -133,7 +169,7 @@ index b782b5489147..53a4430d265d 100644 "admin.gateway" = "admin"; "auth.gateway" = "auth"; -@@ -142,13 +164,13 @@ in +@@ -142,13 +162,13 @@ in services.phpfpm.pools.castopod = { inherit user; group = config.services.nginx.group; @@ -151,7 +187,7 @@ index b782b5489147..53a4430d265d 100644 max_execution_time = 300 max_input_time = 300 ''; -@@ -165,45 +187,50 @@ in +@@ -165,25 +185,25 @@ in path = [ pkgs.openssl phpPackage ]; script = let @@ -181,15 +217,13 @@ index b782b5489147..53a4430d265d 100644 + echo "analytics.salt=$(cat ${cfg.dataDir}/salt)" >> ${envFile} ${if (cfg.database.passwordFile != null) then '' -- echo "database.default.password=$(cat ${lib.escapeShellArg cfg.database.passwordFile})" >> ${envFile} -+ echo "database.default.password=$(cat "$CREDENTIALS_DIRECTORY/dbpasswordfile)" >> ${envFile} - '' else '' - echo "database.default.password=" >> ${envFile} + echo "database.default.password=$(cat ${lib.escapeShellArg cfg.database.passwordFile})" >> ${envFile} +@@ -192,10 +212,10 @@ in ''} ${lib.optionalString (cfg.environmentFile != null) '' - cat ${lib.escapeShellArg cfg.environmentFile}) >> ${envFile} -+ cat "$CREDENTIALS_DIRECTORY/envfile" >> ${envFile} ++ cat ${lib.escapeShellArg cfg.environmentFile} >> ${envFile} ''} - php spark castopod:database-update @@ -197,12 +231,7 @@ index b782b5489147..53a4430d265d 100644 ''; serviceConfig = { StateDirectory = "castopod"; -+ LoadCredential = lib.optional (cfg.environmentFile != null) -+ "envfile:${cfg.environmentFile}" -+ ++ (lib.optional (cfg.database.passwordFile != null) -+ "dbpasswordfile:${cfg.database.passwordFile}"); - WorkingDirectory = "${cfg.package}/share/castopod"; - Type = "oneshot"; +@@ -204,6 +224,7 @@ in RemainAfterExit = true; User = user; Group = config.services.nginx.group; @@ -210,7 +239,7 @@ index b782b5489147..53a4430d265d 100644 }; }; -@@ -212,9 +239,7 @@ in +@@ -212,9 +233,7 @@ in wantedBy = [ "multi-user.target" ]; path = [ phpPackage ]; script = '' @@ -221,7 +250,7 @@ index b782b5489147..53a4430d265d 100644 ''; serviceConfig = { StateDirectory = "castopod"; -@@ -222,6 +247,8 @@ in +@@ -222,6 +241,8 @@ in Type = "oneshot"; User = user; Group = config.services.nginx.group; @@ -230,7 +259,7 @@ index b782b5489147..53a4430d265d 100644 }; }; -@@ -251,6 +278,7 @@ in +@@ -251,6 +272,7 @@ in extraConfig = '' try_files $uri $uri/ /index.php?$args; index index.php index.html; @@ -238,7 +267,7 @@ index b782b5489147..53a4430d265d 100644 ''; locations."^~ /${cfg.settings."media.root"}/" = { -@@ -278,7 +306,7 @@ in +@@ -278,7 +300,7 @@ in }; }; @@ -248,7 +277,7 @@ index b782b5489147..53a4430d265d 100644 isSystemUser = true; group = config.services.nginx.group; diff --git a/nixos/tests/castopod.nix b/nixos/tests/castopod.nix -index 4435ec617d4e..2db7aa0bda65 100644 +index 4435ec617d4e67..2db7aa0bda6507 100644 --- a/nixos/tests/castopod.nix +++ b/nixos/tests/castopod.nix @@ -4,74 +4,211 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: @@ -537,10 +566,10 @@ index 4435ec617d4e..2db7aa0bda65 100644 ''; }) diff --git a/pkgs/applications/audio/castopod/default.nix b/pkgs/applications/audio/castopod/default.nix -index 9d9f83e2ecce..47c824ddda3c 100644 +index 83c70f9b36646d..badace09587d2b 100644 --- a/pkgs/applications/audio/castopod/default.nix +++ b/pkgs/applications/audio/castopod/default.nix -@@ -3,15 +3,15 @@ +@@ -3,7 +3,7 @@ , ffmpeg-headless , lib , nixosTests @@ -549,17 +578,6 @@ index 9d9f83e2ecce..47c824ddda3c 100644 }: stdenv.mkDerivation { pname = "castopod"; -- version = "1.6.4"; -+ version = "1.7.1"; - - src = fetchurl { -- url = "https://code.castopod.org/adaures/castopod/uploads/ce56d4f149242f12bedd20f9a2b0916d/castopod-1.6.4.tar.gz"; -- sha256 = "080jj91yxbn3xsbs0sywzwa2f5in9bp9qi2zwqcfqpaxlq9ga62v"; -+ url = "https://code.castopod.org/adaures/castopod/uploads/2c93d47db7067fd0f9740430dc74cf7a/castopod-1.7.1.tar.gz"; -+ sha256 = "0gvlnnc164lp51crd8b254n8681gf508mh6i0mmwzhbskhn1k9y2"; - }; - - dontBuild = true; @@ -20,13 +20,16 @@ stdenv.mkDerivation { postPatch = '' # not configurable at runtime unfortunately: @@ -581,3 +599,210 @@ index 9d9f83e2ecce..47c824ddda3c 100644 # ffmpeg is required for Video Clips feature substituteInPlace modules/MediaClipper/VideoClipper.php \ + +From 45d43fe39fa3167d5cf7ba9a2cb9fcd6fbe2c5c3 Mon Sep 17 00:00:00 2001 +From: Alexander Tomokhov +Date: Mon, 11 Dec 2023 09:00:26 +0400 +Subject: [PATCH 3/8] nixos/castopod: little documentation fix + +--- + nixos/modules/services/web-apps/castopod.nix | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/nixos/modules/services/web-apps/castopod.nix b/nixos/modules/services/web-apps/castopod.nix +index 7c99551c83183f..11cf4b36aeb385 100644 +--- a/nixos/modules/services/web-apps/castopod.nix ++++ b/nixos/modules/services/web-apps/castopod.nix +@@ -126,9 +126,10 @@ in + Maximum supported size for a file upload in MiB. Maximum HTTP body + size is set to this value for nginx and PHP (because castopod doesn't + support chunked uploads yet: +- https://code.castopod.org/adaures/castopod/-/issues/330). Note, that +- practical upload size limit is smaller. For example, with 512 MiB +- setting - around 500 MiB is possible. ++ https://code.castopod.org/adaures/castopod/-/issues/330). ++ ++ Note, that practical upload size limit is smaller. For example, with ++ 512 MiB setting - around 500 MiB is possible. + ''; + }; + }; + +From 4aafd48b7e76748eaf0ff7409b12b455d1db31ec Mon Sep 17 00:00:00 2001 +From: sinavir +Date: Fri, 23 Feb 2024 22:02:10 +0100 +Subject: [PATCH 4/8] castopod: 1.6.5 -> 1.10.3 + +--- + pkgs/applications/audio/castopod/default.nix | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pkgs/applications/audio/castopod/default.nix b/pkgs/applications/audio/castopod/default.nix +index badace09587d2b..438f1d728f9624 100644 +--- a/pkgs/applications/audio/castopod/default.nix ++++ b/pkgs/applications/audio/castopod/default.nix +@@ -10,8 +10,8 @@ stdenv.mkDerivation { + version = "1.6.5"; + + src = fetchurl { +- url = "https://code.castopod.org/adaures/castopod/uploads/5aaaa6cf2edaed25bd7253449e5f8584/castopod-1.6.5.tar.gz"; +- sha256 = "04gcq2vmfy5aa2fmsm1qqv1k8g024nikmysdrhy33wj460d529b5"; ++ url = "https://code.castopod.org/adaures/castopod/uploads/2bb52d4607a772ac8b397efa3559a3ae/castopod-1.10.3.tar.gz"; ++ sha256 = "0w1yl14v3aajm089vwpq9wkiibv3w312y004ggdbf7xwzsrmjs51"; + }; + + dontBuild = true; + +From 6205595efbdcc2f3440022b4ff7258e2f50a6427 Mon Sep 17 00:00:00 2001 +From: sinavir +Date: Fri, 23 Feb 2024 22:27:24 +0100 +Subject: [PATCH 6/8] nixos/castopod: use LoadCredentials + +--- + nixos/modules/services/web-apps/castopod.nix | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/nixos/modules/services/web-apps/castopod.nix b/nixos/modules/services/web-apps/castopod.nix +index 11cf4b36aeb385..042fb3954d2b73 100644 +--- a/nixos/modules/services/web-apps/castopod.nix ++++ b/nixos/modules/services/web-apps/castopod.nix +@@ -67,6 +67,8 @@ in + description = lib.mdDoc '' + A file containing the password corresponding to + [](#opt-services.castopod.database.user). ++ ++ This file is loaded using systemd LoadCredentials. + ''; + }; + }; +@@ -93,6 +95,8 @@ in + Environment file to inject e.g. secrets into the configuration. + See [](https://code.castopod.org/adaures/castopod/-/blob/main/.env.example) + for available environment variables. ++ ++ This file is loaded using systemd LoadCredentials. + ''; + }; + configureNginx = lib.mkOption { +@@ -207,19 +211,23 @@ in + echo "analytics.salt=$(cat ${cfg.dataDir}/salt)" >> ${envFile} + + ${if (cfg.database.passwordFile != null) then '' +- echo "database.default.password=$(cat ${lib.escapeShellArg cfg.database.passwordFile})" >> ${envFile} ++ echo "database.default.password=$(cat "$CREDENTIALS_DIRECTORY/dbpasswordfile)" >> ${envFile} + '' else '' + echo "database.default.password=" >> ${envFile} + ''} + + ${lib.optionalString (cfg.environmentFile != null) '' +- cat ${lib.escapeShellArg cfg.environmentFile} >> ${envFile} ++ cat "$CREDENTIALS_DIRECTORY/envfile" >> ${envFile} + ''} + + php ${cfg.package}/share/castopod/spark castopod:database-update + ''; + serviceConfig = { + StateDirectory = "castopod"; ++ LoadCredential = lib.optional (cfg.environmentFile != null) ++ "envfile:${cfg.environmentFile}" ++ ++ (lib.optional (cfg.database.passwordFile != null) ++ "dbpasswordfile:${cfg.database.passwordFile}"); + WorkingDirectory = "${cfg.package}/share/castopod"; + Type = "oneshot"; + RemainAfterExit = true; + +From 9b03fc35a30671e5d4146bbcbe6b5536fa9baacc Mon Sep 17 00:00:00 2001 +From: sinavir +Date: Sat, 2 Mar 2024 18:01:54 +0100 +Subject: [PATCH 7/8] nixos/castopod: build mp3 in the test + +--- + nixos/tests/castopod.nix | 31 +++++++++++++++++++++---------- + 1 file changed, 21 insertions(+), 10 deletions(-) + +diff --git a/nixos/tests/castopod.nix b/nixos/tests/castopod.nix +index 2db7aa0bda6507..2bdc6941c23815 100644 +--- a/nixos/tests/castopod.nix ++++ b/nixos/tests/castopod.nix +@@ -37,14 +37,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: + targetPodcastDuration = toString + ((targetPodcastSize + lameMp3FileAdjust) / (lameMp3Bitrate / 8)); + mp3file = with pkgs; +- runCommand "gen-castopod.mp3" { nativeBuildInputs = [ sox lame ]; } '' +- sox -n -r 48000 -t wav - synth ${targetPodcastDuration} sine 440 ` +- `| lame --noreplaygain -cbr -q 9 -b 320 - $out +- FILESIZE="$(stat -c%s $out)" +- [ "$FILESIZE" -gt 0 ] +- [ "$FILESIZE" -le "${toString targetPodcastSize}" ] +- ''; +- ++ runCommand ; + bannerWidth = 3000; + banner = pkgs.runCommand "gen-castopod-cover.jpg" { } '' + ${pkgs.imagemagick}/bin/magick ` +@@ -185,7 +178,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: + # upload podcast ################################################### + + driver.find_element(By.CSS_SELECTOR, '#audio_file').send_keys( +- '${mp3file}' ++ '/tmp/podcast.mp3' + ) + driver.find_element(By.CSS_SELECTOR, '#cover').send_keys( + '${cover}' +@@ -206,7 +199,23 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: + driver.quit() + ''; + in +- [ pkgs.firefox-unwrapped pkgs.geckodriver browser-test ]; ++ [ ++ pkgs.firefox-unwrapped ++ pkgs.geckodriver ++ browser-test ++ (pkgs.writeShellApplication { ++ name = "build-mp3"; ++ runtimeInputs = with pkgs; [ sox lame ]; ++ text = '' ++ out=/tmp/podcast.mp3 ++ sox -n -r 48000 -t wav - synth ${targetPodcastDuration} sine 440 ` ++ `| lame --noreplaygain -cbr -q 9 -b 320 - $out ++ FILESIZE="$(stat -c%s $out)" ++ [ "$FILESIZE" -gt 0 ] ++ [ "$FILESIZE" -le "${toString targetPodcastSize}" ] ++ ''; ++ }) ++ ]; + }; + + testScript = '' +@@ -217,6 +226,8 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: + castopod.wait_for_open_port(80) + castopod.wait_until_succeeds("curl -sS -f http://castopod.example.com") + ++ client.succeed("build-mp3") ++ + with subtest("Create superadmin, log in, create and upload a podcast"): + client.succeed(\ + "PYTHONUNBUFFERED=1 systemd-cat -t browser-test browser-test") + +From 538281e8be427f820371f4005e991e0281872e12 Mon Sep 17 00:00:00 2001 +From: sinavir +Date: Sat, 2 Mar 2024 18:04:35 +0100 +Subject: [PATCH 8/8] nixos/castopod: Increase test timeouts + +--- + nixos/tests/castopod.nix | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/nixos/tests/castopod.nix b/nixos/tests/castopod.nix +index 2bdc6941c23815..2c5c745f7da0df 100644 +--- a/nixos/tests/castopod.nix ++++ b/nixos/tests/castopod.nix +@@ -105,7 +105,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: + + driver.get('http://${domain}/cp-install') + +- wait = WebDriverWait(driver, 10) ++ wait = WebDriverWait(driver, 20) + + wait.until(EC.title_contains("installer")) +