summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--modules/foundation/services.nix19
-rw-r--r--pkgs/common.nix157
-rw-r--r--services/irc/soju.nix38
-rw-r--r--services/minecraft.nix15
4 files changed, 140 insertions, 89 deletions
diff --git a/modules/foundation/services.nix b/modules/foundation/services.nix
index d4edcb3..ddc3263 100644
--- a/modules/foundation/services.nix
+++ b/modules/foundation/services.nix
@@ -27,7 +27,9 @@ let
       };
 
       ports = mkOption {
-        type = with types; listOf (listOf ints.u16);
+        type = with types; listOf (
+          either (listOf ints.u16) str
+        );
         default = [ ];
       };
 
@@ -132,12 +134,15 @@ in
     virtualisation.oci-containers.containers =
       let
         mkOciPort =
-          portTuple:
-          let
-            host = builtins.elemAt portTuple 0;
-            container = builtins.elemAt portTuple 1;
-          in
-          "127.0.0.1:${toString host}:${toString container}";
+          portStrOrTuple:
+          if builtins.isList portStrOrTuple then
+            let
+              host = builtins.elemAt portStrOrTuple 0;
+              container = builtins.elemAt portStrOrTuple 1;
+            in
+            "127.0.0.1:${toString host}:${toString container}"
+          else
+            portStrOrTuple;
 
         mkOciVolume =
           volumeTuple:
diff --git a/pkgs/common.nix b/pkgs/common.nix
index 5110335..7493f41 100644
--- a/pkgs/common.nix
+++ b/pkgs/common.nix
@@ -1,62 +1,117 @@
-{ dockerTools, system, ... }:
+{
+  lib,
+  dockerTools,
+  system,
+  ...
+}:
 
 let
   systemToArch = {
-    "x86_64-linux" = { short = "x86"; arch = "amd64"; };
-    "aarch64-linux" = { short = "arm"; arch = "arm64"; };
+    "x86_64-linux" = {
+      short = "x86";
+      arch = "amd64";
+    };
+    "aarch64-linux" = {
+      short = "arm";
+      arch = "arm64";
+    };
   };
 
