본문으로 바로 가기

전체 아키텍처

WeKnora는 웹 프런트엔드, Go 메인 서비스, Python 문서 파싱 서비스로 구성됩니다. 데이터베이스에 비즈니스 데이터를 저장하고 Redis로 비동기 작업을 스케줄링합니다. 벡터 저장소, 객체 저장소, 지식 그래프, 모델 서비스는 배포 요구 사항에 맞게 구성할 수 있습니다.

시스템 구성

WeKnora는 "메인 서비스 + 프런트엔드 + 문서 파싱 마이크로서비스"의 3개 프로세스를 중심으로 구성되며, PostgreSQL과 Redis라는 두 가지 인프라에 의존합니다. 그 밖의 구성 요소(벡터 데이터베이스, 지식 그래프, 웹 검색 등)는 모두 선택 사항이며 Docker Compose profile로 필요할 때 활성화할 수 있습니다.

핵심 서비스(기본 실행)

서비스이미지 / 빌드포트역할
appwechatopenai/weknora-app(docker/Dockerfile.app, Go)8080메인 백엔드: REST API, RAG 검색, Agent 엔진, 비동기 작업 worker, IM/Embed 채널 연동. 상태 확인 GET /health
frontendwechatopenai/weknora-ui(frontend/, NGINX + Vue3 정적 산출물)80Web UI. NGINX가 리버스 프록시 역할도 하며 /apiapp으로 전달합니다(APP_HOST/APP_BACKEND_PORT/APP_SCHEME으로 원격 백엔드 지정 가능).
docreaderwechatopenai/weknora-docreader(docker/Dockerfile.docreader, Python)50051(compose 네트워크 내부에만 expose하며 호스트에는 매핑하지 않음)문서 파싱 마이크로서비스: gRPC 서버로 PDF/DOCX/Excel/EPUB/웹페이지 등 25개 이상의 형식을 파싱하고 페이지를 렌더링합니다. 상태 확인 grpc_health_probe
postgresparadedb/paradedb:v0.22.2-pg175432(네트워크 내부)메인 데이터베이스. ParadeDB 배포판에는 BM25 전문 검색과 pgvector 벡터 기능이 포함되어 있어 기본 배포에는 별도의 벡터 데이터베이스가 필요하지 않습니다(RETRIEVE_DRIVER=postgres).
redisredis:7.0-alpine(appendonly + requirepass)6379(네트워크 내부)Asynq 작업 큐, SSE 스트림 관리(인스턴스 간), system_settings 발행/구독, 속도 제한, 분산 모델 동시 실행 게이트
sandboxwechatopenai/weknora-sandbox(docker/Dockerfile.sandbox)WeKnora 표준 런타임 이미지. 공간의 Docker 백엔드에 직접 사용할 수 있으며, CubeSandbox/E2B 연동 시에는 템플릿 API를 통해 자동 등록되어 Agent Skills에 사용됩니다.

appdocreader는 공유 볼륨 docreader-tmp(/tmp/docreader에 마운트)를 통해 파싱 결과 이미지를 전달합니다. app의 로컬 파일 저장 볼륨은 data-files(/data/files)입니다.

선택적 구성 요소(Compose profile)

서비스profile용도
searxng(+ 일회성 searxng-init)searxng / full자체 호스팅 메타 검색 엔진으로 Agent에 Web Search를 제공합니다(기본 바인딩 127.0.0.1:8888).
neo4jneo4j / full지식 그래프 저장소(GraphRAG). 활성화 설정은 NEO4J_ENABLE, Bolt 프로토콜 포트는 7687입니다.
miniominio / full객체 저장소(STORAGE_TYPE=minio)
qdrant / milvus / weaviate각각 같은 이름의 profile독립형 벡터 데이터베이스(RETRIEVE_DRIVER로 전환)
doris-fe + doris-bedorisApache Doris 4.1 검색 엔진(FE MySQL 9030 / FE HTTP 8030 Stream Load / BE 8040)
odl-hybridodl-hybridOpenDataLoader PDF 하이브리드 파싱 백엔드(docreader가 HTTP :5002로 호출)
dexdex / fullOIDC 테스트용 IdP(OIDC_AUTH_ENABLE과 함께 사용)
langfuse-*(web/worker/clickhouse/minio/db-init)langfuse자체 구축 LLM 관측성 스택. WeKnora의 postgres(새 langfuse 데이터베이스 생성)와 redis(DB 1)를 재사용합니다.

또한 Go 백엔드는 compose에 포함되지 않은 외부 엔진에 직접 연결할 수 있습니다. Elasticsearch v7/v8, OpenSearch, Tencent Cloud VectorDB, Volcengine VikingDB와 8가지 객체 저장소(local/MinIO/COS/TOS/S3/OSS/KS3/OBS)를 지원합니다.

배포 형태

