diff --git a/modules/nixos/librechat-oci/default.nix b/modules/nixos/librechat-oci/default.nix index df87a02..7dde06a 100644 --- a/modules/nixos/librechat-oci/default.nix +++ b/modules/nixos/librechat-oci/default.nix @@ -16,6 +16,14 @@ let finalImageTag = "v0.8.5"; }; + meiliImage = pkgs.dockerTools.pullImage { + imageName = "getmeili/meilisearch"; + imageDigest = "sha256:b839a48d008d4e67e57f78dcff5b21d5e8b8fa066bacd11f97824d6307abb0dd"; + hash = "sha256-+hypvjFDSdnnWAO4tARTnjNd/6HlF6pMg1L6UUffdYM="; + finalImageName = "getmeili/meilisearch"; + finalImageTag = "v1.44.0"; + }; + defaultEnv = { HOST = "0.0.0.0"; PORT = "3080"; @@ -45,6 +53,11 @@ in default = image; description = "The Docker image to use (`pkgs.dockerTools.pullImage`)."; }; + meiliImage = mkOption { + type = types.package; + default = meiliImage; + description = "The Meilisearch Docker image to use (`pkgs.dockerTools.pullImage`)."; + }; externalUrl = mkOption { type = types.nullOr types.str; default = null; @@ -56,6 +69,11 @@ in default = 3080; description = "Which port the LibreChat server listens to."; }; + meiliPort = mkOption { + type = types.port; + default = 7700; + description = "Which port Meilisearch listens to."; + }; environment = mkOption { default = { }; type = types.attrsOf types.str; @@ -105,6 +123,21 @@ in ]; }; + virtualisation.oci-containers.containers."librechat-meilisearch" = { + image = with cfg.meiliImage; imageName + ":" + imageTag; + imageFile = cfg.meiliImage; + environment = { + MEILI_NO_ANALYTICS = "true"; + }; + volumes = [ + "librechat_meili_data:/meili_data:rw" + ]; + log-driver = "journald"; + extraOptions = [ + "--network=host" + ]; + }; + virtualisation.oci-containers.containers.librechat = { image = with cfg.image; imageName + ":" + imageTag; imageFile = cfg.image; @@ -112,8 +145,10 @@ in defaultEnv // { MONGO_URI = "mongodb://root:librechat@localhost:27017/LibreChat?authSource=admin"; + MEILI_HOST = "http://localhost:${toString cfg.meiliPort}"; } // cfg.environment; + environmentFiles = lib.optional (cfg.environmentFile != null) cfg.environmentFile; volumes = [ "librechat_data:/app/client/data:rw" "librechat_images:/app/client/public/images:rw" @@ -147,6 +182,24 @@ in ]; }; + systemd.services."podman-librechat-meilisearch" = { + serviceConfig = { + Restart = mkOverride 90 "always"; + }; + after = [ + "podman-volume-librechat_meili_data.service" + ]; + requires = [ + "podman-volume-librechat_meili_data.service" + ]; + partOf = [ + "podman-compose-librechat-root.target" + ]; + wantedBy = [ + "podman-compose-librechat-root.target" + ]; + }; + systemd.services."podman-librechat" = { serviceConfig = { Restart = mkOverride 90 "always"; @@ -157,6 +210,7 @@ in "podman-volume-librechat_uploads.service" "podman-volume-librechat_logs.service" "podman-librechat-mongodb.service" + "podman-librechat-meilisearch.service" ]; requires = [ "podman-volume-librechat_data.service" @@ -164,6 +218,7 @@ in "podman-volume-librechat_uploads.service" "podman-volume-librechat_logs.service" "podman-librechat-mongodb.service" + "podman-librechat-meilisearch.service" ]; partOf = [ "podman-compose-librechat-root.target" @@ -238,6 +293,19 @@ in wantedBy = [ "podman-compose-librechat-root.target" ]; }; + systemd.services."podman-volume-librechat_meili_data" = { + path = [ pkgs.podman ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + script = '' + podman volume inspect librechat_meili_data || podman volume create librechat_meili_data + ''; + partOf = [ "podman-compose-librechat-root.target" ]; + wantedBy = [ "podman-compose-librechat-root.target" ]; + }; + systemd.targets."podman-compose-librechat-root" = { unitConfig = { Description = "Root target generated by compose2nix.";