설치 가이드
서명 검증된 CLI를 설치한 뒤 Quick 또는 Custom으로 Spring 프로젝트를 구성합니다. 선택 결과에 맞는 코드·설정·인프라를 함께 적용하고, CLI가 소유한 변경만 추적해 원복합니다.
CLI 설치와 프로젝트 초기화
서명 검증된 CLI를 설치하고 Spring Boot 프로젝트에서 Quick 또는 Custom을 선택합니다. 모든 경로는 파일·의존성·인프라·Docker 변경 계획을 실제 적용 전에 표시합니다.
1단계 — CLI 설치
curl -fsSL https://install.ctxa.ai/install.sh | shirm https://install.ctxa.ai/install.ps1 | iex설치기는 서명 manifest와 SHA-256을 검증합니다. 실행 파일만 설치하며 Spring 프로젝트를 변경하지 않습니다.
2단계 — 진단 및 초기화
cd your-spring-project
contexa init --check # 선택 사항, 읽기 전용
contexa init| 선택 | 정확한 동작 |
|---|---|
| Quick | Merge 통합, FULL 보안 소유권 모드, SHADOW 집행, provider 하나, 선택적 자동 어노테이션, Standalone 인프라와 사용 가능한 경우 Docker 기동입니다. |
| Custom | 통합 방식, 보안 소유권, 집행 모드, 하나 이상의 provider, 인프라, 출력 경로와 Docker 기동 여부를 직접 선택합니다. |
contexa init --yes는 Ollama, 자동 @EnableAISecurity, Standalone PostgreSQL/Ollama 인프라와 Docker 기동을 사용하는 Quick입니다. starter-only 명령이 아닙니다. 컨테이너를 시작하지 않고 Compose만 만들려면 --no-docker를 추가하십시오.
3단계 — 생성 상태 확인
- Merge: build를 갱신하고
application-contexa.yml을 생성하며, 자동 어노테이션을 선택한 경우에만 메인 소스를 변경합니다. 호스트application.yml은 보존합니다. - Standalone 통합: 별도 디렉터리에 Contexa YAML과 Gradle/Maven fragment를 생성합니다. 호스트 build·YAML·소스는 변경하지 않으며 사용자가 생성 fragment를 연결합니다.
- Standalone 인프라: PostgreSQL과, Ollama가 선택된 경우에만 Ollama를 생성합니다.
- Distributed 인프라: PostgreSQL·Redis·ZooKeeper·Kafka와, 선택된 경우에만 Ollama를 생성합니다.
- Skip 인프라: Compose 파일과 Docker 변경이 없습니다.
4단계 — 실행·상태 확인·원복
./gradlew bootRun
contexa status
contexa resetreset은 manifest에 기록된 CLI 소유 상태만 복원합니다. 사용자가 수정한 파일을 임의로 덮어쓰거나 무관한 인프라를 삭제하지 않습니다.
수동 dependency-only — Starter만 직접 추가하고 @EnableAISecurity를 선언하지 않는 무영향 경로는 유효하지만 CLI Quick 초기화와는 별개입니다.
레거시 시스템 연동 (SANDBOX 모드)
프로젝트가 이미 인증·인가를 소유한다면 SANDBOX/HOST_OWNED를 사용하세요. 호스트가 인증한 principal을 브리지 입력으로 전달한 뒤 Contexa Zero Trust runtime은 별도로 동작합니다.
@EnableAISecurity(
mode = SecurityMode.SANDBOX,
authObjectLocation = AuthObjectLocation.SESSION,
authObjectAttribute = "loginUser" // 레거시 세션 속성명
)
@SpringBootApplication
public class LegacyApplication { }
호스트 소유권 유지 — HOST_OWNED에서는 Contexa가 호스트 SecurityContext에 인증 객체를 생성하거나 저장하지 않습니다. 로그인·세션·기존 인가는 호스트가 계속 담당하고, Contexa는 브리지 증거와 DB 정책을 사용해 선택된 리소스를 별도로 평가합니다.
Contexa CLI 명령어 레퍼런스
Contexa CLI가 제공하는 주요 명령어를 상세 설명합니다. 터미널에서 contexa <command> [options] 형식으로 실행할 수 있습니다.
| 명령어 | 설명 | 주요 옵션 |
|---|---|---|
init |
Quick 또는 Custom 선택에 따라 Starter, provider, @EnableAISecurity, application-contexa.yml, 인프라 Compose를 일관되게 구성합니다. Quick은 Ollama·자동 어노테이션·Standalone 인프라를 기본으로 사용합니다. |
--yes: 질문 없이 Quick 기본값 적용--quick: Quick 구성 선택--provider openai|anthropic|ollama: provider 선택(쉼표로 복수 지정 가능)--include-ollama: 다른 provider와 함께 Ollama 포함--auto-annotate: Merge 소스에 @EnableAISecurity 적용--security-mode sandbox|full: HOST_OWNED 또는 CONTEXA_OWNED 선택--merge / --standalone: 호스트 통합 방식 선택--standalone-dir <path>: Standalone 애플리케이션 경로 지정--distributed: PostgreSQL·Redis·ZooKeeper·Kafka 인프라 선택--infra-dir <path>: 인프라 파일 경로 지정--no-docker: Compose는 생성하고 컨테이너 시작은 생략--simulate: 격리된 ctxa-sim 환경 구성--dir <path>: 대상 프로젝트 지정--force: 기존 Contexa 감지 시에도 재실행--check: 변경 없이 사전 진단--enable-ai-security: 호환 옵션(현재 Quick/Custom은 모두 AI 보안 구성을 생성)
|
reset |
CLI manifest에 기록된 변경만 되돌리고, 선택한 Contexa 소유 인프라를 제거합니다. init 이후 사용자 편집은 조용히 덮어쓰지 않고 충돌로 보고합니다. |
--dir <path>: 대상 프로젝트 디렉터리 지정-s, --simulate: simulation 소유 파일과 ctxa-sim 컨테이너·볼륨만 초기화-y, --yes: 확인 질문을 생략하고 동일한 소유권 안전 규칙 적용 |
simulate |
시뮬레이션 컨테이너 스택(ctxa-sim-*)의 생명주기를 관리합니다 (하위 명령어: up, down, reset, logs, ps). |
up: 시뮬레이션 컨테이너 시작down: 시뮬레이션 컨테이너 중지reset: 시뮬레이션 데이터베이스 볼륨 초기화 (깨끗한 빈 데이터베이스 상태로 재구동)logs: 컨테이너 로그 확인ps: 컨테이너 실행 상태 점검
|
mode |
제로 트러스트 차단 정책 모드(SHADOW 또는 ENFORCE)를 동적으로 전환합니다. |
--enforce, -e: 위협 감지 시 실시간 즉시 차단 활성화--shadow, -s: 위협 감지 시 차단 없이 모니터링 로그만 기록
|
doctor |
현재 프로젝트와 선택 기능에 필요한 Java·Docker·네트워크 상태를 검사하고 문제 해결 가이드를 제공합니다. | N/A |
status |
uninstalled·normal·simulation·both·conflict·partial failure 상태와 해당 모드의 runtime 상태를 구분해 표시합니다. | N/A |
scan |
프로젝트 코드 내 @EnableAISecurity 및 @Protectable 선언 적합성과 필수 의존성을 검사합니다. |
N/A |
사전 요구 사항
모든 설치 경로에는 Java와 Spring Boot 프로젝트가 필요합니다. Quick에서 생성한 Standalone 인프라를 CLI가 시작하게 하려면 Docker가 필요합니다. --no-docker 또는 Custom의 Skip을 선택하면 필요한 외부 인프라는 사용자가 준비합니다.
| 요구 사항 | 버전 | 용도 |
|---|---|---|
| Java | 17+ | 런타임 (Gradle 툴체인으로 구성) |
| Spring Boot | 3.5.4 검증 기준 | Spring Boot 3.x 애플리케이션 프레임워크 (4.x 미지원) |
| Docker 선택 | 지원 버전 | simulation·distributed·로컬 Ollama 인프라를 선택한 경우에만 필요 |
Quick과 Distributed의 차이 — Quick은 Standalone PostgreSQL과 선택한 Ollama를 구성합니다. PostgreSQL·Redis·ZooKeeper·Kafka가 모두 필요한 경우에만 Custom 또는 contexa init --distributed를 사용합니다.
수동 설치
CLI를 사용하지 않으려면 Maven Central의 Starter 한 개를 추가하세요. 안정 버전에는 mavenCentral() 외의 milestone·snapshot 저장소가 필요하지 않습니다.
1. 의존성 추가
dependencies {
implementation 'ai.ctxa:spring-boot-starter-contexa:0.1.0'
}
<dependency>
<groupId>ai.ctxa</groupId>
<artifactId>spring-boot-starter-contexa</artifactId>
<version>0.1.0</version>
</dependency>
2. 선택 기능만 구성
Starter의 공통 기본값은 *Properties에 있습니다. 수동 dependency-only 통합에서는 application.yml이나 Docker Compose 파일을 추가할 필요가 없습니다.
| 기능 | 필요한 경우 | 대표 요구 사항 |
|---|---|---|
| Contexa 전용 DB | Identity·IAM·감사·벡터 증거를 영속화할 때 | PostgreSQL, 벡터 기능 사용 시 pgvector |
| AI 보안 | @EnableAISecurity와 @Protectable을 사용할 때 |
선택한 provider 하나와 해당 provider 설정 |
| 로컬 Ollama | provider로 Ollama를 선택할 때 | Ollama runtime과 선택한 모델 |
| 분산 모드 | PoC·엔터프라이즈 데모 또는 다중 인스턴스 runtime | Redis·Kafka와 contexa.infrastructure.* 설정 |
문제 해결
자가 진단 도구 사용 안내 — Contexa 설치 또는 실행 중 문제가 발생하면 먼저 터미널에 contexa doctor를 입력하여 로컬 개발 환경 상태를 진단하십시오. 더 자세한 오류 유형별 원인과 OS별 해결책은 문제 해결 상세 가이드 (Troubleshooting) 바로가기 문서에서 확인하실 수 있습니다.
@EnableAISecurity 시동 오류 가이드
수동 dependency-only 통합에 @EnableAISecurity를 직접 추가했거나, Custom에서 외부 인프라를 선택한 뒤 필수 provider·데이터베이스 설정을 누락하거나, 생성된 설정을 제거하면 다음 오류가 발생할 수 있습니다. Quick은 선택한 provider 의존성, 소스 어노테이션, Standalone 데이터베이스 구성을 함께 생성합니다.
오류 1 — contexa.datasource.url must be configured for @EnableAISecurity
전체 메시지: java.lang.IllegalStateException: contexa.datasource.url must be configured for @EnableAISecurity. Use a dedicated Contexa database by default; sharing the application database requires explicit POC approval.
원인 — Contexa 는 보안 정책·세션·벡터 인덱스를 사용자 운영 DB 와 분리된 전용 PostgreSQL 에 저장합니다. @EnableAISecurity 가 활성화되면 contexa.datasource.url 이 반드시 설정되어 있어야 하며, 미설정 시 ContexaDataSourceIsolation 검증이 즉시 실패합니다.
해결 — 사용자 application.yml 에 contexa 전용 데이터소스 설정을 추가합니다.
contexa:
datasource:
url: jdbc:postgresql://localhost:5432/contexa
username: ${CONTEXA_DB_USERNAME:contexa}
password: ${CONTEXA_DB_PASSWORD:contexa1234!@#}
driver-class-name: org.postgresql.Driver
isolation:
contexa-owned-application: true
운영 DB 와 동일 인스턴스에 별도 스키마로 두려면 운영팀과 사전 승인 후 같은 URL 을 사용하실 수 있습니다. 기본은 별도 DB(권장).
오류 2 — No Spring AI ChatModel is configured for CONTEXA
전체 메시지: No Spring AI ChatModel is configured for CONTEXA. Add at least one Spring AI chat provider starter to your application dependencies (for example org.springframework.ai:spring-ai-starter-model-openai, org.springframework.ai:spring-ai-starter-model-anthropic, or org.springframework.ai:spring-ai-starter-model-ollama), then configure the matching provider under spring.ai.*
원인 — Contexa 의 LLM 티어 자동 설정(CoreLLMTieredAutoConfiguration) 이 ChatModel 빈을 요구하지만, classpath 에 Spring AI provider starter 가 없습니다. spring-boot-starter-contexa 는 ChatModel starter 를 transitive 의존성으로 끌고 오지 않습니다 — 어떤 provider(Ollama/OpenAI/Anthropic) 를 쓰실지는 사용자 결정이라서입니다.
해결 — 본인이 사용하실 provider starter 한 개 이상을 빌드에 추가하시고, 매칭 설정을 contexa.llm.* 아래에 두십시오. (Contexa 는 Spring AI 의 기본 자동 설정을 타지 않고, 전용 네임스페이스 contexa.llm 을 통해 모델 생성을 제어합니다.)
dependencies {
implementation 'ai.ctxa:spring-boot-starter-contexa:0.1.0'
// 아래는 @EnableAISecurity 사용 시 직접 추가 (provider 1개 이상)
implementation 'org.springframework.ai:spring-ai-starter-model-ollama'
}
contexa:
llm:
selection:
chat:
mode: dynamic-priority
priority: ollama,openai,anthropic
chat:
ollama:
baseUrl: ${CONTEXA_CHAT_OLLAMA_BASE_URL:http://127.0.0.1:11434}
model: ${CONTEXA_CHAT_OLLAMA_MODEL:qwen2.5:7b}
keepAlive: ${CONTEXA_OLLAMA_CHAT_KEEP_ALIVE:30m}
embedding:
ollama:
dedicatedRuntimeEnabled: false
model: ${CONTEXA_EMBEDDING_OLLAMA_MODEL:mxbai-embed-large}
dimensions: ${CONTEXA_EMBEDDING_OLLAMA_DIMENSIONS:1024}
OpenAI 또는 Anthropic 사용 시 spring-ai-starter-model-openai / spring-ai-starter-model-anthropic 으로 교체하시고 contexa.llm.openai.* / contexa.llm.anthropic.* 에 API 키를 설정하십시오.
오류 3 — rag-vector capability unresolved / SecurityDecisionPostProcessor 미생성
전체 메시지(요약): [ContexaCapability] rag-vector ... Resolve rag-vector first; SecurityDecisionPostProcessor is created only after UnifiedVectorService is available.
원인 — @EnableAISecurity 의 의사결정 후처리기(SecurityDecisionPostProcessor) 가 UnifiedVectorService 를 의존하고, 그 뿌리에는 Spring AI VectorStore 빈이 있습니다. classpath 에 pgvector 벡터스토어 starter 가 없으면 rag-vector capability 가 미해결되어 후속 빈 트리가 생성되지 않습니다.
해결 — pgvector 벡터스토어 starter 를 추가하시고, contexa.vectorstore.pgvector.* 를 설정합니다. PostgreSQL 컨테이너는 pgvector/pgvector:pg16 이미지를 사용하셔야 vector 확장이 자동 활성화됩니다.
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-pgvector'
}
contexa:
vectorstore:
pgvector:
dimensions: 1024
initialize-schema: true
기본 경로가 작은 이유 — 모든 프로젝트에 Spring AI provider와 vector-store Starter를 주입하면 dependency-only 애플리케이션에서도 ChatModel 또는 PgVectorStore가 불필요하게 기동될 수 있습니다. CLI는 AI 보안과 provider를 명시적으로 선택한 경우에만 해당 경로를 제안하고 적용 전에 변경 내용을 보여 줍니다.
인프라 문제 해결
컨테이너 이름 충돌 — The container name "/contexa-postgres" is already in use
전체 메시지(요약): Error response from daemon: Conflict. The container name "/contexa-postgres" is already in use by container "<hash>". You have to remove (or rename) that container to be able to reuse that name.
이어서 contexa-cli 가 출력: × Docker start failed. Run manually: docker compose up -d
원인 — 같은 이름의 컨테이너(contexa-postgres, contexa-ollama 등) 가 이미 호스트에 존재합니다. Docker 데몬은 같은 이름의 컨테이너 두 개를 동시에 가질 수 없습니다. 보통 다음 두 케이스입니다:
- 이전
contexa init실행이 만든 컨테이너가 그대로 살아있음 → 그대로 사용해도 무방 - 다른 프로젝트가 같은 이름을 점유 중 → 그쪽을 정리하거나 simulate 격리 모드로 전환
해결 방법 1 — 기존 컨테이너 그대로 사용 (권장, 데이터 보존)
# 1) 기존 컨테이너가 떠있는지 확인
docker ps --filter "name=contexa-" --format "table {{.Names}}\t{{.Status}}"
# 2) 떠있다면 그대로 두고 애플리케이션만 시작
./gradlew bootRun
해결 방법 2 — 기존 컨테이너 제거 후 재생성 (데이터 손실 주의)
# 정지 + 제거 (볼륨은 보존)
docker rm -f contexa-postgres contexa-ollama
# 분산 모드도 같이 정리하려면
docker rm -f contexa-redis contexa-zookeeper contexa-kafka
# 다시 시작
contexa init --distributed
해결 방법 3 — 격리된 시뮬레이션 모드로 전환 (운영 컨테이너 보호)
contexa init --simulate
--simulate 옵션은 컨테이너 이름 prefix 를 ctxa-sim- 로 분리하고 포트도 +20000 으로 띄워, 운영 컨테이너와 충돌 없이 사이드 바이 사이드로 사용할 수 있습니다.
| 문제 | 해결 방법 |
|---|---|
| PostgreSQL 연결 거부 | Docker 실행 확인: docker ps. 포트 5432 사용 여부 확인. |
| Ollama 연결 거부 | 컨테이너 로그 확인: docker logs contexa-ollama. 포트 11434 확인. |
| AI 모델 미발견 | 모델 다운로드: docker exec contexa-ollama ollama pull qwen2.5:7b 및 ... pull mxbai-embed-large |
vector 확장 누락 (PostgreSQL) |
이미지를 pgvector/pgvector:pg16 으로 사용하시거나, 기존 DB 라면 CREATE EXTENSION IF NOT EXISTS vector; 를 한 번 실행하십시오. |
| 포트 충돌 | 기본 포트: PostgreSQL 5432, Ollama 11434, Redis 6379, Kafka 9092 |
contexa init — 화살표 키 미작동 |
Windows: Git Bash에서 winpty contexa init 사용, 또는 Windows Terminal에서 실행 |
도움이 필요하신가요? — 설정 레퍼런스를 확인하거나 GitHub Discussions를 방문하세요.