/ nixosModules / qdrant.nix
qdrant.nix
 1  {
 2    self,
 3    config,
 4    lib,
 5    ...
 6  }:
 7  let
 8    cfg = config.services.qdrant;
 9  
10    clanLib = self.inputs.clan-core.lib;
11  
12    wgPrefix = clanLib.getPublicValue {
13      flake = config.clan.core.settings.directory;
14      machine = "taps";
15      generator = "wireguard-network-wireguard";
16      file = "prefix";
17    };
18    localSuffix = config.clan.core.vars.generators.wireguard-network-wireguard.files.suffix.value;
19    localWgIP = "${wgPrefix}:${localSuffix}";
20  in
21  {
22    config = lib.mkIf cfg.enable {
23      users.users.qdrant = {
24        isSystemUser = true;
25        group = "qdrant";
26        home = "/var/lib/qdrant";
27      };
28      users.groups.qdrant = { };
29  
30      systemd.services.qdrant.serviceConfig.DynamicUser = lib.mkForce false;
31      systemd.services.qdrant.serviceConfig.User = "qdrant";
32      systemd.services.qdrant.serviceConfig.Group = "qdrant";
33  
34      # ZFS dataset for Qdrant data
35      disko.devices.zpool.zroot.datasets."qdrant" = {
36        type = "zfs_fs";
37        mountpoint = "/var/lib/qdrant";
38        options = {
39          compression = "lz4";
40          recordsize = "128K"; # Good for sequential vector reads
41          "com.sun:auto-snapshot" = "true";
42        };
43      };
44  
45      services.qdrant = {
46        settings = {
47          # Network: bind to WireGuard IP only
48          service = {
49            host = localWgIP;
50            http_port = 6333;
51            grpc_port = 6334;
52            # Performance settings
53            max_workers = 2; # Conservative for N100
54            enable_cors = true;
55          };
56  
57          # Storage paths
58          storage = {
59            storage_path = "/var/lib/qdrant/storage";
60            snapshots_path = "/var/lib/qdrant/snapshots";
61            # Performance: keep HNSW index on disk for memory efficiency
62            on_disk_payload = true;
63          };
64  
65          # HNSW index settings (memory efficient)
66          hnsw_index = {
67            on_disk = true;
68          };
69  
70          # Disable telemetry
71          telemetry_disabled = true;
72  
73          # Logging
74          log_level = "INFO";
75        };
76      };
77  
78      # Resource limits for N100 + 32GB
79      systemd.services.qdrant.serviceConfig = {
80        MemoryMax = "6G";
81        CPUQuota = "200%"; # 2 cores
82      };
83  
84      # Ensure correct ownership for ZFS dataset
85      systemd.tmpfiles.rules = [
86        "Z /var/lib/qdrant 0750 qdrant qdrant -"
87      ];
88  
89      # Firewall: allow access from WireGuard network
90      networking.firewall.interfaces."wireguard".allowedTCPPorts = [
91        6333 # HTTP API
92        6334 # gRPC API
93      ];
94    };
95  }