summary refs log tree commit diff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/dendrite.nix110
1 files changed, 110 insertions, 0 deletions
diff --git a/services/dendrite.nix b/services/dendrite.nix
new file mode 100644
index 0000000..5eecfd6
--- /dev/null
+++ b/services/dendrite.nix
@@ -0,0 +1,110 @@
+{ lib, pkgs, unstablePkgs, ... }:
+
+let
+  inherit (pkgs) dockerTools;
+
+  dendriteDir = "/srv/dendrite";
+
+  dendrite = unstablePkgs.dendrite;
+
+  baseImageArm = dockerTools.pullImage {
+    imageName = "alpine";
+    imageDigest = "sha256:1e42bbe2508154c9126d48c2b8a75420c3544343bf86fd041fb7527e017a4b4a";
+    sha256 = "06c0q5kk60i89y1d83a28wk282ymp806xjcsmlca4cwwqp590j0q";
+    finalImageName = "alpine";
+    finalImageTag = "3.20.3";
+    os = "linux";
+    arch = "arm64";
+  };
+
+  dendriteImage = dockerTools.buildLayeredImage {
+    name = "dendrite";
+    tag = dendrite.version;
+    fromImage = baseImageArm;
+
+    contents = [ dendrite ];
+  };
+
+in
+{
+  virtualisation.oci-containers.containers = {
+    dendrite = {
+      imageFile = dendriteImage;
+      image = "dendrite:${dendrite.version}";
+      ports = [ 
+        "127.0.0.1:8008:8008"
+        "127.0.0.1:8448:8448"
+      ];
+
+      volumes = [
+        "${dendriteDir}/config:/etc/dendrite"
+        "${dendriteDir}/data:/var/dendrite"
+      ];
+
+      entrypoint = "${dendrite}/bin/dendrite";
+      workdir = "/etc/dendrite";
+      
+      dependsOn = [ "dendrite-db" ];
+
+      extraOptions = [
+        "--network-alias=dendrite"
+        "--network=dendrite"
+      ];
+    };
+
+    dendrite-db = {
+      # TODO: pull through `dockerTools`.
+      image = "postgres:15-alpine";
+      volumes = [ "${dendriteDir}/pgdata:/var/lib/postgresql/data" ];
+
+      environment = {
+        "POSTGRES_DATABASE" = "dendrite";
+        "POSTGRES_USER" = "dendrite";
+        "POSTGRES_PASSWORD" = "TFbQi2cHnzwe26";
+      };
+
+      extraOptions = [
+        "--network-alias=db"
+        "--network=dendrite"
+      ];
+    };
+  };
+
+  systemd = let
+    root = "docker-dendrite-root";
+    network = "docker-dendrite-network";
+
+    containerService = {
+      serviceConfig = {
+        Restart = lib.mkOverride 90 "always";
+        RestartMaxDelaySec = lib.mkOverride 90 "1m";
+        RestartSec = lib.mkOverride 90 "100ms";
+        RestartSteps = lib.mkOverride 90 9;
+      };
+      after = [ "${network}.service" ]; requires = [ "${network}.service" ];
+      partOf = [ "${root}.target" ]; wantedBy = [ "${root}.target" ];
+    };
+  in {
+    services = {
+      "docker-dendrite-db" = containerService;
+      "docker-dendrite" = containerService;
+
+      "${network}" = {
+        path = [ pkgs.docker ];
+        serviceConfig = {
+          Type = "oneshot";
+          RemainAfterExit = true;
+          ExecStop = "docker network rm -f dendrite";
+        };
+        script = ''
+          docker network inspect dendrite || docker network create dendrite --driver=bridge
+        '';
+        partOf = [ "${root}.target" ]; wantedBy = [ "${root}.target" ];
+      };
+    };
+
+    targets = {
+      "${root}" = { wantedBy = [ "multi-user.target" ]; };
+    };
+  };
+}