Files
nginx-portal/ARCHITECTURE.md
qorgh529 e10f15ec00
Some checks failed
Build and Push Images / build-backend (push) Has been cancelled
docs: ARCHITECTURE.md 추가 및 README 최신화
2026-04-28 18:51:12 +09:00

109 lines
3.0 KiB
Markdown
Executable File

# cyanburu.com 홈랩 아키텍처
## 전체 구조
```mermaid
flowchart TD
User["외부 사용자\nhttps://cyanburu.com"]
Router["MSI 라우터\n포트포워딩 80/443"]
Ingress["Nginx Ingress Controller\nTLS 종료 · Let's Encrypt 인증서"]
CoreDNS["CoreDNS\n내부 도메인 헤어핀 NAT 우회"]
User --> Router --> Ingress --> CoreDNS
subgraph K8s["Docker Desktop Kubernetes"]
subgraph WebPortal["web-portal namespace"]
FE["Frontend\nNginx · index.html"]
BE["Backend\nFastAPI · main.py"]
DB["PostgreSQL\nportaldb"]
Notifier["notifier.py\nDiscord · Gmail 다중 채널"]
Monitor["monitor.py\nPod 1분 · 인증서 24시간"]
NotifyCh["notify_channels\nDB 테이블"]
FE --> BE --> DB
BE --> Notifier
BE --> Monitor
Notifier --> NotifyCh
end
subgraph GitOps["GitOps 파이프라인"]
Gitea["Gitea\n코드 · Container Registry"]
ArgoCD["ArgoCD\nGitOps 자동 배포"]
Deploy["K8s Deployment\nbackend · frontend"]
Gitea -->|git push| ArgoCD -->|sync| Deploy
Gitea -->|image pull| Deploy
end
CoreDNS --> WebPortal
end
Notifier -->|Webhook| Discord["Discord"]
Notifier -->|SMTP SSL| Gmail["Gmail"]
```
---
## 네임스페이스 구성
| 네임스페이스 | 구성 요소 | 역할 |
|-------------|----------|------|
| `web-portal` | Frontend, Backend, PostgreSQL | 웹 포털 서비스 |
| `gitea` | Gitea, PostgreSQL-HA, Valkey | 코드 저장소 + Container Registry |
| `argocd` | ArgoCD Server | GitOps 자동 배포 |
| `ingress-nginx` | Nginx Ingress Controller | 외부 트래픽 라우팅 + TLS |
| `cert-manager` | cert-manager | Let's Encrypt 인증서 자동 발급 |
---
## 도메인 구성
| 도메인 | 서비스 | 인증서 |
|--------|-------|--------|
| `cyanburu.com` | Web Portal | Let's Encrypt |
| `gitea.cyanburu.com` | Gitea | Let's Encrypt |
| `argo.cyanburu.com` | ArgoCD | Let's Encrypt |
---
## 배포 흐름 (GitOps)
```mermaid
sequenceDiagram
participant Dev as 개발자
participant Gitea as Gitea
participant Registry as Container Registry
participant ArgoCD as ArgoCD
participant K8s as Kubernetes
Dev->>Gitea: git push (코드 변경)
Dev->>Registry: docker build & push
Gitea-->>ArgoCD: Webhook 감지
ArgoCD->>K8s: Sync (yaml 적용)
K8s->>Registry: image pull
K8s-->>Dev: Pod Running
```
---
## 알림 채널 발송 규칙
| 채널 유형 | Pod 이상/복구 | 계정 잠금/임시PW | 인증서 만료 |
|---------|-------------|----------------|------------|
| Discord+Gmail | Discord + Gmail | Discord만 | Gmail만 |
| Discord 전용 | Discord만 | Discord만 | 발송 안 함 |
| Gmail 전용 | Gmail만 | 발송 안 함 | Gmail만 |
---
## 이미지 레지스트리 주의사항
Docker Desktop 환경에서는 kubelet이 Docker 데몬을 통해 이미지를 Pull하므로
K8s 내부 DNS(`gitea-http.gitea.svc.cluster.local`)를 사용할 수 없음.
**반드시 외부 IP 사용:**
```
192.168.10.101:30000/qorgh529/portal-backend:latest
192.168.10.101:30000/qorgh529/portal-frontend:latest
```