표준 Docker Compose 배포 외에도 저장소는 다음 방식을 지원합니다.

  • Lite 모드: DB_DRIVER=sqlite(내장 sqlite-vec 벡터 확장) + REDIS_ADDR 미설정(Asynq가 프로세스 내 SyncTaskExecutor로 폴백), 단일 바이너리 실행, 프런트엔드 정적 리소스 내장(handler.Edition == "lite"일 때 Go 프로세스가 직접 호스팅)
  • 데스크톱 버전: cmd/desktop을 Wails v2 기반 데스크톱 애플리케이션으로 패키징
  • Kubernetes: helm/ Chart, 베어메탈: deploy/ systemd 유닛, macOS: Formula/ Homebrew 포뮬러

기술 스택 목록

계층기술버전/설명
백엔드 언어Gogo.modgo 1.26.0 선언
Web 프레임워크github.com/gin-gonic/ginv1.12.0
ORMgorm.io/gorm + postgres/sqlite driverv1.31.1, SQLite에 sqlite-vec 벡터 확장 포함
의존성 주입go.uber.org/digv1.19.0(생성자 주입, 백엔드 설계 문서 참고)
비동기 작업github.com/hibiken/asynqv0.26.0(Redis 기반, worker 풀 6개)
캐시/큐github.com/redis/go-redis/v9v9.14.1
인증github.com/golang-jwt/jwt/v5 + OIDCJWT Bearer / X-API-Key / OIDC 세 가지 방식
데이터베이스 마이그레이션github.com/golang-migrate/migrate/v4migrations/versioned/*.up.sql, 시작할 때 AUTO_MIGRATE로 자동 실행
로그github.com/sirupsen/logrus + lumberjack 로테이션자체 개발 formatter, 전 구간에 request_id 사용
설정github.com/spf13/viper + config/config.yaml + 환경 변수
관측성OpenTelemetry + Langfuse(internal/tracing/langfuse)LLM 호출 단위 trace
gRPCgoogle.golang.org/grpc v1.81.0docreader 호출
LLM 연동sashabaranov/go-openai, Ollama, Tencent Cloud LKE 등18개 이상의 모델 제공자(OpenAI 호환 / Ollama / 클라우드 사업자 SDK)
벡터/검색pgvector, ES v7/v8, OpenSearch, Qdrant, Milvus, Weaviate, Doris, Tencent VectorDB, sqlite-vecRETRIEVE_DRIVERvector_stores 테이블로 동적 구성
지식 그래프neo4j-go-driver/v6선택 사항
데이터 분석DuckDB(duckdb-go/v2), pg_query_go SQL 검증Agent 데이터 분석 도구
고루틴 풀panjf2000/ants/v2문서 처리 동시 실행 풀(CONCURRENCY_POOL_SIZE)
MCPmark3labs/mcp-go v0.52.0Agent 외부 MCP 도구 연동(OAuth 포함)
API 문서swaggo/gin-swaggerrelease 모드가 아닐 때 /swagger 제공
프런트엔드 프레임워크Vue 3(^3.5) + TypeScript + Vite 7frontend/package.json
프런트엔드 UI/상태TDesign Vue Next, Pinia, Vue Router 4, vue-i18nMarked/KaTeX/Mermaid/highlight.js로 리치 텍스트 렌더링
문서 파싱 서비스Python + grpciodocreader/main.py, 파서는 docreader/parser/에 위치(pdf/docx/excel/epub/web/image/markitdown/opendataloader 등)
데스크톱Wails v2cmd/desktop

프로세스 간 통신 방식

연결 경로프로토콜설명
브라우저 → frontend(NGINX) → appHTTP/HTTPS(REST + SSE)NGINX가 /api를 리버스 프록시하며 채팅은 SSE 스트리밍 응답을 사용합니다.
appdocreadergRPC(기본값 docreader:50051, DOCREADER_TRANSPORT=grpc, TLS/mTLS 및 GRPC_AUTH_TOKEN 지원)proto는 docreader/proto/에 정의되어 있으며 대용량 파일은 스트리밍 ReadStream을 사용합니다.
apppostgresPostgreSQL wire(GORM/pgx)비즈니스 데이터 + BM25 + pgvector
appredisRESP(TLS 지원)① Asynq 작업 큐(문서 파싱/강화/Wiki/메모리 등의 작업), ② SSE 스트림 연결이 끊긴 뒤 이어받기 위한 Stream Manager(STREAM_MANAGER_TYPE), ③ system_settings 변경 Pub/Sub, ④ Embed 채널 속도 제한, ⑤ 분산형 모델별 동시 실행 세마포어
appneo4jBolt(bolt://neo4j:7687)GraphRAG 엔터티/관계 저장 및 조회
appsearxng / Web 검색 providerHTTPSSRF 허용 목록 검증(SSRF_WHITELIST_EXTRA는 compose 내부의 searxng,qdrant,milvus,weaviate,doris-fe,doris-be를 기본 허용)
app → 벡터 데이터베이스/객체 저장소/LLM 제공자각 SDK(HTTP/gRPC/MySQL 프로토콜)Doris는 MySQL 프로토콜 + Stream Load HTTP 사용
app → 샌드박스 백엔드Docker Engine API / Cube/E2B 제어 영역 및 데이터 영역세션 실행, 스킬 설치, 파일 산출물 처리. 공간의 샌드박스 설정에 따라 선택됩니다.
app ↔ IM 플랫폼HTTP webhook / 장기 연결 SDKWeChat, WeCom, Feishu, DingTalk, Slack, Telegram, QQ, Mattermost, Yunzhijia(internal/im/)

전체 아키텍처 다이어그램

일반적인 요청 흐름: 문서 업로드부터 파싱 및 저장까지

다음 다이어그램은 문서 하나가 업로드된 후 검색 가능한 상태가 되기까지의 전체 흐름을 보여 줍니다. 동기 API, Asynq 비동기 작업, gRPC 파싱, Embedding 및 벡터 저장, 강화 하위 작업 등 구성 요소 간 상호작용 대부분을 다룹니다.

대화 흐름(POST /api/v1/knowledge-chat/:session_id 또는 agent-chat)은 동기 SSE 방식입니다. Handler → SessionServicechat_pipeline 플러그인 파이프라인(query 이해 → 병렬 검색 → rerank → 병합 → Prompt 구성 → LLM 스트리밍 완성) → Stream Manager(Redis/메모리)를 통해 token 스트림을 클라이언트에 전달합니다. 자세한 내용은 백엔드 설계 문서를 참고하세요.

코드 저장소 최상위 디렉터리 안내

디렉터리역할
cmd/실행 진입점. cmd/server: 메인 서비스(main/bootstrap/listen + 플랫폼 시그널 처리), cmd/desktop: Wails 데스크톱 버전, cmd/download: 모델/리소스 다운로드 보조 도구
internal/Go 백엔드의 모든 비즈니스 코드(계층 구조는 백엔드 설계 문서 참고): handler, application/service, application/repository, container(DI), router, middleware, types, agent, im, mcp, stream, sandbox
frontend/Vue3 + Vite + TDesign Web 프런트엔드. 빌드 산출물은 NGINX가 호스팅하거나 Lite 모드에 내장됩니다.
docreader/Python gRPC 문서 파싱 마이크로서비스: 서버 진입점 main.py, 25개 이상의 파서가 있는 parser/, 분할기 splitter/, 프로토콜 정의 proto/, 독립적인 Dockerfile.docreader 빌드
cli/weknora 명령줄 도구(배포, 로그, 백업, 진단 등 약 30개 하위 명령)
client/Go SDK: WeKnora API를 HTTP 클라이언트 형태로 래핑하여 추가 개발 및 통합에 사용
mcp-server/Python으로 구현한 MCP Server(weknora_mcp_server.py)로 WeKnora API를 Claude 등의 MCP 클라이언트가 사용할 MCP 도구로 노출
miniprogram/WeChat 미니 프로그램 클라이언트(WXML/WXSS/JS)
migrations/golang-migrate 데이터베이스 마이그레이션: versioned/(Postgres 메인 계열 NNNNNN_*.up/down.sql), sqlite/(Lite 모드), paradedb/, mysql/
config/런타임 설정: 메인 설정 config.yaml, 내장 Agent builtin_agents.yaml, Agent 프리셋 agent_type_presets.yaml, 선언형 내장 모델 builtin_models.yaml.example, 프롬프트 템플릿 prompt_templates/
docker/각 이미지의 Dockerfile(app/docreader/sandbox/odl-hybrid)과 searxng 설정
deploy/베어메탈 배포 리소스(systemd 서비스 유닛 등)
helm/Kubernetes Helm Chart(Chart.yaml / values.yaml / templates/)
examples/API 사용 예제 코드. examples/skills/는 Agent Skill 패키지 예제입니다.
dataset/평가용 QA 데이터 세트 및 생성 스크립트
scripts/빌드/시작/마이그레이션 보조 스크립트(예: start_all.sh. build_frontend_dist.sh는 Lite / 데스크톱 패키징용이며 UI 이미지는 frontend/Dockerfile의 다단계 빌드로 생성)
tests/, testdata/통합 테스트와 테스트 데이터
Formula/Homebrew 설치 포뮬러(macOS)
misc/기타 파일(예: OIDC 테스트 설정 dex-config.yaml)
packages/로컬 패키지용으로 예약된 디렉터리
docs/초기 문서로, 일부 내용은 오래되었습니다.

참고: Go 모듈 경로는 github.com/Tencent/WeKnora입니다. 루트 디렉터리에는 docker-compose.yml(프로덕션 오케스트레이션), docker-compose.dev.yml(개발 오케스트레이션), Makefile, VERSION 등도 있습니다.

다음 문서인 《Go 백엔드 설계》에서는 internal/ 내부의 계층형 아키텍처, dig 의존성 주입, 시작 흐름, 라우팅과 RBAC, 미들웨어, 도메인 모델, 오류/로그 규칙을 자세히 살펴봅니다.

WeKnora v0.8.0 소스 코드 기반 한국어 번역 · MIT License