109 lines
3.0 KiB
Markdown
Executable File
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
|
|
```
|