Sign inSign up

xmlangel/testcasecraft

By xmlangel

β€’Updated 3 days ago

Test Case Craft

Image
Developer tools
3

10K+

xmlangel/testcasecraft repository overview

TestcaseCraft β€” Open Source Test Case Management Tool

⁠TestcaseCraft

The open source, self-hosted test case management tool for modern QA teams.

Docker Pulls Docker Image Version GitHub

TestcaseCraft is a free, open source test case management system (TCMS) you can self-host with Docker in minutes. Design, organize, execute, and trace your test cases β€” manual and automated β€” with built-in AI/RAG assistance, Jira integration, and a clean React UI. A modern alternative to Kiwi TCMS, TestLink, and Squash.

docker pull xmlangel/testcasecraft:latest

β πŸ”Ž What is TestcaseCraft?

TestcaseCraft is an all-in-one, open source QA platform that manages the full test lifecycle β€” from test case design to execution and result analysis β€” in a single self-hosted application.

Built on a robust Spring Boot + React architecture, with a FastAPI-based RAG (Retrieval-Augmented Generation) service layered on top, TestcaseCraft goes beyond simple record-keeping to deliver an intelligent testing environment.

If you are looking for a self-hosted, Docker-ready, open source test management tool that your team fully owns β€” with no per-seat SaaS pricing and no vendor lock-in β€” TestcaseCraft is built for you.

Keywords: open source test case management Β· self-hosted TCMS Β· Docker test management Β· QA test case tool Β· manual & automated test tracking Β· AI test assistant Β· Jira test management.


⁠✨ Why teams choose TestcaseCraft

🐳 Self-hosted in minutesOne docker compose up brings up app, AI service, PostgreSQL, and object storage. Your data never leaves your servers.
🌲 Hierarchical test casesFolder-based tree structure to organize, classify, and reorganize test cases intuitively.
🧩 Multi-projectManage test assets for many projects from a single system.
πŸ“‹ Test plans & cyclesBundle cases into runnable plans per release or test cycle.
πŸ“ˆ Execution & traceabilityRecord Pass / Fail / Skip results and transparently track historical runs.
πŸ€– AI-powered (LLM + RAG)Ask questions in natural language, refine scenarios, and get context-aware answers grounded in your own documents.
πŸ”— Jira integrationLink Jira issues directly to test cases and sync development & testing status in real time.
πŸ” JWT securityToken-based authentication for safe access control and data protection.
πŸ§ͺ Automation importImport JUnit XML results and manage manual + automated tests in one place.
πŸ†“ Open source & freeNo per-seat licensing. Own your QA platform.

β πŸš€ Quick Start β€” How to Run

TestcaseCraft supports several ways to inject environment variables, so you can pick what fits your situation. Full .env and docker-compose.yml samples are in the shared Configuration section at the bottom of this page.

Create a .env file in the project root. Docker Compose loads it automatically at startup.

# 1. Create a .env file (see Configuration below)
# 2. Start the containers
docker compose up -d --build
⁠Method B: Shell environment variables

Useful for one-off tests or overriding settings. Takes precedence over the .env file.

PROTOCOL=https DOMAIN=mydomain.com SERVER_PORT=443 docker compose up -d --build
⁠Method C: Separate env file (--env-file)

Use this to keep separate configurations for production, development, etc.

docker compose --env-file myenvfile.env up -d --build

Then open http://localhost:8080⁠ and log in with the default admin account.

ServiceURLDescription
Applicationhttp://localhost:8080⁠Main web app
App API Docshttp://localhost:8080/swagger-ui.html⁠Backend API (Swagger)
RAG API Docshttp://localhost:8001/docs⁠AI / RAG service API
MinIO Consolehttp://localhost:9001⁠File storage console
Health Checkhttp://localhost:8080/actuator/health⁠Service status
β πŸ‘€ Default login
UsernamePassword
adminadmin123

⚠️ Security note: Change the default password immediately after your first login.


⁠🧱 Architecture & Tech Stack

LayerTechnology
FrontendReact
BackendSpring Boot
AI ServiceFastAPI (RAG & LLM integration)
DatabasePostgreSQL 18 (+ pgvector for RAG)
Object StorageMinIO (S3-compatible)
AuthJWT

Supported LLM providers: Ollama Β· OpenWebUI Β· OpenAI Β· Perplexity Β· OpenRouter.