-  mkImage = { name, tag, digest, ... }@inputs:
-  let
-    arch = systemToArch.${system};
-  
-    image = dockerTools.pullImage {
-      imageName = name;
-      imageDigest = digest;
-      finalImageName = name;
-      finalImageTag = tag;
-      os = "linux";
-      inherit (inputs.${arch.short}) sha256;
-      inherit (arch) arch;
+  mkImage =
+    {
+      name,
+      tag,
+      digest,
+      ...
+    }@inputs:
+    let
+      arch = systemToArch.${system};
+
+      image = dockerTools.pullImage {
+        imageName = name;
+        imageDigest = digest;
+        finalImageName = name;
+        finalImageTag = tag;
+        os = "linux";
+        inherit (inputs.${arch.short}) sha256;
+        inherit (arch) arch;
+      };
+    in
+    {
+      image = "${name}:${tag}";
+      imageFile = image;
+      base = image;
     };
-  in
-  {
-    image = "${name}:${tag}";
-    imageFile = image;
-    base = image;
-  };
 
-in
-{
-  alpine = mkImage {
-    name = "alpine";
-    tag = "3.20.3";
-    digest = "sha256:1e42bbe2508154c9126d48c2b8a75420c3544343bf86fd041fb7527e017a4b4a";
-    x86.sha256 = "02fr1isg8s2h7j8n5rda7avswnh7vpfhrix3rmvqsjp8cx3qbkz3";
-    arm.sha256 = "06c0q5kk60i89y1d83a28wk282ymp806xjcsmlca4cwwqp590j0q";
-  };
-  
-  postgres13 = mkImage {
-    name = "postgres";
-    tag = "13-alpine";
-    digest = "sha256:857aa00fc7e8541e3e5818b7bb8596182cb5c1b3ad964e4184e90682d5ca0d57";
-    x86.sha256 = "1yc0576kdfsz55ybjaykki2mhr6w9yrby7wslx8pfmn7xkykzq9w";
-    arm.sha256 = "0kjxk2sd03445mgf54x1ir9w2zmjn41zgmyns2h3k3cd7qazhkrx";
-  };
+  images = {
+    alpine = mkImage {
+      name = "alpine";
+      tag = "3.20.3";
+      digest = "sha256:1e42bbe2508154c9126d48c2b8a75420c3544343bf86fd041fb7527e017a4b4a";
+      x86.sha256 = "02fr1isg8s2h7j8n5rda7avswnh7vpfhrix3rmvqsjp8cx3qbkz3";
+      arm.sha256 = "06c0q5kk60i89y1d83a28wk282ymp806xjcsmlca4cwwqp590j0q";
+    };
+
+    postgres13 = mkImage {
+      name = "postgres";
+      tag = "13-alpine";
+      digest = "sha256:857aa00fc7e8541e3e5818b7bb8596182cb5c1b3ad964e4184e90682d5ca0d57";
+      x86.sha256 = "1yc0576kdfsz55ybjaykki2mhr6w9yrby7wslx8pfmn7xkykzq9w";
+      arm.sha256 = "0kjxk2sd03445mgf54x1ir9w2zmjn41zgmyns2h3k3cd7qazhkrx";
+    };
+
+    postgres14 = mkImage {
+      name = "postgres";
+      tag = "14-alpine";
+      digest = "sha256:3f5fc44eeb8e8b42448e218f05299105761a2c33b54a89d9fd06c87cd5f7b043";
+      x86.sha256 = "1zpiv9d6mj9d3n2xhgz0wn8q7a4gzjrk0hp8vpm706wwh72q8nir";
+      arm.sha256 = "1gh6f4frfilr5mp6smp1k00aijd9vh1kv711a64044yl9kqr2nci";
+    };
 
-  postgres14 = mkImage {
-    name = "postgres";
-    tag = "14-alpine";
-    digest = "sha256:3f5fc44eeb8e8b42448e218f05299105761a2c33b54a89d9fd06c87cd5f7b043";
-    x86.sha256 = "1zpiv9d6mj9d3n2xhgz0wn8q7a4gzjrk0hp8vpm706wwh72q8nir";
-    arm.sha256 = "1gh6f4frfilr5mp6smp1k00aijd9vh1kv711a64044yl9kqr2nci";
+    postgres15 = mkImage {
+      name = "postgres";
+      tag = "15-alpine";
+      digest = "sha256:8b963ea3038c3b32182ee7f592ccde21242fa7c5fd9d1b72aa333c27f1bfc809";
+      x86.sha256 = "0cfmp4v1a4b2m21ljsc3f3kn23rl9nki6z37ks9jclzxh9hy629n";
+      arm.sha256 = "0wydmscp4znjdflycvjqwjfry9crizhav0wc2hnajbyvk4ql32h8";
+    };
   };
 
-  postgres15 = mkImage {
-    name = "postgres";
-    tag = "15-alpine";
-    digest = "sha256:8b963ea3038c3b32182ee7f592ccde21242fa7c5fd9d1b72aa333c27f1bfc809";
-    x86.sha256 = "0cfmp4v1a4b2m21ljsc3f3kn23rl9nki6z37ks9jclzxh9hy629n";
-    arm.sha256 = "0wydmscp4znjdflycvjqwjfry9crizhav0wc2hnajbyvk4ql32h8";
+  soloOrDuoPort =
+    p:
+    with builtins;
+    if isList p then
+      assert length p == 2;
+      {
+        host = elemAt p 0;
+        container = elemAt p 1;
+      }
+    else if isInt p then
+      {
+        host = p;
+        container = p;
+      }
+    else
+      throw "unknown port type given";
+
+  ports = {
+    globalPort =
+      p:
+      let
+        ports = soloOrDuoPort p;
+        host = toString ports.host;
+        container = toString ports.container;
+      in
+      "0.0.0.0:${host}:${container}";
+
+    tailnetPort =
+      me: p:
+      let
+        ports = soloOrDuoPort p;
+        host = toString ports.host;
+        container = toString ports.container;
+      in
+      "${me.tailscale.ip}:${host}:${container}";
   };
-}
+in
+images // ports
diff --git a/services/irc/soju.nix b/services/irc/soju.nix
index f6c7ff0..e5c55c1 100644
--- a/services/irc/soju.nix
+++ b/services/irc/soju.nix
@@ -4,8 +4,8 @@ let
   inherit (pkgs) dockerTools soju;
   inherit (auxiliaryPkgs) common;
 
-  ircPort = "6667";
-  socketPort = "3030";
+  ircPort = 6667;
+  socketPort = 3030;
   sojuDir = "/srv/soju";
 
   sojuImage = dockerTools.streamLayeredImage {
@@ -22,24 +22,20 @@ let
 
 in
 {
-  virtualisation.oci-containers.containers = {
-    soju = {
-      imageStream = sojuImage;
-      image = "soju:${soju.version}";
-      # TODO: allow tailscale ports in foundation
-      ports = [
-        "${me.tailscale.ip}:${ircPort}:${ircPort}"
-        "${me.tailscale.ip}:${socketPort}:${socketPort}"
-      ];
-
-      volumes = [
-        "${sojuDir}/config.in:/etc/soju/config.in"
-        "${sojuDir}/soju.db:/var/lib/soju/soju.db"
-        "${sojuDir}/logs:/var/lib/soju/logs"
-      ];
-
-      entrypoint = "${soju}/bin/soju";
-      cmd = [ "-config" "/etc/soju/config.in" ];
-    };
+  foundation.services.soju = {
+    image = sojuImage;
+    ports = [
+      (common.tailnetPort me ircPort)
+      (common.tailnetPort me socketPort)
+    ];
+
+    volumes = [
+      [ "${sojuDir}/config.in" "/etc/soju/config.in" ]
+      [ "${sojuDir}/soju.db" "/var/lib/soju/soju.db" ]
+      [ "${sojuDir}/logs" "/var/lib/soju/logs" ]
+    ];
+
+    entrypoint = "${soju}/bin/soju";
+    cmd = [ "-config" "/etc/soju/config.in" ];
   };
 }
diff --git a/services/minecraft.nix b/services/minecraft.nix
index cd04e31..0690f40 100644
--- a/services/minecraft.nix
+++ b/services/minecraft.nix
@@ -28,16 +28,11 @@ in
 {
   networking.firewall.allowedTCPPorts = [ minecraftPort ];
 
-  # TODO: put global ports into foundation
-  virtualisation.oci-containers.containers.minecraft = {
-    imageStream = minecraftImage;
-    image = "minecraft:${minecraft.version}";
-    # expose minecraft service port globally.
-    ports = [ "0.0.0.0:${toString minecraftPort}:${toString minecraftPort}" ];
-
-    volumes = [
-      "${minecraftDir}:/server"
-    ];
+  foundation.services.minecraft = {
+    image = minecraftImage;
+    ports = [ (common.globalPort minecraftPort) ];
+
+    volumes = [ [ "${minecraftDir}" "/server" ] ];
 
     workdir = "/server";
     entrypoint = "${minecraft}/bin/minecraft-server";