summaryrefslogtreecommitdiffstats
path: root/hosts/poweredge/slskd.nix
blob: 542757fa82116b96f1a8aa291a6fa080206624f4 (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
{ config, ... }: {
	# Secrets
	sops.secrets.slskd-env = { sopsFile = ./resources/secrets/slskd.yaml; key = "env-file"; };

	# Container
	containers.slskd = let
		home = "/var/lib/slskd";
		download-dir = "${home}/complete";
		incomplete-dir = "${home}/incomplete";
	in {
		autoStart = true;
		privateNetwork = true;
		hostBridge = "br-lan0";
		localMacAddress = "02:00:00:00:01:51";

		# Download dirs, shared with transmission's media tree, plus a
		# read-only mount of the whole library for Soulseek sharing
		bindMounts = {
			"${download-dir}" = {
				hostPath = "/media/ingens/media/dls/slskd/complete";
				isReadOnly = false;
			};
			"${incomplete-dir}" = {
				hostPath = "/media/ingens/media/dls/slskd/incomplete";
				isReadOnly = false;
			};
			"/srv" = {
				hostPath = "/media/ingens/media/dls/slskd/srv";
				isReadOnly = false;
			};
			"/media/ingens/media" = {
				hostPath = "/media/ingens/media";
				isReadOnly = true;
			};
		};

		# Bind secrets
		bindMounts."/run/secrets/slskd.env" = {
			hostPath = config.sops.secrets.slskd-env.path;
			isReadOnly = true;
		};

		config = { lib, config, pkgs, ... }: {
			# Network
			networking = {
				enableIPv6 = false;  # Prevent ip leaks
				firewall.allowedTCPPorts = [ 80 50300 ];  # Web ui + soulseek listen port tcp
				firewall.allowedUDPPorts = [ 50300 ];  # soulseek listen port udp
				# DHCP (see transmission.nix)
				interfaces.eth0.useDHCP = true;
				dhcpcd.extraConfig = ''
					interface eth0
					static routers=192.168.1.9
					static domain_name_servers=9.9.9.9 1.1.1.1
				'';
			};

			# slskd
			services.slskd = {
				enable = true;
				environmentFile = "/run/secrets/slskd.env";
				settings = {
					directories = {
						downloads = download-dir;
						incomplete = incomplete-dir;
					};
					shares.directories = [ "/srv" ];
					transfers = {
						upload.slots = 5;
						upload.speed_limit = 0;
						download.slots = 5;
						download.speed_limit = 0;
					};
					flags.no_version_check = true;
				};
			};

			users.users.slskd.uid = 1000;  # uid is not set otherwise

			# Reverse proxy
			services.caddy = {
				enable = true;
				virtualHosts.":80".extraConfig = ''
					reverse_proxy localhost:5030
				'';
			};

			system.stateVersion = "26.05";
		};
	};
}