diff --git a/doc-server/docs/api-docs/_category_.json b/doc-server/docs/api-docs/_category_.json
index 16732e71..e22365e8 100644
--- a/doc-server/docs/api-docs/_category_.json
+++ b/doc-server/docs/api-docs/_category_.json
@@ -1,4 +1,4 @@
{
"label": "API Docs",
- "position": 5
+ "position": 8
}
diff --git a/doc-server/docs/architecture.md b/doc-server/docs/architecture.md
new file mode 100644
index 00000000..a20c133c
--- /dev/null
+++ b/doc-server/docs/architecture.md
@@ -0,0 +1,143 @@
+---
+sidebar_position: 2
+sidebar_label: Architecture & System Design
+---
+
+# Architecture & System Design
+
+NudgeBee is an enterprise-grade AI observability, incident triage, and automation platform designed around a core philosophy: **"Install Once, Build Forever"** — where the marginal cost of running your $N$-th agent trends toward zero, and the compounding intelligence of the platform increases with every incident, metric, and workflow.
+
+---
+
+## 1. Platform Reference Architecture
+
+
+
+---
+
+### Platform Architecture Reference (9-Layer Model)
+
+| Layer | Functional Domain | Key Capabilities & Components | Deployment Boundary |
+|---|---|---|---|
+| **Layer 1** | **Personas & Access** | SRE, DevOps, FinOps, SecOps, Platform, CFO via Web Dashboard, Slack/Teams ChatOps, CLI, REST/GraphQL APIs, and SSO. | User Interface |
+| **Layer 2** | **Role-Based Agents** | **AI-SRE** (RCA & triage), **AI-FinOps** (cost & rightsizing), **AI-K8sOps** (workload reliability), **AI-CloudOps** (cloud drift & scans), and Custom Agents. | In-VPC Control Plane |
+| **Layer 3** | **Builders** | **AI-Ops Automation Builder** (visual runbook/DAG composer) and **AI-Agent Builder** (agent definition & prompt harness). | In-VPC Control Plane |
+| **Layer 4** | **Control Plane (The Brain)** | • **Cortex Intelligence**: Knowledge Graph Engine, Multi-Tier Memory (Redis + Graph DB), RAG Vector Retrieval, Continuous Grounding.
• **DAIR Router**: 8-Signal Model Router, Semantic Prompt Cache, PII/DLP Redaction Gate.
• **Runtime & Guardrails**: Agent Harness (*Plan-Act-Observe*), Policy Engine, HITL Approval Surface, Immutable Audit Logs. | In-VPC Control Plane |
+| **Layer 5** | **Libraries ("Install Once, Build Forever")** | Library of Pre-Built Agents, Library of Diagnostic Tools/Skills, and Library of Automated Runbooks. | In-VPC Control Plane |
+| **Layer 6** | **In-VPC Data Plane** | PostgreSQL (metadata/config), Redis (sessions/cache), ClickHouse (runs/traces), Qdrant (RAG vectors), Graph DB (topology/ownership), Object Store (S3-compatible artifacts), RabbitMQ (event bus). | In-VPC Customer Data Plane |
+| **Layer 7** | **Self-Hosted SLM Serving** | Local private Small Language Model serving via **vLLM / Ollama / TGI** (Qwen 3+, Llama 3+, Gemma 4, Nemotron, Granite, BYOM GPU pools). | In-VPC Model Layer |
+| **Layer 8** | **Collectors & Ingress** | Relay Server (:8080), `k8s-collector`, `cloud-collector`, OpenTelemetry Collector, and Ticketing/GitOps Sync. | In-VPC & In-Cluster |
+| **Layer 9** | **Categorized External Egress** | Collaboration (Slack, Teams), ITSM (Jira, ServiceNow), SCM (GitHub, GitLab), Cloud APIs (AWS, GCP, Azure), Observability backends, and Frontier LLMs (via DAIR + PII Gate). | External Egress |
+
+---
+
+### Layer Deep-Dive
+
+#### Cortex • The Intelligence Layer
+Cortex is NudgeBee's semantic reasoning engine. Instead of passing massive, unstructured context to expensive LLMs, Cortex maintains a continuously updated model of your infrastructure:
+- **Knowledge Graph Engine**: Maps service dependencies, network topologies, infrastructure layers, and engineering team ownership.
+- **Multi-Tier Memory**: Combines millisecond short-term memory (Redis) for live alert context with persistent Graph DB memory for long-term historical incident learning.
+- **RAG Retrieval**: Combines dense vector search (Qdrant) with cross-encoder rerankers to ground AI responses in relevant runbooks, docs, and postmortems.
+- **Continuous Grounding**: Automatically updates context as pods deploy, git commits merge, or alert rules fire.
+
+#### DAIR • Dynamic Adaptive Inference Router
+DAIR optimizes every model invocation across 8 real-time signals: **task complexity, latency SLO, token cost, data sensitivity, cache hit status, model availability, context window size, and reasoning depth**.
+- **In-VPC SLM Serving First**: Simple tasks (log summarization, event classification, metric anomaly detection) are routed locally to private Small Language Models (e.g. Qwen 3+, Llama 3+, Gemma) running inside your cluster or VPC GPU pool.
+- **Semantic Prompt Cache**: Deduplicates repetitive prompts and queries to prevent redundant model calls.
+- **PII / DLP Redaction Gate**: Any query escalated to external frontier models (e.g. AWS Bedrock, OpenAI, Anthropic) passes through an inline DLP sanitizer to redact secrets, tokens, IPs, and user PII before leaving the VPC boundary.
+
+#### Runtime & Guardrails
+- **Agent Orchestrator**: Executes structured *Plan → Act → Observe → Evaluate* loops with bounded iteration limits.
+- **Policy Engine**: Enforces strict RBAC, blast-radius constraints, and mandatory dry-run execution for mutating operations.
+- **Human-In-The-Loop (HITL)**: Provides interactive approval gates directly within Slack, Microsoft Teams, and the Web UI before any remediation action is executed in production.
+- **Immutable Audit Log**: Every prompt, tool execution, intermediate reasoning step, and user approval is recorded immutably in PostgreSQL/ClickHouse.
+
+---
+
+## 2. Runtime Microservices Architecture ("What Runs Where")
+
+The diagram below illustrates how NudgeBee's core microservices, datastores, and collectors interact at runtime:
+
+```mermaid
+flowchart TB
+ classDef browser fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f,rx:8,ry:8;
+ classDef app fill:#bae6fd,stroke:#0284c7,stroke-width:2px,color:#0369a1,rx:8,ry:8;
+ classDef backend fill:#bbf7d0,stroke:#16a34a,stroke-width:2px,color:#14532d,rx:8,ry:8;
+ classDef datastore fill:#f8fafc,stroke:#64748b,stroke-width:2px,color:#1e293b,rx:8,ry:8;
+ classDef collector fill:#ddd6fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95,rx:8,ry:8;
+ classDef agent fill:#fecdd3,stroke:#e11d48,stroke-dasharray: 5 5,stroke-width:2px,color:#881337,rx:8,ry:8;
+
+ BROWSER["Browser"]:::browser
+ APP["app
Next.js UI + auth boundary"]:::app
+
+ subgraph SERVICES["Microservices (Internal RPC with tenant + user context stamped on every call)"]
+ direction TB
+ SERVICES_SERVER["services-server
Go core backend & GraphQL"]:::backend
+ LLM_SERVER["llm-server (AI Engine)
NuBi SRE Agents, RAG & AI Gateway"]:::backend
+ WORKFLOW_SERVER["workflow-server
Autopilot & Runbook Automations"]:::backend
+ NOTIFICATIONS["notifications
Slack / Teams / Email Dispatcher"]:::backend
+ TICKET_SERVER["ticket-server
Jira / ServiceNow / PagerDuty"]:::backend
+ end
+
+ subgraph STORAGE["Storage & Caching Layer (Shared by ALL services)"]
+ POSTGRES["Postgres
State & Audit"]:::datastore
+ REDIS["Redis
Cache Layer"]:::datastore
+ end
+
+ subgraph INFRA["Messaging, Vector & Durable Execution"]
+ RABBITMQ["RabbitMQ
Event Bus & Signal Broker"]:::datastore
+ QDRANT["Qdrant
RAG Vectors & Knowledge Embeddings"]:::datastore
+ TEMPORAL["Temporal
Durable Workflow Execution"]:::datastore
+ end
+
+ subgraph COLLECTORS["Collectors & Ingress Hub"]
+ K8S_COLLECTOR["k8s-collector
Cluster state & metrics"]:::collector
+ CLOUD_COLLECTOR["cloud-collector
AWS / Azure / GCP scans"]:::collector
+ RELAY_SERVER["relay-server
WebSocket Gateway (:8080)"]:::collector
+ end
+
+ AGENT["nudgebee-agent (in YOUR cluster)
kubectl • Prometheus • Logs & Traces"]:::agent
+
+ BROWSER --> APP
+ APP --> SERVICES_SERVER
+ APP --> LLM_SERVER
+ APP --> WORKFLOW_SERVER
+ APP --> NOTIFICATIONS
+ APP --> TICKET_SERVER
+
+ SERVICES_SERVER -.-> STORAGE
+ LLM_SERVER -.-> STORAGE
+ WORKFLOW_SERVER -.-> STORAGE
+ NOTIFICATIONS -.-> STORAGE
+ TICKET_SERVER -.-> STORAGE
+
+ LLM_SERVER -->|vector search| QDRANT
+ WORKFLOW_SERVER -->|durable execution| TEMPORAL
+
+ K8S_COLLECTOR -->|signals| RABBITMQ
+ CLOUD_COLLECTOR -->|signals| RABBITMQ
+ RELAY_SERVER -->|signals| RABBITMQ
+ RABBITMQ --> SERVICES_SERVER
+
+ K8S_COLLECTOR -.-> STORAGE
+ CLOUD_COLLECTOR -.-> STORAGE
+ RELAY_SERVER -.-> STORAGE
+
+ AGENT -.->|"outbound only (WSS :443)"| RELAY_SERVER
+```
+
+---
+
+## 3. Data Privacy & Network Isolation
+
+- **Zero Inbound Ports**: Monitored agents connect to the Control Plane exclusively via outbound HTTPS / WSS (TCP port 443). No firewall openings or public IPs are required in monitored environments.
+- **In-VPC Data Sovereignty**: All cluster metrics, logs, traces, knowledge graph topologies, and audit trails remain within your dedicated storage cluster.
+- **Air-Gapped & Offline Ready**: NudgeBee can be deployed entirely air-gapped using local container registries, internal PostgreSQL/Redis, and in-VPC SLMs served by vLLM or Ollama.
+
+---
+
+## Next Steps
+
+- **[Server Installation Guide](/docs/installation/server/)** — Deploy the complete NudgeBee Control Plane onto your Kubernetes cluster using Helm.
+- **[Agent Installation Guide](/docs/installation/agent/)** — Install the lightweight NudgeBee Agent into target Kubernetes clusters.
+- **[Editions & Pricing](/docs/editions)** — Compare Community, Enterprise, and Cloud SaaS capabilities.
diff --git a/doc-server/docs/editions.md b/doc-server/docs/editions.md
index f25c0ebc..9efd4bd5 100644
--- a/doc-server/docs/editions.md
+++ b/doc-server/docs/editions.md
@@ -1,20 +1,20 @@
---
-sidebar_position: 2
-sidebar_label: Editions & Pricing
+sidebar_position: 3
+sidebar_label: Editions & Capabilities
---
-# Editions
+# Editions & Capabilities
NudgeBee is available in three editions. They share the same codebase and
documentation — this page is the source of truth for what each one includes.
| | **Community** | **Enterprise** | **Cloud** |
|---|---|---|---|
-| **What it is** | Free, open-source (Apache 2.0), self-hosted. Fully functional. | Self-hosted with a commercial license. Adds enterprise features and support. | Fully managed SaaS, hosted and operated by NudgeBee. |
+| **What it is** | Free self-hosted edition. Server is licensed under **BSL 1.1**; Agents are **Apache 2.0**. Fully functional. | Self-hosted with a commercial license. Adds enterprise features and SLA support. | Fully managed SaaS, hosted and operated by NudgeBee. |
| **Where it runs** | Your own Kubernetes cluster | Your own Kubernetes cluster | [app.nudgebee.com](https://app.nudgebee.com) |
| **Container images** | Public — `ghcr.io/nudgebee` (no authentication) | Licensed — `registry.nudgebee.com` | Managed for you |
-| **License key** | Not required | Required | Not applicable |
-| **Cost** | Free | Paid (per-license) | Paid (subscription) |
+| **License key** | Not required | Required | Managed in cloud account |
+| **Licensing** | Free for internal production & operations | Commercial enterprise license | Commercial SaaS subscription |
| **Best for** | Teams that want full control and a zero-cost, self-hosted deployment. | Organizations that need SAML SSO, NudgeBee's managed models, and commercial support while self-hosting. | Teams that want to start in minutes without managing infrastructure. |
| **Support** | Community ([GitHub Issues & Discussions](https://github.com/nudgebee)) | Commercial support (SLA) | Commercial support (SLA) |
@@ -25,7 +25,7 @@ the Workflow Builder, and Autopilot all work out of the box. You can move to
Enterprise or Cloud later without losing your configuration.
:::
-## What's in the open-source (Community) edition
+## What's in the Community edition
The Community edition is **fully functional** for self-hosted Kubernetes
operations. It includes:
@@ -64,10 +64,14 @@ per-feature badges are updated together so the docs always reflect what's
actually gated.
:::
-## Trademarks
+## Licensing & Trademarks
-NudgeBee is open source under the Apache 2.0 license, but the **NudgeBee name
-and logo are trademarks**. The Apache license does not grant trademark rights —
-in particular, modified builds and forks must be renamed. See the
-[trademark policy](https://github.com/nudgebee/nudgebee-docs/blob/main/TRADEMARKS.md)
-for what's allowed.
+- **NudgeBee Server**: Licensed under the **Business Source License 1.1 (BSL 1.1)**. Free for non-competing production and internal operations, automatically converting to open source under Apache 2.0 after its change date.
+- **NudgeBee Agents & Ecosystem**: The Kubernetes Agent ([k8s-agent](https://github.com/nudgebee/k8s-agent)) and Proxy Agent ([forager](https://github.com/nudgebee/forager)) are licensed under the **Apache 2.0 License**.
+- **Trademarks**: The **NudgeBee name and logo are trademarks**. The licenses do not grant trademark rights — modified builds and forks must be renamed. See the [trademark policy](https://github.com/nudgebee/nudgebee-docs/blob/main/TRADEMARKS.md) for what is allowed.
+
+---
+
+## Commercial Inquiries & Pricing
+
+For commercial licensing, enterprise SLAs, volume discounts, and Cloud subscription pricing, visit the [NudgeBee Pricing Page](https://nudgebee.com/pricing) or contact our sales team at [sales@nudgebee.com](mailto:sales@nudgebee.com).
diff --git a/doc-server/docs/features/_category_.json b/doc-server/docs/features/_category_.json
index e456a6a8..e1c1956e 100644
--- a/doc-server/docs/features/_category_.json
+++ b/doc-server/docs/features/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Features",
- "position": 2
+ "position": 6
}
diff --git a/doc-server/docs/features/optimizations.md b/doc-server/docs/features/optimizations.md
index c7c79b07..32506131 100644
--- a/doc-server/docs/features/optimizations.md
+++ b/doc-server/docs/features/optimizations.md
@@ -50,8 +50,8 @@ graph LR
### How to Raise Automated PRs
-1. Connect your repository under **Admin $\rightarrow$ Integrations $\rightarrow$ Code Repositories** ([GitHub](../integrations/Code%20Repository/GitHub/github-integration.md) or [GitLab](../integrations/Code%20Repository/GitLab/gitlab-integration.md)).
-2. Navigate to **Optimizations $\rightarrow$ Workload Right-Sizing**.
+1. Connect your repository under **Admin → Integrations → Code Repositories** ([GitHub](../integrations/Code%20Repository/GitHub/github-integration.md) or [GitLab](../integrations/Code%20Repository/GitLab/gitlab-integration.md)).
+2. Navigate to **Optimizations → Workload Right-Sizing**.
3. Select the target deployment or StatefulSet.
4. Click **Create Pull Request**.
5. NudgeBee creates a new branch, updates the Helm `values.yaml` or Terraform manifest with the recommended CPU/memory requests and limits, and opens a Pull Request with a clear rationale table for your engineering team to review.
diff --git a/doc-server/docs/index.md b/doc-server/docs/index.md
index 291e1265..5d8a6f99 100644
--- a/doc-server/docs/index.md
+++ b/doc-server/docs/index.md
@@ -87,6 +87,26 @@ NudgeBee has two components, both packaged as Helm charts that deploy natively o
**Self-hosted users**: You need a dedicated Kubernetes cluster (or namespace) to run the NudgeBee Server before connecting your monitored clusters. Sizing typically requires a 2-node cluster with 16 GB RAM and 4 cores per node. If you do not have Kubernetes clusters to run the server on, choose **Cloud SaaS**.
:::
+### Architecture at a Glance
+
+```mermaid
+flowchart LR
+ classDef infra fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#1e40af,rx:8,ry:8;
+ classDef platform fill:#f5f3ff,stroke:#8b5cf6,stroke-width:2px,color:#5b21b6,rx:8,ry:8;
+ classDef integ fill:#ecfdf5,stroke:#10b981,stroke-width:2px,color:#065f46,rx:8,ry:8;
+
+ INFRA["Monitored Infrastructure
• Kubernetes Clusters
• VMs & Bare Metal
• Cloud Provider Accounts"]:::infra
+ PLATFORM["NudgeBee Platform
• Cortex Intelligence & Graph
• DAIR Adaptive Router & SLMs
• SRE Agents & Autopilot Runbooks"]:::platform
+ INTEG["Actions & Integrations
• Slack / Teams Incident Triage
• Jira / PagerDuty Sync
• Automated GitOps PRs"]:::integ
+
+ INFRA -->|"Outbound Telemetry (WSS :443)"| PLATFORM
+ PLATFORM -->|"Alerts, Insights & Auto-PRs"| INTEG
+```
+
+:::tip Deep-Dive: Platform Reference Architecture
+For an in-depth breakdown of the 9-layer enterprise architecture (including the **Cortex Intelligence Layer**, **DAIR Adaptive Model Router**, in-VPC data plane, and runtime microservices), explore our dedicated **[Architecture & System Design Guide](./architecture.md)**.
+:::
+
### Connecting Your Infrastructure
Once the server is running (or you have signed up for SaaS), connect your infrastructure:
diff --git a/doc-server/docs/installation/_category_.json b/doc-server/docs/installation/_category_.json
index 54e12bf1..daa4859e 100644
--- a/doc-server/docs/installation/_category_.json
+++ b/doc-server/docs/installation/_category_.json
@@ -1 +1 @@
-{"label": "Installation", "position": 3}
+{"label": "Installation", "position": 5}
diff --git a/doc-server/docs/installation/agent/index.md b/doc-server/docs/installation/agent/index.md
index 4283fe1b..759db756 100644
--- a/doc-server/docs/installation/agent/index.md
+++ b/doc-server/docs/installation/agent/index.md
@@ -29,53 +29,73 @@ If you connected a cloud account (AWS, Azure, or GCP), NudgeBee can auto-discove
## Architecture
-The NudgeBee Agent runs within your Kubernetes cluster. The main component is the Runner, which acts as a central controller — it collects data from various components and communicates with the NudgeBee Server over HTTP and WebSocket.
-
-
+The NudgeBee Agent runs within your Kubernetes cluster. The main component is the Runner, which acts as a central controller — it coordinates data collection from cluster components and maintains a secure, outbound-only WebSocket connection to the NudgeBee Server.
+
+```mermaid
+flowchart TB
+ classDef runner fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#1e40af,rx:6,ry:6;
+ classDef collector fill:#f0fdf4,stroke:#22c55e,stroke-width:2px,color:#14532d,rx:6,ry:6;
+ classDef k8s fill:#fffbeb,stroke:#f59e0b,stroke-width:2px,color:#92400e,rx:6,ry:6;
+ classDef server fill:#f5f3ff,stroke:#8b5cf6,stroke-width:2px,color:#5b21b6,rx:6,ry:6;
+
+ subgraph MONITORED["Monitored Kubernetes Cluster"]
+ API_SERVER["Kubernetes API Server
Cluster state, Pods, Deployments"]:::k8s
+
+ subgraph AGENT["NudgeBee Agent Namespace (nudgebee-agent)"]
+ RUNNER["NudgeBee Runner (Deployment)
• Aggregates telemetry signals
• Executes in-cluster diagnostic & remediation tasks
• Outbound WSS tunnel"]:::runner
+ KUBEWATCH["Event Watcher (Kubewatch)
Streams resource changes & pod events"]:::collector
+ NODE_AGENT["Node Agent (DaemonSet)
eBPF network metrics, latency & packet telemetry"]:::collector
+ PROM["Metrics Engine (Prometheus / KSM)
Scrapes workload metrics & ServiceMonitors"]:::collector
+ LOGS["Logs Engine
Loki • OpenObserve • Elasticsearch • Fluentbit"]:::collector
+ TRACES["Distributed Tracing (OTel Collector)
OTLP spans • ClickHouse • Jaeger • Tempo"]:::collector
+ end
+ end
+
+ subgraph BACKEND["NudgeBee Server Control Plane"]
+ RELAY["Relay Server (:8080)
wss://relay.nudgebee.com/register"]:::server
+ COLLECTOR["Collector Server
https://collector.nudgebee.com"]:::server
+ end
+
+ API_SERVER -->|Watch Events| KUBEWATCH
+ KUBEWATCH -->|Forward Events| RUNNER
+ NODE_AGENT -->|eBPF Metrics| PROM
+ NODE_AGENT -->|OTLP Spans| TRACES
+
+ RUNNER -->|Query Metrics| PROM
+ RUNNER -->|Query Logs| LOGS
+ RUNNER -->|Query Traces| TRACES
+
+ RUNNER -->|"Outbound WSS :443"| RELAY
+ RUNNER -->|"HTTPS Telemetry :443"| COLLECTOR
+```
## Components
-### [Event Watcher (Forwarder)](https://github.com/robusta-dev/kubewatch) - Watch for K8s events and Forward to Runner
+### [Event Watcher (Forwarder)](https://github.com/robusta-dev/kubewatch) - Watch for K8s Events
- Monitors Kubernetes events using the Kubernetes API server.
- Filters and processes events based on predefined criteria.
-- Forwards relevant events to the Runner component.
-
-### [Node Agent](https://github.com/nudgebee/node-agent) - Network Metrics Collection using eBPF
-The Node Agent is responsible for collecting network metrics on each Kubernetes node using eBPF (Extended Berkeley Packet Filter) and publishing them to Prometheus for further analysis.
-
-- eBPF Probe
- - Attaches eBPF probes to key networking events, such as packet transmissions and receptions.
- - Captures relevant metrics, including latency, throughput, and error rates.
-
-- Metric Publisher
- - Aggregates collected metrics.
- - Publishes metrics to Prometheus for centralized monitoring.
- - Detects Application Errors (Logs and API Errors) and publishes these metrics to Prometheus.
-
-### [Runner](https://github.com/nudgebee/nudgebee-agent) - Discovery and Communication with NudgeBee Server
-The Runner component facilitates the discovery of Kubernetes cluster workloads and communicates with the NudgeBee server for workload synchronization.
-
-- Workload Discovery
- - Uses the Kubernetes API to discover running workloads within the cluster.
- - Periodically updates the list of workloads.
-
-- Communication with NudgeBee
- - Establishes a secure connection with the NudgeBee server.
- - Sends information about discovered workloads to the NudgeBee server for further processing.
-
-### [CostModel](https://github.com/opencost/opencost) - Cost Collection
-NudgeBee uses OpenCost for calculating cost metrics for Pods/Workloads etc.
-
-### Recommendation Jobs
-NudgeBee runs the following container Images on a scheduled basis as K8s Jobs for generating specific recommendations.
-
-[Security Recommendation](https://github.com/aquasecurity/trivy)
-NudgeBee Currently uses Trivy for Generating Docker Image Vulnerability related security Recommendations
-
-[Usage Recommendation](https://github.com/robusta-dev/krr)
-NudgeBee Currently uses Krr for Generating Usage related Recommendations
-
-[Best Practices Recommendation](https://github.com/derailed/popeye)
-NudgeBee Currently uses Popeye for Generating Best Practices related Recommendations
-
-[Prometheus](https://github.com/prometheus/prometheus) (Or [VictoriaMetrics](https://victoriametrics.com/)) - Metrics Collection and alerting
\ No newline at end of file
+- Forwards relevant events to the Runner component for incident triage.
+
+### [Node Agent](https://github.com/nudgebee/node-agent) - Network & eBPF Telemetry
+The Node Agent collects low-overhead network metrics and distributed trace signals on each Kubernetes node using eBPF:
+- **eBPF Probes**: Attaches to socket connections and packet lifecycle events to capture latency, throughput, and connection resets.
+- **Metric & Signal Publisher**: Publishes network performance signals to Prometheus and forwards distributed traces to the OpenTelemetry collector.
+
+### [Runner](https://github.com/nudgebee/k8s-agent) - Discovery & In-Cluster Controller
+The Runner facilitates workload discovery, coordinates data aggregation from metrics/logs/traces, and communicates securely with the NudgeBee Server:
+- Discovers running workloads, pods, and services via Kubernetes API.
+- Maintains an outbound-only WebSocket connection to the Relay Server.
+- Executes diagnostic runbooks and remediation commands safely inside the cluster.
+
+### [Logging Integration](./installation/logging/) - Log Stream Collection
+Collects and aggregates application, system, and container logs from Loki, OpenObserve, Elasticsearch, CloudWatch, or Fluent Bit for AI-driven root cause analysis and anomaly detection.
+
+### [Tracing Integration](./installation/tracing/) - Distributed Tracing & APM
+Leverages the OpenTelemetry Collector and backends (ClickHouse, Jaeger, Tempo, GCP Cloud Trace) to capture distributed transaction traces, map service dependencies, and pinpoint latency bottlenecks.
+
+### Recommendation & Diagnostic Jobs
+NudgeBee runs scheduled container jobs for specialized analysis:
+- **[Security Vulnerabilities](https://github.com/aquasecurity/trivy)**: Scans container images for CVEs using Trivy.
+- **[Workload Rightsizing](https://github.com/robusta-dev/krr)**: Analyzes CPU and memory usage patterns for FinOps recommendations.
+- **[Cluster Best Practices](https://github.com/derailed/popeye)**: Inspects Kubernetes configurations for misconfigurations and anti-patterns.
+- **[Prometheus](https://github.com/prometheus/prometheus)** (or VictoriaMetrics): Scrapes and indexes real-time workload metrics.
\ No newline at end of file
diff --git a/doc-server/docs/installation/agent/installation/index.md b/doc-server/docs/installation/agent/installation/index.md
index c64300ef..392c2e11 100644
--- a/doc-server/docs/installation/agent/installation/index.md
+++ b/doc-server/docs/installation/agent/installation/index.md
@@ -45,7 +45,7 @@ Install the NudgeBee Agent on each Kubernetes cluster you want to monitor. The a
| **Kubernetes cluster** | v1.27 or newer | The cluster you want to monitor |
| **Helm** | v3.x installed and configured | [Install Helm](https://helm.sh/) if you don't have it |
| **Linux Kernel** | v4.2 or newer on all nodes | Required for eBPF-based network metrics collection |
-| **NudgeBee Auth Key** | Generated from the NudgeBee UI | Go to **Kubernetes** $\rightarrow$ **Connect Cluster** |
+| **NudgeBee Auth Key** | Generated from the NudgeBee UI | Go to **Kubernetes** → **Connect Cluster** |
| **Registry access** | Outbound access to `nudgebee.github.io` (Helm repo) and `ghcr.io/nudgebee` (agent images) | Air-gapped clusters can mirror images internally |
| **Prometheus** | A running Prometheus instance in the cluster | If omitted, the installer can deploy a bundled instance |
@@ -55,8 +55,8 @@ The agent components are designed to be low overhead:
| Component | Sizing Breakdown | Notes |
|---|---|---|
-| **Agent Core (without Prometheus)** | **~3 GB RAM, 2 CPU cores** | Includes Runner, Node Agent DaemonSet, Event Watcher, OpenCost |
-| **Agent with Bundled Observability** | **~6 GB RAM, 3 CPU cores** | Includes Prometheus, Alertmanager, and Kube-State-Metrics |
+| **Agent Core (without Prometheus)** | **~2 GB RAM, 1-2 CPU cores** | Includes Runner, Node Agent DaemonSet (eBPF), Event Watcher |
+| **Agent with Bundled Observability** | **~5 GB RAM, 2-3 CPU cores** | Includes Prometheus, Alertmanager, and Kube-State-Metrics |
---
@@ -65,7 +65,7 @@ The agent components are designed to be low overhead:
### Step 1: Generate Your Auth Key
1. Log in to [app.nudgebee.com](https://app.nudgebee.com) (or your self-hosted NudgeBee UI).
-2. Navigate to **Kubernetes** $\rightarrow$ **Connect Cluster** in the left sidebar.
+2. Navigate to **Kubernetes** → **Connect Cluster** in the left sidebar.
3. Enter a friendly name for your cluster and click **Connect**.
4. Copy the generated **Auth Key** (``).
@@ -73,26 +73,12 @@ The agent components are designed to be low overhead:
Your Auth Key authorizes your agent to send data to your NudgeBee control plane. Store it securely in a secret manager or Kubernetes Secret — never commit it in cleartext.
:::
-### Step 2: Choose Your Installation Method
+### Step 2: Deploy via Helm
-#### Option A: Quick Install Script (Recommended)
-
-The automated script detects your cluster environment, sets up Prometheus if not already present, and deploys the agent with optimal defaults:
-
-```bash
-wget https://raw.githubusercontent.com/nudgebee/k8s-agent/refs/heads/prod/installation.sh
-chmod +x installation.sh
-./installation.sh -a
-```
-
----
-
-#### Option B: Manual Helm Installation by Environment
-
-Select your Kubernetes environment below for tailored Helm installation commands:
+Choose your Kubernetes environment:
-
+
```bash
# 1. Add NudgeBee Helm repository
@@ -111,8 +97,7 @@ helm upgrade --install nudgebee-prometheus prometheus-community/kube-prometheus-
helm upgrade --install nudgebee-agent nudgebee-agent/nudgebee-agent \
--namespace nudgebee-agent --create-namespace \
--set runner.nudgebee.auth_secret_key="" \
- --set globalConfig.prometheus_url="http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090" \
- --set opencost.opencost.prometheus.external.url="http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090"
+ --set globalConfig.prometheus_url="http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090"
```
@@ -123,13 +108,19 @@ helm upgrade --install nudgebee-agent nudgebee-agent/nudgebee-agent \
helm repo add nudgebee-agent https://nudgebee.github.io/k8s-agent/
helm repo update
-# 2. Deploy NudgeBee Agent (with GCP Cloud Billing API key for OpenCost)
+# 2. Install Prometheus (skip if already running in cluster)
+helm upgrade --install nudgebee-prometheus prometheus-community/kube-prometheus-stack \
+ --namespace nudgebee-agent --create-namespace \
+ --set nodeExporter.enabled=true \
+ --set alertmanager.enabled=true \
+ --set kubeStateMetrics.enabled=true \
+ -f https://raw.githubusercontent.com/nudgebee/k8s-agent/main/extra-scrape-config.yaml
+
+# 3. Deploy NudgeBee Agent
helm upgrade --install nudgebee-agent nudgebee-agent/nudgebee-agent \
--namespace nudgebee-agent --create-namespace \
--set runner.nudgebee.auth_secret_key="" \
- --set globalConfig.prometheus_url="http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090" \
- --set opencost.opencost.prometheus.external.url="http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090" \
- --set opencost.opencost.exporter.cloudProviderApiKey=""
+ --set globalConfig.prometheus_url="http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090"
```
@@ -196,14 +187,85 @@ Look for log confirmation: `Connected to NudgeBee Relay successfully` and `Regis
---
-## Troubleshooting Common Errors
+## 3. Troubleshooting Agent Installation Errors
+
+Use this diagnostic reference to resolve common agent deployment and communication issues.
+
+---
+
+### Diagnostic Quick Reference
| Error Symptom | Cause | Resolution |
|---|---|---|
-| **`401 Unauthorized / Invalid API Key`** | Incorrect or revoked Auth Key | Verify the key from **Kubernetes $\rightarrow$ Connect Cluster** and re-run `helm upgrade` with `--set runner.nudgebee.auth_secret_key=""`. |
-| **`WebSocket Dial Timeout / EOF`** | Outbound firewall blocking WebSocket | Ensure the cluster network allows outbound TCP traffic to port 443 (for SaaS `app.nudgebee.com` or your Ingress `relay.`). |
-| **`CRD / Webhook timeout error`** | Prometheus operator CRDs not yet established | Re-run the `helm upgrade` command. Helm will resume once the CRDs finish registering. |
-| **`Prometheus connection refused / empty metrics`** | Wrong Prometheus service URL | Ensure `globalConfig.prometheus_url` points to an accessible Prometheus service DNS (e.g. `http://..svc:9090`). |
+| **`401 Unauthorized / Invalid API Key`** | Incorrect or revoked Auth Key | Verify the key from **Kubernetes → Connect Cluster** and re-run `helm upgrade` with `--set runner.nudgebee.auth_secret_key=""`. |
+| **`node-agent CrashLoopBackOff` (eBPF load failure)** | Kernel < 4.2 or non-standard distro (Bottlerocket, Talos, GKE COS) | Check kernel with `uname -r`. Ensure `/sys/kernel/debug` is accessible, or disable eBPF with `--set nodeAgent.ebpf.enabled=false`. |
+| **`WebSocket Dial Timeout / EOF`** | Outbound firewall or NetworkPolicy blocking TCP 443 | Verify egress to `wss://relay.nudgebee.com` (SaaS) or your relay Ingress. Ensure port 443 is open. |
+| **`Prometheus connection refused / empty metrics`** | Wrong Prometheus service URL or missing KSM | Point `globalConfig.prometheus_url` to valid service DNS (e.g. `http://..svc:9090`). |
+| **OpenCost shows $0.00 / Missing Cost Data** | Missing cloud provider pricing API key | Provide `--set opencost.opencost.exporter.cloudProviderApiKey=""` or AWS CUR integration. |
+| **`CRD / Webhook timeout error`** | Prometheus operator CRDs not yet established | Wait 30 seconds and re-run the `helm upgrade` command. |
+
+---
+
+### In-Depth Diagnostic Scenarios
+
+#### 1. Node-Agent eBPF Probe Load Failures
+If the `nudgebee-node-agent` DaemonSet pods enter `CrashLoopBackOff` or fail to attach eBPF probes:
+
+**Diagnose:**
+```shell
+kubectl logs daemonset/nudgebee-node-agent -n nudgebee-agent
+```
+
+**Resolution:**
+- Verify that your Kubernetes node kernel is version **4.2 or higher** (`uname -r`).
+- For container-optimized operating systems (e.g. AWS Bottlerocket or GKE COS), ensure debugfs and bpf filesystems are mounted.
+- If running on microVMs or kernels with restricted eBPF, disable kernel probe instrumentation while maintaining metric scraping:
+ ```shell
+ helm upgrade nudgebee-agent nudgebee-agent/nudgebee-agent \
+ --namespace nudgebee-agent \
+ --reuse-values \
+ --set nodeAgent.ebpf.enabled=false
+ ```
+
+#### 2. Prometheus Metric Discovery & Zero Metrics
+If the cluster connects in the UI but workload CPU and memory graphs remain empty:
+
+**Diagnose:**
+```shell
+# Test Prometheus DNS resolution from inside the agent runner pod
+kubectl exec -it deployment/nudgebee-runner -n nudgebee-agent -- wget -qO- http://nudgebee-prometheus-kube-prometheus-prometheus.nudgebee-agent.svc:9090/api/v1/query?query=up
+```
+
+**Resolution:**
+Ensure `globalConfig.prometheus_url` points to the exact Prometheus service running in your cluster.
+
+#### 3. Egress Firewall & Kubernetes NetworkPolicy
+If your cluster enforces default-deny egress NetworkPolicies, the runner will fail with `WebSocket dial timeout`:
+
+**Resolution:**
+Apply a NetworkPolicy allowing outbound TCP traffic on port 443 from the `nudgebee-agent` namespace:
+```yaml
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: allow-nudgebee-egress
+ namespace: nudgebee-agent
+spec:
+ podSelector: {}
+ policyTypes:
+ - Egress
+ egress:
+ - to:
+ - ipBlock:
+ cidr: 0.0.0.0/0
+ ports:
+ - protocol: TCP
+ port: 443
+ - protocol: TCP
+ port: 53 # Allow DNS resolution
+ - protocol: UDP
+ port: 53
+```
---
@@ -229,12 +291,6 @@ runner:
globalConfig:
prometheus_url: "http://prometheus-kube-prometheus-prometheus.prometheus.svc:9090"
-
-opencost:
- opencost:
- prometheus:
- external:
- url: "http://prometheus-kube-prometheus-prometheus.prometheus.svc:9090"
```
Replace the placeholder values with your actual server URLs and auth key.
@@ -275,12 +331,6 @@ runner:
globalConfig:
prometheus_url: "http://prometheus-kube-prometheus-prometheus.prometheus.svc:9090"
-
-opencost:
- opencost:
- prometheus:
- external:
- url: "http://prometheus-kube-prometheus-prometheus.prometheus.svc:9090"
```
This disables WebSocket connections and configures the agent to accept HTTP connections from the relay instead.
diff --git a/doc-server/docs/installation/index.md b/doc-server/docs/installation/index.md
index 827aa1c5..0fd4acc3 100644
--- a/doc-server/docs/installation/index.md
+++ b/doc-server/docs/installation/index.md
@@ -25,7 +25,7 @@ Use the table below to determine the exact path for your setup:
| Your Situation | Recommended Model | Where to Go |
|---|---|---|
| **Want fastest start & zero infra management** | **Cloud SaaS** | [Agent Installation](./agent/installation/index.md) (or [Cloud Account Discovery](../features/Cloud/index.md)) |
-| **Strict data residency / air-gapped environment** | **Self-Hosted** | [Server Installation](./server/index.md) $\rightarrow$ then [Agent Installation](./agent/installation/index.md) |
+| **Strict data residency / air-gapped environment** | **Self-Hosted** | [Server Installation](./server/index.md) → then [Agent Installation](./agent/installation/index.md) |
| **Evaluating free open-source edition** | **Self-Hosted (Community)** | [Server Installation](./server/index.md) (select Community edition) |
| **No Kubernetes clusters yet** | **Cloud SaaS** | Sign up at [app.nudgebee.com](https://app.nudgebee.com) — add clusters when ready |
diff --git a/doc-server/docs/installation/server/index.md b/doc-server/docs/installation/server/index.md
index 927386cd..9e6d8713 100644
--- a/doc-server/docs/installation/server/index.md
+++ b/doc-server/docs/installation/server/index.md
@@ -27,7 +27,73 @@ The installation steps below use tabs — pick your edition in each step.
## Architecture
-
+```mermaid
+flowchart TB
+ classDef browser fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#78350f,rx:8,ry:8;
+ classDef app fill:#bae6fd,stroke:#0284c7,stroke-width:2px,color:#0369a1,rx:8,ry:8;
+ classDef backend fill:#bbf7d0,stroke:#16a34a,stroke-width:2px,color:#14532d,rx:8,ry:8;
+ classDef datastore fill:#f8fafc,stroke:#64748b,stroke-width:2px,color:#1e293b,rx:8,ry:8;
+ classDef collector fill:#ddd6fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95,rx:8,ry:8;
+ classDef agent fill:#fecdd3,stroke:#e11d48,stroke-dasharray: 5 5,stroke-width:2px,color:#881337,rx:8,ry:8;
+
+ BROWSER["Browser"]:::browser
+ APP["app
Next.js UI + auth boundary"]:::app
+
+ subgraph SERVICES["Microservices (Internal RPC with tenant + user context stamped on every call)"]
+ direction TB
+ SERVICES_SERVER["services-server
Go core backend"]:::backend
+ LLM_SERVER["llm-server
agents + tools"]:::backend
+ WORKFLOW_SERVER["workflow-server
runbooks + automations"]:::backend
+ NOTIFICATIONS["notifications
Slack / Teams / email"]:::backend
+ TICKET_SERVER["ticket-server
Jira / PagerDuty ..."]:::backend
+ end
+
+ subgraph STORAGE["Storage & Caching Layer (Shared by ALL services)"]
+ POSTGRES["Postgres
state + audit"]:::datastore
+ REDIS["Redis
cache"]:::datastore
+ end
+
+ subgraph INFRA["Messaging, Vector & Durable Execution"]
+ RABBITMQ["RabbitMQ
events"]:::datastore
+ QDRANT["Qdrant
RAG vectors"]:::datastore
+ TEMPORAL["Temporal
durable workflows"]:::datastore
+ end
+
+ subgraph COLLECTORS["Collectors & Ingress Hub"]
+ K8S_COLLECTOR["k8s-collector
cluster state + metrics"]:::collector
+ CLOUD_COLLECTOR["cloud-collector
AWS / Azure / GCP scans"]:::collector
+ RELAY_SERVER["relay-server
websocket hub"]:::collector
+ end
+
+ AGENT["nudgebee-agent (in YOUR cluster)
kubectl • Prometheus • Logs & Traces"]:::agent
+
+ BROWSER --> APP
+ APP --> SERVICES_SERVER
+ APP --> LLM_SERVER
+ APP --> WORKFLOW_SERVER
+ APP --> NOTIFICATIONS
+ APP --> TICKET_SERVER
+
+ SERVICES_SERVER -.-> STORAGE
+ LLM_SERVER -.-> STORAGE
+ WORKFLOW_SERVER -.-> STORAGE
+ NOTIFICATIONS -.-> STORAGE
+ TICKET_SERVER -.-> STORAGE
+
+ LLM_SERVER -->|vector search| QDRANT
+ WORKFLOW_SERVER -->|durable execution| TEMPORAL
+
+ K8S_COLLECTOR -->|signals| RABBITMQ
+ CLOUD_COLLECTOR -->|signals| RABBITMQ
+ RELAY_SERVER -->|signals| RABBITMQ
+ RABBITMQ --> SERVICES_SERVER
+
+ K8S_COLLECTOR -.-> STORAGE
+ CLOUD_COLLECTOR -.-> STORAGE
+ RELAY_SERVER -.-> STORAGE
+
+ AGENT -.->|"outbound only (WSS :443)"| RELAY_SERVER
+```
:::tip
**Estimated time**: 15–30 minutes, depending on your cluster and infrastructure setup.
@@ -463,50 +529,98 @@ nudgebee_secret:
## 7. Troubleshooting Installation Failures {#troubleshooting-installation-failures}
-### Most Common Issue: Migration Job Timeout
+Use this diagnostic playbook if your Helm deployment encounters errors or pods fail to transition into a `Running` state.
+
+---
+
+### Diagnostic Quick Reference
+| Error Symptom | Probable Cause | Diagnostic Command & Fix |
+|---|---|---|
+| **Migration Job Timeout / `0/1 Completed`** | Database not ready before migration ran, or stale schema lock | Check logs: `kubectl logs job/nudgebee-migration -n nudgebee`
Fix: Re-run `helm upgrade --wait` |
+| **`error pinging postgres: lookup postgres`** | Incorrect DB hostname or bundled vs external mismatch | Check `nudgebee_secret.APP_DATABASE_URL`
Bundled: `postgresql.nudgebee.svc.cluster.local:5432`
External: Verify RDS / Cloud SQL endpoint |
+| **RabbitMQ connection refused / CrashLoop** | RabbitMQ broker not ready or bad AMQP credentials | Check: `kubectl logs deployment/nudgebee-rabbitmq -n nudgebee`
Verify `RABBIT_MQ_HOST: "rabbitmq"` and port `5672` |
+| **502 Bad Gateway / WebSocket Disconnects** | Ingress missing WebSocket upgrade or timeout annotations | Add `nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"` to Ingress manifest |
+| **Pod Exit Code 137 (`OOMKilled`)** | Node under memory pressure or insufficient pod limit | Check: `kubectl describe pod -n nudgebee`
Fix: Increase RAM request/limit in `values.yaml` |
-The most common reason for installation failures or timeouts is the **post-installation migration job** not completing. This usually happens because dependent services (like the database) were not fully ready when Helm triggered the migration.
+---
-**Fix — re-run Helm upgrade:**
+### Failure Scenarios & Step-by-Step Fixes
+#### 1. Migration Job Timeout or CrashLoop
+The most common reason for installation timeouts is the **post-installation schema migration job** failing to complete. This occurs when the database pod is still initializing when the migration begins.
+
+**Diagnose:**
+```shell
+kubectl logs job/nudgebee-migration -n nudgebee
+```
+
+**Resolution:**
+Ensure PostgreSQL is in a `Running` state, then re-run the Helm upgrade with the `--wait` flag to allow dependencies to stabilize:
```shell
helm upgrade nudgebee $NUDGEBEE_CHART \
-f values.yaml \
--install \
--namespace nudgebee \
--wait \
- --kube-context $KUBE_CONTEXT
+ --timeout 10m
```
-This re-triggers the post-install migration and typically resolves the issue.
-
-:::tip
-If you installed a specific version, include `--version $CHART_VERSION` in the command.
-:::
+#### 2. Database Connection or DNS Lookup Failure
+If backend pods (`services-server`, `relay-server`) crash on startup with errors like:
+```text
+error pinging postgres: dial tcp: lookup postgres: no such host
+```
-### General Troubleshooting Steps
+**Resolution:**
+- **If using Bundled PostgreSQL (`postgresql.enabled: true`)**: Ensure `APP_DATABASE_URL` references the in-cluster Kubernetes DNS name:
+ `postgresql://nudgebee:@nudgebee-postgresql.nudgebee.svc.cluster.local:5432/nudgebee?sslmode=disable`
+- **If using External PostgreSQL (`postgresql.enabled: false`)**: Ensure your Kubernetes cluster nodes have network routing and security group access to your cloud database endpoint (e.g. AWS RDS or GCP Cloud SQL) on port 5432.
-If re-running Helm upgrade does not resolve the issue, check the following:
+#### 3. RabbitMQ Broker Connection Failure
+If backend services fail to initialize task consumers and event queues:
-**Check pod status** — look for pods in `Error`, `CrashLoopBackOff`, or `Pending` state:
+**Diagnose:**
```shell
-kubectl get pods -n nudgebee -o wide
+kubectl get pods -n nudgebee -l app.kubernetes.io/name=rabbitmq
+kubectl logs deployment/nudgebee-services-server -n nudgebee | grep -i rabbit
```
-**Check pod logs** — examine logs from failing pods, particularly migration-related pods:
-```shell
-kubectl logs -n nudgebee
+**Resolution:**
+Verify that `RABBIT_MQ_HOST` matches your service name (default `rabbitmq` or `nudgebee-rabbitmq`) and that the `RABBIT_MQ_PASSWORD` matches the secret generated during install.
+
+#### 4. Ingress 502 Bad Gateway / WebSocket EOF
+If the NudgeBee web UI loads but live events, agent connections, or NuBi AI chat stream disconnect unexpectedly:
+
+**Resolution:**
+Ensure your Ingress controller is configured for long-lived WebSocket connections. For NGINX Ingress, apply these annotations:
+```yaml
+metadata:
+ annotations:
+ nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
+ nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
+ nginx.ingress.kubernetes.io/websocket-services: "relay-server"
```
-**Inspect a failing pod** — get detailed information about why a pod is stuck:
+#### 5. Control Plane OOMKilled (Exit Code 137)
+If pods randomly restart under heavy metric or event ingestion:
+
+**Diagnose:**
```shell
-kubectl describe pod -n nudgebee
+kubectl get pods -n nudgebee -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.containerStatuses[*].lastState.terminated.reason}{"\n"}{end}'
```
-**Review recent events** — look for image pull errors, resource issues, or volume problems:
-```shell
-kubectl get events -n nudgebee --sort-by=.lastTimestamp
+**Resolution:**
+If `OOMKilled` appears, adjust the container memory limits in your `values.yaml`:
+```yaml
+services_server:
+ resources:
+ requests:
+ cpu: "500m"
+ memory: "1Gi"
+ limits:
+ cpu: "2"
+ memory: "4Gi"
```
---
diff --git a/doc-server/docs/integrations/Authentication/SAML.md b/doc-server/docs/integrations/Authentication/SAML.md
index 29bc165a..689d0014 100644
--- a/doc-server/docs/integrations/Authentication/SAML.md
+++ b/doc-server/docs/integrations/Authentication/SAML.md
@@ -1,5 +1,6 @@
---
sidebar_position: 2
+sidebar_label: SAML 2.0
---
# SAML 2.0
diff --git a/doc-server/docs/integrations/LLM/index.md b/doc-server/docs/integrations/LLM/index.md
index 90743086..80bbfc67 100644
--- a/doc-server/docs/integrations/LLM/index.md
+++ b/doc-server/docs/integrations/LLM/index.md
@@ -39,6 +39,8 @@ nudgebee_secret:
nudgebee_secret:
LLM_PROVIDER: "bedrock"
AWS_DEFAULT_REGION: "us-east-1"
+ # Bare model IDs (e.g. anthropic.claude-3-5-sonnet-20241022-v2:0) are valid for on-demand regional inference.
+ # Cross-region inference profile IDs (e.g. us.anthropic.claude-3-5-sonnet-20241022-v2:0) provide cross-region availability.
AWS_BEDROCK_MODEL_ID: "anthropic.claude-3-5-sonnet-20241022-v2:0"
# In EKS, IRSA is recommended; otherwise pass access keys:
# AWS_ACCESS_KEY_ID: ""
diff --git a/doc-server/docs/integrations/_category_.json b/doc-server/docs/integrations/_category_.json
index 23dd5433..19c7840e 100644
--- a/doc-server/docs/integrations/_category_.json
+++ b/doc-server/docs/integrations/_category_.json
@@ -1 +1 @@
-{"label": "Integrations", "position": 4}
+{"label": "Integrations", "position": 7}
diff --git a/doc-server/docs/releases/_category_.json b/doc-server/docs/releases/_category_.json
index e76e7398..ed9f5dde 100644
--- a/doc-server/docs/releases/_category_.json
+++ b/doc-server/docs/releases/_category_.json
@@ -1 +1 @@
-{"label": "Releases", "position": 5}
+{"label": "Releases", "position": 9}
diff --git a/doc-server/docs/telemetry.md b/doc-server/docs/telemetry.md
index 3ae30022..c9f04289 100644
--- a/doc-server/docs/telemetry.md
+++ b/doc-server/docs/telemetry.md
@@ -1,5 +1,5 @@
---
-sidebar_position: 3
+sidebar_position: 4
sidebar_label: Telemetry & Privacy
---
diff --git a/doc-server/static/img/platform_reference_architecture.png b/doc-server/static/img/platform_reference_architecture.png
new file mode 100644
index 00000000..bee7c478
Binary files /dev/null and b/doc-server/static/img/platform_reference_architecture.png differ
diff --git a/doc-server/static/img/server_runtime_architecture.png b/doc-server/static/img/server_runtime_architecture.png
new file mode 100644
index 00000000..c1897641
Binary files /dev/null and b/doc-server/static/img/server_runtime_architecture.png differ