Skip to content

Commit

Permalink
feat: Add Weaviate service (#195)
Browse files Browse the repository at this point in the history
resolves #90
  • Loading branch information
jedimahdi authored May 28, 2024
1 parent cf76850 commit 2fba2e0
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 0 deletions.
1 change: 1 addition & 0 deletions doc/services.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@ short-title: Services
- [[tempo]]
- [[prometheus]]#
- [[cassandra]]#
- [[weaviate]]#

[gh]: https://github.com/juspay/services-flake/issues/132
67 changes: 67 additions & 0 deletions doc/weaviate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Weaviate

[Weaviate] is an open-source vector database that stores both objects and vectors, allowing for the combination of vector search with structured filtering with the fault tolerance and scalability of a cloud-native database.

[Weaviate]: https://github.com/weaviate/weaviate

{#start}

## Getting started

```nix
# In `perSystem.process-compose.<name>`
{
services.weaviate."weaviate1".enable = true;
}
```

{#tips}

## Tips & Tricks

{#envs}

### Environment variables

To see list of environment variables, see [this link](https://weaviate.io/developers/weaviate/config-refs/env-vars).

```nix
{
services.weaviate."weaviate1" = {
enable = true;
envs = {
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED = true;
QUERY_DEFAULTS_LIMIT = 100;
DISABLE_TELEMETRY = true;
LIMIT_RESOURCES = true;
ENABLE_MODULES = ["text2vec-openai" "generative-openai"];
};
};
}
```

{#port}

### Use a different port

```nix
{
services.weaviate."weaviate1" = {
enable = true;
port = 8080;
};
}
```

{#dataDir}

### Use a different data path

```nix
{
services.weaviate."weaviate1" = {
enable = true;
dataDir = "./data";
};
}
```
1 change: 1 addition & 0 deletions nix/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@ in
./pgadmin.nix
./cassandra.nix
./tempo.nix
./weaviate.nix
];
}
99 changes: 99 additions & 0 deletions nix/weaviate.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
{ 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";
};
};
};
};
};
}
24 changes: 24 additions & 0 deletions nix/weaviate_test.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{ pkgs, config, ... }: {
services.weaviate."weaviate1" = {
enable = true;
environment = {
# To fix the problem with nix failing to run weaviate in sandbox mode
CLUSTER_ADVERTISE_ADDR = "127.0.0.1";
};
};

settings.processes.test =
let
cfg = config.services.weaviate."weaviate1";
in
{
command = pkgs.writeShellApplication {
runtimeInputs = [ cfg.package pkgs.curl ];
text = ''
curl http://localhost:8080/v1/.well-known/live
'';
name = "weaviate-test";
};
depends_on."weaviate1".condition = "process_healthy";
};
}
1 change: 1 addition & 0 deletions test/flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"${inputs.services-flake}/nix/pgadmin_test.nix"
"${inputs.services-flake}/nix/cassandra_test.nix"
"${inputs.services-flake}/nix/tempo_test.nix"
"${inputs.services-flake}/nix/weaviate_test.nix"
]);
};
};
Expand Down

0 comments on commit 2fba2e0

Please sign in to comment.