From 031db7fbba50ea8d320bca0868c19819faaab8f8 Mon Sep 17 00:00:00 2001 From: Myned <dev@bjork.tech> Date: Mon, 17 Mar 2025 22:38:22 -0500 Subject: [PATCH] containers: add freshrss --- flake.in.nix | 8 ++++ flake.nix | 32 ++++++++++++++ options/custom/containers/freshrss.nix | 56 +++++++++++++++++++++++++ profiles/server/default.nix | 1 + secrets/server/caddy/Caddyfile | Bin 4410 -> 4489 bytes 5 files changed, 97 insertions(+) create mode 100644 options/custom/containers/freshrss.nix diff --git a/flake.in.nix b/flake.in.nix index d68d737..5b786ed 100644 --- a/flake.in.nix +++ b/flake.in.nix @@ -77,6 +77,14 @@ ### Source code cisco-packettracer8 = source "file:///home/myned/SYNC/linux/config/cisco/CiscoPacketTracer822_amd64_signed.deb"; + freshrss-autorefresh = source "github:Eisa01/FreshRSS---Auto-Refresh-Extension"; + freshrss-cntools = source "github:cn-tools/cntools_FreshRssExtensions"; + freshrss-comicsinfeed = source "github:giventofly/freshrss-comicsinfeed"; + freshrss-dateformat = source "github:aledeg/xExtension-DateFormat"; + freshrss-extensions = source "github:FreshRSS/Extensions"; + freshrss-kagisummarizer = source "git+https://code.sitosis.com/rudism/freshrss-kagi-summarizer"; + freshrss-kapdap = source "github:kapdap/freshrss-extensions"; + freshrss-markpreviousasread = source "github:kalvn/freshrss-mark-previous-as-read"; lifx-cli = source "github:Rawa/lifx-cli"; steamtinkerlaunch = source "github:sonic2kk/steamtinkerlaunch"; thunderbird-gnome-theme = source "github:rafaelmardojai/thunderbird-gnome-theme"; diff --git a/flake.nix b/flake.nix index ee5c4f0..dc3cd5b 100644 --- a/flake.nix +++ b/flake.nix @@ -47,6 +47,38 @@ url = "github:nix-community/disko"; }; flakegen.url = "github:jorsn/flakegen"; + freshrss-autorefresh = { + flake = false; + url = "github:Eisa01/FreshRSS---Auto-Refresh-Extension"; + }; + freshrss-cntools = { + flake = false; + url = "github:cn-tools/cntools_FreshRssExtensions"; + }; + freshrss-comicsinfeed = { + flake = false; + url = "github:giventofly/freshrss-comicsinfeed"; + }; + freshrss-dateformat = { + flake = false; + url = "github:aledeg/xExtension-DateFormat"; + }; + freshrss-extensions = { + flake = false; + url = "github:FreshRSS/Extensions"; + }; + freshrss-kagisummarizer = { + flake = false; + url = "git+https://code.sitosis.com/rudism/freshrss-kagi-summarizer"; + }; + freshrss-kapdap = { + flake = false; + url = "github:kapdap/freshrss-extensions"; + }; + freshrss-markpreviousasread = { + flake = false; + url = "github:kalvn/freshrss-mark-previous-as-read"; + }; fw-fanctrl = { inputs.nixpkgs.follows = "nixpkgs-unstable"; url = "github:TamtamHero/fw-fanctrl/packaging/nix"; diff --git a/options/custom/containers/freshrss.nix b/options/custom/containers/freshrss.nix new file mode 100644 index 0000000..488861a --- /dev/null +++ b/options/custom/containers/freshrss.nix @@ -0,0 +1,56 @@ +{ + config, + inputs, + lib, + ... +}: +with lib; let + cfg = config.custom.containers.freshrss; +in { + options.custom.containers.freshrss = { + enable = mkOption {default = false;}; + }; + + config = mkIf cfg.enable { + #?? arion-freshrss pull + environment.shellAliases.arion-freshrss = "sudo arion --prebuilt-file ${config.virtualisation.arion.projects.freshrss.settings.out.dockerComposeYaml}"; + + virtualisation.arion.projects.freshrss.settings.services = { + # https://github.com/FreshRSS/FreshRSS + # https://github.com/FreshRSS/FreshRSS/tree/edge/Docker + freshrss.service = { + container_name = "freshrss"; + image = "freshrss/freshrss:1"; + ports = ["127.0.0.1:8088:80"]; + restart = "unless-stopped"; + + environment = { + TRUSTED_PROXY = "172.16.0.0/12"; + }; + + volumes = let + #?? (extension "NAME" SOURCE) + extension = name: source: "${source}:/var/www/FreshRSS/extensions/${name}"; + in [ + "${config.custom.containers.directory}/freshrss/data:/var/www/FreshRSS/data" + + # Extensions + # https://github.com/FreshRSS/Extensions + #!! Causes docker permission changes to fail on container start due to immutable source + (extension "autorefresh" "${inputs.freshrss-autorefresh}/xExtension-AutoRefresh") # https://github.com/Eisa01/FreshRSS---Auto-Refresh-Extension + (extension "clickablelinks" "${inputs.freshrss-kapdap}/xExtension-ClickableLinks") # https://github.com/kapdap/freshrss-extensions/tree/master/xExtension-ClickableLinks + (extension "colorfullist" "${inputs.freshrss-extensions}/xExtension-ColorfulList") # https://github.com/FreshRSS/Extensions/tree/master/xExtension-ColorfulList + (extension "comicsinfeed" inputs.freshrss-comicsinfeed) # https://github.com/giventofly/freshrss-comicsinfeed + (extension "dateformat" inputs.freshrss-dateformat) # https://github.com/aledeg/xExtension-DateFormat + (extension "filtertitle" "${inputs.freshrss-cntools}/xExtension-FilterTitle") # https://github.com/cn-tools/cntools_FreshRssExtensions/tree/master/xExtension-FilterTitle + (extension "kagisummarizer" inputs.freshrss-kagisummarizer) # https://code.sitosis.com/rudism/freshrss-kagi-summarizer + (extension "markpreviousasread" inputs.freshrss-markpreviousasread) # https://github.com/kalvn/freshrss-mark-previous-as-read + (extension "quickcollapse" "${inputs.freshrss-extensions}/xExtension-QuickCollapse") # https://github.com/FreshRSS/Extensions/tree/master/xExtension-QuickCollapse + (extension "readingtime" "${inputs.freshrss-extensions}/xExtension-ReadingTime") # https://github.com/FreshRSS/Extensions/tree/master/xExtension-ReadingTime + (extension "removeemojis" "${inputs.freshrss-cntools}/xExtension-RemoveEmojis") # https://github.com/cn-tools/cntools_FreshRssExtensions/tree/master/xExtension-RemoveEmojis + (extension "youtube" "${inputs.freshrss-extensions}/xExtension-YouTube") # https://github.com/FreshRSS/Extensions/tree/master/xExtension-YouTube + ]; + }; + }; + }; +} diff --git a/profiles/server/default.nix b/profiles/server/default.nix index b582afa..980cd64 100644 --- a/profiles/server/default.nix +++ b/profiles/server/default.nix @@ -16,6 +16,7 @@ coturn.enable = true; forgejo.enable = true; foundryvtt.enable = true; + freshrss.enable = true; #// headscale.enable = true; mastodon.enable = true; netbox.enable = true; diff --git a/secrets/server/caddy/Caddyfile b/secrets/server/caddy/Caddyfile index 47e7128b155fa4d254f213d98985fc35636a0484..84c219d3254d1d0d7d8585502cd4de2ee2b8c3e9 100644 GIT binary patch delta 4467 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 F-}zOaZ?gaZ delta 4387 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