Update TO-BE: Proxmox + Coolify architecture
This commit is contained in:
141
network-plan.md
141
network-plan.md
@@ -223,76 +223,115 @@ Gitea (https://git.0022222.xyz)
|
||||
|
||||
---
|
||||
|
||||
## 목표 구조 (TO-BE): Proxmox + 서브도메인 기반
|
||||
## 목표 구조 (TO-BE): Proxmox + Coolify
|
||||
|
||||
### 설계 원칙
|
||||
- **개발자 셀프서비스**: git push → 자동 빌드/배포 (인프라 담당자 개입 불필요)
|
||||
- **최소 구성**: VM 1개 (Coolify) + CT 1개 (DB) — 단순할수록 좋다
|
||||
- **Proxmox**: 스냅샷/백업/리소스 격리 담당, 서비스 오케스트레이션은 Coolify에 위임
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ ISP (SK브로드밴드) │
|
||||
│ WAN: 동적 IP (DDNS 권장) │
|
||||
└──────────────┬──────────────────────┘
|
||||
│
|
||||
┌──────────────┴──────────────────────┐
|
||||
│ TP-Link Archer AXE75 │
|
||||
│ LAN: 192.168.0.254 │
|
||||
│ 포트포워딩: 80, 443 → .101 │
|
||||
│ WireGuard VPN: 51820/UDP │
|
||||
└──────────────┬──────────────────────┘
|
||||
│
|
||||
┌────────────────────────────┴────────────────────────────┐
|
||||
│ Proxmox 호스트 (192.168.0.100) │
|
||||
│ Proxmox VE (192.168.0.100) │
|
||||
│ SSD / i9-10900K / 64GB │
|
||||
│ 관리: https://.100:8006 (VPN 전용) │
|
||||
│ │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────┐ ┌─────┐ │
|
||||
│ │CT101 │ │CT102 │ │CT103 │ │CT104 │ │CT105│ │
|
||||
│ │Caddy │ │Gitea │ │Apps │ │DB │ │CI │ │
|
||||
│ │.101 │ │.102 │ │.103 │ │.104 │ │.105 │ │
|
||||
│ │:80/:443 │ │:3000 │ │Docker │ │PG │ │Jenk │ │
|
||||
│ │ │→│ │ │TB,CM,CB │ │MySQL │ │Gitea│ │
|
||||
│ │ │→│ │ │GW,CC │ │ │ │Runr │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └──────┘ └─────┘ │
|
||||
│ ┌──────────────────────────────────┐ ┌─────────────┐ │
|
||||
│ │ VM 101: Coolify (192.168.0.101) │ │CT 104: DB │ │
|
||||
│ │ Ubuntu 22.04 / 8C / 48GB │ │.104 │ │
|
||||
│ │ │ │PostgreSQL │ │
|
||||
│ │ ┌─ Traefik (리버스 프록시) ────┐ │ │MySQL │ │
|
||||
│ │ │ :80/:443 ← 외부 유일 진입점 │ │ │(내부만 접근) │ │
|
||||
│ │ │ auto Let's Encrypt SSL │ │ └─────────────┘ │
|
||||
│ │ └─────────────────────────────┘ │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─ Coolify (PaaS) ────────────┐ │ │
|
||||
│ │ │ 관리 UI: :8000 │ │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ │ ┌─ Gitea (:3000) ─────────┐ │ │ │
|
||||
│ │ │ │ git.0022222.xyz │ │ │ │
|
||||
│ │ │ └─────────────────────────┘ │ │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ │ ┌─ 앱 서비스 (Docker) ────┐ │ │ │
|
||||
│ │ │ │ tb.0022222.xyz (TB) │ │ │ │
|
||||
│ │ │ │ cm.0022222.xyz (CM) │ │ │ │
|
||||
│ │ │ │ cb.0022222.xyz (CB) │ │ │ │
|
||||
│ │ │ │ gw.0022222.xyz (GW) │ │ │ │
|
||||
│ │ │ │ cc.0022222.xyz (CC) │ │ │ │
|
||||
│ │ │ │ + 새 서비스 자동 추가 │ │ │ │
|
||||
│ │ │ └─────────────────────────┘ │ │ │
|
||||
│ │ └─────────────────────────────┘ │ │
|
||||
│ └──────────────────────────────────┘ │
|
||||
└────────────────────────────────────────────────────────┘
|
||||
|
||||
외부 → :80/:443 → CT101 (Caddy) → 서브도메인별 라우팅
|
||||
VPN → 직접 접근 (Proxmox :8006, Jenkins, DB 등)
|
||||
개발자 워크플로우:
|
||||
Gitea push → Coolify webhook → 자동 빌드 → Docker 배포 → 서브도메인+SSL 자동
|
||||
```
|
||||
|
||||
### IP 할당
|
||||
| IP | 역할 | 비고 |
|
||||
|----|------|------|
|
||||
| 192.168.0.254 | TP-Link 라우터 | 관리 웹UI |
|
||||
| 192.168.0.100 | Proxmox 호스트 | 관리 웹UI (8006) |
|
||||
| 192.168.0.101 | CT: Reverse Proxy | Caddy — 외부 유일 진입점 |
|
||||
| 192.168.0.102 | CT: Gitea | GitLab 대체 |
|
||||
| 192.168.0.103 | CT: 웹앱 (Docker) | TrainBoard, CM, CheeseBoard, GroupWare 등 |
|
||||
| 192.168.0.104 | CT: DB | PostgreSQL + MySQL (내부만 접근) |
|
||||
| 192.168.0.105 | CT: Jenkins/CI | Jenkins + Gitea Runner |
|
||||
| IP | 역할 | 리소스 | 비고 |
|
||||
|----|------|--------|------|
|
||||
| 192.168.0.254 | TP-Link 라우터 | - | 관리 웹UI (VPN 전용) |
|
||||
| 192.168.0.100 | Proxmox 호스트 | - | 관리 웹UI :8006 (VPN 전용) |
|
||||
| 192.168.0.101 | VM: Coolify | 8C / 48GB / 400GB | PaaS + 리버스 프록시 + 앱 전체 |
|
||||
| 192.168.0.104 | CT: DB | 2C / 8GB / 100GB | PostgreSQL + MySQL (내부만) |
|
||||
|
||||
### 라우터 포트포워딩 (최종)
|
||||
| 외부 포트 | 내부 대상 | 용도 |
|
||||
|-----------|-----------|------|
|
||||
| 80 | 192.168.0.101:80 | HTTP → HTTPS 리다이렉트 + Let's Encrypt |
|
||||
| 443 | 192.168.0.101:443 | 모든 HTTPS 트래픽 |
|
||||
| 443 | 192.168.0.101:443 | 모든 HTTPS 트래픽 (Traefik) |
|
||||
| 51820/UDP | (라우터 자체) | WireGuard VPN |
|
||||
|
||||
→ 기존 포트포워딩 규칙 **전부 폐쇄**
|
||||
→ 외부에서는 80/443/51820만 열림
|
||||
→ SSH, DB, 관리 포트는 VPN 전용
|
||||
→ 외부에서는 **80/443/51820만 열림**
|
||||
→ SSH, DB, Proxmox, Coolify 관리 UI는 **VPN 전용**
|
||||
|
||||
### 서브도메인 → 서비스 매핑 (최종)
|
||||
| 서브도메인 | 백엔드 | 비고 |
|
||||
### Coolify가 관리하는 서비스
|
||||
| 서브도메인 | 서비스 | 타입 |
|
||||
|------------|--------|------|
|
||||
| git.0022222.xyz | 192.168.0.102:3000 | Gitea |
|
||||
| tb.0022222.xyz | 192.168.0.103:10500 | TrainBoard API |
|
||||
| cm.0022222.xyz | 192.168.0.103:10501 | CultureMakers API |
|
||||
| cb.0022222.xyz | 192.168.0.103:10590 | CheeseBoard API |
|
||||
| gw.0022222.xyz | 192.168.0.103:15002 | GroupWare |
|
||||
| gw-qa.0022222.xyz | 192.168.0.103:15005 | GroupWare QA |
|
||||
| cc.0022222.xyz | 192.168.0.103:10513 | ChordCourse |
|
||||
| git.0022222.xyz | Gitea | Coolify 내장 서비스 |
|
||||
| tb.0022222.xyz | TrainBoard API | Docker (Gitea webhook) |
|
||||
| cm.0022222.xyz | CultureMakers API | Docker (Gitea webhook) |
|
||||
| cb.0022222.xyz | CheeseBoard API | Docker (Gitea webhook) |
|
||||
| gw.0022222.xyz | GroupWare | Docker (Gitea webhook) |
|
||||
| gw-qa.0022222.xyz | GroupWare QA | Docker (Gitea webhook) |
|
||||
| cc.0022222.xyz | ChordCourse | Docker (Gitea webhook) |
|
||||
| *.0022222.xyz | **새 서비스** | Coolify UI에서 추가 → 자동 |
|
||||
|
||||
### 새 마이크로서비스 배포 (개발자 가이드)
|
||||
```
|
||||
1. Gitea에 레포 생성 (Dockerfile 또는 docker-compose.yml 포함)
|
||||
2. Coolify UI (https://coolify.0022222.xyz) 접속
|
||||
3. "New Resource" → Git 소스 선택 → 레포 연결
|
||||
4. 서브도메인 입력 (예: myapp.0022222.xyz)
|
||||
5. Deploy 클릭
|
||||
→ Coolify가 자동으로:
|
||||
- Docker 이미지 빌드
|
||||
- 컨테이너 배포
|
||||
- Traefik 라우팅 규칙 추가
|
||||
- Let's Encrypt SSL 발급
|
||||
6. 이후 git push 시 자동 재배포 (webhook)
|
||||
```
|
||||
|
||||
### VPN 전용 접근
|
||||
| 대상 | 접근 방법 |
|
||||
|------|-----------|
|
||||
| Proxmox 관리 | `https://192.168.0.100:8006` |
|
||||
| Jenkins | `http://192.168.0.105:8080` |
|
||||
| DB (MySQL/PG) | `192.168.0.104:3306/5432` |
|
||||
| Coolify 관리 | `https://coolify.0022222.xyz` 또는 `http://192.168.0.101:8000` |
|
||||
| DB (PostgreSQL) | `192.168.0.104:5432` |
|
||||
| DB (MySQL) | `192.168.0.104:3306` |
|
||||
| 라우터 관리 | `https://192.168.0.254` |
|
||||
|
||||
### DNS 레코드 (0022222.xyz — Cloudflare)
|
||||
@@ -335,31 +374,33 @@ Gitea (https://git.0022222.xyz)
|
||||
- [ ] lets_encrypt 포트포워딩 수정 (80→10080 → 80→80)
|
||||
|
||||
### Phase 1: SSD 도착 전 준비
|
||||
- [ ] 전체 백업 실행 (GitLab, DB, Docker 볼륨, 설정파일, 인증서)
|
||||
- [ ] 전체 백업 (DB 덤프, Docker 볼륨, Gitea 데이터, 설정파일, 인증서)
|
||||
- [ ] 백업 스크립트 작성
|
||||
- [ ] docker-compose 정리
|
||||
- [ ] GitLab 서비스 중단 (Gitea로 완전 전환 후)
|
||||
- [ ] CI/CD 파이프라인 Gitea webhook으로 전환
|
||||
- [ ] docker-compose.yml 정리 및 문서화
|
||||
- [ ] GitLab 서비스 중단 (Gitea 전환 확인 후)
|
||||
- [ ] 각 서비스 Dockerfile 정리 (Coolify 배포 준비)
|
||||
|
||||
### Phase 2: SSD 도착 후 Proxmox 설치
|
||||
### Phase 2: SSD 도착 → Proxmox + Coolify 설치
|
||||
- [ ] SSD에 Proxmox VE 설치
|
||||
- [ ] 네트워크 브릿지 설정 (vmbr0 → 192.168.0.0/24)
|
||||
- [ ] CT 생성: 101 (Caddy), 102 (Gitea), 103 (Apps), 104 (DB), 105 (Jenkins)
|
||||
- [ ] 각 CT에 고정 IP 할당
|
||||
- [ ] VM 101 생성: Ubuntu 22.04 (Coolify용, 8C/48GB/400GB)
|
||||
- [ ] CT 104 생성: DB 전용 (2C/8GB/100GB)
|
||||
- [ ] Coolify 설치 (`curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash`)
|
||||
- [ ] Coolify 초기 설정 (관리자 계정, Traefik 도메인)
|
||||
- [ ] Gitea를 Coolify 서비스로 배포
|
||||
|
||||
### Phase 3: 서비스 이관
|
||||
- [ ] DB 복원 (PostgreSQL, MySQL)
|
||||
- [ ] Gitea 데이터 이관
|
||||
- [ ] Docker 앱 배포
|
||||
- [ ] Jenkins 복원
|
||||
- [ ] Caddy 리버스 프록시 설정
|
||||
- [ ] SSL 인증서 발급 확인 (Caddy 자동)
|
||||
- [ ] DB 복원 (PostgreSQL → CT104, MySQL → CT104)
|
||||
- [ ] Coolify에 기존 서비스 등록 (TB, CM, CB, GW, CC)
|
||||
- [ ] Gitea webhook 연결 (각 레포 → Coolify 자동 배포)
|
||||
- [ ] 서브도메인 + SSL 자동 발급 확인
|
||||
|
||||
### Phase 4: 전환
|
||||
- [ ] 라우터 포트포워딩 변경 (80/443 → .101)
|
||||
- [ ] 기존 포트포워딩 전부 제거
|
||||
- [ ] DNS 최종 확인
|
||||
- [ ] 검증 후 기존 HDD Ubuntu 보관 (롤백용)
|
||||
- [ ] 개발팀에 Coolify 사용 가이드 공유
|
||||
- [ ] 기존 HDD Ubuntu 보관 (롤백용)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user