From 227a29b06e09ce765da12e5cab74f9c539c1fe1e Mon Sep 17 00:00:00 2001 From: Mel Date: Thu, 14 Nov 2024 18:20:48 +0100 Subject: Dendrite service from lapin Signed-off-by: Mel --- services/dendrite.nix | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 services/dendrite.nix (limited to 'services/dendrite.nix') 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" ]; }; + }; + }; +} -- cgit 1.4.1