chore: rename cameleer3 to cameleer
Rename Java packages from com.cameleer3 to com.cameleer, module directories from cameleer3-* to cameleer-*, and all references throughout workflows, Dockerfiles, docs, migrations, and pom.xml. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -568,7 +568,7 @@ MetricsFlushScheduler (@Scheduled)
|
||||
### Configuration
|
||||
|
||||
Environment variables (existing pattern):
|
||||
- `SPRING_DATASOURCE_URL=jdbc:postgresql://cameleer-postgres:5432/cameleer3`
|
||||
- `SPRING_DATASOURCE_URL=jdbc:postgresql://cameleer-postgres:5432/cameleer`
|
||||
- `SPRING_DATASOURCE_USERNAME`, `SPRING_DATASOURCE_PASSWORD`
|
||||
- `OPENSEARCH_URL=http://opensearch:9200`
|
||||
- `CAMELEER_RETENTION_DAYS=30` (applies to both PostgreSQL and OpenSearch)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## Overview
|
||||
|
||||
Add Database and OpenSearch admin pages to the Cameleer3 Server UI, allowing administrators to monitor subsystem health, inspect metrics, and perform basic maintenance actions. Restructure admin navigation from a single OIDC page to a sidebar sub-menu with dedicated pages per concern.
|
||||
Add Database and OpenSearch admin pages to the Cameleer Server UI, allowing administrators to monitor subsystem health, inspect metrics, and perform basic maintenance actions. Restructure admin navigation from a single OIDC page to a sidebar sub-menu with dedicated pages per concern.
|
||||
|
||||
## Goals
|
||||
|
||||
@@ -121,7 +121,7 @@ The gear icon expands/collapses an admin sub-menu in the sidebar:
|
||||
- Visual bar showing queue depth vs. max queue size
|
||||
- Metrics: queue depth, failed document count, debounce interval, indexing rate (docs/s), time since last indexed
|
||||
- Status badge based on configurable thresholds
|
||||
- Source: `SearchIndexer` internal stats, exposed via a new `SearchIndexerStats` interface in `cameleer3-server-core`
|
||||
- Source: `SearchIndexer` internal stats, exposed via a new `SearchIndexerStats` interface in `cameleer-server-core`
|
||||
- **Auto-refreshes every 15 seconds**
|
||||
|
||||
**Implementation note:** `SearchIndexer` currently has no stats API. This requires adding:
|
||||
@@ -242,7 +242,7 @@ Every admin action across the system, not just infrastructure pages:
|
||||
|
||||
### Backend Implementation
|
||||
|
||||
- `AuditService` — central service in `cameleer3-server-core`, injected into all admin controllers via direct method calls (no AOP/interceptor — consistent with existing controller style)
|
||||
- `AuditService` — central service in `cameleer-server-core`, injected into all admin controllers via direct method calls (no AOP/interceptor — consistent with existing controller style)
|
||||
- Primary method: `log(action, category, target, detail, result)` — extracts username and IP from `SecurityContextHolder` and `HttpServletRequest`
|
||||
- Overloaded method for pre-auth contexts: `log(username, action, category, target, detail, result, request)` — used by auth controllers where `SecurityContext` is not yet populated (login success/failure)
|
||||
- Captures `user_agent` from `HttpServletRequest` header
|
||||
|
||||
@@ -125,13 +125,13 @@ Sort explicitly in `DashboardTab.tsx` before rendering.
|
||||
### Backend — Modified
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| `cameleer3-server-core/.../rbac/SystemRole.java` | Add `ADMINS_GROUP_ID` constant |
|
||||
| `cameleer3-server-app/.../security/UiAuthController.java` | Add admin user to Admins group on login |
|
||||
| `cameleer-server-core/.../rbac/SystemRole.java` | Add `ADMINS_GROUP_ID` constant |
|
||||
| `cameleer-server-app/.../security/UiAuthController.java` | Add admin user to Admins group on login |
|
||||
|
||||
### Backend — New Migration
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| `cameleer3-server-app/src/main/resources/db/migration/V2__admin_group_seed.sql` | Seed Admins group + ADMIN role assignment |
|
||||
| `cameleer-server-app/src/main/resources/db/migration/V2__admin_group_seed.sql` | Seed Admins group + ADMIN role assignment |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
**Date:** 2026-03-23
|
||||
**Status:** Reviewed
|
||||
**Scope:** Close all gaps between `@cameleer/design-system` mocks and the cameleer3-server UI
|
||||
**Scope:** Close all gaps between `@cameleer/design-system` mocks and the cameleer-server UI
|
||||
|
||||
## Context
|
||||
|
||||
The `@cameleer/design-system` package (v0.0.2) contains fully realized mock pages demonstrating the target UX for the Cameleer3 monitoring platform. The current server UI was built as a first pass and has significant deviations from these mocks across every page. This spec defines the work to align them.
|
||||
The `@cameleer/design-system` package (v0.0.2) contains fully realized mock pages demonstrating the target UX for the Cameleer monitoring platform. The current server UI was built as a first pass and has significant deviations from these mocks across every page. This spec defines the work to align them.
|
||||
|
||||
**Out of scope:**
|
||||
- Business context columns (Order ID, Customer) — not applicable to current data model
|
||||
@@ -121,7 +121,7 @@ record SetPasswordRequest(
|
||||
|
||||
**Security:** ADMIN role required (same as other user management endpoints).
|
||||
|
||||
**New files:** `cameleer3-server-app/.../dto/SetPasswordRequest.java`; new method in `UserAdminController`.
|
||||
**New files:** `cameleer-server-app/.../dto/SetPasswordRequest.java`; new method in `UserAdminController`.
|
||||
|
||||
## 2. Dashboard Enhancements
|
||||
|
||||
@@ -541,12 +541,12 @@ All three tabs (Users, Groups, Roles) adopt the same layout pattern:
|
||||
- `ui/src/api/queries/agent-metrics.ts` (useAgentMetrics hook)
|
||||
- `ui/src/api/queries/processor-metrics.ts` (useProcessorMetrics hook)
|
||||
- `ui/src/api/queries/correlation.ts` (useCorrelationChain hook)
|
||||
- `cameleer3-server-app/.../controller/AgentMetricsController.java`
|
||||
- `cameleer3-server-app/.../dto/ProcessorMetrics.java`
|
||||
- `cameleer3-server-app/.../dto/AgentMetricsResponse.java`
|
||||
- `cameleer3-server-app/.../dto/MetricBucket.java`
|
||||
- `cameleer3-server-app/.../dto/SetPasswordRequest.java`
|
||||
- `cameleer3-server-app/src/main/resources/db/migration/V7__processor_stats_by_id.sql`
|
||||
- `cameleer-server-app/.../controller/AgentMetricsController.java`
|
||||
- `cameleer-server-app/.../dto/ProcessorMetrics.java`
|
||||
- `cameleer-server-app/.../dto/AgentMetricsResponse.java`
|
||||
- `cameleer-server-app/.../dto/MetricBucket.java`
|
||||
- `cameleer-server-app/.../dto/SetPasswordRequest.java`
|
||||
- `cameleer-server-app/src/main/resources/db/migration/V7__processor_stats_by_id.sql`
|
||||
|
||||
### Modified files:
|
||||
- `ui/package.json` — design system `^0.0.2`
|
||||
@@ -564,13 +564,13 @@ All three tabs (Users, Groups, Roles) adopt the same layout pattern:
|
||||
- `ui/src/pages/Admin/RbacPage.tsx` — restructured to container with split-pane tabs
|
||||
- `ui/src/pages/Admin/OidcConfigPage.tsx` — default roles, ConfirmDialog
|
||||
- `ui/src/api/schema.d.ts` — regenerated with new types
|
||||
- `cameleer3-server-app/.../dto/AgentInstanceResponse.java` — add version, capabilities
|
||||
- `cameleer3-server-app/.../controller/AgentRegistrationController.java` — map version/capabilities
|
||||
- `cameleer3-server-app/.../controller/RouteMetricsController.java` — add processor stats method
|
||||
- `cameleer3-server-app/.../controller/UserAdminController.java` — add password reset method
|
||||
- `cameleer3-server-app/.../SecurityConfig.java` — add rule for `GET /api/v1/agents/*/metrics`
|
||||
- `cameleer-server-app/.../dto/AgentInstanceResponse.java` — add version, capabilities
|
||||
- `cameleer-server-app/.../controller/AgentRegistrationController.java` — map version/capabilities
|
||||
- `cameleer-server-app/.../controller/RouteMetricsController.java` — add processor stats method
|
||||
- `cameleer-server-app/.../controller/UserAdminController.java` — add password reset method
|
||||
- `cameleer-server-app/.../SecurityConfig.java` — add rule for `GET /api/v1/agents/*/metrics`
|
||||
- `ui/src/main.tsx` or `ui/src/components/LayoutShell.tsx` — add `ToastProvider`
|
||||
- `cameleer3-server-app/.../OpenApiConfig.java` — register new DTOs
|
||||
- `cameleer-server-app/.../OpenApiConfig.java` — register new DTOs
|
||||
|
||||
### Backend migration:
|
||||
- `V7__processor_stats_by_id.sql` — new `stats_1m_processor_detail` continuous aggregate with `processor_id` grouping
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
## Context
|
||||
|
||||
The Cameleer3 agent now supports camel-native data extraction taps, business attributes on executions, enhanced replay with editable payloads, per-route recording toggles, and success compression. The agent-side implementation is deployed and live.
|
||||
The Cameleer agent now supports camel-native data extraction taps, business attributes on executions, enhanced replay with editable payloads, per-route recording toggles, and success compression. The agent-side implementation is deployed and live.
|
||||
|
||||
The shared models (`TapDefinition`, extended `ApplicationConfig` with `taps`, `tapVersion`, `routeRecording`, `compressSuccess`) exist in `cameleer3-common` (agent repo). The server already depends on this library and persists `ApplicationConfig` as JSONB in the `application_config` table. However, the server-side execution DTOs (`ExecutionDetail`, `ExecutionSummary`, `ProcessorNode`) do not yet carry `attributes` fields, and the `CommandType` enum lacks `TEST_EXPRESSION`.
|
||||
The shared models (`TapDefinition`, extended `ApplicationConfig` with `taps`, `tapVersion`, `routeRecording`, `compressSuccess`) exist in `cameleer-common` (agent repo). The server already depends on this library and persists `ApplicationConfig` as JSONB in the `application_config` table. However, the server-side execution DTOs (`ExecutionDetail`, `ExecutionSummary`, `ProcessorNode`) do not yet carry `attributes` fields, and the `CommandType` enum lacks `TEST_EXPRESSION`.
|
||||
|
||||
This spec covers all UI surfaces and the backend changes needed to support them.
|
||||
|
||||
@@ -24,7 +24,7 @@ This spec covers all UI surfaces and the backend changes needed to support them.
|
||||
|
||||
Before UI work can begin, the following backend changes are required:
|
||||
|
||||
1. **Update `cameleer3-common` dependency** — ensure the server pulls a version that includes `TapDefinition`, and `ApplicationConfig` with `taps`, `tapVersion`, `routeRecording`, `compressSuccess` fields.
|
||||
1. **Update `cameleer-common` dependency** — ensure the server pulls a version that includes `TapDefinition`, and `ApplicationConfig` with `taps`, `tapVersion`, `routeRecording`, `compressSuccess` fields.
|
||||
2. **Add `attributes` to execution DTOs** — `ExecutionDetail`, `ProcessorNode`, and `ExecutionSummary` need a `Map<String, String> attributes` field. This requires changes to the PostgreSQL ingestion pipeline (store attributes from agent-submitted `RouteExecution`/`ProcessorExecution`), the detail service (reconstruct attributes), and the OpenSearch indexing (index attributes for search results).
|
||||
3. **Add `TEST_EXPRESSION` to `CommandType`** enum.
|
||||
4. **Enhance `CommandAckRequest`** — add an optional `data` field (`String`, JSON) to carry structured results (currently only `status` + `message`). The test-expression endpoint needs the result value from the ACK.
|
||||
@@ -228,12 +228,12 @@ No new components required. Uses existing: Modal, DataTable, Badge, Toggle, Sele
|
||||
- `pages/Admin/AppConfigDetailPage.tsx` — restructure to 3 sections, traces & taps merged table, route recording table, compress success badge
|
||||
- `pages/Admin/AppConfigDetailPage.module.css` — updated section styles
|
||||
|
||||
### Backend (cameleer3-server-app/)
|
||||
### Backend (cameleer-server-app/)
|
||||
- `controller/ApplicationConfigController.java` — add test-expression endpoint
|
||||
- `dto/CommandAckRequest.java` — add optional `data` field
|
||||
- `controller/AgentCommandController.java` — support CompletableFuture-based ACK for test-expression
|
||||
|
||||
### Backend (cameleer3-server-core/)
|
||||
### Backend (cameleer-server-core/)
|
||||
- `agent/CommandType.java` — add TEST_EXPRESSION
|
||||
- `detail/ExecutionDetail.java` — add attributes field
|
||||
- `detail/ProcessorNode.java` — add attributes field
|
||||
|
||||
@@ -36,7 +36,7 @@ Build an `ExecutionDiagram` wrapper component that overlays execution data onto
|
||||
|
||||
### Iteration fields on ProcessorNode
|
||||
|
||||
The `ProcessorExecution` model in `cameleer3-common` has iteration tracking fields (`loopIndex`, `loopSize`, `splitIndex`, `splitSize`, `multicastIndex`), but the server's storage layer and API response model do not surface them. The following changes are needed:
|
||||
The `ProcessorExecution` model in `cameleer-common` has iteration tracking fields (`loopIndex`, `loopSize`, `splitIndex`, `splitSize`, `multicastIndex`), but the server's storage layer and API response model do not surface them. The following changes are needed:
|
||||
|
||||
**Storage:**
|
||||
- Add columns to `processor_records` table: `loop_index`, `loop_size`, `split_index`, `split_size`, `multicast_index` (all nullable integers)
|
||||
|
||||
@@ -37,9 +37,9 @@ Add optional `direction` query parameter to diagram render endpoints.
|
||||
|
||||
### Files
|
||||
|
||||
- `cameleer3-server-app/.../diagram/ElkDiagramRenderer.java` — accept direction param, map to ELK `Direction.RIGHT` (LR) or `Direction.DOWN` (TB)
|
||||
- `cameleer3-server-core/.../diagram/DiagramRenderer.java` — update interface to accept direction
|
||||
- `cameleer3-server-app/.../controller/DiagramRenderController.java` — add `@RequestParam(defaultValue = "LR") String direction` to render endpoints
|
||||
- `cameleer-server-app/.../diagram/ElkDiagramRenderer.java` — accept direction param, map to ELK `Direction.RIGHT` (LR) or `Direction.DOWN` (TB)
|
||||
- `cameleer-server-core/.../diagram/DiagramRenderer.java` — update interface to accept direction
|
||||
- `cameleer-server-app/.../controller/DiagramRenderController.java` — add `@RequestParam(defaultValue = "LR") String direction` to render endpoints
|
||||
- `ui/src/api/queries/diagrams.ts` — pass `direction` query param to API calls; also update `DiagramLayout` edge type to match backend `PositionedEdge` serialization: `{ sourceId, targetId, label?, points: number[][] }` (currently defines `{ from?, to? }` which is missing `points` and `label`)
|
||||
|
||||
### Behavior
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Context
|
||||
|
||||
The Cameleer3 UI was redesigned from page-based routing to a scope-based model with three content tabs. The Process Diagram is the major USP for the Apache Camel community.
|
||||
The Cameleer UI was redesigned from page-based routing to a scope-based model with three content tabs. The Process Diagram is the major USP for the Apache Camel community.
|
||||
|
||||
## Core Model
|
||||
|
||||
@@ -130,7 +130,7 @@ Default `/` redirects to `/exchanges`.
|
||||
|
||||
## What Differentiates from njams
|
||||
|
||||
1. **Three-tab model** — njams interleaves everything; Cameleer3 separates concerns
|
||||
1. **Three-tab model** — njams interleaves everything; Cameleer separates concerns
|
||||
2. **Inline KPI metrics** — compact stats in the tab bar with trend indicators
|
||||
3. **State-based selection** — exchange selection via local state, not URL navigation (preserves search)
|
||||
4. **Browser history integration** — Back/Forward restores exchange selection
|
||||
|
||||
@@ -68,9 +68,9 @@ Event 2: {type: "EXECUTION_COMPLETED", executionId: "abc", duration: 250, output
|
||||
- More flexible: supports any number of state transitions (RUNNING -> PAUSED -> RUNNING -> COMPLETED)
|
||||
- Natural fit for event sourcing architectures
|
||||
|
||||
### Option C: Hybrid (Current Cameleer3-Server Approach)
|
||||
### Option C: Hybrid (Current Cameleer-Server Approach)
|
||||
|
||||
Keep the two-phase protocol but handle merging at the server application layer. This is what cameleer3-server implements today with the `ExecutionAccumulator`:
|
||||
Keep the two-phase protocol but handle merging at the server application layer. This is what cameleer-server implements today with the `ExecutionAccumulator`:
|
||||
|
||||
- RUNNING POST -> hold in `ConcurrentHashMap` (no DB write)
|
||||
- COMPLETED POST -> merge with RUNNING in-memory -> single INSERT to DB
|
||||
|
||||
@@ -5,7 +5,7 @@ PostgreSQL retained only for RBAC, config, and audit log.
|
||||
|
||||
## Context
|
||||
|
||||
Cameleer3-server currently uses three storage systems:
|
||||
Cameleer-server currently uses three storage systems:
|
||||
|
||||
- **PostgreSQL/TimescaleDB**: executions, processor_executions, agent_metrics (hypertables), agent_events, route_diagrams, plus RBAC/config/audit tables. Continuous aggregates for dashboard statistics.
|
||||
- **OpenSearch**: executions-YYYY-MM-DD indices (full-text search on bodies/headers/errors), logs-YYYY-MM-DD indices (application log storage with 7-day retention).
|
||||
@@ -34,7 +34,7 @@ This architecture has scaling limits: three systems to operate, data duplication
|
||||
|
||||
These are features NOT available in the open-source version:
|
||||
|
||||
| Constraint | Impact on Cameleer3 |
|
||||
| Constraint | Impact on Cameleer |
|
||||
|------------|---------------------|
|
||||
| No SharedMergeTree | No elastic compute scaling; must size nodes up-front. Acceptable for self-hosted. |
|
||||
| No BM25 relevance scoring | Search returns matches without ranking. Acceptable for observability (want all matches, not ranked). |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Composable Sidebar with Accordion & Collapse
|
||||
|
||||
**Issue:** [#112](https://gitea.siegeln.net/cameleer/cameleer3-server/issues/112)
|
||||
**Issue:** [#112](https://gitea.siegeln.net/cameleer/cameleer-server/issues/112)
|
||||
**Date:** 2026-04-02
|
||||
**Scope:** Design system refactor + server UI migration
|
||||
|
||||
@@ -346,7 +346,7 @@ This is a two-repo change:
|
||||
- Update barrel exports
|
||||
- Bump version
|
||||
|
||||
2. **Server UI migration** (cameleer3-server repo):
|
||||
2. **Server UI migration** (cameleer-server repo):
|
||||
- Move tree-building functions to local utils
|
||||
- Rewrite sidebar composition in `LayoutShell` using new compound API
|
||||
- Add accordion logic for admin mode
|
||||
|
||||
@@ -194,7 +194,7 @@ for (AgentEvent event : events) {
|
||||
The agent detects route state changes using Camel's `EventNotifier` mechanism:
|
||||
|
||||
```java
|
||||
// In the Cameleer3 agent (cameleer3 repo)
|
||||
// In the Cameleer agent (cameleer repo)
|
||||
public class RouteStateEventNotifier extends EventNotifierSupport {
|
||||
|
||||
@Override
|
||||
@@ -264,7 +264,7 @@ Agent boots
|
||||
3. Update `RouteStateRegistry` from both sources
|
||||
4. Remove ACK-based inference from `AgentCommandController` (heartbeat/events are authoritative)
|
||||
|
||||
### Phase 2: Agent-side (cameleer3 repo)
|
||||
### Phase 2: Agent-side (cameleer repo)
|
||||
1. Add `RouteStateEventNotifier` to detect state changes
|
||||
2. Maintain local `routeStates` map
|
||||
3. Include `routeStates` in heartbeat payload
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Goal
|
||||
|
||||
Standalone demo prototype: upload a Camel JAR, build a container image with the cameleer3 monitoring agent injected, deploy to k3s, and see full observability appear in cameleer3-server.
|
||||
Standalone demo prototype: upload a Camel JAR, build a container image with the cameleer monitoring agent injected, deploy to k3s, and see full observability appear in cameleer-server.
|
||||
|
||||
## Project
|
||||
|
||||
@@ -35,7 +35,7 @@ Deploy Service (Spring Boot 3, Java 21, port 8082)
|
||||
│
|
||||
├─► Gitea Container Registry (images)
|
||||
├─► k3s cluster / cameleer-demo namespace (workloads)
|
||||
└─► cameleer3-server (agents auto-register via bootstrap token)
|
||||
└─► cameleer-server (agents auto-register via bootstrap token)
|
||||
```
|
||||
|
||||
## No Auth
|
||||
@@ -49,11 +49,11 @@ Generated Dockerfile per app:
|
||||
```dockerfile
|
||||
FROM eclipse-temurin:21-jre-alpine
|
||||
|
||||
ADD https://gitea.siegeln.net/api/packages/cameleer/maven/com/cameleer3/cameleer3-agent/1.0-SNAPSHOT/cameleer3-agent-1.0-SNAPSHOT.jar /opt/cameleer/agent.jar
|
||||
ADD https://gitea.siegeln.net/api/packages/cameleer/maven/com/cameleer/cameleer-agent/1.0-SNAPSHOT/cameleer-agent-1.0-SNAPSHOT.jar /opt/cameleer/agent.jar
|
||||
|
||||
COPY app.jar /opt/app/app.jar
|
||||
|
||||
ENV CAMELEER_SERVER_URL=http://cameleer3-server.cameleer.svc:8081
|
||||
ENV CAMELEER_SERVER_URL=http://cameleer-server.cameleer.svc:8081
|
||||
ENV CAMELEER_APP_NAME=<user-provided-name>
|
||||
ENV CAMELEER_AUTH_TOKEN=<bootstrap-token>
|
||||
|
||||
@@ -68,7 +68,7 @@ Each app gets a Deployment in the `cameleer-demo` namespace:
|
||||
|
||||
- Resource requests/limits from user config (defaults: 250m/256Mi requests, 500m/512Mi limits)
|
||||
- User-provided env vars injected into the container spec
|
||||
- No Service or Ingress (apps only need outbound access to cameleer3-server)
|
||||
- No Service or Ingress (apps only need outbound access to cameleer-server)
|
||||
- Labels: `app.kubernetes.io/managed-by: cameleer-deploy`, `cameleer/app-name: <name>`
|
||||
|
||||
## Data Model (In-Memory)
|
||||
@@ -101,7 +101,7 @@ On GET /api/apps, reconcile status with actual K8s pod phase via kubectl. On sta
|
||||
|
||||
| Column | Content |
|
||||
|--------|---------|
|
||||
| Name | Clickable → cameleer3-server exchanges page |
|
||||
| Name | Clickable → cameleer-server exchanges page |
|
||||
| Status | Badge: Running / Pending / Failed / Building |
|
||||
| Image | Image tag (mono text) |
|
||||
| Resources | CPU/Memory limits |
|
||||
@@ -124,7 +124,7 @@ All components from @cameleer/design-system. CSS modules for layout.
|
||||
## Configuration
|
||||
|
||||
Deploy service env vars:
|
||||
- `CAMELEER_SERVER_URL` — cameleer3-server URL for agent registration (default: `http://cameleer3-server.cameleer.svc:8081`)
|
||||
- `CAMELEER_SERVER_URL` — cameleer-server URL for agent registration (default: `http://cameleer-server.cameleer.svc:8081`)
|
||||
- `CAMELEER_BOOTSTRAP_TOKEN` — bootstrap token for agent registration
|
||||
- `CAMELEER_REGISTRY` — container registry prefix (default: `gitea.siegeln.net/cameleer/demo-apps`)
|
||||
- `CAMELEER_AGENT_MAVEN_URL` — URL for agent snapshot JAR
|
||||
@@ -139,7 +139,7 @@ Deploy service env vars:
|
||||
- Container: Docker (multi-stage build)
|
||||
- Deploy: k3s at 192.168.50.86, namespace `cameleer-demo`
|
||||
- Registry: Gitea container registry
|
||||
- Agent: cameleer3-agent 1.0-SNAPSHOT from Gitea Maven registry
|
||||
- Agent: cameleer-agent 1.0-SNAPSHOT from Gitea Maven registry
|
||||
|
||||
## Out of Scope
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
## Context
|
||||
|
||||
Cameleer3 Server is being integrated into a SaaS platform (cameleer-saas). The server must support multiple tenants sharing PostgreSQL and ClickHouse while guaranteeing strict data isolation. Each tenant gets their own cameleer3-server instance. Environments (dev/staging/prod) are a first-class concept within each tenant.
|
||||
Cameleer Server is being integrated into a SaaS platform (cameleer-saas). The server must support multiple tenants sharing PostgreSQL and ClickHouse while guaranteeing strict data isolation. Each tenant gets their own cameleer-server instance. Environments (dev/staging/prod) are a first-class concept within each tenant.
|
||||
|
||||
## Decisions
|
||||
|
||||
@@ -32,13 +32,13 @@ Tenant (customer org)
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Tenant "Acme" ──► cameleer3-server (TENANT_ID=acme)
|
||||
Tenant "Acme" ──► cameleer-server (TENANT_ID=acme)
|
||||
├─ PG schema: tenant_acme
|
||||
├─ CH writes: tenant_id='acme'
|
||||
├─ Agents: env=dev, env=prod
|
||||
└─ In-memory: registry, catalog, SSE
|
||||
|
||||
Tenant "Beta" ──► cameleer3-server (TENANT_ID=beta)
|
||||
Tenant "Beta" ──► cameleer-server (TENANT_ID=beta)
|
||||
├─ PG schema: tenant_beta
|
||||
├─ CH writes: tenant_id='beta'
|
||||
└─ ...
|
||||
@@ -335,9 +335,9 @@ prod
|
||||
|
||||
## 7. What the SaaS Shell Must Do
|
||||
|
||||
The cameleer3-server does NOT manage tenants. The SaaS shell (cameleer-saas) is responsible for:
|
||||
The cameleer-server does NOT manage tenants. The SaaS shell (cameleer-saas) is responsible for:
|
||||
|
||||
1. **Provisioning**: Create PG schema `tenant_{id}`, generate per-tenant bootstrap token, start cameleer3-server container with `CAMELEER_TENANT_ID={id}` and PG URL pointing to the schema
|
||||
1. **Provisioning**: Create PG schema `tenant_{id}`, generate per-tenant bootstrap token, start cameleer-server container with `CAMELEER_TENANT_ID={id}` and PG URL pointing to the schema
|
||||
2. **Routing**: Route agent and UI traffic to the correct server instance (by tenant)
|
||||
3. **Lifecycle**: Start/stop/upgrade tenant server instances
|
||||
4. **Auth**: Issue JWTs with tenant claims (via Logto), configure ForwardAuth
|
||||
@@ -346,7 +346,7 @@ The cameleer3-server does NOT manage tenants. The SaaS shell (cameleer-saas) is
|
||||
|
||||
| Area | Change | Complexity |
|
||||
|------|--------|------------|
|
||||
| Agent protocol (cameleer3-common) | Add `environmentId` to registration + heartbeat | Low |
|
||||
| Agent protocol (cameleer-common) | Add `environmentId` to registration + heartbeat | Low |
|
||||
| Server config | `TenantProperties` bean, PG schema URL | Low |
|
||||
| ClickHouse schema | Add `environment` column, update ORDER BY/PARTITION BY | Medium |
|
||||
| ClickHouse stores (8 files) | Replace hardcoded `"default"` with injected tenant ID, add environment | Medium |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Context
|
||||
|
||||
Cameleer3 Server uses Authentik as its OIDC provider for external identity federation. The SaaS platform (cameleer-saas) has adopted Logto as its identity provider. To align the stack:
|
||||
Cameleer Server uses Authentik as its OIDC provider for external identity federation. The SaaS platform (cameleer-saas) has adopted Logto as its identity provider. To align the stack:
|
||||
|
||||
1. **Replace Authentik with Logto** — self-hosted Logto in the K8s cluster, replacing the Authentik deployment
|
||||
2. **Add OIDC resource server support** — the server must accept Logto access tokens (asymmetric JWT, ES384) in addition to its own internal HMAC JWTs, so the SaaS platform can call server APIs using M2M tokens
|
||||
@@ -43,7 +43,7 @@ Self-hosted Logto deployment:
|
||||
## Part 2: Server — OIDC Resource Server Support
|
||||
|
||||
### Change 1: Add dependency
|
||||
**File:** `cameleer3-server-app/pom.xml`
|
||||
**File:** `cameleer-server-app/pom.xml`
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
@@ -53,7 +53,7 @@ Self-hosted Logto deployment:
|
||||
```
|
||||
|
||||
### Change 2: Add OIDC properties
|
||||
**File:** `cameleer3-server-app/src/main/resources/application.yml`
|
||||
**File:** `cameleer-server-app/src/main/resources/application.yml`
|
||||
|
||||
```yaml
|
||||
security:
|
||||
@@ -196,7 +196,7 @@ Update PUT handler default: `rolesClaim` from `realm_access.roles` to `roles`.
|
||||
| `deploy/authentik.yaml` | Delete |
|
||||
| `deploy/logto.yaml` | Create |
|
||||
| `.gitea/workflows/ci.yml` | Modify (Authentik -> Logto) |
|
||||
| `cameleer3-server-app/pom.xml` | Modify (add dependency) |
|
||||
| `cameleer-server-app/pom.xml` | Modify (add dependency) |
|
||||
| `application.yml` | Modify (add OIDC properties) |
|
||||
| `SecurityProperties.java` | Modify (add fields) |
|
||||
| `SecurityConfig.java` | Modify (build decoder, pass to filter) |
|
||||
|
||||
@@ -109,7 +109,7 @@ traefik.enable=true
|
||||
traefik.http.routers.{svc}.rule=PathPrefix(`/{envSlug}/{appSlug}/`)
|
||||
traefik.http.routers.{svc}.entrypoints=websecure
|
||||
traefik.http.services.{svc}.loadbalancer.server.port={appPort}
|
||||
managed-by=cameleer3-server
|
||||
managed-by=cameleer-server
|
||||
cameleer.app={appSlug}
|
||||
cameleer.environment={envSlug}
|
||||
```
|
||||
@@ -257,7 +257,7 @@ Plus all entries from `customEnvVars` in the resolved config.
|
||||
|
||||
`@Component` that starts a persistent Docker event stream on `@PostConstruct`.
|
||||
|
||||
- Filters for containers with label `managed-by=cameleer3-server`
|
||||
- Filters for containers with label `managed-by=cameleer-server`
|
||||
- Listens for events: `die`, `oom`, `stop`, `start`
|
||||
- On `die`/`oom`: looks up deployment by container ID, updates replica status to `DEAD`, recomputes deployment status (RUNNING → DEGRADED → FAILED)
|
||||
- On `start`: updates replica status to `RUNNING` (handles Docker restart policy recoveries)
|
||||
@@ -330,7 +330,7 @@ Same fields as create page, plus visible in read-only mode when not editing.
|
||||
|
||||
## New/Modified Components Summary
|
||||
|
||||
### Core module (cameleer3-server-core)
|
||||
### Core module (cameleer-server-core)
|
||||
|
||||
- `ResolvedContainerConfig` — new record with all typed fields
|
||||
- `ConfigMerger` — pure function, three-layer merge
|
||||
@@ -338,7 +338,7 @@ Same fields as create page, plus visible in read-only mode when not editing.
|
||||
- `DeploymentStatus` — add `DEGRADED`, `STOPPING`
|
||||
- `Deployment` — add `targetState`, `deploymentStrategy`, `replicaStates`, `deployStage`
|
||||
|
||||
### App module (cameleer3-server-app)
|
||||
### App module (cameleer-server-app)
|
||||
|
||||
- `DockerRuntimeOrchestrator` — apply full config (memory reserve, CPU limit, exposed ports, restart policy)
|
||||
- `DockerNetworkManager` — new component, lazy network creation + container attachment
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# UI Consistency Fix — Design Spec
|
||||
|
||||
**Date:** 2026-04-09
|
||||
**Goal:** Bring the cameleer3-server UI to consistent design system usage — eliminate CSS duplication, hardcoded colors, inline styles, and native HTML where DS components exist.
|
||||
**Goal:** Bring the cameleer-server UI to consistent design system usage — eliminate CSS duplication, hardcoded colors, inline styles, and native HTML where DS components exist.
|
||||
**Source:** `UI-CONSISTENCY-AUDIT.md` (same repo, same date)
|
||||
|
||||
---
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## Context
|
||||
|
||||
Comprehensive Playwright-driven audit of the live Cameleer3 UI (build 69dcce2, 60+ screenshots) combined with the existing UI_FINDINGS.md visual audit (2026-03-25) and 16 open Gitea issues. Three code-level audits performed: layout consistency (CSS modules), interaction patterns (dialogs, buttons, toasts), and design system adoption.
|
||||
Comprehensive Playwright-driven audit of the live Cameleer UI (build 69dcce2, 60+ screenshots) combined with the existing UI_FINDINGS.md visual audit (2026-03-25) and 16 open Gitea issues. Three code-level audits performed: layout consistency (CSS modules), interaction patterns (dialogs, buttons, toasts), and design system adoption.
|
||||
|
||||
Audit artifacts in `audit/`:
|
||||
- `monitoring-pages-findings.md` — exchanges, dashboard, runtime, deployments, command palette, dark mode
|
||||
@@ -314,7 +314,7 @@ Single highest-impact fix — affects every page.
|
||||
|
||||
### 4.4 Agent Name Truncation
|
||||
|
||||
**Problem:** Raw K8s pod names like `8c0affadb860-1` or `cameleer3-backend-7c778f488c-2c2pc-1`.
|
||||
**Problem:** Raw K8s pod names like `8c0affadb860-1` or `cameleer-backend-7c778f488c-2c2pc-1`.
|
||||
|
||||
**Fix:**
|
||||
- Use agent `displayName` if set at registration
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
**Date:** 2026-04-11
|
||||
**Status:** Approved
|
||||
**Scope:** cameleer3-server + cameleer-saas
|
||||
**Scope:** cameleer-server + cameleer-saas
|
||||
|
||||
---
|
||||
|
||||
@@ -113,7 +113,7 @@ returns 404 and the page shows its existing error state.
|
||||
|
||||
The SaaS platform sits on the same Docker network as PostgreSQL and ClickHouse.
|
||||
It already has their connection URLs in `ProvisioningProperties` (`datasourceUrl`
|
||||
for cameleer3 PostgreSQL, `clickhouseUrl` for ClickHouse). It already uses raw
|
||||
for cameleer PostgreSQL, `clickhouseUrl` for ClickHouse). It already uses raw
|
||||
JDBC (`DriverManager.getConnection()`) for tenant data cleanup in
|
||||
`TenantDataCleanupService`. The infrastructure dashboard uses the same pattern.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ The server constructs Docker container entrypoints for deployed apps, but curren
|
||||
|
||||
- **Spring Boot**: `-cp app.jar org.springframework.boot.loader.launch.PropertiesLauncher` with `-Dloader.path` for the log appender
|
||||
- **Quarkus JVM**: `-jar app.jar` (appender is a compiled-in Maven dependency)
|
||||
- **Plain Java**: `-cp app.jar:/app/cameleer3-log-appender.jar <Main-Class>`
|
||||
- **Plain Java**: `-cp app.jar:/app/cameleer-log-appender.jar <Main-Class>`
|
||||
- **Native** (Quarkus native): no JVM, just run the binary directly (agent compiled in at build time)
|
||||
|
||||
Users also need a way to pass custom command-line arguments (JVM flags, system properties, or native binary args).
|
||||
@@ -64,9 +64,9 @@ New class `RuntimeDetector` in the core module. Pure function: takes a file path
|
||||
|
||||
| Type | Entrypoint |
|
||||
|------|-----------|
|
||||
| `SPRING_BOOT` | `exec java -javaagent:/app/agent.jar -Dloader.path=/app/cameleer3-log-appender.jar {customArgs} -cp {jarPath} org.springframework.boot.loader.launch.PropertiesLauncher` |
|
||||
| `SPRING_BOOT` | `exec java -javaagent:/app/agent.jar -Dloader.path=/app/cameleer-log-appender.jar {customArgs} -cp {jarPath} org.springframework.boot.loader.launch.PropertiesLauncher` |
|
||||
| `QUARKUS` | `exec java -javaagent:/app/agent.jar {customArgs} -jar {jarPath}` |
|
||||
| `PLAIN_JAVA` | `exec java -javaagent:/app/agent.jar -cp {jarPath}:/app/cameleer3-log-appender.jar {customArgs} {mainClass}` |
|
||||
| `PLAIN_JAVA` | `exec java -javaagent:/app/agent.jar -cp {jarPath}:/app/cameleer-log-appender.jar {customArgs} {mainClass}` |
|
||||
| `NATIVE` | `exec {jarPath} {customArgs}` |
|
||||
|
||||
All entrypoints are wrapped in `sh -c "..."` for consistent execution. `jarPath` is resolved per mount strategy (volume mount uses the original path, bind mount uses `/app/app.jar`).
|
||||
|
||||
@@ -27,7 +27,7 @@ void stopLogCaptureByApp(String appSlug, String envSlug);
|
||||
|
||||
### ContainerLogForwarder
|
||||
|
||||
**Package:** `com.cameleer3.server.app.runtime` (Docker-specific, alongside `DockerRuntimeOrchestrator`, `DockerEventMonitor`, etc.)
|
||||
**Package:** `com.cameleer.server.app.runtime` (Docker-specific, alongside `DockerRuntimeOrchestrator`, `DockerEventMonitor`, etc.)
|
||||
|
||||
**Responsibilities:**
|
||||
- Manages active capture sessions in a `ConcurrentHashMap<String, CaptureSession>` keyed by container ID
|
||||
|
||||
@@ -100,7 +100,7 @@ No new tables. Uses existing PostgreSQL schema.
|
||||
|
||||
### Per-App Keys
|
||||
|
||||
Stored in `application_config.config_val` as part of the existing `ApplicationConfig` JSONB. The `sensitiveKeys` field (added by the agent team in `cameleer3-common`) stores only the per-app additions.
|
||||
Stored in `application_config.config_val` as part of the existing `ApplicationConfig` JSONB. The `sensitiveKeys` field (added by the agent team in `cameleer-common`) stores only the per-app additions.
|
||||
|
||||
## Fan-Out on Global Change
|
||||
|
||||
@@ -137,7 +137,7 @@ When admin PUTs global keys with `pushToAgents=true`:
|
||||
|
||||
### No Schema Migration Required
|
||||
|
||||
Uses existing `server_config` table (JSONB key-value store). The `sensitiveKeys` field on `ApplicationConfig` is added by the agent team in `cameleer3-common` — the server just reads/writes it as part of the existing JSONB blob.
|
||||
Uses existing `server_config` table (JSONB key-value store). The `sensitiveKeys` field on `ApplicationConfig` is added by the agent team in `cameleer-common` — the server just reads/writes it as part of the existing JSONB blob.
|
||||
|
||||
## Audit
|
||||
|
||||
|
||||
Reference in New Issue
Block a user