nix/home/programs/ollama.nix
2024-05-01 16:01:21 +10:00

78 lines
2.3 KiB
Nix

{
config,
lib,
pkgs,
...
}: {
config.programs.firefox.webapps = {
"OpenWebUI" = {
url = "http://127.0.0.1:3021";
id = 6;
extraSettings = config.programs.firefox.profiles.default.settings;
name = "OpenWebUI Client";
hidden = true;
};
};
config.systemd.user.services = {
open-webui = {
Unit.Description = "OpenWebUI";
Service = let
docker = lib.getExe pkgs.docker;
in {
Type = "exec";
ExecStartPre = "-${docker} create -e PORT=3021 --network host --gpus all -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama";
ExecStart = "${docker} start open-webui";
ExecStop = "${docker} stop open-webui";
};
};
};
config.xdg.desktopEntries = {
open-webui = {
name = "Ollama OpenWebUI";
type = "Application";
icon = ../icons/openwebui.png;
exec = "${let
notify-send = "${lib.getExe' pkgs.libnotify "notify-send"}";
systemctl = "${lib.getExe' pkgs.systemd "systemctl"}";
dex = "${lib.getExe pkgs.dex}";
curl = "${lib.getExe pkgs.curl}";
in
pkgs.writeShellScript "ollama"
''
${notify-send} "Ollama OpenWebUI" "Launching backend.."
${systemctl} --user start open-webui
attempts=0
success=false
while [[ $attempts -lt $((20*9)) ]]; do
if [[ $(${curl} http://127.0.0.1:3021) ]]; then
${notify-send} "Ollama OpenWebUI" "Launching client.."
success=true
break
else
attempts=$((attempts+1))
if [[ $(($attempts % 20)) -eq 0 ]]; then
${notify-send} "Ollama OpenWebUI" "Still launching backend.. ($((attempts/2))s)"
fi
fi
sleep 0.5
done
if [[ ! $success ]]; then
${notify-send} "Ollama OpenWebUI" "Failed to launch backend!"
${systemctl} --user kill open-webui
exit 1
fi
sleep 0.5 # give it a little time
${dex} -w ~/.nix-profile/share/applications/OpenWebUI.desktop
${notify-send} "Ollama OpenWebUI" "Shutting down."
${systemctl} --user stop open-webui
exit 0
''}";
};
};
}