summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/foundation/services.nix19
-rw-r--r--pkgs/common.nix157
-rw-r--r--services/irc/soju.nix34
-rw-r--r--services/minecraft.nix13
4 files changed, 137 insertions, 86 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}"
- ];
+ 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"
- ];
+ 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" ];
- };
+ 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}" ];
+ foundation.services.minecraft = {
+ image = minecraftImage;
+ ports = [ (common.globalPort minecraftPort) ];
- volumes = [
- "${minecraftDir}:/server"
- ];
+ volumes = [ [ "${minecraftDir}" "/server" ] ];
workdir = "/server";
entrypoint = "${minecraft}/bin/minecraft-server";