summaryrefslogtreecommitdiff
path: root/modules/nixos/syncthing.nix
blob: b0d98bc47824ee54426e83e75ad9e57c2f38f505 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{
  config,
  inputs,
  lib,
  this,
  ...
}:
with lib; let
  cfg = config.nixfiles.modules.syncthing;
in {
  options.nixfiles.modules.syncthing = {
    enable = mkEnableOption "Syncthing";

    domain = mkOption {
      description = "Domain name sans protocol scheme.";
      type = with types; str;
      default = "syncthing.${config.networking.fqdn}";
    };
  };

  config = mkIf cfg.enable (mkMerge [
    {
      secrets = {
        "syncthing-cert-${this.hostname}" = with config.services.syncthing; {
          file = "${inputs.self}/secrets/syncthing-cert-${this.hostname}";
          owner = user;
          inherit group;
        };

        "syncthing-key-${this.hostname}" = with config.services.syncthing; {
          file = "${inputs.self}/secrets/syncthing-key-${this.hostname}";
          owner = user;
          inherit group;
        };
      };

      services.syncthing = {
        enable = true;

        user = my.username;
        inherit (config.my) group;

        dataDir = config.my.home;

        guiAddress = "127.0.0.1:8384";

        cert = config.secrets."syncthing-cert-${this.hostname}".path;
        key = config.secrets."syncthing-key-${this.hostname}".path;

        overrideDevices = true;
        devices = mapAttrs (name: attr:
          mkIf (attr.syncthing.id != null && hasAttr "wireguard" attr) {
            inherit (attr.syncthing) id;
            addresses = ["tcp://${name}.${config.networking.domain}:22000"];
            introducer = this.isHeadless;
          })
        my.configurations;

        overrideFolders = true;
        folders = let
          filterDevices = f:
            attrNames (filterAttrs (_: attr:
              (attr.hostname != this.hostname)
              && (attr.syncthing.id != null)
              && f attr)
            my.configurations);
          all = filterDevices (_: true);
          notHeadless = filterDevices (attr: !attr.isHeadless);
          notOther = filterDevices (attr: !attr.isOther);

          simple = {
            type = "simple";
            params.keep = "5";
          };
          trashcan = {
            type = "trashcan";
            params.cleanoutDays = "7";
          };
        in
          with config.hm.xdg.userDirs; {
            share = {
              path = publicShare;
              devices = notHeadless;
              versioning = trashcan;
            };
            pass = {
              path = config.hm.programs.password-store.settings.PASSWORD_STORE_DIR;
              devices = notOther;
              versioning = trashcan;
            };
            org = {
              path = "${documents}/org";
              devices = all;
              versioning = simple;
            };
            roam = {
              path = "${documents}/roam";
              devices = notOther;
              versioning = simple;
            };
            elfeed = {
              path = "${config.my.home}/.elfeed";
              devices = notOther;
              versioning = trashcan;
            };
            books = {
              path = "${documents}/books";
              devices = notOther;
              versioning = trashcan;
            };
          };

        extraOptions = {
          gui = {
            insecureAdminAccess = true;
            insecureSkipHostcheck = this.isHeadless;
          };
          options = {
            autoUpgradeIntervalH = 0;
            crashReportingEnabled = false;
            globalAnnounceEnabled = false;
            relaysEnabled = false;
            setLowPriority = this.isHeadless;
            stunKeepaliveMinS = 0;
            stunKeepaliveStartS = 0;
            urAccepted = -1;
          };
        };
      };

      systemd.services.syncthing.environment.STNODEFAULTFOLDER = "yes";
    }
    (mkIf this.isHeadless {
      nixfiles.modules.nginx = {
        enable = true;
        upstreams.syncthing.servers.${config.services.syncthing.guiAddress} = {};
        virtualHosts.${cfg.domain} = {
          locations."/".proxyPass = "http://syncthing";
          extraConfig = nginxInternalOnly;
        };
      };
    })
  ]);
}