nixos/ollama: add options to bypass sandboxing

abysssol 552eb759 457c3417

Changed files
+36 -2
nixos
modules
services
misc
+36 -2
nixos/modules/services/misc/ollama.nix
···
example = "/home/foo";
description = ''
The home directory that the ollama service is started in.
+
+
See also `services.ollama.writablePaths` and `services.ollama.sandbox`.
'';
};
models = lib.mkOption {
···
example = "/path/to/ollama/models";
description = ''
The directory that the ollama service will read models from and download new models to.
+
+
See also `services.ollama.writablePaths` and `services.ollama.sandbox`
+
if downloading models or other mutation of the filesystem is required.
+
'';
+
};
+
sandbox = lib.mkOption {
+
type = types.bool;
+
default = true;
+
example = false;
+
description = ''
+
Whether to enable systemd's sandboxing capabilities.
+
+
This sets [`DynamicUser`](
+
https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#DynamicUser=
+
), which runs the server as a unique user with read-only access to most of the filesystem.
+
+
See also `services.ollama.writablePaths`.
+
'';
+
};
+
writablePaths = lib.mkOption {
+
type = types.listOf types.str;
+
default = [ ];
+
example = [ "/home/foo" "/mnt/foo" ];
+
description = ''
+
Paths that the server should have write access to.
+
+
This sets [`ReadWritePaths`](
+
https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#ReadWritePaths=
+
), which allows specified paths to be written to through the default sandboxing.
+
+
See also `services.ollama.sandbox`.
'';
};
listenAddress = lib.mkOption {
···
type = types.attrsOf types.str;
default = { };
example = {
-
HOME = "/tmp";
OLLAMA_LLM_LIBRARY = "cpu";
+
HIP_VISIBLE_DEVICES = "0,1";
};
description = ''
Set arbitrary environment variables for the ollama service.
···
ExecStart = "${lib.getExe ollamaPackage} serve";
WorkingDirectory = cfg.home;
StateDirectory = [ "ollama" ];
-
DynamicUser = true;
+
DynamicUser = cfg.sandbox;
+
ReadWritePaths = cfg.writablePaths;
};
};