128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
with lib;
 | 
						|
let
 | 
						|
  cfg = config.services.rss-bridge;
 | 
						|
 | 
						|
  poolName = "rss-bridge";
 | 
						|
 | 
						|
  whitelist = pkgs.writeText "rss-bridge_whitelist.txt"
 | 
						|
    (concatStringsSep "\n" cfg.whitelist);
 | 
						|
in
 | 
						|
{
 | 
						|
  options = {
 | 
						|
    services.rss-bridge = {
 | 
						|
      enable = mkEnableOption "rss-bridge";
 | 
						|
 | 
						|
      user = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        default = "nginx";
 | 
						|
        example = "nginx";
 | 
						|
        description = ''
 | 
						|
          User account under which both the service and the web-application run.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      group = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        default = "nginx";
 | 
						|
        example = "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 <literal>config.ini.php</literal> 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.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      whitelist = mkOption {
 | 
						|
        type = types.listOf types.str;
 | 
						|
        default = [];
 | 
						|
        example = options.literalExample ''
 | 
						|
          [
 | 
						|
            "Facebook"
 | 
						|
            "Instagram"
 | 
						|
            "Twitter"
 | 
						|
          ]
 | 
						|
        '';
 | 
						|
        description = ''
 | 
						|
          List of bridges to be whitelisted.
 | 
						|
          If the list is empty, rss-bridge will use whitelist.default.txt.
 | 
						|
          Use <literal>[ "*" ]</literal> to whitelist all.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  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.rules = [
 | 
						|
      "d '${cfg.dataDir}/cache' 0750 ${cfg.user} ${cfg.group} - -"
 | 
						|
      (mkIf (cfg.whitelist != []) "L+ ${cfg.dataDir}/whitelist.txt - - - - ${whitelist}")
 | 
						|
      "z '${cfg.dataDir}/config.ini.php' 0750 ${cfg.user} ${cfg.group} - -"
 | 
						|
    ];
 | 
						|
 | 
						|
    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 ${pkgs.nginx}/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};
 | 
						|
            '';
 | 
						|
          };
 | 
						|
        };
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 |