summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2024-12-16 23:09:24 +0100
committerMel <einebeere@gmail.com>2024-12-16 23:09:24 +0100
commit8951443e005295167d4cee4968a2c803dc07b430 (patch)
tree83ccded974f600aa08ea3b516c059cb195443414
parent7cea3ef593c337667f7efebf49ce609e96cb029f (diff)
downloadnetwork-8951443e005295167d4cee4968a2c803dc07b430.tar.zst
network-8951443e005295167d4cee4968a2c803dc07b430.zip
Deploy Transmission + VPN services
Signed-off-by: Mel <einebeere@gmail.com>
-rw-r--r--machines/corsac/default.nix1
-rw-r--r--modules/foundation/services.nix41
-rw-r--r--secrets/pia-login-secrets.agebin0 -> 590 bytes
-rw-r--r--secrets/secrets.nix4
-rw-r--r--services/transmission.nix85
5 files changed, 127 insertions, 4 deletions
diff --git a/machines/corsac/default.nix b/machines/corsac/default.nix
index b01b241..a80993f 100644
--- a/machines/corsac/default.nix
+++ b/machines/corsac/default.nix
@@ -14,6 +14,7 @@
../../modules/jellyfin.nix
../../services/immich.nix
+ ../../services/transmission.nix
];
system.stateVersion = "24.05";
diff --git a/modules/foundation/services.nix b/modules/foundation/services.nix
index 5acb0c6..bedceb1 100644
--- a/modules/foundation/services.nix
+++ b/modules/foundation/services.nix
@@ -38,6 +38,16 @@ let
default = [ ];
};
+ devices = mkOption {
+ type = with types; listOf str;
+ default = [ ];
+ };
+
+ capabilities = mkOption {
+ type = with types; listOf str;
+ default = [ ];
+ };
+
entrypoint = mkOption {
type = types.nullOr types.str;
default = null;
@@ -62,6 +72,11 @@ let
type = types.listOf types.path;
default = [ ];
};
+
+ customNetwork = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ };
};
};
@@ -178,11 +193,15 @@ in
image,
ports,
volumes,
+ devices,
+ capabilities,
entrypoint ? null,
cmd ? null,
workdir ? null,
environment ? null,
environmentFiles ? null,
+ customNetwork ? null,
+
group,
...
}:
@@ -196,10 +215,24 @@ in
;
ports = map mkOciPort ports;
volumes = map mkOciVolume volumes;
- extraOptions = lib.mkIf (group != "") [
- "--network-alias=${name}"
- "--network=${group}"
- ];
+
+ extraOptions = let
+ mapOptions = optionName: values:
+ map (v: "--${optionName}=${v}") values;
+
+ networkOptions =
+ if customNetwork != null then [
+ "--network=${customNetwork}"
+ ] else if group != "" then [
+ "--network-alias=${name}"
+ "--network=${group}"
+ ] else [];
+
+ capabilityOptions = mapOptions "cap-add" capabilities;
+
+ deviceOptions = mapOptions "device" devices;
+ in
+ networkOptions ++ capabilityOptions ++ deviceOptions;
}
// (mkImage {
oldImage = fullImage;
diff --git a/secrets/pia-login-secrets.age b/secrets/pia-login-secrets.age
new file mode 100644
index 0000000..5f66af1
--- /dev/null
+++ b/secrets/pia-login-secrets.age
Binary files differ
diff --git a/secrets/secrets.nix b/secrets/secrets.nix
index 604ca1e..823420b 100644
--- a/secrets/secrets.nix
+++ b/secrets/secrets.nix
@@ -18,5 +18,9 @@ in
lapin
] ++ allAdmins;
+ "pia-login-secrets.age".publicKeys = [
+ corsac
+ ] ++ allAdmins;
+
"password.age".publicKeys = allSystems ++ allAdmins;
}
diff --git a/services/transmission.nix b/services/transmission.nix
new file mode 100644
index 0000000..ec98177
--- /dev/null
+++ b/services/transmission.nix
@@ -0,0 +1,85 @@
+{
+ me,
+ config,
+ lib,
+ pkgs,
+ auxiliaryPkgs,
+ ...
+}:
+
+let
+ inherit (pkgs) dockerTools;
+ inherit (auxiliaryPkgs) common;
+
+ transmission = pkgs.transmission_4;
+
+ transmissionLocalPort = 2018;
+ transmissionDir = "/srv/transmission";
+
+ transmissionImage = dockerTools.streamLayeredImage {
+ name = "transmission";
+ tag = transmission.version;
+ fromImage = common.alpine.base;
+ contents = [ transmission ];
+ };
+
+ gluetunImage = common.pullImage {
+ name = "qmcgaw/gluetun";
+ tag = "v3.39";
+ digest = "sha256:6a8058e626763cbf735ac2f78c774dbb24fec2490bd9d9f7d67e22592cb4a991";
+ x86.sha256 = "1cg43lmp3ql64zsfwp2f52kigijs30n3hnja12msr9npbgq8a8ga";
+ };
+
+ piaCountries = [
+ "Albania" "Austria" "Belgium" "Bosnia and Herzegovina" "Bulgaria"
+ "Czech Republic" "ES Madrid" "ES Valencia" "Estonia" "Georgia" "Greece"
+ "Hungary" "IT Milano" "Poland" "Portugal" "Romania" "Serbia" "Turkey" "Ukraine"
+ ];
+in
+{
+ age.secrets.pia-login-secrets = {
+ file = ../secrets/pia-login-secrets.age;
+ };
+
+ foundation.services = {
+ transmission = {
+ image = transmissionImage;
+
+ volumes = [
+ [ "${transmissionDir}/config" "/var/lib/transmission/config" ]
+ [ "${transmissionDir}/download" "/var/lib/transmission/download" ]
+ [ "${transmissionDir}/torrents" "/var/lib/transmission/torrents" ]
+ ];
+
+ entrypoint = lib.getExe' transmission "transmission-daemon";
+ cmd = [
+ "--foreground"
+ "--config-dir" "/var/lib/transmission/config"
+ ];
+
+ customNetwork = "container:vpn";
+ };
+
+ vpn = {
+ fullImage = gluetunImage;
+
+ ports = [
+ (common.tailnetPort me [ transmissionLocalPort 9091 ])
+ ];
+
+ volumes = [
+ [ "${transmissionDir}/gluetun" "/gluetun" ]
+ ];
+
+ capabilities = [ "NET_ADMIN" ];
+ devices = [ "/dev/net/tun" ];
+
+ environment = {
+ VPN_SERVICE_PROVIDER = "private internet access";
+ SERVER_REGIONS = lib.concatStringsSep "," piaCountries;
+ };
+
+ environmentFiles = [ config.age.secrets.pia-login-secrets.path ];
+ };
+ };
+}