diff --git a/mod-seafile-server.nix b/mod-seafile-server.nix new file mode 100644 index 0000000..4e1f889 --- /dev/null +++ b/mod-seafile-server.nix @@ -0,0 +1,116 @@ +{ config, pkgs, lib, ...}: +with lib; +let + cfg = config.services.seafile-server; + # fix permissions at start +in + { + options.services.seafile-server = { + enable = mkEnableOption "Seafile server"; + storagePath = mkOption { + type = types.path; + default = "/srv/seafile"; + description = "where to store uploaded file data"; + }; + autorun = mkOption { + type = types.bool; + default = true; + description = "enable the seafile-server service to get started automatically"; + }; + db = { + type = mkOption { + type = types.enum ["sqlite" "mysql"]; + default = "sqlite"; + description = "database backend type"; + }; + user = mkOption { + type = types.nullOr types.string; + default = "seafile"; + description = "Database user name. Not required for sqlite."; + }; + dbname = mkOption { + type = types.nullOr types.string; + default = "seafile"; + description = "Database name. Not required for sqlite."; + }; + password = mkOption { + type = types.nullOr types.string; + default = null; + description = '' + Database password. Use passwordFile to avoid this + being world-readable in the /nix/store. + + Not required for sqlite.''; + }; + passwordFile = mkOption { + type = types.nullOr types.str; + default = null; + description = '' + The full path to a file that contains the database password. + ''; + }; + host = mkOption { + type = types.nullOr types.str; + default = "localhost"; + description = "Database host."; + }; + dbport = mkOption { + type = with types; nullOr (either int str); + default = null; + description = "Database port. Not required for sqlite."; + }; + }; + + user = mkOption { + type = types.str; + default = "seafile"; + description = "User account under which the Seafile server runs."; + }; + + group = mkOption { + type = types.str; + default = "seafile"; + description = "Group account under which the Seafile server runs."; + }; + + domainName = mkOption { + type = types.str; + description = "full domain name of the seafile instance"; + }; + }; + + + config = let + directoriesToManage = [ cfg.storagePath ]; + in + lib.mkIf cfg.enable { + systemd.services.seafile-server = { + + serviceConfig = { + ExecStartPre = "+${pkgs.writeScript "seafile-server-preStart" '' + #!${pkgs.runtimeShell} + #set -ex + for DIR in ${escapeShellArgs directoriesToManage}; do + mkdir -p "$DIR" + chown ${cfg.user}:${cfg.group} "$DIR" + done; + ''}"; + ExecStart = "${pkgs.seafile-server}/seafile-core/bin/seaf-server-init"; + User = cfg.user; + Group = cfg.group; + Type = "oneshot"; + WorkingDirectory = cfg.storagePath; + }; + enable = cfg.autorun; + wantedBy = [ "multi-user.target" ]; + }; + + users.users.${cfg.user} = { + home = cfg.storagePath; + group = cfg.group; + createHome = true; + isNormalUser = false; + }; + users.groups.${cfg.group}.members = [ cfg.user ]; + }; + } diff --git a/seafile-test.nix b/seafile-test.nix new file mode 100644 index 0000000..c717711 --- /dev/null +++ b/seafile-test.nix @@ -0,0 +1,31 @@ +{ config, pkgs, ...}: +{ + imports = [ + + + ./mod-seafile-server.nix + ]; + + nixpkgs.overlays = [ + (import /home/spiollinux/nixconfigs/home/ov/seafile-overlay) + ]; + + i18n.consoleKeyMap = "de"; + users.mutableUsers = false; + users.users.test = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + #hashedPassword = "$6$SZCzE/xB$Hr9sfsJ7xAcBCoptG39cxxQk8RZfldDjjGpSngOvn9Ufex5dHBEbdncXRZnfrGATsGcYPvLi7m4wIu.f8tY9B."; + password = ""; + home = "/home/test"; + createHome = true; + }; + + # Seafile + services.seafile-server = { + enable = true; + #autorun = false; + domainName = "localhost"; + }; + +}