chore: rename cameleer3 to cameleer
Some checks failed
CI / cleanup-branch (push) Has been skipped
CI / build (push) Failing after 18s
CI / docker (push) Has been skipped
CI / deploy (push) Has been skipped
CI / deploy-feature (push) Has been skipped

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:
hsiegeln
2026-04-15 15:28:42 +02:00
parent 1077293343
commit cb3ebfea7c
569 changed files with 4356 additions and 3245 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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 |
---

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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). |

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 |

View File

@@ -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) |

View File

@@ -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

View File

@@ -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)
---

View File

@@ -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

View File

@@ -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.

View File

@@ -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`).

View File

@@ -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

View File

@@ -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