grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / search / meilisearch.nix
blob39197c5e69e1531565520c75dc6a94f7857da0a7
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.meilisearch;
8 in
11   meta.maintainers = with maintainers; [ Br1ght0ne happysalada ];
12   meta.doc = ./meilisearch.md;
14   ###### interface
16   options.services.meilisearch = {
17     enable = mkEnableOption "MeiliSearch - a RESTful search API";
19     package = mkPackageOption pkgs "meilisearch" {
20       extraDescription = ''
21         Use this if you require specific features to be enabled. The default package has no features.
22       '';
23     };
25     listenAddress = mkOption {
26       description = "MeiliSearch listen address.";
27       default = "127.0.0.1";
28       type = types.str;
29     };
31     listenPort = mkOption {
32       description = "MeiliSearch port to listen on.";
33       default = 7700;
34       type = types.port;
35     };
37     environment = mkOption {
38       description = "Defines the running environment of MeiliSearch.";
39       default = "development";
40       type = types.enum [ "development" "production" ];
41     };
43     # TODO change this to LoadCredentials once possible
44     masterKeyEnvironmentFile = mkOption {
45       description = ''
46         Path to file which contains the master key.
47         By doing so, all routes will be protected and will require a key to be accessed.
48         If no master key is provided, all routes can be accessed without requiring any key.
49         The format is the following:
50         MEILI_MASTER_KEY=my_secret_key
51       '';
52       default = null;
53       type = with types; nullOr path;
54     };
56     noAnalytics = mkOption {
57       description = ''
58         Deactivates analytics.
59         Analytics allow MeiliSearch to know how many users are using MeiliSearch,
60         which versions and which platforms are used.
61         This process is entirely anonymous.
62       '';
63       default = true;
64       type = types.bool;
65     };
67     logLevel = mkOption {
68       description = ''
69         Defines how much detail should be present in MeiliSearch's logs.
70         MeiliSearch currently supports four log levels, listed in order of increasing verbosity:
71         - 'ERROR': only log unexpected events indicating MeiliSearch is not functioning as expected
72         - 'WARN:' log all unexpected events, regardless of their severity
73         - 'INFO:' log all events. This is the default value
74         - 'DEBUG': log all events and including detailed information on MeiliSearch's internal processes.
75           Useful when diagnosing issues and debugging
76       '';
77       default = "INFO";
78       type = types.str;
79     };
81     maxIndexSize = mkOption {
82       description = ''
83         Sets the maximum size of the index.
84         Value must be given in bytes or explicitly stating a base unit.
85         For example, the default value can be written as 107374182400, '107.7Gb', or '107374 Mb'.
86         Default is 100 GiB
87       '';
88       default = "107374182400";
89       type = types.str;
90     };
92     payloadSizeLimit = mkOption {
93       description = ''
94         Sets the maximum size of accepted JSON payloads.
95         Value must be given in bytes or explicitly stating a base unit.
96         For example, the default value can be written as 107374182400, '107.7Gb', or '107374 Mb'.
97         Default is ~ 100 MB
98       '';
99       default = "104857600";
100       type = types.str;
101     };
103   };
105   ###### implementation
107   config = mkIf cfg.enable {
108     systemd.services.meilisearch = {
109       description = "MeiliSearch daemon";
110       wantedBy = [ "multi-user.target" ];
111       after = [ "network.target" ];
112       environment = {
113         MEILI_DB_PATH = "/var/lib/meilisearch";
114         MEILI_HTTP_ADDR = "${cfg.listenAddress}:${toString cfg.listenPort}";
115         MEILI_NO_ANALYTICS = toString cfg.noAnalytics;
116         MEILI_ENV = cfg.environment;
117         MEILI_DUMP_DIR = "/var/lib/meilisearch/dumps";
118         MEILI_LOG_LEVEL = cfg.logLevel;
119         MEILI_MAX_INDEX_SIZE = cfg.maxIndexSize;
120       };
121       serviceConfig = {
122         ExecStart = "${cfg.package}/bin/meilisearch";
123         DynamicUser = true;
124         StateDirectory = "meilisearch";
125         EnvironmentFile = mkIf (cfg.masterKeyEnvironmentFile != null) cfg.masterKeyEnvironmentFile;
126       };
127     };
128   };