{ ... }: let staggeredVersioning = { type = "staggered"; params = { cleanInterval = "3600"; maxAge = "31536000"; }; }; in { systemd.tmpfiles.rules = [ "d /srv/syncthing 0770 syncthing syncthing" # defaults to 0700 ]; # May be of limited usefulness because Syncthing generally ignores umask. systemd.services.syncthing = { serviceConfig.UMask = "0002"; }; services.syncthing = { enable = true; openDefaultPorts = true; # Syncthing supports named sockets but the NixOS module assumes network. guiAddress = "[::1]:8384"; dataDir = "/srv/syncthing"; settings = { devices = { "Asus Nexus 7" = { id = "BVZARYC-2D56A6I-V6L2VQF-MU7IVCT-ITJTCGQ-IGMZG2W-RZRCTOT-K4GDHAY"; }; "DESKTOP-SFVBFBU" = { id = "T547Y5S-HUO5WIC-DM3Z7LS-UG647YR-ZQAMZHU-LIZHDY5-Q5WQLXL-RNH2GAV"; autoAcceptFolders = true; }; "Joes-iPhone-6" = { id = "F5APH5K-XXO454B-6YU4BTT-YPHF4KT-OD7YF5Y-JTWJRSU-UNJ2KZK-IVJZNQT"; autoAcceptFolders = true; }; "iPad" = { id = "U7D7667-RFEFHXX-TUJGGII-CE62S6P-YC6MWNV-4LBJ4YJ-5ZUZVPT-GBC5PQH"; autoAcceptFolders = true; }; "Joes-Mac-mini.local" = { id = "K532ULN-SMFZDJR-U2NSGTY-HY35MXX-6POK7KI-CETEKLV-RMCGRHL-DVROHAF"; autoAcceptFolders = true; }; "maxsettings-C6554E6AF22F" = { id = "HO3QQZO-RDWYDB6-U74ZQRC-FP7YPB2-IPB2EBC-KIQ5JII-FD4KBXR-J3GCOQ5"; autoAcceptFolders = true; }; "penguin" = { id = "5BEB6SZ-YAPV3CC-54RZF3V-HQXXP3Y-TTVDWDU-SHHNVCH-IXKZ3O2-6RXG6QL"; autoAcceptFolders = true; }; "sparky" = { id = "FE43LDI-33WS467-LIGFWCC-5PPSKN6-GYODEWJ-KLQZLN7-H3GYGLG-IJ2JGQW"; autoAcceptFolders = true; }; "sparky-win" = { id = "UWA5IFV-CKFMLRS-CUMUB7X-LABLQST-QK2ULLM-BUVW6CW-PBT5AQX-AUNPBAK"; }; "steamdeck" = { id = "SCUAABL-XU6AS5H-IZZE4PN-LY5J4LH-OYZMXTU-2UMTVUL-I7B7QKE-ZBPSAQ5"; autoAcceptFolders = true; }; }; folders = { "Deck/Documents" = { id = "mwxed-yy9gn"; path = "~/Deck/Documents"; versioning = staggeredVersioning; devices = [ "steamdeck" ]; }; "Documents" = { id = "bhemx-9nh3v"; path = "~/Documents"; versioning = staggeredVersioning; devices = [ "sparky" ]; }; "Downloads" = { id = "kvq6q-axjhu"; path = "~/Downloads"; versioning = staggeredVersioning; devices = [ "sparky" ]; }; "Game/Epic Games/TheTalosPrinciple/UserData" = { id = "vek7u-iausx"; path = "~/Game/Epic Games/TheTalosPrinciple/UserData"; versioning = staggeredVersioning; devices = [ "DESKTOP-SFVBFBU" "maxsettings-C6554E6AF22F" ]; }; "Game/PCSX2" = { id = "chxsg-hpqgm"; path = "~/Game/PCSX2"; versioning = staggeredVersioning; devices = [ "maxsettings-C6554E6AF22F" ]; }; "Pictures" = { id = "vfjsd-4fczh"; path = "~/Pictures"; versioning = staggeredVersioning; devices = [ "sparky" ]; }; "Public" = { id = "f6iys-eunyf"; path = "~/Public"; versioning = staggeredVersioning; devices = [ "sparky" ]; }; "Sync" = { id = "7thks-5badk"; path = "~/Sync"; versioning = staggeredVersioning; devices = [ "Asus Nexus 7" "DESKTOP-SFVBFBU" "Joes-iPhone-6" "iPad" "penguin" "sparky" "sparky-win" ]; }; "Windows" = { id = "gjcn7-qrsjr"; path = "~/Windows"; versioning = staggeredVersioning; devices = [ "DESKTOP-SFVBFBU" "maxsettings-C6554E6AF22F" "sparky-win" ]; }; "iPad" = { id = "qtzmu-fqdrs"; path = "~/iPad"; versioning = staggeredVersioning; devices = [ "iPad" ]; }; }; }; }; services.nginx.virtualHosts."st.mou.fo" = { enableACME = true; forceSSL = true; locations."/" = { proxyPass = "http://[::1]:8384"; # https://docs.syncthing.net/users/faq.html#why-do-i-get-host-check-error-in-the-gui-api recommendedProxySettings = false; }; }; services.oauth2-proxy.nginx.virtualHosts = { "st.mou.fo" = {}; }; }