β πŸ†š TestcaseCraft vs other open source test management tools

CapabilityTestcaseCraftKiwi TCMSTestLinkSquash
Self-hosted via Dockerβœ…βœ…βœ…βœ…
Hierarchical (folder tree) test casesβœ…βœ…βœ…βœ…
Test plans & execution trackingβœ…βœ…βœ…βœ…
JUnit XML automation importβœ…βœ…partialβœ…
Built-in AI assistant (LLM)βœ…βŒβŒβŒ
RAG over your own docsβœ…βŒβŒβŒ
Jira integrationβœ…βœ…βœ…βœ…
Modern React UIβœ…partialβŒβœ…

Comparison reflects publicly documented capabilities and is provided for orientation only.


β πŸ’‘ Use cases

  • QA teams that want a fully owned, self-hosted alternative to SaaS test management (TestRail, Zephyr, Xray).
  • Security-sensitive environments that require on-premise, air-gapped deployment.
  • Teams adopting AI in QA β€” author test scenarios, summarize specs, and query internal docs with RAG.
  • Mixed manual + automation workflows that consolidate JUnit results with manual runs.
  • Jira-centric teams that need traceability between issues and test cases.

⁠❓ FAQ

Is TestcaseCraft really open source and free? Yes. TestcaseCraft is open source and free to self-host. You own your data and your deployment.

Can I run it entirely on-premise / offline? Yes. Everything runs in Docker containers on your infrastructure. With a local LLM provider (e.g. Ollama), even the AI features can run fully offline.

Does it support automated test results? Yes β€” import JUnit XML to manage automated and manual tests together.

Which databases does it use? PostgreSQL 18 for application data and PostgreSQL 18 + pgvector for RAG embeddings.

Is there an API? Yes β€” a full REST API documented via Swagger, plus an MCP server so LLM clients (Claude Desktop, Cline, Cursor) can drive TestcaseCraft in natural language.



TestcaseCraft β€” The Finishing Touch ✨ Β· Open source test case management, self-hosted with Docker.

TestcaseCraft: The Finishing Touch ✨ "μ½”λ“œλΌλŠ” 원석이 μ™„λ²½ν•œ μ œν’ˆμœΌλ‘œ λΉ›λ‚˜λŠ” μˆœκ°„, κ·Έ λ§ˆμ§€λ§‰ 손길을 ν•¨κ»˜ν•©λ‹ˆλ‹€."

⁠Philosophy: μ™„μ„±ν•˜λŠ” 손길 (The Finishing Touch)

μ†Œν”„νŠΈμ›¨μ–΄ 개발의 λλ‹¨μ—μ„œ ν’ˆμ§ˆμ„ μ±…μž„μ§€λŠ” QA(Quality Assurance)λŠ” λ‹¨μˆœν•œ 였λ₯˜ κ²€μΆœμ΄ μ•„λ‹™λ‹ˆλ‹€. 그것은 거친 원석과도 같은 μ½”λ“œλ₯Ό 닀듬고, λ””μ§€ν„Έ λΈ”λ‘μ˜ λ§ˆμ§€λ§‰ 쑰각을 λΌμ›Œ 맞좰 λΉ„λ‘œμ†Œ μ œν’ˆμ„ λΉ›λ‚˜κ²Œ ν•˜λŠ” 'μž₯인(Craftsman)'의 κ³Όμ •μž…λ‹ˆλ‹€.

TestcaseCraftλŠ” μ΄λŸ¬ν•œ μž₯인 정신을 λ‹΄μ•˜μŠ΅λ‹ˆλ‹€. QA μ—”μ§€λ‹ˆμ–΄μ˜ μ„¬μ„Έν•œ μ‹œκ°κ³Ό μˆ™λ ¨λœ κ²½ν—˜μ΄ λ””μ§€ν„Έ ν™˜κ²½μ—μ„œ μ˜¨μ „νžˆ 발휘될 수 μžˆλ„λ‘, κ°€μž₯ 직관적이고 ν˜„λŒ€μ μΈ 도ꡬλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ‹Ήμ‹ μ˜ μ†λμ—μ„œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 완성을 κ²½ν—˜ν•˜μ„Έμš”.

⁠Introduction

TestcaseCraftλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 섀계뢀터 μ‹€ν–‰, κ²°κ³Ό λΆ„μ„κΉŒμ§€μ˜ 전체 라이프사이클을 톡합 κ΄€λ¦¬ν•˜λŠ” All-in-One QA ν”Œλž«νΌμž…λ‹ˆλ‹€.

Spring Boot와 React둜 κ΅¬μΆ•λœ κ²¬κ³ ν•œ μ•„ν‚€ν…μ²˜ μœ„μ—, FastAPI 기반의 RAG(검색 증강 생성) μ„œλΉ„μŠ€λ₯Ό 더해 λ‹¨μˆœν•œ 관리λ₯Ό λ„˜μ–΄μ„  'μ§€λŠ₯ν˜• ν…ŒμŠ€νŠΈ ν™˜κ²½'을 μ œκ³΅ν•©λ‹ˆλ‹€.

⁠Tech Stack
  • Frontend: React
  • Backend: Spring Boot
  • AI Service: FastAPI (RAG & LLM Integration)
  • Database: PostgreSQL 18 (+ pgvector for RAG)
  • Storage: MinIO

⁠Key Features

⁠1. Craftsmanship in Management (μ •κ΅ν•œ 관리)

ν…ŒμŠ€νŠΈ μžμ‚°μ„ μ²΄κ³„μ μœΌλ‘œ κ΅¬μ‘°ν™”ν•˜μ—¬ κ΄€λ¦¬μ˜ λ³΅μž‘ν•¨μ„ μ€„μž…λ‹ˆλ‹€.

  • κ³„μΈ΅ν˜• ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 관리: 폴더 기반의 트리 ꡬ쑰λ₯Ό 톡해 μ§κ΄€μ μœΌλ‘œ μΌ€μ΄μŠ€λ₯Ό λΆ„λ₯˜ν•˜κ³  μœ μ—°ν•˜κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ©€ν‹° ν”„λ‘œμ νŠΈ 지원: μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ˜ ν…ŒμŠ€νŠΈ μžμ‚°μ„ ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ—μ„œ 톡합 κ΄€λ¦¬ν•˜μ—¬ 업무 νš¨μœ¨μ„ κ·ΉλŒ€ν™”ν•©λ‹ˆλ‹€.

⁠2. Execution & Traceability (μ‹€ν–‰κ³Ό 좔적)

ν…ŒμŠ€νŠΈ κ³„νšλΆ€ν„° μ‹€ν–‰ κ²°κ³ΌκΉŒμ§€, μ™„μ„±μœΌλ‘œ κ°€λŠ” λͺ¨λ“  발자취λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€.

  • ν…ŒμŠ€νŠΈ ν”Œλžœ (Test Plan): 릴리즈 및 ν…ŒμŠ€νŠΈ 사이클 λ‹¨μœ„λ‘œ μΌ€μ΄μŠ€λ₯Ό λ¬Άμ–΄ μ‹€ν–‰ κ°€λŠ₯ν•œ ν”Œλžœμ„ μƒμ„±ν•©λ‹ˆλ‹€.
  • μ‹€ν–‰ 이λ ₯ 좔적: Pass / Fail / Skip λ“±μ˜ κ²°κ³Όλ₯Ό μƒμ„Ένžˆ κΈ°λ‘ν•˜κ³ , 과거의 μ‹€ν–‰ 이λ ₯을 투λͺ…ν•˜κ²Œ μΆ”μ ν•©λ‹ˆλ‹€.
  • μžλ™ν™” κ²°κ³Ό 톡합: JUnit 포맷(XML)의 μžλ™ν™” ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό importν•˜μ—¬ μˆ˜λ™ ν…ŒμŠ€νŠΈμ™€ μžλ™ν™” ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό ν•œκ³³μ—μ„œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

⁠3. Intelligence with AI (AI 기반의 톡찰)

λ‹¨μˆœ 반볡 업무λ₯Ό λ„˜μ–΄, AI와 ν•¨κ»˜ 더 깊이 μžˆλŠ” ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • LLM 지원: μžμ—°μ–΄ μ§ˆμ˜μ‘λ‹΅μ„ 톡해 ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ΅¬μ²΄ν™”ν•˜κ±°λ‚˜ 쑰언을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. (Support: Ollama, OpenWebUI, OpenAI, Perplexity, OpenRouter)
  • RAG (Retrieval-Augmented Generation) 지원: 내뢀에 λ“±λ‘λœ λ¬Έμ„œμ™€ 자료λ₯Ό 기반으둜 AIκ°€ λ§₯락을 νŒŒμ•…ν•˜μ—¬ 정확도 높은 닡변을 μ œκ³΅ν•©λ‹ˆλ‹€.

