From 3ca11455ee952767aff21a2ba3ab6227288f9aac Mon Sep 17 00:00:00 2001 From: Joakim Repomaa Date: Fri, 29 May 2026 19:14:50 +0300 Subject: [PATCH] setup openwebui --- hosts/freun-dev/secrets.nix | 2 + hosts/freun-dev/services.nix | 25 ++++++++++ modules/services/default.nix | 1 + modules/services/open-webui.nix | 78 ++++++++++++++++++++++++++++++ secrets/open-terminal-api-key.age | Bin 0 -> 522 bytes secrets/open-webui.age | Bin 0 -> 822 bytes secrets/secrets.nix | 2 + 7 files changed, 108 insertions(+) create mode 100644 modules/services/open-webui.nix create mode 100644 secrets/open-terminal-api-key.age create mode 100644 secrets/open-webui.age diff --git a/hosts/freun-dev/secrets.nix b/hosts/freun-dev/secrets.nix index bfc985b..61a8fa7 100644 --- a/hosts/freun-dev/secrets.nix +++ b/hosts/freun-dev/secrets.nix @@ -33,6 +33,8 @@ "gitea" "gitea-actions-runner" "searx" + "open-webui" + "open-terminal-api-key" ] ) // { diff --git a/hosts/freun-dev/services.nix b/hosts/freun-dev/services.nix index 5c95b0e..f989b6d 100644 --- a/hosts/freun-dev/services.nix +++ b/hosts/freun-dev/services.nix @@ -19,6 +19,7 @@ let secrets = config.age.secrets; in { + nixpkgs.config.allowUnfree = true; imports = [ ./glance.nix ]; @@ -425,11 +426,35 @@ in }; }; + open-webui = { + enable = true; + port = 3500; + environmentFile = secrets.open-webui.path; + environment = { + ENABLE_WEB_SEARCH = "True"; + ENABLE_OLLAMA_API = "False"; + }; + subdomain = "owu"; + }; + webserver = { acme.dnsChallenge = true; tailscaleAuth.expectedTailnet = "tempel-vibes.ts.net"; }; }; + virtualisation.oci-containers.containers.open-terminal = { + image = "ghcr.io/open-webui/open-terminal:latest"; + autoStart = true; + ports = [ "127.0.0.1:3700:8000" ]; + environmentFiles = [ config.age.secrets."open-terminal-api-key".path ]; + environment = { + OPEN_TERMINAL_MULTI_USER = "true"; + }; + volumes = [ + "open-terminal-data:/home/user" + ]; + }; + virtualisation.docker.autoPrune.enable = true; } diff --git a/modules/services/default.nix b/modules/services/default.nix index b683018..f8e425f 100644 --- a/modules/services/default.nix +++ b/modules/services/default.nix @@ -34,5 +34,6 @@ ./dhcp-dns-sync ./invidious-companion.nix ./searx.nix + ./open-webui.nix ]; } diff --git a/modules/services/open-webui.nix b/modules/services/open-webui.nix new file mode 100644 index 0000000..cff2edb --- /dev/null +++ b/modules/services/open-webui.nix @@ -0,0 +1,78 @@ +{ + lib, + config, + pkgs-unstable, + ... +}: +let + cfg = config.services.open-webui; + fqdn = "${cfg.subdomain}.${config.networking.domain}"; + + open-webui-pkg = pkgs-unstable.open-webui.overridePythonAttrs (oldAttrs: { + dependencies = + oldAttrs.dependencies + ++ (with pkgs-unstable.python3Packages; [ + pgvector + psycopg2 + ]) + ++ [ + pkgs-unstable.ffmpeg + ]; + }); +in +{ + options.services.open-webui = { + subdomain = lib.mkOption { + type = lib.types.str; + }; + }; + + config = lib.mkIf cfg.enable { + services = { + open-webui = { + package = open-webui-pkg; + environment = { + ANONYMIZED_TELEMETRY = "False"; + DO_NOT_TRACK = "True"; + SCARF_NO_ANALYTICS = "True"; + WEBUI_URL = "https://${fqdn}"; + VECTOR_DB = "pgvector"; + PGVECTOR_CREATE_EXTENSION = "False"; + DATABASE_URL = "postgresql:///open-webui?host=/var/run/postgresql"; + CORS_ALLOW_ORIGIN = "https://${fqdn};http://localhost"; + }; + }; + + webserver.vHosts.${fqdn}.locations."/".proxyPort = cfg.port; + postgresql = { + enable = lib.mkDefault true; + ensureDatabases = [ "open-webui" ]; + ensureUsers = [ + { + name = "open-webui"; + ensureDBOwnership = true; + } + ]; + extensions = ps: with ps; [ pgvector ]; + }; + }; + + systemd.services.open-webui-pgvector-setup = { + description = "Ensure pgvector extension exists for open-webui"; + wantedBy = [ "open-webui.service" ]; + before = [ "open-webui.service" ]; + after = [ + "postgresql.service" + "postgresql-setup.service" + ]; + requires = [ "postgresql.service" ]; + serviceConfig = { + Type = "oneshot"; + User = "postgres"; + Group = "postgres"; + ExecStart = "${config.services.postgresql.package}/bin/psql -d open-webui -c 'CREATE EXTENSION IF NOT EXISTS vector;'"; + RemainAfterExit = true; + }; + }; + }; +} diff --git a/secrets/open-terminal-api-key.age b/secrets/open-terminal-api-key.age new file mode 100644 index 0000000000000000000000000000000000000000..af8cde2c3487490707ec3c19985bfc0d0349f1ec GIT binary patch literal 522 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCU7FZOqia#TnSjmq~l zC@{?rFUqh8H1={c3pPzp2@LVCGIMkf3oFd@%@1~uN;j*x@w=7Of%n3+x&Gj&L z@$@SR^s5MVuT0bT%1I0fam(>?k915*wlD|}4Mn%j#Vs>GBTymHD5EqyJSm_wuqZFm zsUWh@*TB#>%F`>gOgqrW+*I2w$2_;vDY48n+k&gIJYV0}$TZl^G&j4bpd`yQH#js& z+cPJ_Ge1Aq%cUsMMcY8TvcR}B%N5 zsw_)WQ?qdI-0Q;zlG<&$nE{bC5XYv$(j zMDX&7FsA~(kCnoU4P6giY0(i#Q{+0Cscif9;FF#=N1WGhlUO$4LCq<>nEQo=xsNQ3 o-sq^l&p#w(_HR=6zLc!LH7Tb~uJ}5CTh>jFdB#UBH)Xp505GDwE&u=k literal 0 HcmV?d00001 diff --git a/secrets/open-webui.age b/secrets/open-webui.age new file mode 100644 index 0000000000000000000000000000000000000000..3c616d73ecf73af7ff5c8b8c8278e68d9318a1fe GIT binary patch literal 822 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCU7FZOqia#ScWa7~Of zF7oh=jLOOnPjL)0OY?Be@Y46u&&n_N$PCPg)D8GBT&J~FSOFcB0VQJ%`_#) zJu%A?BDATdzC*e5GD z!ZJIXfgdsLaC6Cmr3kfDrSvv~&e0%ivr?|4`#xzu-u>+=_DJ)Ix)7 zv%n-T53ek557WGeNN3|p{|f(XLsu?~u&VsToD%0?{i@=~KvQ$0;FPc`pE5HGcT@M` z!qUw0$KLwZ&uMRAq%pRCf~vZ11EX_e;b@QqWvn|gkg{`$pS?e^|8m+$Zq4Cwdf`}M_-MYN?QbaBSx!+-