services-flake/nix/weaviate.nix
2024-05-28 12:30:40 +05:30

100 lines
2.7 KiB
Nix

{ pkgs, lib, name, config, ... }:
let
inherit (lib) types;
asAtom = value:
if builtins.isList value then lib.concatStringsSep "," value else value;
toStr = value:
if builtins.isString value then value else builtins.toJSON value;
in
{
options = {
enable = lib.mkEnableOption name;
package = lib.mkPackageOption pkgs "weaviate" { };
dataDir = lib.mkOption {
type = types.str;
default = "./data/${name}";
description = "Path to the Weaviate data store";
};
host = lib.mkOption {
type = types.str;
default = "127.0.0.1";
description = ''
The IP to listen on
'';
example = "0.0.0.0";
};
port = lib.mkOption {
type = types.port;
default = 8080;
description = ''
The port to listen on for connections
'';
};
environment = lib.mkOption {
type = types.attrsOf (types.oneOf [ types.raw (types.listOf types.str) ]);
default = { };
description = ''
Weaviate environment variables.
See https://weaviate.io/developers/weaviate/config-refs/env-vars
'';
example = lib.literalExpression ''
{
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED = true;
QUERY_DEFAULTS_LIMIT = 100;
DISABLE_TELEMETRY = true;
LIMIT_RESOURCES = true;
ENABLE_MODULES = ["text2vec-openai" "generative-openai"];
}
'';
apply = lib.mapAttrs (_: value: toStr (asAtom value));
};
outputs.settings = lib.mkOption {
type = types.deferredModule;
internal = true;
readOnly = true;
default = {
processes = {
"${name}" =
let
startScript = pkgs.writeShellApplication {
name = "start-weaviate";
runtimeInputs = [ config.package ];
text = ''
exec weaviate --scheme http --host ${config.host} --port ${toString config.port}
'';
};
in
{
environment = config.environment // { "PERSISTENCE_DATA_PATH" = config.dataDir; };
command = startScript;
readiness_probe = {
http_get = {
inherit (config) host port;
path = "/v1/.well-known/ready";
};
initial_delay_seconds = 3;
period_seconds = 10;
timeout_seconds = 4;
success_threshold = 1;
failure_threshold = 5;
};
namespace = name;
# https://github.com/F1bonacc1/process-compose#-auto-restart-if-not-healthy
availability.restart = "on_failure";
};
};
};
};
};
}