tkds 도메인 폐기. 로그인 리다이렉트, CORS, 알림벨 등 16개 파일에서 tkds → tkfb로 변경. tkds로 접속 시 gateway에 /pages/ 경로가 없어 404 발생하던 문제 해결. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.3 KiB
5.3 KiB
TK Factory Services — 시스템 아키텍처
전체 구조
21개 컨테이너, Docker Compose 기반, Cloudflare Tunnel로 외부 노출.
[Cloudflare Tunnel] → tk-cloudflared
├── tkfb.technicalkorea.net → tk-gateway:80 (로그인 + 대시보드 + 공유JS)
├── tkfb.technicalkorea.net → tk-system1-web:80 (공장관리)
├── tkreport.technicalkorea.net → tk-system2-web:80 (신고)
├── tkqc.technicalkorea.net → tk-system3-web:80 (부적합관리)
├── tkuser.technicalkorea.net → tk-tkuser-web:80 (통합관리)
├── tkpurchase.technicalkorea.net → tk-tkpurchase-web:80 (구매관리)
├── tksafety.technicalkorea.net → tk-tksafety-web:80 (안전관리)
└── tksupport.technicalkorea.net → tk-tksupport-web:80 (행정지원)
서비스 목록
| 서비스 | 컨테이너명 | 로컬 포트 | 내부 포트 | 역할 |
|---|---|---|---|---|
| Gateway | tk-gateway | 30000 | 80 | 로그인/대시보드/공유JS + SSO·API 프록시 |
| System1 API | tk-system1-api | 30005 | 3005 | 공장관리 백엔드 (Node.js) |
| System1 Web | tk-system1-web | 30080 | 80 | 공장관리 프론트엔드 (nginx) |
| System1 FastAPI | tk-system1-fastapi | 30008 | 8000 | FastAPI Bridge |
| System2 API | tk-system2-api | 30105 | 3005 | 신고 백엔드 (Node.js) |
| System2 Web | tk-system2-web | 30180 | 80 | 신고 프론트엔드 (nginx) |
| System3 API | tk-system3-api | 30200 | 8000 | 부적합관리 백엔드 (FastAPI) |
| System3 Web | tk-system3-web | 30280 | 80 | 부적합관리 프론트엔드 (nginx) |
| User API | tk-tkuser-api | 30300 | 3000 | 사용자관리 백엔드 (Node.js) |
| User Web | tk-tkuser-web | 30380 | 80 | 사용자관리 프론트엔드 (nginx) |
| Purchase API | tk-tkpurchase-api | 30400 | 3000 | 구매관리 백엔드 (Node.js) |
| Purchase Web | tk-tkpurchase-web | 30480 | 80 | 구매관리 프론트엔드 (nginx) |
| Safety API | tk-tksafety-api | 30500 | 3000 | 안전관리 백엔드 (Node.js) |
| Safety Web | tk-tksafety-web | 30580 | 80 | 안전관리 프론트엔드 (nginx) |
| Support API | tk-tksupport-api | 30600 | 3000 | 행정지원 백엔드 (Node.js) |
| Support Web | tk-tksupport-web | 30680 | 80 | 행정지원 프론트엔드 (nginx) |
| SSO Auth | tk-sso-auth | 30050 | 3000 | SSO 인증 서비스 (Node.js) |
| MariaDB | tk-mariadb | 30306 | 3306 | 메인 데이터베이스 |
| Redis | tk-redis | — | 6379 | 세션/캐시 |
| phpMyAdmin | tk-phpmyadmin | 30880 | 80 | DB 관리 도구 |
| Cloudflared | tk-cloudflared | — | — | Cloudflare Tunnel 에이전트 |
요청 흐름
브라우저 → Cloudflare DNS → Cloudflare Tunnel → cloudflared 컨테이너
→ 서브도메인별 라우팅 → 해당 web 컨테이너 (nginx)
→ /api/ → 해당 API 컨테이너
→ /auth/ → sso-auth 컨테이너
→ /uploads/ → API 컨테이너 (파일 서빙)
→ 나머지 → 정적 파일 (SPA fallback)
SSO 인증 흐름
- 사용자가 아무 서비스 접근 → 프론트엔드 JS가
sso_token쿠키 확인 - 토큰 없음/만료 →
tkfb.technicalkorea.net/dashboard로 리다이렉트 (redirect 파라미터 포함) - 로그인 폼 제출 →
POST /auth/login→ sso-auth가 JWT 발급 - 쿠키 설정:
sso_token,sso_user,sso_refresh_token(domain=.technicalkorea.net) - redirect 파라미터가 있으면 원래 페이지로, 없으면 대시보드 표시
- 각 서비스의 API는
Authorization: Bearer <token>헤더로 인증 검증
CORS 관리
- sso-auth:
sso-auth-service/config/— 모든*.technicalkorea.net서브도메인 허용 - system1-factory API:
system1-factory/api/config/cors.js— 허용 origin 명시적 관리 - 로컬 네트워크(192.168.x.x)는 자동 허용
공유 JS
Gateway(/shared/)에서 서빙:
notification-bell.js— 알림 벨 UI, 모든 서비스에서 로딩nav-header.js— 공통 네비게이션 헤더
각 서비스의 core.js에서 동적 로딩:
프로덕션: https://tkfb.technicalkorea.net/shared/notification-bell.js
로컬: http://localhost:30000/shared/notification-bell.js
신규 서비스 추가 체크리스트
<service>/api/+<service>/web/디렉토리 생성 (Dockerfile 포함)docker-compose.yml에 api + web 서비스 추가 (포트 할당)cloudflared.depends_on에 web 서비스 추가- Cloudflare Tunnel 대시보드에서 서브도메인 → 컨테이너 라우팅 추가
sso-auth-service/config/에 새 origin 추가system1-factory/api/config/cors.js에 새 origin 추가 (API 호출 시)- 알림 벨 사용 시: core.js에
_loadNotificationBell()함수 추가 - 로그인 리다이렉트:
tkfb.technicalkorea.net/dashboard?redirect=패턴 사용
배포 절차
# 로컬에서 push
git push
# NAS에서 pull + rebuild
ssh hyungi@100.71.132.52 "cd /volume1/docker/tk-factory-services && \
git pull && \
export PATH=\$PATH:/volume2/@appstore/ContainerManager/usr/bin && \
docker compose up -d --build <서비스명>"
전체 재시작: docker compose up -d --build
특정 서비스만: docker compose up -d --build gateway system1-web