nix/modules/syncthing.nix
2025-10-24 12:00:44 +02:00

111 lines
3 KiB
Nix

{ config, pkgs, lib, ... }:
let
# Common ignore patterns for all synced folders
commonIgnores = [
".DS_Store"
"*.tmp"
"*.temp"
"~*"
".*.swp"
".*.swo"
"*~"
".Trash-*"
"Thumbs.db"
"desktop.ini"
];
# Convert ignore list to .stignore file content
stignoreContent = lib.concatStringsSep "\n" commonIgnores;
# Common versioning configuration
commonVersioning = {
type = "staggered";
params = {
maxAge = "15552000"; # 180 days in seconds
cleanInterval = "3600"; # Clean every hour
};
};
in
{
# Enable Syncthing service
services.syncthing = {
enable = true;
# Don't enable tray on server (Linux) or macOS
tray.enable = false;
# Listen on all interfaces for the GUI
guiAddress = "0.0.0.0:8384";
# Declarative configuration - will override any GUI changes
overrideDevices = true;
overrideFolders = true;
settings = {
# Define all devices
devices = {
"iphone" = {
id = "NMWI5MP-J4FC4A6-SDDXZPD-G66TJCO-2W7KGFD-RJWQ53U-I7GUVWP-WHF4QQO";
};
"hs" = {
id = "GH5D3DJ-PAGKBL6-3VDZJRT-QG4ZMRD-GHCCA3Y-HM2H5CE-NAMJYRR-VHLOOQH";
};
"thinkpad" = {
id = "OMZKASU-QPZDCQ2-7QRHRD4-3TPAXLM-AYRMWXB-A6E5OIZ-MGR422V-JYARQA6";
};
};
# Define shared folders
folders = {
"Credentials" = {
path = "~/Credentials";
devices = [ "iphone" "hs" "thinkpad" ];
ignorePerms = true;
versioning = commonVersioning;
};
"Documents" = {
path = "~/Documents";
devices = [ "hs" "thinkpad" ];
ignorePerms = true;
versioning = commonVersioning;
};
"Obsidian" = {
path = "~/Obsidian";
devices = [ "iphone" "hs" "thinkpad" ];
ignorePerms = true;
versioning = commonVersioning;
};
};
# GUI settings with authentication
gui = {
enabled = true;
user = "yanlin";
password = "1Hayashi-2Hiko"; # You should change this password
useTLS = false; # TLS is handled by Traefik
};
# Additional settings
options = {
urAccepted = -1; # Disable usage reporting
relaysEnabled = true;
localAnnounceEnabled = true;
globalAnnounceEnabled = true;
};
};
};
# Override the launchd agent to add RunAtLoad on macOS
launchd.agents.syncthing = lib.mkIf (pkgs.stdenv.isDarwin && config.services.syncthing.enable) {
config.RunAtLoad = true;
};
# Deploy .stignore files to synced folders
home.file."Credentials/.stignore".text = stignoreContent;
home.file."Documents/.stignore".text = stignoreContent;
home.file."Obsidian/.stignore".text = stignoreContent;
# For NixOS systems, we need to add Syncthing as a manual service in Traefik
# Since Syncthing runs as a systemd service (not container), we'll handle routing via static config
# or create a container wrapper for it to use with service discovery
}