integrate stateful dockerised AI applications
This commit is contained in:
parent
4712934003
commit
a145fad398
8 changed files with 295 additions and 20 deletions
95
flakes/comfyui/flake.lock
generated
Normal file
95
flakes/comfyui/flake.lock
generated
Normal file
|
@ -0,0 +1,95 @@
|
|||
{
|
||||
"nodes": {
|
||||
"comfyui-mgr": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1714523018,
|
||||
"narHash": "sha256-BsJbbWtgIx7ydyVCy4lxdJR9xAGvCdA3FDGdwcLEuSY=",
|
||||
"owner": "ltdrdata",
|
||||
"repo": "ComfyUI-Manager",
|
||||
"rev": "393bf64b35439ee948dc71483e69c478bb05e35c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "ltdrdata",
|
||||
"repo": "ComfyUI-Manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"comfyui-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1714526620,
|
||||
"narHash": "sha256-mQ9YBiSAR+WbGeEHd7DRdcMSz9+XF6ZrQkxrZigv2Cw=",
|
||||
"owner": "comfyanonymous",
|
||||
"repo": "ComfyUI",
|
||||
"rev": "2aed53c4ac78d842a2e984d23343334a29ed8562",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "comfyanonymous",
|
||||
"repo": "ComfyUI",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1714253743,
|
||||
"narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"comfyui-mgr": "comfyui-mgr",
|
||||
"comfyui-src": "comfyui-src",
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
68
flakes/comfyui/flake.nix
Normal file
68
flakes/comfyui/flake.nix
Normal file
|
@ -0,0 +1,68 @@
|
|||
{
|
||||
description = "ComfyUI";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
comfyui-src = {
|
||||
url = "github:comfyanonymous/ComfyUI";
|
||||
flake = false;
|
||||
};
|
||||
comfyui-mgr = {
|
||||
url = "github:ltdrdata/ComfyUI-Manager";
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
|
||||
# cuda
|
||||
# micromamba
|
||||
# pytorch
|
||||
# triton
|
||||
# comfyui
|
||||
# requirements.txt
|
||||
# needs some kind of mutability escape hatch for addons, models etc..
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
comfyui-src,
|
||||
comfyui-mgr,
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem (
|
||||
system: let
|
||||
pkgs = import nixpkgs {inherit system;};
|
||||
in
|
||||
with pkgs; rec {
|
||||
packages.default = buildFHSEnv {
|
||||
name = "ComfyUI";
|
||||
targetPkgs = pkgs: (with pkgs;
|
||||
with cudaPackages; [
|
||||
cuda_cudart
|
||||
cudnn
|
||||
micromamba
|
||||
]);
|
||||
extraBuildCommands = ''
|
||||
mkdir -p $out/opt/ComfyUI
|
||||
mkdir -p $out/opt/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
cp -R ${comfyui-src}/* $out/opt/ComfyUI
|
||||
cp -R ${comfyui-mgr}/* $out/opt/ComfyUI/custom_nodes/ComfyUI-Manager
|
||||
'';
|
||||
profile = ''
|
||||
ln -nfs /opt/ComfyUI/models /host/etc/comfyui/models
|
||||
ln -nfs /opt/ComfyUI/custom_nodes /host/etc/comfyui/custom_nodes
|
||||
'';
|
||||
# cd /opt/ComfyUI
|
||||
# eval "$(micromamba shell hook --shell bash)"
|
||||
# micromamba activate
|
||||
# micromamba install python pytorch triton
|
||||
# pip install -r requirements.txt
|
||||
# '';
|
||||
runScript = ''
|
||||
bash
|
||||
# ./startup.sh
|
||||
'';
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
|
@ -8,6 +8,8 @@
|
|||
}: {
|
||||
imports = [
|
||||
./home.nix
|
||||
./programs/stable-diffusion.nix
|
||||
./programs/ollama.nix
|
||||
];
|
||||
|
||||
home = {
|
||||
|
|
|
@ -16,7 +16,6 @@ in {
|
|||
./programs/firefox.nix
|
||||
./programs/kitty.nix
|
||||
./programs/zsh.nix
|
||||
./programs/stable-diffusion.nix
|
||||
./util/ez.nix
|
||||
./util/firefox-webapp.nix
|
||||
# inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
|
|
75
home/programs/ollama.nix
Normal file
75
home/programs/ollama.nix
Normal file
|
@ -0,0 +1,75 @@
|
|||
{
|
||||
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 {
|
||||
ExecStartPre = "bash -c '${docker} inspect open-webui || ${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";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config.xdg.desktopEntries = {
|
||||
open-webui = {
|
||||
name = "Ollama OpenWebUI";
|
||||
type = "Application";
|
||||
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
|
||||
''}";
|
||||
};
|
||||
};
|
||||
}
|
|
@ -4,7 +4,8 @@
|
|||
lib,
|
||||
...
|
||||
}: {
|
||||
# TODO: create a flake for this
|
||||
# TODO: figure out if there's a meaningful way to add this to the nix store
|
||||
# if nothing's reproducible should we even bother
|
||||
# https://github.com/AbdBarho/stable-diffusion-webui-docker/
|
||||
|
||||
config.programs.firefox.webapps = {
|
||||
|
@ -13,44 +14,72 @@
|
|||
id = 5;
|
||||
extraSettings = config.programs.firefox.profiles.default.settings;
|
||||
name = "Stable Diffusion Client";
|
||||
hidden = true;
|
||||
};
|
||||
};
|
||||
|
||||
# consider making these manually activated systemd services
|
||||
config.systemd.user.services = {
|
||||
stable-diffusion = {
|
||||
Unit.Description = "Stable Diffusion Backend";
|
||||
Service = {
|
||||
WorkingDirectory = "${config.home.homeDirectory}/code/etc/stable-diffusion-webui-docker";
|
||||
ExecStart = "${lib.getExe pkgs.docker} compose --profile comfy up --build";
|
||||
# ExecStop = "${lib.getExe pkgs.docker} compose stop";
|
||||
};
|
||||
};
|
||||
# stable-diffusion-dl = {}
|
||||
};
|
||||
|
||||
config.xdg.desktopEntries = {
|
||||
stable-diffusion = {
|
||||
name = "Stable Diffusion Backend Start";
|
||||
name = "Stable Diffusion";
|
||||
type = "Application";
|
||||
exec = "systemctl --user start stable-diffusion.service";
|
||||
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 "stable-diffusion"
|
||||
''
|
||||
${notify-send} "Stable Diffusion" "Launching backend.."
|
||||
${systemctl} --user start stable-diffusion
|
||||
attempts=0
|
||||
success=false
|
||||
|
||||
while [[ $attempts -lt $((20*9)) ]]; do
|
||||
if [[ $(${curl} http://127.0.0.1:7860) ]]; then
|
||||
${notify-send} "Stable Diffusion" "Launching client.."
|
||||
success=true
|
||||
break
|
||||
else
|
||||
attempts=$((attempts+1))
|
||||
if [[ $(($attempts % 20)) -eq 0 ]]; then
|
||||
${notify-send} "Stable Diffusion" "Still launching backend.. ($((attempts/2))s)"
|
||||
fi
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
if [[ ! $success ]]; then
|
||||
${notify-send} "Stable Diffusion" "Failed to launch backend!"
|
||||
${systemctl} --user kill stable-diffusion
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sleep 0.5 # give it a little time
|
||||
${dex} -w ~/.nix-profile/share/applications/StableDiffusion.desktop
|
||||
|
||||
${notify-send} "Stable Diffusion" "Shutting down."
|
||||
${systemctl} --user stop stable-diffusion
|
||||
exit 0
|
||||
''}";
|
||||
};
|
||||
stable-diffusion-stop = {
|
||||
name = "Stable Diffusion Backend Stop";
|
||||
type = "Application";
|
||||
exec = "systemctl --user stop stable-diffusion.service";
|
||||
};
|
||||
# settings = {
|
||||
# Path = "${config.home.homeDirectory}/code/etc/stable-diffusion-webui-docker";
|
||||
# };
|
||||
# exec = "kitty -d ${config.home.homeDirectory}/code/etc/stable-diffusion-webui-docker sh -c \"docker compose --profile comfy up --build\"";
|
||||
# stable-diffusion-dl = {
|
||||
# name = "Stable Diffusion Setup";
|
||||
# type = "Application";
|
||||
# settings = {
|
||||
# Path = "${config.home.homeDirectory}/code/etc/stable-diffusion-webui-docker";
|
||||
# };
|
||||
# exec = "kitty --hold docker compose --profile download up --build";
|
||||
# exec = "docker compose --profile download up --build";
|
||||
# };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
}: let
|
||||
inherit (builtins) getAttr stringLength substring;
|
||||
inherit (lib) mkOption;
|
||||
inherit (lib.attrsets) mapAttrs mapAttrs' nameValuePair;
|
||||
inherit (lib.attrsets) filterAttrs mapAttrs mapAttrs' nameValuePair;
|
||||
inherit (lib.strings) concatStringsSep toUpper;
|
||||
|
||||
make-app-profiles = cfg:
|
||||
|
@ -87,6 +87,12 @@ in {
|
|||
description = "The Firefox profile ID to set.";
|
||||
};
|
||||
|
||||
hidden = mkOption {
|
||||
type = bool;
|
||||
description = "Hide this webapp from the list of applications (but still generate a .desktop file).";
|
||||
default = false;
|
||||
};
|
||||
|
||||
extraArgs = mkOption {
|
||||
type = listOf str;
|
||||
default = [];
|
||||
|
@ -184,7 +190,7 @@ in {
|
|||
type = "Application";
|
||||
|
||||
exec = concatStringsSep " " ([
|
||||
"${config.programs.firefox.package}/bin/firefox"
|
||||
"${lib.getExe config.programs.firefox.package}"
|
||||
"--name"
|
||||
"${name}"
|
||||
"--app-id"
|
||||
|
@ -201,6 +207,7 @@ in {
|
|||
settings = {
|
||||
X-MultipleArgs = "false"; # Consider enabling, don't know what this does
|
||||
StartupWMClass = "${name}";
|
||||
NoDisplay = lib.boolToString cfg.hidden;
|
||||
};
|
||||
})
|
||||
config.programs.firefox.webapps;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
}: {
|
||||
imports = [
|
||||
./configuration.nix
|
||||
# ../ollama.nix
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "usbcore" "sd_mod"];
|
||||
|
@ -74,7 +75,6 @@
|
|||
extraOptions = "--add-runtime nvidia=/run/current-system/sw/bin/nvidia-container-runtime";
|
||||
};
|
||||
};
|
||||
systemd.enableUnifiedCgroupHierarchy = false; # libnvidia-container doesn't support cgroups v2
|
||||
|
||||
services.minidlna = {
|
||||
enable = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue