<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Operations on GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/</link><description>Recent content in Operations on GENIE.AI</description><generator>Hugo</generator><language>en</language><atom:link href="https://genie-ai-7e342b.opensource.unicc.org/docs/operate/index.xml" rel="self" type="application/rss+xml"/><item><title>Backup &amp; Restore</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/backup-restore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/backup-restore/</guid><description>&lt;p&gt;If you operate a GENIE.AI deployment and own the recovery story, this page
is for you. A complete GENIE.AI recovery requires more than the knowledge
base. Four stores hold state that is not reproducible from the codebase
alone, plus a handful of supporting volumes. Losing any of them costs more
than a rebuild incurs. This page covers all of them and the order to restore
them in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In an emergency (TL;DR).&lt;/strong&gt; Restore order is fixed and non-negotiable:
&lt;strong&gt;PostgreSQL → Redis → Document-repository uploads → ArangoDB →
Supporting volumes.&lt;/strong&gt; Each layer depends on the one below; skipping or
reordering leaves the stack in an inconsistent state. Jump to the
&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/operate/backup-restore/#restore-procedure--in-reverse-order"&gt;Restore procedure&lt;/a&gt; if you already
know how to back up; everything below is for the operator who needs to
build a backup routine from scratch.&lt;/p&gt;</description></item><item><title>Distributed tracing (operator how-to)</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/tracing-howto/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/tracing-howto/</guid><description>&lt;p&gt;Tracing is what makes a GENIE.AI user query legible. Because every service
propagates a single W3C &lt;code&gt;traceparent&lt;/code&gt; header and every RAG stage emits a span,
one user question produces one contiguous trace that can be read end-to-end in
Grafana — revealing exactly where time went and which chunks were retrieved.&lt;/p&gt;
&lt;h2 id="trace-propagation"&gt;Trace propagation&lt;/h2&gt;
&lt;p&gt;The trace starts at the edge. Kong creates the root span and injects a
&lt;code&gt;traceparent&lt;/code&gt; header into the request. Each downstream hop reads that header,
joins the trace as a child span, and re-injects the header for the next hop:&lt;/p&gt;</description></item><item><title>Updates</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/updates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/updates/</guid><description>&lt;p&gt;GENIE.AI has three kinds of update, with different blast radii. The critical
thing to know is &lt;strong&gt;which updates force a knowledge-base re-ingestion&lt;/strong&gt;. Plan
backups before every change and keep the previous-known-good tag for rollback.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A working deployment (Compose or Swarm) with &lt;code&gt;.env&lt;/code&gt; populated.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GENIE_AI_GLOBAL_TAG&lt;/code&gt; rollback target noted before starting (per-service tags like &lt;code&gt;GENIE_AI_BACKEND_IMAGE_TAG&lt;/code&gt; override just the backend).&lt;/li&gt;
&lt;li&gt;For model pulls: &lt;code&gt;HUGGING_FACE_HUB_TOKEN&lt;/code&gt; set in &lt;code&gt;.env&lt;/code&gt;. Without it, vLLM
silently stalls while retrying the private-model download with no error in
the container logs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker service ls&lt;/code&gt; (Swarm) or &lt;code&gt;docker compose ps&lt;/code&gt; (Compose) returns the
stack — required to copy service names verbatim in the commands below.&lt;/li&gt;
&lt;li&gt;Backup taken (see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/operate/backup-restore/"&gt;Backup &amp;amp; restore&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-re-ingestion-rule"&gt;The re-ingestion rule&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Change&lt;/th&gt;
 &lt;th&gt;Re-ingest required?&lt;/th&gt;
 &lt;th&gt;Restart target (Swarm service)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt; (&lt;code&gt;VLLM_LLM_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; — model is read at query time&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genieai_vllm&lt;/code&gt; (model-serving vLLM)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reranker&lt;/strong&gt; (&lt;code&gt;RERANKER_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; — query-time re-score&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genieai_tei_reranker&lt;/code&gt; (the TEI serving the reranker)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Translation&lt;/strong&gt; (&lt;code&gt;VLLM_TRANSLATION_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt; — query-time&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genieai_vllm-translation-guardrail&lt;/code&gt; (the vLLM serving the translation model — &lt;strong&gt;not&lt;/strong&gt; the &lt;code&gt;translation&lt;/code&gt; OPEA wrapper)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Embedding model&lt;/strong&gt; (&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; — vectors live in the old model&amp;rsquo;s space&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genieai_tei&lt;/code&gt; + full re-ingest&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Labelling taxonomy&lt;/strong&gt; (&lt;code&gt;LABEL_SELECTOR_SYSTEM_PROMPT&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Recommended&lt;/strong&gt; — labels are stored on chunks at ingest time&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genieai_dataprep-arango-service&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Chunking / dataprep logic&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt; — chunk boundaries and content change&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;genieai_dataprep-arango-service&lt;/code&gt; + re-ingest affected docs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Changing the embedding model is the expensive update.&lt;/strong&gt; Plan a full
re-ingest (see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/ingestion/"&gt;Knowledge base →
Ingestion&lt;/a&gt;) when you change
&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;. Everything else is a service restart.&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/troubleshooting/</guid><description>&lt;p&gt;This page lists the problems operators hit most often, the first place to look,
and where the deeper notes live. For install-time problems, see the
troubleshooting sections of the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/"&gt;deployment
guides&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;p&gt;Localise any operational issue to a single component, stage, or config value
in minutes — without restarting services or grepping unbounded logs.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A running GENIE.AI stack (Swarm or Compose) reachable via SSH on the manager
node. See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/install-guide/"&gt;Installation &amp;amp; Configuration
Guide&lt;/a&gt; for first-time setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; access: &lt;code&gt;docker service ls&lt;/code&gt;, &lt;code&gt;docker service logs&lt;/code&gt;, &lt;code&gt;docker service ps&lt;/code&gt; must work for the operator user (member of the &lt;code&gt;docker&lt;/code&gt; group,
or root on the Swarm manager).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability stack on&lt;/strong&gt; (&lt;code&gt;ENABLE_OBSERVABILITY=1&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt;): Grafana
reachable at &lt;code&gt;https://&amp;lt;NGINX_PUBLIC_DOMAIN&amp;gt;/grafana/&lt;/code&gt;. Without it, the
trace-first playbook below reduces to log-grep + admin Query Inspector.
See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observe/configuration/"&gt;Observability →
Configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keycloak admin password&lt;/strong&gt; (&lt;code&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt;) for the
Authentication / token errors section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU node SSH access&lt;/strong&gt; (read-only) for the GPU OOM section — VRAM headroom
is read directly from the GPU host via &lt;code&gt;nvidia-smi&lt;/code&gt; (no Grafana panel
exposes GPU memory yet).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="general-principle-trace-then-logs-then-code"&gt;General principle: trace, then logs, then code&lt;/h2&gt;
&lt;p&gt;For any &amp;ldquo;why did this answer come out wrong / slow / empty&amp;rdquo; question, the
fastest path is the &lt;strong&gt;trace&lt;/strong&gt;, not the logs:&lt;/p&gt;</description></item><item><title>Admin Logs</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/admin-logs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/admin-logs/</guid><description>&lt;p&gt;The &lt;strong&gt;Logs tab&lt;/strong&gt; in the admin dashboard (reachable at
&lt;code&gt;https://&amp;lt;NGINX_PUBLIC_DOMAIN&amp;gt;/admin&lt;/code&gt; → &amp;ldquo;Logs&amp;rdquo;) is the operator-facing
surface for searching container logs across all GENIE.AI services. It is
backed by VictoriaLogs via the backend&amp;rsquo;s &lt;strong&gt;MELT seam&lt;/strong&gt;
(&lt;code&gt;MELT_PROVIDER=victorialogs&lt;/code&gt;, an abstraction layer in
&lt;code&gt;components/shared/lib/melt/&lt;/code&gt; named for &lt;strong&gt;M&lt;/strong&gt;etrics / &lt;strong&gt;E&lt;/strong&gt;vents /
&lt;strong&gt;L&lt;/strong&gt;ogs / &lt;strong&gt;T&lt;/strong&gt;races — a future-proof seam that lets the storage backend
swapped without changing call sites), with graceful degradation when VL is
unreachable.&lt;/p&gt;</description></item><item><title>Ingestion Log</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/ingestion-log/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/ingestion-log/</guid><description>&lt;p&gt;The &lt;strong&gt;ingestion log&lt;/strong&gt; is the per-chunk progress feed that dataprep writes
during document ingestion. Every chunk event — parse, label, embed, context
generation, fallbacks — produces one row, addressed by &lt;code&gt;file_id&lt;/code&gt;. The log is
the operator&amp;rsquo;s primary tool for answering &amp;ldquo;why did this document land in
&lt;code&gt;failed&lt;/code&gt; state?&amp;rdquo; or &amp;ldquo;what step was reached before the pipeline broke?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This page consolidates what the ingestion log is, how to read it (UI and
ArangoDB), the canonical messages you will learn to grep for, and how to
correlate a log entry with the matching RAG-pipeline trace.&lt;/p&gt;</description></item><item><title>Health Checks</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/health-checks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/health-checks/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For operators and load balancers.&lt;/strong&gt; GENIE.AI exposes two layered health
endpoints on the &lt;strong&gt;backend&lt;/strong&gt; service (port &lt;code&gt;3000&lt;/code&gt;):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/api/health&lt;/code&gt;&lt;/strong&gt; — a public, dependency-free &lt;strong&gt;liveness probe&lt;/strong&gt; (no auth).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/api/admin/system-health&lt;/code&gt;&lt;/strong&gt; — a richer &lt;strong&gt;admin diagnostic&lt;/strong&gt; that probes
ArangoDB, Keycloak, and the backend itself (requires the &lt;code&gt;admin&lt;/code&gt; realm role).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Use the first for liveness, the second for readiness and post-deploy smoke
tests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This page covers what each endpoint reports, how to wire them into your
infrastructure, and how to interpret the results.&lt;/p&gt;</description></item><item><title>Security Hardening</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/security-hardening/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/security-hardening/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For deployers and security reviewers.&lt;/strong&gt; This page documents the
security controls the GENIE.AI stack ships with by default: which
requests are blocked before they reach the router, which HTTP headers
Nginx and the backend set (or strip), which static surfaces are
intentionally exposed, and how the document download flow actually
gates access. Use it to audit your deployment, confirm Kong/Nginx is
not re-enabling what the backend blocks, and adjust policy when
reverse-proxying.&lt;/p&gt;</description></item><item><title>Scaling GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/scaling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operate/scaling/</guid><description>&lt;p&gt;GENIE.AI runs ~30 services in &lt;code&gt;docker-compose.yaml&lt;/code&gt; (excluding init/migration
helpers and named volumes). Each scales differently depending on its workload
profile. This guide groups services by scaling category and explains what to
watch.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A deployed stack (see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/install-guide/"&gt;Install guide&lt;/a&gt; or
&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/docker-swarm-setup/"&gt;Docker Swarm setup&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Docker CLI access on a Swarm manager node (&lt;code&gt;docker service ls&lt;/code&gt; returns the
stack).&lt;/li&gt;
&lt;li&gt;For GPU scaling: at least one Swarm node labelled &lt;code&gt;gpu=true&lt;/code&gt; (see
&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/gpu/"&gt;GPU deployment&lt;/a&gt; and
&lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deploy/topologies/"&gt;Topologies&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;For observability scaling: &lt;code&gt;ENABLE_OBSERVABILITY=1&lt;/code&gt; set in &lt;code&gt;.env&lt;/code&gt; (or
&lt;code&gt;enable_observability: &amp;quot;1&amp;quot;&lt;/code&gt; in the Ansible vars).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Stack-name caveat:&lt;/strong&gt; the Ansible playbook defaults
&lt;code&gt;stack_name: genieai&lt;/code&gt; (see &lt;code&gt;deploy/ansible/group_vars/all.yml&lt;/code&gt;), so the
examples below assume services are prefixed &lt;code&gt;genieai_&amp;lt;service&amp;gt;&lt;/code&gt;. If you
overrode &lt;code&gt;stack_name&lt;/code&gt; at deploy time (&lt;code&gt;--extra-vars stack_name=foo&lt;/code&gt;), use
&lt;code&gt;foo_&amp;lt;service&amp;gt;&lt;/code&gt; instead.&lt;/p&gt;</description></item></channel></rss>