⁠4. Connection & Security (연동과 λ³΄μ•ˆ)

  • JIRA 연동: JIRA μ΄μŠˆμ™€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό 직접 μ—°κ²°ν•˜μ—¬ 개발 μ§„ν–‰ 상황과 ν…ŒμŠ€νŠΈ ν˜„ν™©μ„ μ‹€μ‹œκ°„μœΌλ‘œ λ™κΈ°ν™”ν•©λ‹ˆλ‹€.
  • λ³΄μ•ˆ 인증: JWT 기반의 인증 μ‹œμŠ€ν…œμ„ 톡해 μ•ˆμ „ν•œ μ ‘κ·Ό μ œμ–΄μ™€ 데이터 보호λ₯Ό 보μž₯ν•©λ‹ˆλ‹€.

πŸš€ Getting Started

⁠1. μ‹€ν–‰ 방법 (How to Run)

TestcaseCraftλŠ” μœ μ—°ν•œ 섀정을 μœ„ν•΄ λ‹€μ–‘ν•œ ν™˜κ²½ λ³€μˆ˜ μ£Όμž… 방식을 μ§€μ›ν•©λ‹ˆλ‹€. 상황에 λ§žλŠ” 방법을 μ„ νƒν•˜μ„Έμš”.

⁠방법 A: .env 파일 μ‚¬μš© (ꢌμž₯)

ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— .env νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ 섀정을 κ΄€λ¦¬ν•©λ‹ˆλ‹€. Docker Composeκ°€ μ‹€ν–‰ μ‹œ μžλ™μœΌλ‘œ 이 νŒŒμΌμ„ λ‘œλ“œν•©λ‹ˆλ‹€.

# 1. .env 파일 μž‘μ„± (ν•˜λ‹¨μ˜ Configuration μ°Έμ‘°)
# 2. μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker compose up -d --build
⁠방법 B: μ‰˜ ν™˜κ²½ λ³€μˆ˜ μ£Όμž…

μΌμ‹œμ μΈ ν…ŒμŠ€νŠΈλ‚˜ μ„€μ • μ˜€λ²„λΌμ΄λ”©μ΄ ν•„μš”ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. .env νŒŒμΌλ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ λ†’μŠ΅λ‹ˆλ‹€.

PROTOCOL=https DOMAIN=mydomain.com SERVER_PORT=443 docker compose up -d --build
⁠방법 C: 별도 ν™˜κ²½ 파일 μ§€μ • (--env-file)

운영 ν™˜κ²½(prod), 개발 ν™˜κ²½(dev) λ“± 섀정을 λΆ„λ¦¬ν•˜μ—¬ 관리할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

docker compose --env-file myenvfile.env up -d --build

β πŸ”Œ Access & Credentials

μ»¨ν…Œμ΄λ„ˆκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λœ ν›„, μ•„λž˜ 정보λ₯Ό 톡해 각 μ„œλΉ„μŠ€μ™€ λ°μ΄ν„°λ² μ΄μŠ€μ— 접속할 수 μžˆμŠ΅λ‹ˆλ‹€.

β πŸ‘€ Default Application Login

μ‹œμŠ€ν…œ 졜초 접속 μ‹œ μ‚¬μš©λ˜λŠ” κ΄€λ¦¬μž κ³„μ •μž…λ‹ˆλ‹€.

⚠️ λ³΄μ•ˆ 주의: 졜초 둜그인 ν›„ λ°˜λ“œμ‹œ λΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

  • Username: admin
  • Password: admin123
β πŸ—„οΈ Database & Infrastructure Accounts

개발, 디버깅 λ˜λŠ” μ™ΈλΆ€ 도ꡬ(DBeaver λ“±) μ—°κ²° μ‹œ μ‚¬μš©ν•˜λŠ” 계정 μ •λ³΄μž…λ‹ˆλ‹€.

