From c73442d776b3b4889b1f7985f776d8310c6c4b7c Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Thu, 25 Dec 2025 17:46:45 -0500 Subject: Omni/Dev: convert Ava to dynamic deployment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create Omni/Dev/Packages.nix with ava, deployer, deploy-manifest packages - Add biz-deployer service to Beryllium.nix - Remove static systemd service from Ava.nix (keep user/dirs setup) Ava is now deployed via the mini-PaaS system rather than being a static NixOS service. This enables fast Ava updates without full NixOS rebuilds - just build, push closure, update manifest. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- Omni/Dev/Beryllium.nix | 50 ++++++++++++++++---------- Omni/Dev/Beryllium/Ava.nix | 89 +++------------------------------------------- Omni/Dev/Packages.nix | 60 +++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 104 deletions(-) create mode 100644 Omni/Dev/Packages.nix (limited to 'Omni/Dev') diff --git a/Omni/Dev/Beryllium.nix b/Omni/Dev/Beryllium.nix index 4d9ed09..f2fa1a3 100755 --- a/Omni/Dev/Beryllium.nix +++ b/Omni/Dev/Beryllium.nix @@ -1,20 +1,32 @@ #!/usr/bin/env run.sh -{bild}: -bild.os { - imports = [ - ../Os/Base.nix - ../Packages.nix - ../Users.nix - ./Beryllium/Ava.nix - ./Beryllium/Configuration.nix - ./Beryllium/Hardware.nix - ./Beryllium/Ollama.nix - ./Docker.nix - ./Vpn.nix - ./Beryllium/OpenWebui.nix - ./Beryllium/Live.nix - ../Syncthing.nix - ]; - networking.hostName = "beryllium"; - networking.domain = "beryl.bensima.com"; -} +{bild}: let + packages = import ./Packages.nix {inherit bild;}; +in + bild.os { + imports = [ + ../Os/Base.nix + ../Packages.nix + ../Users.nix + ./Beryllium/Ava.nix + ./Beryllium/Configuration.nix + ./Beryllium/Hardware.nix + ./Beryllium/Ollama.nix + ./Docker.nix + ./Vpn.nix + ./Beryllium/OpenWebui.nix + ./Beryllium/Live.nix + ../Syncthing.nix + ../Deploy/Deployer.nix + ]; + networking.hostName = "beryllium"; + networking.domain = "beryl.bensima.com"; + + # Mini-PaaS deployer service manages Ava and other services + # via manifest.json in S3. Services are deployed dynamically + # without NixOS rebuild. + services.biz-deployer = { + enable = true; + package = packages.deployer; + manifestPackage = packages.deploy-manifest; + }; + } diff --git a/Omni/Dev/Beryllium/Ava.nix b/Omni/Dev/Beryllium/Ava.nix index 7563b26..890ec53 100644 --- a/Omni/Dev/Beryllium/Ava.nix +++ b/Omni/Dev/Beryllium/Ava.nix @@ -1,88 +1,7 @@ -{...}: let - bild = import ../../Bild.nix {}; - avaPkg = bild.run ../../Ava.hs; - - # Python environment for Ava's python_exec tool - avaPython = bild.python.pythonWith (p: [ - p.requests # HTTP requests - p.httpx # Async HTTP - p.beautifulsoup4 # HTML/XML parsing - p.lxml # Fast XML/HTML parser - p.pandas # Data analysis - p.numpy # Numerical computing - p.pillow # Image processing - p.pyyaml # YAML parsing - p.python-dateutil # Date utilities - ]); - - # Nixpkgs for CLI tools not in bild.pkgs - nixpkgs = import ../../Bild/Nixpkgs.nix; - pkgs = nixpkgs.nixos-24_11; - - # Wrap ava binary with tools in PATH - avaWithTools = bild.stdenv.mkDerivation { - name = "ava-wrapped"; - buildInputs = [bild.makeWrapper]; - phases = ["installPhase"]; - installPhase = '' - mkdir -p $out/bin - makeWrapper ${avaPkg}/bin/ava $out/bin/ava \ - --prefix PATH : ${bild.lib.makeBinPath [ - avaPython - bild.pkgs.jq - bild.pkgs.ripgrep - bild.pkgs.coreutils - bild.pkgs.git - bild.pkgs.sqlite - bild.pkgs.ffmpeg - bild.pkgs.bash - pkgs.curl - pkgs.pandoc - pkgs.imagemagick - pkgs.csvkit - pkgs.openai-whisper-cpp - pkgs.direnv - pkgs.nix - ]} - ''; - }; -in { - systemd.services.ava = { - description = "Ava Telegram assistant"; - after = ["network-online.target" "ollama.service"]; - wants = ["network-online.target" "ollama.service"]; - wantedBy = ["multi-user.target"]; - - serviceConfig = { - Type = "simple"; - User = "ava"; - Group = "users"; - WorkingDirectory = "/home/ava/omni"; - - Environment = [ - "AVA_DATA_ROOT=/home/ava" - "HOME=/home/ava" - "OLLAMA_URL=http://localhost:11434" - "AVA_WEB_PORT=8079" - "AVA_WEB_URL=https://beryllium.oryx-ide.ts.net" - ]; - - EnvironmentFile = "/run/secrets/ava.env"; - - ExecStart = "${avaWithTools}/bin/ava"; - - StandardOutput = "journal"; - StandardError = "journal"; - - Restart = "on-failure"; - RestartSec = 5; - - TimeoutStopSec = 90; - KillMode = "mixed"; - KillSignal = "SIGTERM"; - }; - }; - +# Ava user and directory setup. +# The Ava service itself is deployed dynamically via biz-deployer. +# This module only creates the user, directories, and activation scripts. +{...}: { systemd.tmpfiles.rules = [ "d /home/ava 0755 ava users -" "d /home/ava/omni 0755 ava users -" diff --git a/Omni/Dev/Packages.nix b/Omni/Dev/Packages.nix new file mode 100644 index 0000000..bb45d61 --- /dev/null +++ b/Omni/Dev/Packages.nix @@ -0,0 +1,60 @@ +# Build Dev packages independently, outside NixOS context. +# +# This file builds packages for Beryllium and returns them as an attribute set. +# The NixOS config (Beryllium.nix) will accept these as inputs rather than +# building them during OS evaluation. +# +# Usage: +# nix-build Omni/Dev/Packages.nix # builds all packages +# nix-build Omni/Dev/Packages.nix -A ava # builds one package +{bild ? import ../Bild.nix {}}: let + nixpkgs = import ../Bild/Nixpkgs.nix; + pkgs = nixpkgs.nixos-24_11; + + # Python environment for Ava's python_exec tool + avaPython = bild.python.pythonWith (p: [ + p.requests # HTTP requests + p.httpx # Async HTTP + p.beautifulsoup4 # HTML/XML parsing + p.lxml # Fast XML/HTML parser + p.pandas # Data analysis + p.numpy # Numerical computing + p.pillow # Image processing + p.pyyaml # YAML parsing + p.python-dateutil # Date utilities + ]); + + avaPkg = bild.run ../Ava.hs; + + # Wrapped ava with tools in PATH + ava = bild.stdenv.mkDerivation { + name = "ava-wrapped"; + buildInputs = [bild.makeWrapper]; + phases = ["installPhase"]; + installPhase = '' + mkdir -p $out/bin + makeWrapper ${avaPkg}/bin/ava $out/bin/ava \ + --prefix PATH : ${bild.lib.makeBinPath [ + avaPython + bild.pkgs.jq + bild.pkgs.ripgrep + bild.pkgs.coreutils + bild.pkgs.git + bild.pkgs.sqlite + bild.pkgs.ffmpeg + bild.pkgs.bash + pkgs.curl + pkgs.pandoc + pkgs.imagemagick + pkgs.csvkit + pkgs.openai-whisper-cpp + pkgs.direnv + pkgs.nix + ]} + ''; + }; +in { + inherit ava; + deployer = bild.run ../Deploy/Deployer.hs; + deploy-manifest = bild.run ../Deploy/Manifest.hs; +} -- cgit v1.2.3