{ self, ... }: { config, lib, pkgs, ... }: let cfg = config.services.doerg; doerg-config = pkgs.writeText "doerg-config.edn" '' #:net.deertopia.doerg.config {:org-roam-db-path "${cfg.databasePath}" :state-directory "${cfg.stateDir}"} ''; inherit (lib) types; in { options.services.doerg = { enable = lib.mkEnableOption "Doerg"; org-roam-db-sync.enable = lib.mkEnableOption "Org-roam db sync"; port = lib.mkOption { default = 21984; type = lib.types.port; description = '' The port on which Doerg will listen. ''; }; stateDir = lib.mkOption { type = types.path; default = "/var/lib/private/doerg"; description = "Daemon's state directory."; }; orgDir = lib.mkOption { type = types.path; description = "Org roam directory."; }; package = lib.mkPackageOption pkgs "doerg" {}; databasePath = lib.mkOption { type = types.path; description = "Org roam database path"; default = cfg.orgDir + "org-roam.db"; }; }; config = lib.mkIf cfg.enable { nixpkgs.overlays = [ self.overlays.default ]; systemd.services.doerg = { after = [ "network-online.target" ]; wants = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; environment.DOERG_CONFIG = doerg-config; serviceConfig = { # WorkingDirectory = cfg.stateDir; StateDirectory = "doerg"; ExecStart = lib.getExe cfg.package; DynamicUser = true; ProtectSystem = "strict"; PrivateTmp = true; BindReadOnlyPaths = [ cfg.orgDir cfg.databasePath "/nix" ]; }; }; }; }