ComponentHost PortUsernamePasswordNote
PostgreSQL (Main)localhost:5434testcase_usertestcase_passwordμ£Όμš” 데이터 μ €μž₯μ†Œ (v18)
PostgreSQL (RAG)localhost:5433rag_userrag_dev_password_123벑터 DB (pgvector + v18)
MinIOlocalhost:9000 / 9001minioadminminioadmin_dev_password_789S3 ν˜Έν™˜ μŠ€ν† λ¦¬μ§€
⁠Configuration

✨ .env sample

# Protocol Configuration (http or https)
PROTOCOL=http

# Server Configuration
HTTP_PORT=8080
HTTPS_PORT=443
DOMAIN=localhost

SERVER_PORT=8080
SERVER_SSL_ENABLED=false

# SSL Configuration (only used when PROTOCOL=https)
SSL_KEYSTORE_PATH=/app/ssl/keystore.p12
SSL_KEYSTORE_PASSWORD=changeit
SSL_KEYSTORE_TYPE=PKCS12

# Database Configuration
POSTGRES_DB=testcase_management
POSTGRES_USER=testcase_user
POSTGRES_PASSWORD=testcase_password
DATABASE_URL=jdbc:postgresql://postgres:5432/testcase_management

# JWT Configuration (512-bit key required for HS512)
JWT_SECRET=512-bit key required for HS512
# SessionTime
JWT_EXPIRATION=604800000
JWT_REFRESH_EXPIRATION=2592000000

# Spring Boot Configuration
SPRING_PROFILES_ACTIVE=prod

# JPA Configuration
# Use validate to avoid Hibernate attempting to recreate existing indexes on startup
SPRING_JPA_HIBERNATE_DDL_AUTO=update
SPRING_JPA_SHOW_SQL=false

# Logging Configuration
LOGGING_LEVEL_COM_TESTCASE=INFO
LOGGING_LEVEL_ROOT=WARN

# Frontend API Configuration
REACT_APP_API_BASE_URL=http://:localhost:8080

DOCUMENT_PARSER=pymupdf4llm

# Upstage API Key
UPSTAGE_API_KEY=up

TESTCASE_INIT_ENABLED=false

# MinIO Configuration
MINIO_SECRET_KEY=minioadmin_dev_password_789

# RAG Database Configuration
POSTGRES_RAG_PASSWORD=rag_dev_password_123

# Encryption Configuration (AES-256, 32-byte Base64)
# Encrypts LLM API keys, Jira API tokens, mail passwords and Google service account JSON.
# Generate: openssl rand -base64 32
# Without a value, none of the above can be saved (the prod profile has no default).
JIRA_ENCRYPTION_KEY=

✨ Docker Compose sample(docker-compose.yml)

