nixpkgs/nixos/modules/services/web-apps/selfoss.nix
2018-11-15 19:22:20 +00:00

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