Files
cameleer-server/CLAUDE.md
hsiegeln 810f493639
All checks were successful
CI / cleanup-branch (push) Has been skipped
CI / build (push) Successful in 1m23s
CI / docker (push) Successful in 5m22s
CI / deploy-feature (push) Has been skipped
CI / deploy (push) Successful in 44s
chore: track .claude/rules/ and add self-maintenance instruction
Un-ignore .claude/rules/ so path-scoped rule files are shared via git.
Add instruction in CLAUDE.md to update rule files when modifying classes,
controllers, endpoints, or metrics — keeps rules current as part of
normal workflow rather than requiring separate maintenance.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 09:26:53 +02:00

6.9 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project

Cameleer Server — observability server that receives, stores, and serves Camel route execution data and route diagrams from Cameleer agents. Pushes config and commands to agents via SSE. Also orchestrates Docker container deployments when running under cameleer-saas.

  • cameleer (https://gitea.siegeln.net/cameleer/cameleer) — the Java agent that instruments Camel applications
  • Protocol defined in cameleer-common/PROTOCOL.md in the agent repo
  • This server depends on com.cameleer:cameleer-common (shared models and graph API)

Modules

  • cameleer-server-core — domain logic, storage interfaces, services (no Spring dependencies)
  • cameleer-server-app — Spring Boot web app, REST controllers, SSE, persistence, Docker orchestration

Build Commands

mvn clean compile          # Compile all modules
mvn clean verify           # Full build with tests

Run

java -jar cameleer-server-app/target/cameleer-server-app-1.0-SNAPSHOT.jar

Key Conventions

  • Java 17+ required
  • Spring Boot 3.4.3 parent POM
  • Depends on com.cameleer:cameleer-common from Gitea Maven registry
  • Jackson JavaTimeModule for Instant deserialization
  • Communication: receives HTTP POST data from agents (executions, diagrams, metrics, logs), serves SSE event streams for config push/commands (config-update, deep-trace, replay, route-control)
  • Environment filtering: all data queries filter by the selected environment. All commands target only agents in the selected environment. Backend endpoints accept optional environment query parameter; null = all environments (backward compatible).
  • Maintains agent instance registry (in-memory) with states: LIVE -> STALE -> DEAD. Auto-heals from JWT env claim + heartbeat body on heartbeat/SSE after server restart (priority: heartbeat environmentId > JWT env claim > "default"). Capabilities and route states updated on every heartbeat (protocol v2). Route catalog falls back to ClickHouse stats for route discovery when registry has incomplete data.
  • Multi-tenancy: each server instance serves one tenant (configured via CAMELEER_SERVER_TENANT_ID, default: "default"). Environments (dev/staging/prod) are first-class. PostgreSQL isolated via schema-per-tenant (?currentSchema=tenant_{id}) and ApplicationName=tenant_{id} on the JDBC URL. ClickHouse shared DB with tenant_id + environment columns, partitioned by (tenant_id, toYYYYMM(timestamp)).
  • Storage: PostgreSQL for RBAC, config, and audit; ClickHouse for all observability data (executions, search, logs, metrics, stats, diagrams). ClickHouse schema migrations in clickhouse/*.sql, run idempotently on startup by ClickHouseSchemaInitializer. Use IF NOT EXISTS for CREATE and ADD PROJECTION.
  • Log exchange correlation: ClickHouseLogStore extracts exchange_id from log entry MDC, preferring cameleer.exchangeId over camel.exchangeId (fallback for older agents). For ON_COMPLETION exchange copies, the agent sets cameleer.exchangeId to the parent's exchange ID via CORRELATION_ID.
  • Log processor correlation: The agent sets cameleer.processorId in MDC, identifying which processor node emitted a log line.
  • Logging: ClickHouse JDBC set to INFO (com.clickhouse), HTTP client to WARN (org.apache.hc.client5) in application.yml
  • Security: JWT auth with RBAC (AGENT/VIEWER/OPERATOR/ADMIN roles), Ed25519 config signing (key derived deterministically from JWT secret via HMAC-SHA256), bootstrap token for registration. CORS: CAMELEER_SERVER_SECURITY_CORSALLOWEDORIGINS (comma-separated) overrides CAMELEER_SERVER_SECURITY_UIORIGIN for multi-origin setups. Infrastructure access: CAMELEER_SERVER_SECURITY_INFRASTRUCTUREENDPOINTS=false disables Database and ClickHouse admin endpoints. Last-ADMIN guard: system prevents removal of the last ADMIN role (409 Conflict). Password policy: min 12 chars, 3-of-4 character classes, no username match. Brute-force protection: 5 failed attempts -> 15 min lockout. Token revocation: token_revoked_before column on users, checked in JwtAuthenticationFilter, set on password change.
  • OIDC: Optional external identity provider support (token exchange pattern). Configured via admin API/UI, stored in database (server_config table). Resource server mode: accepts external access tokens (Logto M2M) via JWKS validation when CAMELEER_SERVER_SECURITY_OIDCISSUERURI is set. Scope-based role mapping via SystemRole.normalizeScope(). System roles synced on every OIDC login via applyClaimMappings() in OidcAuthController (calls clearManagedAssignments + assignManagedRole on RbacService) — always overwrites managed role assignments; uses managed assignment origin to avoid touching group-inherited or directly-assigned roles. Supports ES384, ES256, RS256.
  • OIDC role extraction: OidcTokenExchanger reads roles from the access_token first (JWT with at+jwt type), then falls back to id_token. OidcConfig includes audience (RFC 8707 resource indicator) and additionalScopes. All provider-specific configuration is external — no provider-specific code in the server.
  • Sensitive keys: Global enforced baseline for masking sensitive data in agent payloads. Merge rule: final = global UNION per-app (case-insensitive dedup, per-app can only add, never remove global keys).
  • User persistence: PostgreSQL users table, admin CRUD at /api/v1/admin/users
  • Usage analytics: ClickHouse usage_events table tracks authenticated UI requests, flushed every 5s

Database Migrations

PostgreSQL (Flyway): cameleer-server-app/src/main/resources/db/migration/

  • V1 — RBAC (users, roles, groups, audit_log)
  • V2 — Claim mappings (OIDC)
  • V3 — Runtime management (apps, environments, deployments, app_versions)
  • V4 — Environment config (default_container_config JSONB)
  • V5 — App container config (container_config JSONB on apps)
  • V6 — JAR retention policy (jar_retention_count on environments)
  • V7 — Deployment orchestration (target_state, deployment_strategy, replica_states JSONB, deploy_stage)
  • V8 — Deployment active config (resolved_config JSONB on deployments)
  • V9 — Password hardening (failed_login_attempts, locked_until, token_revoked_before on users)
  • V10 — Runtime type detection (detected_runtime_type, detected_main_class on app_versions)

ClickHouse: cameleer-server-app/src/main/resources/clickhouse/init.sql (run idempotently on startup)

Maintaining .claude/rules/

When adding, removing, or renaming classes, controllers, endpoints, UI components, or metrics, update the corresponding .claude/rules/ file as part of the same change. The rule files are the class/API map that future sessions rely on — stale rules cause wrong assumptions. Treat rule file updates like updating an import: part of the change, not a separate task.

Disabled Skills

  • Do NOT use any gsd:* skills in this project. This includes all /gsd: prefixed commands.