Files
safe-project/docs/architecture.md
Hyungi Ahn 2a9968fa7f feat: TK 안전관리 플랫폼 초기 구현
위험성평가, 안전 RAG Q&A, 안전점검 체크리스트를 통합한
안전관리자 전용 웹 플랫폼 전체 구현.

- Next.js 15 (App Router) + TypeScript + Tailwind + shadcn/ui
- Drizzle ORM + PostgreSQL 16 (12개 테이블)
- 위험성평가 CRUD + 5x5 위험성 매트릭스 + 인쇄 내보내기
- 체크리스트 템플릿/점검/NCR 추적
- RAG 문서 파이프라인 (Tika + bge-m3 + Qdrant)
- SSE 스트리밍 RAG 채팅 (qwen3.5:35b-a3b)
- AI 어시스트 (위험요인 추천, 감소대책, 점검항목 생성)
- 대시보드 통계/차트 (recharts)
- 단일 사용자 인증 (HMAC 쿠키 세션)
- 다크모드 지원
- Docker 멀티스테이지 빌드 (standalone)
- 프로젝트 가이드 문서 (docs/)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 12:33:55 +09:00

108 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TK 안전관리 플랫폼 - 아키텍처 가이드
## 기술 스택
| 분류 | 기술 |
|------|------|
| 프레임워크 | Next.js 15 (App Router, TypeScript, Server Actions) |
| UI | Tailwind CSS + shadcn/ui + Lucide icons + recharts |
| ORM | Drizzle ORM |
| DB | PostgreSQL 16 (컨테이너 `tk-safety-db`) |
| AI 생성 | 맥미니 Ollama qwen3.5:35b-a3b |
| AI 임베딩 | 조립컴 Ollama bge-m3 (1024d) |
| 벡터DB | Qdrant (컬렉션 `safety-docs`) |
| OCR | Apache Tika (port 9998) |
| 인증 | 단일 사용자 (환경변수 비밀번호 + HMAC 쿠키 세션) |
## 포트 매핑
| 서비스 | 호스트:컨테이너 |
|--------|------------------|
| tk-safety (Next.js) | 3100:3000 |
| tk-safety-db (PostgreSQL) | 127.0.0.1:5433:5432 |
## 프로젝트 구조
```
tk-safety/
├── docker-compose.yml # 서비스 정의
├── Dockerfile # multi-stage 빌드 (standalone)
├── .env / .env.example # 환경변수
├── drizzle.config.ts # Drizzle ORM 설정
├── drizzle/migrations/ # DB 마이그레이션 (자동 생성)
├── uploads/ # 업로드 파일 (documents, photos)
├── docs/ # 프로젝트 가이드 문서
└── src/
├── app/
│ ├── layout.tsx # 루트 레이아웃 (다크모드 초기화)
│ ├── page.tsx # 인증 리다이렉트
│ ├── login/page.tsx # 로그인 페이지
│ ├── middleware.ts # 인증 미들웨어
│ ├── (authenticated)/ # 인증 필요 라우트 그룹
│ │ ├── layout.tsx # 사이드바 + 헤더
│ │ ├── dashboard/ # 대시보드
│ │ ├── risk-assessment/ # 위험성평가
│ │ ├── rag/ # 안전 Q&A
│ │ ├── checklists/ # 점검 체크리스트
│ │ └── settings/ # 설정
│ └── api/
│ ├── auth/ # 로그인/로그아웃 API
│ ├── ai/ # AI 엔드포인트 (SSE 스트리밍)
│ └── health/ # 서비스 헬스체크
├── actions/ # Server Actions (CRUD)
├── components/
│ ├── ui/ # shadcn/ui 컴포넌트
│ ├── layout/ # 사이드바, 헤더, 모바일 내비
│ ├── dashboard/ # 통계, 차트, 퀵액션
│ ├── risk-assessment/ # 평가 폼, 매트릭스, AI 패널
│ ├── rag/ # 채팅, 문서 관리
│ └── checklists/ # 템플릿, 점검, NCR
├── lib/
│ ├── db/ # schema.ts, index.ts
│ ├── ai/ # ollama, qdrant, tika, embeddings, prompts
│ ├── auth.ts # 인증 유틸
│ ├── constants.ts # 상수 정의
│ └── utils.ts # shadcn 유틸
├── hooks/ # use-streaming.ts (SSE)
└── types/ # 타입 정의
```
## DB 스키마 (12개 테이블)
### 위험성평가
- `risk_assessments` — 평가 마스터 (제목, 상태, 버전)
- `risk_assessment_hazards` — 유해위험요인 (S×L=위험성)
### RAG 문서
- `rag_documents` — 업로드 문서 (처리 상태 포함)
- `rag_chunks` — 문서 청크 (Qdrant pointId 매핑)
- `rag_conversations` — 대화 세션
- `rag_messages` — 메시지 (질문/답변 + 출처)
### 체크리스트
- `checklist_templates` — 점검 템플릿
- `checklist_template_items` — 템플릿 항목
- `inspections` — 점검 실행 기록
- `inspection_results` — 항목별 결과
- `non_conformances` — 부적합 사항 (NCR)
### 기타
- `app_settings` — 앱 설정 (key-value)
## AI 연동 흐름
### RAG Q&A
```
질문 → bge-m3 임베딩(조립컴) → Qdrant 검색(top-5) → 컨텍스트 + 질문 → qwen3.5 생성(맥미니) → SSE 스트리밍
```
### AI 위험요인 추천
```
작업 설명 → bge-m3 임베딩 → Qdrant 검색(top-3) → 컨텍스트 + 프롬프트 → qwen3.5 JSON 생성 → 구조화 응답
```
### 문서 처리 파이프라인
```
파일 업로드 → Tika 텍스트 추출 → 1500자/200 overlap 청킹 → bge-m3 배치 임베딩(10개씩) → Qdrant 저장
```