grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / search / qdrant.nix
blob41a4e9b41f6d9093b5b1bbd1a247b5ad161d69f9
1 { config, lib, pkgs, ... }:
3 with lib;
4 let
6   cfg = config.services.qdrant;
8   settingsFormat = pkgs.formats.yaml { };
9   configFile = settingsFormat.generate "config.yaml" cfg.settings;
10 in {
12   options = {
13     services.qdrant = {
14       enable = mkEnableOption "Vector Search Engine for the next generation of AI applications";
16       settings = mkOption {
17         description = ''
18           Configuration for Qdrant
19           Refer to <https://github.com/qdrant/qdrant/blob/master/config/config.yaml> for details on supported values.
20         '';
22         type = settingsFormat.type;
24         example = {
25           storage = {
26             storage_path = "/var/lib/qdrant/storage";
27             snapshots_path = "/var/lib/qdrant/snapshots";
28           };
29           hsnw_index = {
30             on_disk = true;
31           };
32           service = {
33             host = "127.0.0.1";
34             http_port = 6333;
35             grpc_port = 6334;
36           };
37           telemetry_disabled = true;
38         };
40         defaultText = literalExpression ''
41           {
42             storage = {
43               storage_path = "/var/lib/qdrant/storage";
44               snapshots_path = "/var/lib/qdrant/snapshots";
45             };
46             hsnw_index = {
47               on_disk = true;
48             };
49             service = {
50               host = "127.0.0.1";
51               http_port = 6333;
52               grpc_port = 6334;
53             };
54             telemetry_disabled = true;
55           }
56         '';
57       };
58     };
59   };
61   config = mkIf cfg.enable {
62     services.qdrant.settings = {
63       service.static_content_dir = mkDefault pkgs.qdrant-web-ui;
64       storage.storage_path = mkDefault "/var/lib/qdrant/storage";
65       storage.snapshots_path = mkDefault "/var/lib/qdrant/snapshots";
66       # The following default values are the same as in the default config,
67       # they are just written here for convenience.
68       storage.on_disk_payload = mkDefault true;
69       storage.wal.wal_capacity_mb = mkDefault 32;
70       storage.wal.wal_segments_ahead = mkDefault 0;
71       storage.performance.max_search_threads = mkDefault 0;
72       storage.performance.max_optimization_threads = mkDefault 1;
73       storage.optimizers.deleted_threshold = mkDefault 0.2;
74       storage.optimizers.vacuum_min_vector_number = mkDefault 1000;
75       storage.optimizers.default_segment_number = mkDefault 0;
76       storage.optimizers.max_segment_size_kb = mkDefault null;
77       storage.optimizers.memmap_threshold_kb = mkDefault null;
78       storage.optimizers.indexing_threshold_kb = mkDefault 20000;
79       storage.optimizers.flush_interval_sec = mkDefault 5;
80       storage.optimizers.max_optimization_threads = mkDefault 1;
81       storage.hnsw_index.m = mkDefault 16;
82       storage.hnsw_index.ef_construct = mkDefault 100;
83       storage.hnsw_index.full_scan_threshold_kb = mkDefault 10000;
84       storage.hnsw_index.max_indexing_threads = mkDefault 0;
85       storage.hnsw_index.on_disk = mkDefault false;
86       storage.hnsw_index.payload_m = mkDefault null;
87       service.max_request_size_mb = mkDefault 32;
88       service.max_workers = mkDefault 0;
89       service.http_port = mkDefault 6333;
90       service.grpc_port = mkDefault 6334;
91       service.enable_cors = mkDefault true;
92       cluster.enabled = mkDefault false;
93       # the following have been altered for security
94       service.host = mkDefault "127.0.0.1";
95       telemetry_disabled = mkDefault true;
96     };
98     systemd.services.qdrant = {
99       description = "Vector Search Engine for the next generation of AI applications";
100       wantedBy = [ "multi-user.target" ];
101       after = [ "network.target" ];
103       serviceConfig = {
104         LimitNOFILE=65536;
105         ExecStart = "${pkgs.qdrant}/bin/qdrant --config-path ${configFile}";
106         DynamicUser = true;
107         Restart = "on-failure";
108         StateDirectory = "qdrant";
109         CapabilityBoundingSet = "";
110         NoNewPrivileges = true;
111         PrivateTmp = true;
112         ProtectHome = true;
113         ProtectClock = true;
114         ProtectProc = "noaccess";
115         ProcSubset = "pid";
116         ProtectKernelLogs = true;
117         ProtectKernelModules = true;
118         ProtectKernelTunables = true;
119         ProtectControlGroups = true;
120         ProtectHostname = true;
121         RestrictSUIDSGID = true;
122         RestrictRealtime = true;
123         RestrictNamespaces = true;
124         LockPersonality = true;
125         RemoveIPC = true;
126         SystemCallFilter = [ "@system-service" "~@privileged" ];
127       };
128     };
129   };