mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-20 00:50:38 +03:00

This avoids restarting the postgresql server, when only ensureDatabases or ensureUsers have been changed. It will also allow to properly wait for recovery to finish later. To wait for "postgresql is ready" in other services, we now provide a postgresql.target. Resolves #400018 Co-authored-by: Marcel <me@m4rc3l.de>
143 lines
4.1 KiB
Nix
143 lines
4.1 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.services.zipline;
|
|
in
|
|
{
|
|
meta.maintainers = with lib.maintainers; [ defelo ];
|
|
|
|
options.services.zipline = {
|
|
enable = lib.mkEnableOption "Zipline";
|
|
|
|
package = lib.mkPackageOption pkgs "zipline" { };
|
|
|
|
settings = lib.mkOption {
|
|
description = ''
|
|
Configuration of Zipline. See <https://zipline.diced.sh/docs/config> for more information.
|
|
'';
|
|
default = { };
|
|
example = {
|
|
DATABASE_URL = "postgres://postgres:postgres@postgres/postgres";
|
|
CORE_SECRET = "changethis";
|
|
CORE_HOSTNAME = "0.0.0.0";
|
|
CORE_PORT = "3000";
|
|
DATASOURCE_TYPE = "local";
|
|
DATASOURCE_LOCAL_DIRECTORY = "/var/lib/zipline/uploads";
|
|
};
|
|
|
|
type = lib.types.submodule {
|
|
freeformType =
|
|
with lib.types;
|
|
attrsOf (oneOf [
|
|
str
|
|
int
|
|
]);
|
|
|
|
options = {
|
|
CORE_HOSTNAME = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "The hostname to listen on.";
|
|
default = "127.0.0.1";
|
|
example = "0.0.0.0";
|
|
};
|
|
|
|
CORE_PORT = lib.mkOption {
|
|
type = lib.types.port;
|
|
description = "The port to listen on.";
|
|
default = 3000;
|
|
example = 8000;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
environmentFiles = lib.mkOption {
|
|
type = lib.types.listOf lib.types.path;
|
|
default = [ ];
|
|
example = [ "/run/secrets/zipline.env" ];
|
|
description = ''
|
|
Files to load environment variables from (in addition to [](#opt-services.zipline.settings)). This is useful to avoid putting secrets into the nix store. See <https://zipline.diced.sh/docs/config> for more information.
|
|
'';
|
|
};
|
|
|
|
database.createLocally = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = true;
|
|
description = ''
|
|
Whether to enable and configure a local PostgreSQL database server.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
services.zipline.settings = {
|
|
DATABASE_URL = lib.mkIf cfg.database.createLocally "postgresql://zipline@localhost/zipline?host=/run/postgresql";
|
|
DATASOURCE_TYPE = lib.mkDefault "local";
|
|
DATASOURCE_LOCAL_DIRECTORY = lib.mkDefault "/var/lib/zipline/uploads"; # created automatically by zipline
|
|
};
|
|
|
|
services.postgresql = lib.mkIf cfg.database.createLocally {
|
|
enable = true;
|
|
ensureUsers = lib.singleton {
|
|
name = "zipline";
|
|
ensureDBOwnership = true;
|
|
};
|
|
ensureDatabases = [ "zipline" ];
|
|
};
|
|
|
|
systemd.services.zipline = {
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
wants = [ "network-online.target" ];
|
|
after = [ "network-online.target" ] ++ lib.optional cfg.database.createLocally "postgresql.target";
|
|
requires = lib.optional cfg.database.createLocally "postgresql.target";
|
|
|
|
environment = lib.mapAttrs (_: value: toString value) cfg.settings;
|
|
|
|
serviceConfig = {
|
|
User = "zipline";
|
|
Group = "zipline";
|
|
DynamicUser = true;
|
|
StateDirectory = "zipline";
|
|
EnvironmentFile = cfg.environmentFiles;
|
|
ExecStart = lib.getExe cfg.package;
|
|
|
|
# Hardening
|
|
AmbientCapabilities = "";
|
|
CapabilityBoundingSet = [ "" ];
|
|
DevicePolicy = "closed";
|
|
LockPersonality = true;
|
|
NoNewPrivileges = true;
|
|
PrivateDevices = true;
|
|
PrivateTmp = true;
|
|
PrivateUsers = true;
|
|
ProcSubset = "pid";
|
|
ProtectClock = true;
|
|
ProtectControlGroups = true;
|
|
ProtectHome = true;
|
|
ProtectHostname = true;
|
|
ProtectKernelLogs = true;
|
|
ProtectKernelModules = true;
|
|
ProtectKernelTunables = true;
|
|
ProtectProc = "invisible";
|
|
ProtectSystem = "strict";
|
|
RemoveIPC = true;
|
|
RestrictAddressFamilies = [ "AF_INET AF_INET6 AF_UNIX AF_NETLINK" ];
|
|
RestrictNamespaces = true;
|
|
RestrictRealtime = true;
|
|
RestrictSUIDSGID = true;
|
|
SystemCallArchitectures = "native";
|
|
SystemCallFilter = [
|
|
"@system-service"
|
|
"~@privileged"
|
|
"~@resources"
|
|
];
|
|
UMask = "0077";
|
|
};
|
|
};
|
|
};
|
|
}
|