linuxKernel.kernels.linux_zen: 6.11.5-zen1 -> v6.12.1-zen1; linuxKernel.kernels.linux...
[NixPkgs.git] / nixos / modules / services / web-servers / garage.nix
blobbfc3fed4a2a5ae082a3816a76851980336024084
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 with lib;
10 let
11   cfg = config.services.garage;
12   toml = pkgs.formats.toml { };
13   configFile = toml.generate "garage.toml" cfg.settings;
15   anyHasPrefix =
16     prefix: strOrList:
17     if isString strOrList then
18       hasPrefix prefix strOrList
19     else
20       any ({ path, ... }: hasPrefix prefix path) strOrList;
23   meta = {
24     doc = ./garage.md;
25     maintainers = [ maintainers.mjm ];
26   };
28   options.services.garage = {
29     enable = mkEnableOption "Garage Object Storage (S3 compatible)";
31     extraEnvironment = mkOption {
32       type = types.attrsOf types.str;
33       description = "Extra environment variables to pass to the Garage server.";
34       default = { };
35       example = {
36         RUST_BACKTRACE = "yes";
37       };
38     };
40     environmentFile = mkOption {
41       type = types.nullOr types.path;
42       description = "File containing environment variables to be passed to the Garage server.";
43       default = null;
44     };
46     logLevel = mkOption {
47       type = types.enum ([
48         "error"
49         "warn"
50         "info"
51         "debug"
52         "trace"
53       ]);
54       default = "info";
55       example = "debug";
56       description = "Garage log level, see <https://garagehq.deuxfleurs.fr/documentation/quick-start/#launching-the-garage-server> for examples.";
57     };
59     settings = mkOption {
60       type = types.submodule {
61         freeformType = toml.type;
63         options = {
64           metadata_dir = mkOption {
65             default = "/var/lib/garage/meta";
66             type = types.path;
67             description = "The metadata directory, put this on a fast disk (e.g. SSD) if possible.";
68           };
70           data_dir = mkOption {
71             default = "/var/lib/garage/data";
72             example = [
73               {
74                 path = "/var/lib/garage/data";
75                 capacity = "2T";
76               }
77             ];
78             type = with types; either path (listOf attrs);
79             description = ''
80               The directory in which Garage will store the data blocks of objects. This folder can be placed on an HDD.
81               Since v0.9.0, Garage supports multiple data directories, refer to https://garagehq.deuxfleurs.fr/documentation/reference-manual/configuration/#data_dir for the exact format.
82             '';
83           };
84         };
85       };
86       description = "Garage configuration, see <https://garagehq.deuxfleurs.fr/documentation/reference-manual/configuration/> for reference.";
87     };
89     package = mkOption {
90       type = types.package;
91       description = "Garage package to use, needs to be set explicitly. If you are upgrading from a major version, please read NixOS and Garage release notes for upgrade instructions.";
92     };
93   };
95   config = mkIf cfg.enable {
96     environment.etc."garage.toml" = {
97       source = configFile;
98     };
100     # For administration
101     environment.systemPackages = [
102       (pkgs.writeScriptBin "garage" ''
103         # make it so all future variables set are automatically exported as environment variables
104         set -a
106         # source the set environmentFile (since systemd EnvironmentFile is supposed to be a minor subset of posix sh parsing) (with shell arg escaping to avoid quoting issues)
107         [ -f ${lib.escapeShellArg cfg.environmentFile} ] && . ${lib.escapeShellArg cfg.environmentFile}
109         # exec the program with quoted args (also with shell arg escaping for the program path to avoid quoting issues there)
110         exec ${lib.escapeShellArg (lib.getExe cfg.package)} "$@"
111       '')
112     ];
114     systemd.services.garage = {
115       description = "Garage Object Storage (S3 compatible)";
116       after = [
117         "network.target"
118         "network-online.target"
119       ];
120       wants = [
121         "network.target"
122         "network-online.target"
123       ];
124       wantedBy = [ "multi-user.target" ];
125       restartTriggers = [
126         configFile
127       ] ++ (lib.optional (cfg.environmentFile != null) cfg.environmentFile);
128       serviceConfig = {
129         ExecStart = "${cfg.package}/bin/garage server";
131         StateDirectory = mkIf (
132           anyHasPrefix "/var/lib/garage" cfg.settings.data_dir
133           || hasPrefix "/var/lib/garage" cfg.settings.metadata_dir
134         ) "garage";
135         DynamicUser = lib.mkDefault true;
136         ProtectHome = true;
137         NoNewPrivileges = true;
138         EnvironmentFile = lib.optional (cfg.environmentFile != null) cfg.environmentFile;
139       };
140       environment = {
141         RUST_LOG = lib.mkDefault "garage=${cfg.logLevel}";
142       } // cfg.extraEnvironment;
143     };
144   };