Files
tk-factory-services/ARCHITECTURE.md
Hyungi Ahn 28a5924e76 fix: tkds.technicalkorea.net → tkfb.technicalkorea.net 일괄 전환
tkds 도메인 폐기. 로그인 리다이렉트, CORS, 알림벨 등 16개 파일에서
tkds → tkfb로 변경. tkds로 접속 시 gateway에 /pages/ 경로가 없어
404 발생하던 문제 해결.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:26:32 +09:00

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 인증 흐름

  1. 사용자가 아무 서비스 접근 → 프론트엔드 JS가 sso_token 쿠키 확인
  2. 토큰 없음/만료 → tkfb.technicalkorea.net/dashboard로 리다이렉트 (redirect 파라미터 포함)
  3. 로그인 폼 제출 → POST /auth/login → sso-auth가 JWT 발급
  4. 쿠키 설정: sso_token, sso_user, sso_refresh_token (domain=.technicalkorea.net)
  5. redirect 파라미터가 있으면 원래 페이지로, 없으면 대시보드 표시
  6. 각 서비스의 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

신규 서비스 추가 체크리스트

  1. <service>/api/ + <service>/web/ 디렉토리 생성 (Dockerfile 포함)
  2. docker-compose.yml에 api + web 서비스 추가 (포트 할당)
  3. cloudflared.depends_on에 web 서비스 추가
  4. Cloudflare Tunnel 대시보드에서 서브도메인 → 컨테이너 라우팅 추가
  5. sso-auth-service/config/에 새 origin 추가
  6. system1-factory/api/config/cors.js에 새 origin 추가 (API 호출 시)
  7. 알림 벨 사용 시: core.js에 _loadNotificationBell() 함수 추가
  8. 로그인 리다이렉트: 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