mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-28 08:31:59 +00:00
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=${toString (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" ];
|
|
|
|
};
|
|
|
|
};
|
|
}
|