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" ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |