587713944a
GitOrigin-RevId: 6143fc5eeb9c4f00163267708e26191d1e918932
150 lines
4.5 KiB
Nix
150 lines
4.5 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
with lib;
|
|
let
|
|
cfg = config.services.rss-bridge;
|
|
|
|
poolName = "rss-bridge";
|
|
|
|
configAttr = lib.recursiveUpdate { FileCache.path = "${cfg.dataDir}/cache/"; } cfg.config;
|
|
cfgHalf = lib.mapAttrsRecursive (path: value: let
|
|
envName = lib.toUpper ("RSSBRIDGE_" + lib.concatStringsSep "_" path);
|
|
envValue = if lib.isList value then
|
|
lib.concatStringsSep "," value
|
|
else if lib.isBool value then
|
|
lib.boolToString value
|
|
else
|
|
toString value;
|
|
in "fastcgi_param \"${envName}\" \"${envValue}\";") configAttr;
|
|
cfgEnv = lib.concatStringsSep "\n" (lib.collect lib.isString cfgHalf);
|
|
in
|
|
{
|
|
imports = [
|
|
(mkRenamedOptionModule [ "services" "rss-bridge" "whitelist" ] [ "services" "rss-bridge" "config" "system" "enabled_bridges" ])
|
|
];
|
|
|
|
options = {
|
|
services.rss-bridge = {
|
|
enable = mkEnableOption "rss-bridge";
|
|
|
|
user = mkOption {
|
|
type = types.str;
|
|
default = "nginx";
|
|
description = ''
|
|
User account under which both the service and the web-application run.
|
|
'';
|
|
};
|
|
|
|
group = mkOption {
|
|
type = types.str;
|
|
default = "nginx";
|
|
description = ''
|
|
Group under which the web-application run.
|
|
'';
|
|
};
|
|
|
|
pool = mkOption {
|
|
type = types.str;
|
|
default = poolName;
|
|
description = ''
|
|
Name of existing phpfpm pool that is used to run web-application.
|
|
If not specified a pool will be created automatically with
|
|
default values.
|
|
'';
|
|
};
|
|
|
|
dataDir = mkOption {
|
|
type = types.str;
|
|
default = "/var/lib/rss-bridge";
|
|
description = ''
|
|
Location in which cache directory will be created.
|
|
You can put `config.ini.php` in here.
|
|
'';
|
|
};
|
|
|
|
virtualHost = mkOption {
|
|
type = types.nullOr types.str;
|
|
default = "rss-bridge";
|
|
description = ''
|
|
Name of the nginx virtualhost to use and setup. If null, do not setup any virtualhost.
|
|
'';
|
|
};
|
|
|
|
config = mkOption {
|
|
type = with types; attrsOf (attrsOf (oneOf [ bool int str (listOf str) ]));
|
|
default = {};
|
|
defaultText = options.literalExpression "FileCache.path = \"\${config.services.rss-bridge.dataDir}/cache/\"";
|
|
example = options.literalExpression ''
|
|
{
|
|
system.enabled_bridges = [ "*" ];
|
|
error = {
|
|
output = "http";
|
|
report_limit = 5;
|
|
};
|
|
FileCache = {
|
|
enable_purge = true;
|
|
};
|
|
}
|
|
'';
|
|
description = ''
|
|
Attribute set of arbitrary config options.
|
|
Please consult the documentation at the [wiki](https://rss-bridge.github.io/rss-bridge/For_Hosts/Custom_Configuration.html)
|
|
and [sample config](https://github.com/RSS-Bridge/rss-bridge/blob/master/config.default.ini.php) to see a list of available options.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
services.phpfpm.pools = mkIf (cfg.pool == poolName) {
|
|
${poolName} = {
|
|
user = cfg.user;
|
|
settings = mapAttrs (name: mkDefault) {
|
|
"listen.owner" = cfg.user;
|
|
"listen.group" = cfg.user;
|
|
"listen.mode" = "0600";
|
|
"pm" = "dynamic";
|
|
"pm.max_children" = 75;
|
|
"pm.start_servers" = 10;
|
|
"pm.min_spare_servers" = 5;
|
|
"pm.max_spare_servers" = 20;
|
|
"pm.max_requests" = 500;
|
|
"catch_workers_output" = 1;
|
|
};
|
|
};
|
|
};
|
|
systemd.tmpfiles.settings.rss-bridge = let
|
|
perm = {
|
|
mode = "0750";
|
|
user = cfg.user;
|
|
group = cfg.group;
|
|
};
|
|
in {
|
|
"${configAttr.FileCache.path}".d = perm;
|
|
"${cfg.dataDir}/config.ini.php".z = perm;
|
|
};
|
|
|
|
services.nginx = mkIf (cfg.virtualHost != null) {
|
|
enable = true;
|
|
virtualHosts = {
|
|
${cfg.virtualHost} = {
|
|
root = "${pkgs.rss-bridge}";
|
|
|
|
locations."/" = {
|
|
tryFiles = "$uri /index.php$is_args$args";
|
|
};
|
|
|
|
locations."~ ^/index.php(/|$)" = {
|
|
extraConfig = ''
|
|
include ${config.services.nginx.package}/conf/fastcgi_params;
|
|
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
|
fastcgi_pass unix:${config.services.phpfpm.pools.${cfg.pool}.socket};
|
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
fastcgi_param RSSBRIDGE_DATA ${cfg.dataDir};
|
|
${cfgEnv}
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|