{ config, lib, ... }: let mountDir = "/mnt/sync"; configDir = "/etc/syncthing"; in { options = { services.syncthing.impermanence.enable = lib.mkOption { type = lib.types.bool; default = config.services.syncthing.enable && config.storage.impermanence.enable; }; }; config = lib.mkIf config.services.syncthing.enable ( lib.mkMerge [ (lib.mkIf config.storage.zfs.enable (lib.mkMerge [ { # Syncthing needs persistent storage for configuration and data } (lib.mkIf (!config.services.syncthing.impermanence.enable) { # TODO: placeholder to configure a unique dataset for this service }) (lib.mkIf config.services.syncthing.impermanence.enable { assertions = [ { assertion = config.services.syncthing.configDir == configDir; message = "syncthing config dir does not match persistence"; } ] ++ lib.attrsets.mapAttrsToList (_: folder: { assertion = lib.strings.hasPrefix mountDir folder.path; message = "syncthing folder ${folder.label} is stored at ${folder.path} which not under the persisted path of ${mountDir}"; }) config.services.syncthing.settings.folders; storage.impermanence.datasets."persist/system/root" = { directories = { "${mountDir}" = { enable = true; owner.name = "syncthing"; group.name = "syncthing"; }; "${configDir}" = { enable = true; owner.name = "syncthing"; group.name = "syncthing"; }; }; }; }) ])) ] ); }