167 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, pkgs, ... }:
 | 
						|
with lib;
 | 
						|
let
 | 
						|
  cfg = config.services.selfoss;
 | 
						|
 | 
						|
  poolName = "selfoss_pool";
 | 
						|
  phpfpmSocketName = "/var/run/phpfpm/${poolName}.sock";
 | 
						|
 | 
						|
  dataDir = "/var/lib/selfoss";
 | 
						|
 | 
						|
  selfoss-config =
 | 
						|
  let
 | 
						|
    db_type = cfg.database.type;
 | 
						|
    default_port = if (db_type == "mysql") then 3306 else 5342;
 | 
						|
  in
 | 
						|
  pkgs.writeText "selfoss-config.ini" ''
 | 
						|
    [globals]
 | 
						|
    ${lib.optionalString (db_type != "sqlite") ''
 | 
						|
      db_type=${db_type}
 | 
						|
      db_host=${cfg.database.host}
 | 
						|
      db_database=${cfg.database.name}
 | 
						|
      db_username=${cfg.database.user}
 | 
						|
      db_password=${cfg.database.password}
 | 
						|
      db_port=${if (cfg.database.port != null) then cfg.database.port
 | 
						|
                    else default_port}
 | 
						|
    ''
 | 
						|
    }
 | 
						|
    ${cfg.extraConfig}
 | 
						|
  '';
 | 
						|
in
 | 
						|
  {
 | 
						|
    options = {
 | 
						|
      services.selfoss = {
 | 
						|
        enable = mkEnableOption "selfoss";
 | 
						|
 | 
						|
        user = mkOption {
 | 
						|
          type = types.str;
 | 
						|
          default = "nginx";
 | 
						|
          example = "nginx";
 | 
						|
          description = ''
 | 
						|
            User account under which both the service and 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.
 | 
						|
          '';
 | 
						|
        };
 | 
						|
 | 
						|
      database = {
 | 
						|
        type = mkOption {
 | 
						|
          type = types.enum ["pgsql" "mysql" "sqlite"];
 | 
						|
          default = "sqlite";
 | 
						|
          description = ''
 | 
						|
            Database to store feeds. Supported are sqlite, pgsql and mysql.
 | 
						|
          '';
 | 
						|
        };
 | 
						|
 | 
						|
        host = mkOption {
 | 
						|
          type = types.str;
 | 
						|
          default = "localhost";
 | 
						|
          description = ''
 | 
						|
            Host of the database (has no effect if type is "sqlite").
 | 
						|
          '';
 | 
						|
        };
 | 
						|
 | 
						|
        name = mkOption {
 | 
						|
          type = types.str;
 | 
						|
          default = "tt_rss";
 | 
						|
          description = ''
 | 
						|
            Name of the existing database (has no effect if type is "sqlite").
 | 
						|
          '';
 | 
						|
        };
 | 
						|
 | 
						|
        user = mkOption {
 | 
						|
          type = types.str;
 | 
						|
          default = "tt_rss";
 | 
						|
          description = ''
 | 
						|
            The database user. The user must exist and has access to
 | 
						|
            the specified database (has no effect if type is "sqlite").
 | 
						|
          '';
 | 
						|
        };
 | 
						|
 | 
						|
        password = mkOption {
 | 
						|
          type = types.nullOr types.str;
 | 
						|
          default = null;
 | 
						|
          description = ''
 | 
						|
            The database user's password (has no effect if type is "sqlite").
 | 
						|
          '';
 | 
						|
        };
 | 
						|
 | 
						|
        port = mkOption {
 | 
						|
          type = types.nullOr types.int;
 | 
						|
          default = null;
 | 
						|
          description = ''
 | 
						|
            The database's port. If not set, the default ports will be
 | 
						|
            provided (5432 and 3306 for pgsql and mysql respectively)
 | 
						|
            (has no effect if type is "sqlite").
 | 
						|
          '';
 | 
						|
        };
 | 
						|
      };
 | 
						|
      extraConfig = mkOption {
 | 
						|
        type = types.lines;
 | 
						|
        default = "";
 | 
						|
        description = ''
 | 
						|
          Extra configuration added to config.ini
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
 | 
						|
    services.phpfpm.poolConfigs = mkIf (cfg.pool == "${poolName}") {
 | 
						|
      "${poolName}" = ''
 | 
						|
        listen = "${phpfpmSocketName}";
 | 
						|
        listen.owner = nginx
 | 
						|
        listen.group = nginx
 | 
						|
        listen.mode = 0600
 | 
						|
        user = nginx
 | 
						|
        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.services.selfoss-config = {
 | 
						|
      serviceConfig.Type = "oneshot";
 | 
						|
      script = ''
 | 
						|
        mkdir -m 755 -p ${dataDir}
 | 
						|
        cd ${dataDir}
 | 
						|
 | 
						|
        # Delete all but the "data" folder
 | 
						|
        ls | grep -v data | while read line; do rm -rf $line; done || true
 | 
						|
 | 
						|
        # Create the files
 | 
						|
        cp -r "${pkgs.selfoss}/"* "${dataDir}"
 | 
						|
        ln -sf "${selfoss-config}" "${dataDir}/config.ini"
 | 
						|
        chown -R "${cfg.user}" "${dataDir}"
 | 
						|
        chmod -R 755 "${dataDir}"
 | 
						|
      '';
 | 
						|
      wantedBy = [ "multi-user.target" ];
 | 
						|
    };
 | 
						|
 | 
						|
    systemd.services.selfoss-update = {
 | 
						|
      serviceConfig = {
 | 
						|
        ExecStart = "${pkgs.php}/bin/php ${dataDir}/cliupdate.php";
 | 
						|
        User = "${cfg.user}";
 | 
						|
      };
 | 
						|
      startAt = "hourly";
 | 
						|
      after = [ "selfoss-config.service" ];
 | 
						|
      wantedBy = [ "multi-user.target" ];
 | 
						|
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
}
 |