{ pkgs, ... }: { home.packages = with pkgs; [ sshfs ]; systemd.user.services = let mountArchive = '' ${pkgs.sshfs}/bin/sshfs \ -f \ -o reconnect \ -o compression=yes \ -o ServerAliveInterval=15 \ -o ServerAliveCountMax=3 \ -o IdentityFile=%h/.ssh/id_ed25519 \ -o StrictHostKeyChecking=yes \ drew@mcp:/tank/archive/drew \ %h/archive ''; unmountArchive = "/run/wrappers/bin/fusermount -u %h/archive"; in { # Mounts the archive when the system is online. mcp-archive = { Unit = { Description = "SSHFS mount for remote archive"; # Start only after the network is online After = [ "network-online.target" ]; # Stop this service if the network stops StopPropagatedFrom = [ "network-online.target" ]; }; Service = { Type = "simple"; ExecStartPre = "/run/current-system/sw/bin/mkdir -p %h/archive"; ExecStart = mountArchive; ExecStop = unmountArchive; Restart = "on-failure"; RestartSec = "10s"; }; Install = { WantedBy = [ "default.target" ]; }; }; # Unmounts the SSHFS mount whenever the system wants to go to sleep. If I # don't do this, the service will prevent sleep while it tries to # reconnect. mcp-archive-unmount-on-sleep = { Unit = { Description = "Unmount SSHFS archive before sleep"; # Run this before the system goes to sleep. It should then be # shutdown after the system wakes up. Before = [ "sleep.target" ]; StopWhenUnneeded = true; }; Service = { Type = "oneshot"; # The service will remain after it runs so that it stays in the # service registry as active. RemainAfterExit = true; ExecStart = unmountArchive; ExecStop = mountArchive; }; Install = { WantedBy = [ "sleep.target" ]; }; }; }; }