Files
server-migration/network-plan.md

428 lines
22 KiB
Markdown

# Network & Migration Plan
## 현재 구조 (AS-IS) — 2026-03-30 기준
```
┌─────────────────────────────────────┐
│ ISP (SK브로드밴드) │
│ WAN: 39.122.244.108 (동적) │
└──────────────┬──────────────────────┘
┌──────────────┴──────────────────────┐
│ TP-Link Archer AXE75 (라우터) │
│ LAN: 192.168.0.254 │
│ WireGuard VPN: 51820/UDP │
│ DHCP: .200 ~ .253 │
│ │
│ 포트포워딩: │
│ :80 → .100:10080 (Let's Encrypt)│
│ :443 → .100:443 (Caddy HTTPS) │
│ :24242 → .100:22 (SSH) │
│ + 레거시 포트 다수 (정리 예정) │
└──────────────┬──────────────────────┘
┌────────────────────┴────────────────────────┐
│ 서버 (192.168.0.100, coala) │
│ Ubuntu 20.04 / i9-10900K / 64GB │
│ HDD 2TB (191GB 사용) │
│ │
│ ┌─── Caddy v2.11.2 (리버스 프록시) ───┐ │
│ │ :443 ← 외부 HTTPS 진입점 │ │
│ │ auto Let's Encrypt SSL │ │
│ │ │ │
│ │ git.0022222.xyz → localhost:3000 │ │
│ │ gitlab.0022222.xyz → localhost:8443 │ │
│ │ tb.0022222.xyz → localhost:10500 │ │
│ │ cm.0022222.xyz → localhost:10501 │ │
│ │ cb.0022222.xyz → localhost:10590 │ │
│ │ gw.0022222.xyz → localhost:15002 │ │
│ │ gw-qa.0022222.xyz → localhost:15005 │ │
│ │ cc.0022222.xyz → localhost:10513 │ │
│ │ jenkins.0022222.xyz→ localhost:8080 │ │
│ │ pve.0022222.xyz → localhost:8006 │ │
│ └──────────────────────────────────────┘ │
│ │
│ ┌─── Docker 컨테이너 ──────────────────┐ │
│ │ gitea :3000 (Git 호스팅) │ │
│ │ tb-api :10500 (TrainBoard) │ │
│ │ cm-api :10501 (CultureMakers) │ │
│ │ cheeseboard :10590 (CheeseBoard) │ │
│ │ tb-db :33306 (MySQL) │ │
│ │ cm-db :33308 (MySQL) │ │
│ │ cheeseboard-db:33309 (MySQL) │ │
│ │ gitlab-runner │ │
│ └──────────────────────────────────────┘ │
│ │
│ ┌─── 네이티브 서비스 ──────────────────┐ │
│ │ GitLab Omnibus :8443 (레거시, HTTP) │ │
│ │ Jenkins :8080 │ │
│ │ PostgreSQL :5432 │ │
│ │ GroupWare :15002 / :15005 (QA) │ │
│ │ ChordCourse :10513 │ │
│ └──────────────────────────────────────┘ │
└──────────────────────────────────────────────┘
┌─── VPN 클라이언트 (외부) ──────────┐
│ brandon: 10.5.5.2/32 │
│ → 192.168.0.0/24 접근 가능 │
│ → Endpoint: 39.122.244.108:51820 │
└────────────────────────────────────┘
```
### WAN 정보
| 항목 | 값 |
|------|-----|
| ISP | SK브로드밴드 |
| 연결 유형 | 동적 IP (DHCP) |
| WAN IP | 39.122.244.108 (변경될 수 있음) |
| WAN Gateway | 39.122.244.1 |
| DNS | 210.220.163.82 / 219.250.36.130 |
### TP-Link 설정
| 항목 | 값 |
|------|-----|
| LAN IP | 192.168.0.254 |
| 서브넷 | 255.255.255.0 |
| DHCP 범위 | 192.168.0.200 ~ .253 |
| 관리자 비밀번호 | (설정됨) |
| WireGuard VPN | 활성 (51820/UDP) |
| MAC | BC-07-1D-3C-CF-D8 |
### TP-Link 포트포워딩 (현재)
| 서비스 | 외부포트 | 내부포트 | 대상 | 상태 | 비고 |
|--------|----------|----------|------|------|------|
| gitlab | 443 | 443 | .100 | 활성 | Caddy HTTPS |
| gitlab_hook | 5050 | 5050 | .100 | 활성 | |
| lets_encrypt | 80 | 10080 | .100 | 활성 | ⚠️ 80→80으로 변경 필요 |
| ssh | 24242 | 22 | .100 | 활성 | |
| TB_mvp_back | 10600 | 10600 | .100 | 활성 | 레거시 |
| CM-back | 10601 | 10601 | .100 | 활성 | 레거시 |
| bjsrtest_back | 10501 | 10501 | .100 | 활성 | 레거시 |
| CheeseBoard | 10503 | 10503 | .100 | 활성 | 레거시 |
| CC_frontend | 10510 | 10510 | .100 | 활성 | 레거시 |
| CC_backend | 10511 | 10511 | .100 | 활성 | 레거시 |
| CC_mysql | 10512 | 10512 | .100 | 활성 | ⚠️ DB 노출 |
| Groupware_Dev | 15001 | 15001 | .100 | 활성 | 레거시 |
| Groupware_swagger | 15003 | 15003 | .100 | 활성 | 레거시 |
| Groupware_qa | 15004 | 15004 | .100 | 활성 | 레거시 |
| Groupware_mysql | 33307 | 33307 | .100 | 활성 | ⚠️ DB 노출 |
| TB_mysql | 33306 | 33306 | .100 | 활성 | ⚠️ DB 노출 |
| bjsrtest_mysql | 33308 | 33308 | .100 | 활성 | ⚠️ DB 노출 |
| jenkins | 8889 | 28080 | .100 | 활성 | ⚠️ 관리 노출 |
| kisa_test | 9797 | 9797 | .100 | 활성 | ⚠️ 삭제 대상 |
| bjsrtest_frt1 | 13000 | 13000 | .100 | 활성 | ⚠️ 삭제 대상 |
| bjsrtest_frt2 | 13001 | 13001 | .100 | 활성 | ⚠️ 삭제 대상 |
| BM_rdp | 2765 | 2765 | .15 | 활성 | ⚠️ 삭제 대상 |
| flask_test | 5000 | 5000 | .48 | 활성 | ⚠️ 삭제 대상 |
| rdp | 2588 | 3389 | .48 | 활성 | ⚠️ 삭제 대상 |
### DHCP 예약
| 장치 | MAC | IP |
|------|-----|-----|
| 서버 (coala) | B4-2E-99-F6-D0-65 | 192.168.0.100 |
| DESKTOP-N2D0NAM | D4-5D-64-B0-6B-7F | 192.168.0.48 |
| DESKTOP-8NDJGE9 | 0C-7A-15-8B-AE-E3 | 192.168.0.2 |
### WireGuard VPN
| 항목 | 값 |
|------|-----|
| 터널 IP | 10.5.5.1/32 |
| 수신 포트 | 51820/UDP |
| 클라이언트 액세스 | 인터넷 & 홈네트워크 |
| 계정: brandon | 10.5.5.2/32 |
### 서브도메인 (Cloudflare DNS — 0022222.xyz)
| 서브도메인 | 대상 | 서비스 |
|------------|------|--------|
| git.0022222.xyz | → Caddy → :3000 | Gitea |
| gitlab.0022222.xyz | → Caddy → :8443 | GitLab (레거시) |
| tb.0022222.xyz | → Caddy → :10500 | TrainBoard API |
| cm.0022222.xyz | → Caddy → :10501 | CultureMakers API |
| cb.0022222.xyz | → Caddy → :10590 | CheeseBoard API |
| gw.0022222.xyz | → Caddy → :15002 | GroupWare |
| gw-qa.0022222.xyz | → Caddy → :15005 | GroupWare QA |
| cc.0022222.xyz | → Caddy → :10513 | ChordCourse |
| jenkins.0022222.xyz | → Caddy → :8080 | Jenkins |
| pve.0022222.xyz | → Caddy → :8006 | Proxmox (미설치) |
### 외부 접속 방법
| 대상 | 방법 |
|------|------|
| 서버 SSH | `ssh -p 24242 brandon@39.122.244.108` |
| Gitea | `https://git.0022222.xyz` |
| 모든 웹 서비스 | `https://{서브도메인}.0022222.xyz` |
| 공유기 관리 | VPN 접속 후 `https://192.168.0.254` |
---
## Gitea 레포지토리 (GitLab에서 마이그레이션 완료 — 33개)
```
Gitea (https://git.0022222.xyz)
├── cheeserush (15)
│ ├── at-thermo ├── cm ├── cm-back
│ ├── cm-monorepo ├── cheeseboard ├── be-template
│ ├── fobl_landingpage ├── homepage ├── jenkins_test
│ ├── medigo-poc ├── onboarding ├── schindler-sso
│ ├── suneeds-homepage ├── tb_mvp_back └── tb_mvp_front
├── bjsl (7)
│ ├── bjsl-admin-app ├── bjsl-admin-web ├── bjsl-back
│ ├── bjsl-forus-web ├── bjsl-monorepo ├── bjsl-user-app
│ └── bjsl-user-app-android
├── chordcourse (3)
│ ├── back ├── deploy └── front
├── groupware (3)
│ ├── back-end ├── cheeseoffice-landing └── front-end
├── okmoneyletter (3)
│ ├── admin-front ├── back └── front
├── mini-apps (1)
│ └── seoul-metro-time
└── rush (1)
└── signal_arena
```
---
## 보안 긴급 조치 (Phase 0.5)
### 즉시 삭제할 포트포워딩
| 규칙 | 이유 |
|------|------|
| TB_mysql (33306) | DB 외부 노출 |
| Groupware_mysql (33307) | DB 외부 노출 |
| bjsrtest_mysql (33308) | DB 외부 노출 |
| CC_mysql (10512) | DB 외부 노출 |
| jenkins (8889) | 관리 페이지 노출 |
| BM_rdp (2765) | 미사용 장비 RDP |
| flask_test (5000) | 미사용 장비 |
| rdp (2588) | 미사용 장비 RDP |
| kisa_test (9797) | 테스트용 |
| bjsrtest_frt1 (13000) | 테스트용 |
| bjsrtest_frt2 (13001) | 테스트용 |
### 서버 보안 조치
- [ ] PostgreSQL: listen_addresses → localhost
- [ ] SSH: PasswordAuthentication → no
- [ ] MySQL Docker: 0.0.0.0 바인딩 → 127.0.0.1 (tb-db, cm-db, cheeseboard-db)
- [ ] 불필요 사용자 계정 정리
### Caddy 전환 후 추가 삭제 가능 (레거시 포트포워딩)
| 규칙 | 조건 |
|------|------|
| 모든 개별 서비스 포트 (10500~15005) | Caddy 서브도메인으로 대체 완료 시 |
| ssh (24242) | VPN으로만 접속 시 |
| gitlab_hook (5050) | Gitea webhook 전환 후 |
| lets_encrypt (80→10080) | 80→80 변경 또는 Caddy 직접 수신 |
---
## 목표 구조 (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 VE (192.168.0.100) │
│ SSD / i9-10900K / 64GB │
│ 관리: https://.100:8006 (VPN 전용) │
│ │
│ ┌──────────────────────────────────┐ ┌─────────────┐ │
│ │ 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) │ │ │ │
│ │ │ │ + 새 서비스 자동 추가 │ │ │ │
│ │ │ └─────────────────────────┘ │ │ │
│ │ └─────────────────────────────┘ │ │
│ └──────────────────────────────────┘ │
└────────────────────────────────────────────────────────┘
개발자 워크플로우:
Gitea push → Coolify webhook → 자동 빌드 → Docker 배포 → 서브도메인+SSL 자동
```
### IP 할당
| 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 트래픽 (Traefik) |
| 51820/UDP | (라우터 자체) | WireGuard VPN |
→ 외부에서는 **80/443/51820만 열림**
→ SSH, DB, Proxmox, Coolify 관리 UI는 **VPN 전용**
### Coolify가 관리하는 서비스
| 서브도메인 | 서비스 | 타입 |
|------------|--------|------|
| 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` |
| 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)
```
*.0022222.xyz A 39.122.244.108
0022222.xyz A 39.122.244.108
```
참고: WAN IP가 동적이므로 DDNS 설정 또는 고정 IP 전환 권장
---
## 마이그레이션 순서
### Phase 0: 기본 인프라 ✅ 완료
- [x] 서버 상태 파악 (server-audit.md)
- [x] SSH 키 설정 (coala@192.168.0.100, brandon 계정 추가)
- [x] 라우터 교체 (FortiGate → TP-Link, FortiGate 제거)
- [x] TP-Link LAN IP 변경 (.1 → .254)
- [x] TP-Link DHCP 범위 설정 (.200~.253)
- [x] 서버 게이트웨이 변경 (.1 → .254)
- [x] WireGuard VPN 설정 (brandon: 10.5.5.2)
- [x] 외부 접속 확인 (SSH, GitLab, 서비스들)
### Phase 0.7: Caddy + Gitea + 마이그레이션 ✅ 완료
- [x] Caddy v2.11.2 설치 (리버스 프록시, auto SSL)
- [x] Cloudflare DNS 서브도메인 10개 설정 (0022222.xyz)
- [x] Gitea 설치 (Docker, :3000)
- [x] GitLab → Gitea 전체 마이그레이션 (33개 레포, 7개 org)
- [x] GitLab HTTP 전환 (:8443, Caddy 뒤로)
- [x] 외부 HTTPS 접속 확인 (git/tb/cm/cb 등)
### Phase 0.5: 보안 긴급 조치 ← 다음
- [ ] DB 포트포워딩 삭제 (33306, 33307, 33308, 10512)
- [ ] Jenkins 포트포워딩 삭제 (8889)
- [ ] 미사용 포트포워딩 삭제 (RDP, flask_test, kisa_test, bjsrtest)
- [ ] PostgreSQL listen_addresses → localhost
- [ ] MySQL Docker 바인딩 → 127.0.0.1
- [ ] SSH 비밀번호 로그인 비활성화
- [ ] 레거시 포트포워딩 정리 (Caddy 서브도메인으로 대체된 것들)
- [ ] lets_encrypt 포트포워딩 수정 (80→10080 → 80→80)
### Phase 1: SSD 도착 전 준비
- [ ] 전체 백업 (DB 덤프, Docker 볼륨, Gitea 데이터, 설정파일, 인증서)
- [ ] 백업 스크립트 작성
- [ ] docker-compose.yml 정리 및 문서화
- [ ] GitLab 서비스 중단 (Gitea 전환 확인 후)
- [ ] 각 서비스 Dockerfile 정리 (Coolify 배포 준비)
### Phase 2: SSD 도착 → Proxmox + Coolify 설치
- [ ] SSD에 Proxmox VE 설치
- [ ] 네트워크 브릿지 설정 (vmbr0 → 192.168.0.0/24)
- [ ] 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 → CT104, MySQL → CT104)
- [ ] Coolify에 기존 서비스 등록 (TB, CM, CB, GW, CC)
- [ ] Gitea webhook 연결 (각 레포 → Coolify 자동 배포)
- [ ] 서브도메인 + SSL 자동 발급 확인
### Phase 4: 전환
- [ ] 라우터 포트포워딩 변경 (80/443 → .101)
- [ ] 기존 포트포워딩 전부 제거
- [ ] DNS 최종 확인
- [ ] 개발팀에 Coolify 사용 가이드 공유
- [ ] 기존 HDD Ubuntu 보관 (롤백용)
---
## 참고
### 도메인
| 도메인 | 레지스트라 | 용도 | 만료일 |
|--------|-----------|------|--------|
| 0022222.xyz | Cloudflare | 현재 서브도메인 (임시) | 2027-02-22 |
| softk.io | - | 주 도메인 (추후 전환) | - |
| cheeserush.co | - | 이전 도메인 (비활성) | - |
### 서버 하드웨어
- CPU: Intel i9-10900K (10C/20T)
- RAM: 64GB
- Disk: HDD 2TB (191GB 사용) → SSD 마이그레이션 예정
- VT-x: 지원 (Proxmox 가능)
### 계정
| 대상 | 계정 | 비고 |
|------|------|------|
| 서버 SSH | brandon (NOPASSWD sudo) | `ssh -p 24242 brandon@39.122.244.108` |
| 서버 SSH | coala (기존) | 키 인증 설정됨 |
| Gitea 관리자 | brandon | https://git.0022222.xyz |