From 055978329777020223b1d291287a689becae27b4 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Nov 2026 12:45:17 -0500 Subject: [PATCH] Persist LocalAI state and match the live deployment - Keep agents, KB collections, users and runtime settings (LOCALAI_DATA_PATH, LOCALAI_CONFIG_DIR) and backends (LOCALAI_BACKENDS_PATH) on the models PVC. The chart's /data, /configuration and /backends are ephemeral, so every pod restart wiped the agent team and the llama.cpp backend. - Default the agent pool to ornith-1.5-9b-q8 with granite-embedding-107m-multilingual embeddings. - Make the image tag a variable, defaulting to the CUDA 13 image that runs. - Patch hostNetwork and the LOCALAI_P2P_TOKEN secretKeyRef (Secret localai/localai-p2p) onto the Deployment after Helm. Both were set by hand, and applying the role would otherwise revert them. Co-Authored-By: Claude Opus 5.5 --- defaults/main.yml | 13 ++++++++++++ tasks/main.yml | 51 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/defaults/main.yml b/defaults/main.yml index a9a952c..82ade05 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -8,3 +8,16 @@ localai_api_keys: localai_watchdog_idle: "false" localai_watchdog_idle_timeout: "15m" localai_watchdog_busy: "true" +localai_image_tag: latest-gpu-nvidia-cuda-13 +localai_debug: "false" +localai_p2p: "false" +localai_federated: "false" +# Persistent state lives on the models PVC (mounted at /models). +localai_data_path: /models/.localai/data +localai_config_dir: /models/.localai/configuration +localai_backends_path: /models/.backends +localai_agent_pool_default_model: ornith-1.5-9b-q8 +localai_agent_pool_embedding_model: granite-embedding-107m-multilingual +localai_host_network: true +# Name of a Secret holding LOCALAI_P2P_TOKEN; empty skips the patch. +localai_p2p_token_secret: localai-p2p diff --git a/tasks/main.yml b/tasks/main.yml index cbd268e..ec114b0 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -20,7 +20,7 @@ values: deployment: image: - tag: latest-gpu-nvidia-cuda-12 + tag: "{{ localai_image_tag }}" pullPolicy: Always runtimeClassName: nvidia secretEnv: @@ -40,6 +40,19 @@ value: "{{ localai_p2p }}" - name: LOCALAI_FEDERATED value: "{{ localai_federated }}" + # Keep agents, knowledge-base collections, users and runtime settings + # on the models PVC; the chart's default /data and /configuration are + # ephemeral, so a pod restart used to wipe them. + - name: LOCALAI_DATA_PATH + value: "{{ localai_data_path }}" + - name: LOCALAI_CONFIG_DIR + value: "{{ localai_config_dir }}" + - name: LOCALAI_BACKENDS_PATH + value: "{{ localai_backends_path }}" + - name: LOCALAI_AGENT_POOL_DEFAULT_MODEL + value: "{{ localai_agent_pool_default_model }}" + - name: LOCALAI_AGENT_POOL_EMBEDDING_MODEL + value: "{{ localai_agent_pool_embedding_model }}" resources: limits: nvidia.com/gpu: 1 @@ -70,3 +83,39 @@ hosts: - localai.eom.dev +# The chart has no values for these, so patch them onto the Deployment after +# Helm. hostNetwork lets p2p workers on the LAN reach the server directly. +- name: Enable host networking + kubernetes.core.k8s: + state: patched + kind: Deployment + name: localai-local-ai + namespace: localai + definition: + spec: + template: + spec: + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + when: localai_host_network | bool + +# The p2p token lives in a Secret created outside this role (localai/localai-p2p). +- name: Read the p2p token from its Secret + kubernetes.core.k8s: + state: patched + kind: Deployment + name: localai-local-ai + namespace: localai + definition: + spec: + template: + spec: + containers: + - name: local-ai + env: + - name: LOCALAI_P2P_TOKEN + valueFrom: + secretKeyRef: + name: "{{ localai_p2p_token_secret }}" + key: LOCALAI_P2P_TOKEN + when: localai_p2p_token_secret | length > 0