nixos/flaresolverr: initial commit

Changed files
+84
nixos
doc
manual
release-notes
modules
tests
+2
nixos/doc/manual/release-notes/rl-2411.section.md
···
## New Services {#sec-release-24.11-new-services}
+
- [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr), proxy server to bypass Cloudflare protection. Available as [services.flaresolverr](#opt-services.flaresolverr.enable) service.
+
- [Open-WebUI](https://github.com/open-webui/open-webui), a user-friendly WebUI
for LLMs. Available as [services.open-webui](#opt-services.open-webui.enable)
service.
+1
nixos/modules/module-list.nix
···
./services/misc/etesync-dav.nix
./services/misc/evdevremapkeys.nix
./services/misc/felix.nix
+
./services/misc/flaresolverr.nix
./services/misc/forgejo.nix
./services/misc/freeswitch.nix
./services/misc/fstrim.nix
+58
nixos/modules/services/misc/flaresolverr.nix
···
+
{
+
config,
+
pkgs,
+
lib,
+
...
+
}:
+
+
let
+
cfg = config.services.flaresolverr;
+
in
+
{
+
options = {
+
services.flaresolverr = {
+
enable = lib.mkEnableOption "FlareSolverr, a proxy server to bypass Cloudflare protection";
+
+
package = lib.mkPackageOption pkgs "flaresolverr" { };
+
+
openFirewall = lib.mkOption {
+
type = lib.types.bool;
+
default = false;
+
description = "Open the port in the firewall for FlareSolverr.";
+
};
+
+
port = lib.mkOption {
+
type = lib.types.port;
+
default = 8191;
+
description = "The port on which FlareSolverr will listen for incoming HTTP traffic.";
+
};
+
};
+
};
+
+
config = lib.mkIf cfg.enable {
+
systemd.services.flaresolverr = {
+
description = "FlareSolverr";
+
after = [ "network.target" ];
+
wantedBy = [ "multi-user.target" ];
+
+
environment = {
+
HOME = "/run/flaresolverr";
+
PORT = toString cfg.port;
+
};
+
+
serviceConfig = {
+
SyslogIdentifier = "flaresolverr";
+
Restart = "always";
+
RestartSec = 5;
+
Type = "simple";
+
DynamicUser = true;
+
RuntimeDirectory = "flaresolverr";
+
WorkingDirectory = "/run/flaresolverr";
+
ExecStart = lib.getExe cfg.package;
+
TimeoutStopSec = 30;
+
};
+
};
+
+
networking.firewall = lib.mkIf cfg.openFirewall { allowedTCPPorts = [ cfg.port ]; };
+
};
+
}
+1
nixos/tests/all-tests.nix
···
firewall-nftables = handleTest ./firewall.nix { nftables = true; };
fish = handleTest ./fish.nix {};
flannel = handleTestOn ["x86_64-linux"] ./flannel.nix {};
+
flaresolverr = handleTest ./flaresolverr.nix {};
flood = handleTest ./flood.nix {};
floorp = handleTest ./firefox.nix { firefoxPackage = pkgs.floorp; };
fluentd = handleTest ./fluentd.nix {};
+22
nixos/tests/flaresolverr.nix
···
+
import ./make-test-python.nix (
+
{ lib, ... }:
+
{
+
name = "flaresolverr";
+
meta.maintainers = with lib.maintainers; [ paveloom ];
+
+
nodes.machine =
+
{ pkgs, ... }:
+
{
+
services.flaresolverr = {
+
enable = true;
+
port = 8888;
+
};
+
};
+
+
testScript = ''
+
machine.wait_for_unit("flaresolverr.service")
+
machine.wait_for_open_port(8888)
+
machine.succeed("curl --fail http://localhost:8888/")
+
'';
+
}
+
)