services:
  # Spring Boot Application
  app:
    image: xmlangel/testcasecraft:latest
    container_name: testcasecraft
    environment:
      # Spring Profile
      - SPRING_PROFILES_ACTIVE=prod

      # Protocol and Domain Configuration
      - PROTOCOL=${PROTOCOL}
      - DOMAIN=${DOMAIN}

      # Server Configuration
      - SERVER_PORT=${SERVER_PORT}

      # SSL Configuration (only when HTTPS)
      - SERVER_SSL_ENABLED=${SERVER_SSL_ENABLED}
      - SERVER_SSL_KEYSTORE=${SSL_KEYSTORE_PATH}
      - SERVER_SSL_KEYSTORE_PASSWORD=${SSL_KEYSTORE_PASSWORD}
      - SERVER_SSL_KEYSTORE_TYPE=${SSL_KEYSTORE_TYPE}

      # Database Configuration
      - DATABASE_URL=${DATABASE_URL}
      - DATABASE_USERNAME=${POSTGRES_USER}
      - DATABASE_PASSWORD=${POSTGRES_PASSWORD}

      # JWT Configuration
      - JWT_SECRET=${JWT_SECRET}
      - JWT_EXPIRATION=${JWT_EXPIRATION}
      - JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION}

      # Encryption key for stored secrets (LLM API keys, Jira tokens, mail passwords, Google JSON)
      - JIRA_ENCRYPTION_KEY=${JIRA_ENCRYPTION_KEY:-}

      # Application Configuration
      - SPRING_JPA_HIBERNATE_DDL_AUTO=${SPRING_JPA_HIBERNATE_DDL_AUTO:-update}

      - SPRING_JPA_SHOW_SQL=false
      - LOGGING_LEVEL_COM_TESTCASE=INFO
      - LOGGING_LEVEL_ROOT=WARN
      - RAG_API_URL=http://rag-service:8000
      - TESTCASE_INIT_ENABLED=${TESTCASE_INIT_ENABLED:-false}

      # MinIO Configuration (TestCase Attachments)
      - MINIO_ENDPOINT=minio:9000
      - MINIO_ACCESS_KEY=minioadmin
      - MINIO_SECRET_KEY=${MINIO_SECRET_KEY}
      - MINIO_TESTCASE_BUCKET=testcase-attachments
      - MINIO_SECURE=false

      # Mail Configuration (optional - can be empty for development)
      - MAIL_USERNAME=${MAIL_USERNAME:-}
      - MAIL_PASSWORD=${MAIL_PASSWORD:-}
      - MAIL_HOST=${MAIL_HOST:-localhost}
      - MAIL_PORT=${MAIL_PORT:-587}

      # Frontend API Configuration
      - REACT_APP_API_BASE_URL=${REACT_APP_API_BASE_URL:-http://localhost:8080}
    ports:
      - "${HTTP_PORT}:${SERVER_PORT}"
      - "${HTTPS_PORT}:${SERVER_PORT}"
    volumes:
      - ./logs:/app/logs
      - ./ssl:/app/ssl:ro
    networks:
      - testcasecraft-network
    depends_on:
      postgres:
        condition: service_healthy
      minio:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "curl -f -k ${PROTOCOL}://localhost:${SERVER_PORT}/actuator/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    restart: unless-stopped
    platform: linux/amd64

  # FastAPI RAG Service
  rag-service:
    image: xmlangel/testcasecraft-rag-service:latest
    container_name: testcasecraft-rag-service
    environment:
      # Database
      DATABASE_URL: postgresql://rag_user:${POSTGRES_RAG_PASSWORD}@postgres:5432/rag_db

      # MinIO (Docker Compose MinIO μ‚¬μš©)
      MINIO_ENDPOINT: minio:9000
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
      MINIO_BUCKET: rag-documents
      MINIO_SECURE: "false"

      # Document Parser Configuration
      # Options: upstage, pymupdf, pymupdf4llm, pypdf2, auto
      # Using pymupdf4llm for LLM-optimized markdown extraction (no API key required)
      DOCUMENT_PARSER: ${DOCUMENT_PARSER:-pymupdf4llm}

      # Upstage API (not used when using pymupdf4llm)
      UPSTAGE_API_KEY: ${UPSTAGE_API_KEY:-your_upstage_api_key}

      # Application
      APP_ENV: development
      LOG_LEVEL: DEBUG
    ports:
      - "8001:8000"
    networks:
      - testcasecraft-network
    depends_on:
      postgres:
        condition: service_healthy
      minio:
        condition: service_healthy
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

  # PostgreSQL 18 with pgvector β€” 톡합 단일 μΈμŠ€ν„΄μŠ€
  #   - testcase_management (μ•± DB, testcase_user)
  #   - rag_db (RAG 벑터 DB, rag_user) : init-scripts κ°€ 졜초 기동 μ‹œ μžλ™ 생성
  postgres:
    image: pgvector/pgvector:pg18
    container_name: testcasecraft-postgres
    environment:
      POSTGRES_DB: testcase_management
      POSTGRES_USER: testcase_user
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      # 졜초 기동 μ‹œ rag_user/rag_db 생성에 μ‚¬μš© (init-scripts/01-init-rag.sh)
      POSTGRES_RAG_PASSWORD: ${POSTGRES_RAG_PASSWORD}
    ports:
      - "5434:5432"
    volumes:
      - ./data/postgres:/var/lib/postgresql
      - ./init-scripts:/docker-entrypoint-initdb.d
    networks:
      - testcasecraft-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U testcase_user -d testcase_management"]
      interval: 10s
      timeout: 5s
      retries: 5

# MinIO Object Storage (RAG)
  minio:
    image: minio/minio:latest
    container_name: testcasecraft-minio
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
    ports:
      - "9000:9000"  # API
      - "9001:9001"  # Console
    volumes:
      - ./data/minio:/data
    networks:
      - testcasecraft-network
    command: server /data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  testcasecraft-network:
    name: testcasecraft-network-spring
    driver: bridge

Tag summary

Content type

Image

Digest

sha256:7e5fbf1c0…

Size

219.4 MB

Last updated

3 days ago

docker pull xmlangel/testcasecraft