From c83b40ce501f17c4971b2826c8f7429720dd2030 Mon Sep 17 00:00:00 2001 From: qorgh529 Date: Fri, 10 Apr 2026 21:40:33 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EB=B0=8F=20HTTPS=20=EC=84=A4=EC=A0=95=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 123 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 33a5ef8..71db4de 100755 --- a/README.md +++ b/README.md @@ -11,17 +11,25 @@ ## ๐Ÿ—๏ธ ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ``` +์‚ฌ์šฉ์ž (์™ธ๋ถ€ ์ธํ„ฐ๋„ท) + โ†“ https://cyanburu.com (443) +MSI ๋ผ์šฐํ„ฐ (ํฌํŠธํฌ์›Œ๋”ฉ 80/443) + โ†“ +Nginx Ingress Controller โ† TLS ์ข…๋ฃŒ, ๋ผ์šฐํŒ… + โ†“ +cert-manager โ† Let's Encrypt ์ธ์ฆ์„œ ์ž๋™ ๋ฐœ๊ธ‰/๊ฐฑ์‹  + โ†“ +Kubernetes - web-portal ๋„ค์ž„์ŠคํŽ˜์ด์Šค + โ”œโ”€โ”€ Nginx Frontend (ClusterIP: 80) + โ”œโ”€โ”€ FastAPI Backend (ClusterIP: 8000) + โ””โ”€โ”€ PostgreSQL DB (ClusterIP: 5432) + โ†‘ ๊ฐœ๋ฐœ์ž (git push) โ†“ Gitea (192.168.10.101:30000) โ””โ”€โ”€ Container Registry (์ด๋ฏธ์ง€ ์ €์žฅ) โ†“ ArgoCD ์ž๋™ ๊ฐ์ง€ & ๋ฐฐํฌ (192.168.10.101:30080) - โ†“ -Kubernetes - web-portal ๋„ค์ž„์ŠคํŽ˜์ด์Šค - โ”œโ”€โ”€ Nginx Frontend (NodePort: 30090) - โ”œโ”€โ”€ FastAPI Backend (ClusterIP: 8000) - โ””โ”€โ”€ PostgreSQL DB (ClusterIP: 5432) ``` --- @@ -37,6 +45,9 @@ Kubernetes - web-portal ๋„ค์ž„์ŠคํŽ˜์ด์Šค | Orchestration | Kubernetes (Docker Desktop ๋‚ด์žฅ) | | GitOps | Gitea + ArgoCD | | Image Registry | Gitea Container Registry | +| Ingress | Nginx Ingress Controller | +| TLS | cert-manager + Let's Encrypt | +| Domain | cyanburu.com (ํ›„์ด์ฆˆ) | --- @@ -63,6 +74,10 @@ nginx-portal/ โ”‚ โ””โ”€โ”€ 05-frontend.yaml # Nginx Deployment + NodePort(30090) โ”œโ”€โ”€ 06-argocd-app.yaml # ArgoCD Application ์ •์˜ (k8s ํด๋” ๋ฐ–์— ์œ„์น˜) โ””โ”€โ”€ README.md + +k8s/ ํด๋” ๋‚ด ์ถ”๊ฐ€ ํŒŒ์ผ: +โ”œโ”€โ”€ 07-clusterissuer.yaml # Let's Encrypt ClusterIssuer +โ””โ”€โ”€ 08-ingress.yaml # Nginx Ingress ๊ทœ์น™ + TLS ์„ค์ • ``` > โš ๏ธ `06-argocd-app.yaml` ์€ ๋ฐ˜๋“œ์‹œ `k8s/` ํด๋” **๋ฐ–**์— ์œ„์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @@ -180,9 +195,65 @@ kubectl label secret gitea-repo-secret \ kubectl apply -f 06-argocd-app.yaml ``` -### 6๋‹จ๊ณ„. ์ ‘์† ํ™•์ธ +### 6๋‹จ๊ณ„. Nginx Ingress Controller ์„ค์น˜ (์ตœ์ดˆ 1ํšŒ) +```bash +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/cloud/deploy.yaml +kubectl get pods -n ingress-nginx ``` -http://192.168.10.101:30090 + +### 7๋‹จ๊ณ„. cert-manager ์„ค์น˜ (์ตœ์ดˆ 1ํšŒ) +```bash +kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml +kubectl get pods -n cert-manager +``` + +### 8๋‹จ๊ณ„. CoreDNS ๋‚ด๋ถ€ ๋„๋ฉ”์ธ ๋“ฑ๋ก (ํ—ค์–ดํ•€ NAT ์šฐํšŒ) +```bash +kubectl patch configmap coredns -n kube-system --patch-file coredns-patch.yaml +kubectl rollout restart deployment/coredns -n kube-system +``` + +> `coredns-patch.yaml` ๋‚ด์šฉ: +> ```yaml +> data: +> Corefile: | +> cyanburu.com { +> hosts { +> 192.168.10.101 cyanburu.com +> fallthrough +> } +> cache 30 +> } +> .:53 { +> ... (๊ธฐ์กด ๋‚ด์šฉ ์œ ์ง€) +> } +> ``` + +### 9๋‹จ๊ณ„. ๋ผ์šฐํ„ฐ ํฌํŠธํฌ์›Œ๋”ฉ ์„ค์ • +MSI ๋ผ์šฐํ„ฐ์—์„œ ์„ค์ •: + +| ๊ณต์šฉ ํฌํŠธ | ๋‚ด๋ถ€ IP | ๋น„๊ณต๊ฐœ ํฌํŠธ | +|-----------|---------|-------------| +| 80 | 192.168.10.101 | 80 | +| 443 | 192.168.10.101 | 443 | + +### 10๋‹จ๊ณ„. Ingress + ClusterIssuer ๋ฐฐํฌ +```bash +git add k8s/07-clusterissuer.yaml k8s/08-ingress.yaml k8s/05-frontend.yaml +git commit -m "feat: Ingress + cert-manager HTTPS ์„ค์ •" +git push origin main +# ArgoCD๊ฐ€ ์ž๋™ ๋ฐฐํฌ +``` + +### 11๋‹จ๊ณ„. ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ํ™•์ธ +```bash +kubectl get certificate -n web-portal +# READY: True ํ™•์ธ +``` + +### 12๋‹จ๊ณ„. ์ ‘์† ํ™•์ธ +``` +https://cyanburu.com ``` --- @@ -267,6 +338,11 @@ location /api/auth/login { - **CAPTCHA**: ๋กœ๊ทธ์ธ 3ํšŒ ์‹คํŒจ ์‹œ Google reCAPTCHA ํ‘œ์‹œ (์ถ”๊ฐ€ ๊ฐœ๋ฐœ ํ•„์š”) - **JWT ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋‹จ์ถ•**: `main.py` ์—์„œ `timedelta(hours=8)` โ†’ `timedelta(hours=2)` ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ +### HTTPS / TLS +- cert-manager๊ฐ€ Let's Encrypt ์ธ์ฆ์„œ๋ฅผ **์ž๋™์œผ๋กœ ๊ฐฑ์‹ ** (๋งŒ๋ฃŒ 30์ผ ์ „) +- HTTP ์ ‘์† ์‹œ ์ž๋™์œผ๋กœ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (`ssl-redirect: "true"`) +- ์ธ์ฆ์„œ ์ƒํƒœ ํ™•์ธ: `kubectl get certificate -n web-portal` + --- ## โ— ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… @@ -481,7 +557,35 @@ git push origin main --- -### 11. git commit ์‹œ Author identity unknown +### 11. cert-manager HTTP01 Challenge pending (ํ—ค์–ดํ•€ NAT) +**์ฆ์ƒ** +``` +propagation check failed: failed to perform self check GET request +context deadline exceeded (Client.Timeout exceeded while awaiting headers) +``` +**์›์ธ** cert-manager๊ฐ€ K8s ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ ๋„๋ฉ”์ธ(`cyanburu.com`)์œผ๋กœ self-check ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, +๊ณต์ธ IP โ†’ ๋ผ์šฐํ„ฐ โ†’ ๋‚ด๋ถ€ PC๋กœ ๋Œ์•„์˜ค๋Š” ํ—ค์–ดํ•€ NAT์ด ์ง€์›๋˜์ง€ ์•Š์•„ ํƒ€์ž„์•„์›ƒ ๋ฐœ์ƒ. + +**ํ•ด๊ฒฐ** +CoreDNS์— ๋‚ด๋ถ€ ๋„๋ฉ”์ธ์„ ์ง์ ‘ ๋“ฑ๋กํ•ด์„œ K8s ๋‚ด๋ถ€์—์„œ ๋„๋ฉ”์ธ์„ ๋‚ด๋ถ€ IP๋กœ ํ•ด์„ํ•˜๊ฒŒ ์„ค์ •: +```bash +kubectl patch configmap coredns -n kube-system --patch-file coredns-patch.yaml +kubectl rollout restart deployment/coredns -n kube-system +``` + +--- + +### 12. Ingress Controller EXTERNAL-IP๊ฐ€ localhost๋กœ ํ‘œ์‹œ +**์ฆ์ƒ** `kubectl get svc -n ingress-nginx` ์—์„œ EXTERNAL-IP๊ฐ€ `localhost` ๋กœ ํ‘œ์‹œ๋จ. + +**์›์ธ** Docker Desktop ํ™˜๊ฒฝ์˜ ์ •์ƒ์ ์ธ ๋™์ž‘. `localhost` = ์‹ค์ œ PC๋ฅผ ์˜๋ฏธ. + +**ํ•ด๊ฒฐ** ํฌํŠธํฌ์›Œ๋”ฉ์„ NodePort(30118, 30963)๊ฐ€ ์•„๋‹Œ **80, 443 โ†’ PC๋‚ด๋ถ€IP:80, 443** ์œผ๋กœ ์„ค์ •. +Docker Desktop์ด 80/443์„ ๋ฐ›์•„์„œ Ingress Controller๋กœ ์ž๋™ ์ „๋‹ฌ. + +--- + +### 13. git commit ์‹œ Author identity unknown **์ฆ์ƒ** ``` Author identity unknown @@ -505,7 +609,8 @@ git config --global user.name "๊ณ„์ •๋ช…" - Gitea + ArgoCD GitOps ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ - Gitea Container Registry ์—ฐ๋™ -### 2026-04-10 (๊ธฐ๋Šฅ ์ถ”๊ฐ€) +### 2026-04-10 (๊ธฐ๋Šฅ ์ถ”๊ฐ€ + ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ) +#### ๊ธฐ๋Šฅ ์ถ”๊ฐ€ - **MY Page**: ํƒญ๋ช…/๋ชฉ๋ก ์ œ๋ชฉ ์˜๋ฌธ ๋ณ€๊ฒฝ, URL ๋ฏธํ‘œ๊ธฐ, Favicon ์ž๋™ ํ‘œ์‹œ - **๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณด์•ˆ ๊ฐ•ํ™”** - ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ‘œ์‹œ/์ˆจ๊น€ ํ† ๊ธ€ ๋ฒ„ํŠผ @@ -516,3 +621,12 @@ git config --global user.name "๊ณ„์ •๋ช…" - **๊ณต์ง€์‚ฌํ•ญ ํƒญ**: ๊ด€๋ฆฌ์ž ์ž‘์„ฑ ์ „์šฉ, ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋Œ“๊ธ€ ๊ฐ€๋Šฅ - **๊ด€๋ฆฌ์ž ์š”์ฒญ ํƒญ**: ๊ฒŒ์‹œํŒ ํ˜•ํƒœ, ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž‘์„ฑ/๋‹ต๊ธ€ ๊ฐ€๋Šฅ - **Nginx Rate Limiting**: ๋กœ๊ทธ์ธ API ๋ถ„๋‹น 5ํšŒ ์ œํ•œ (Brute Force ๋ฐฉ์–ด) + +#### ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ (HTTPS) +- **Nginx Ingress Controller** ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ +- **cert-manager** ์„ค์น˜ + Let's Encrypt ์ธ์ฆ์„œ ์ž๋™ ๋ฐœ๊ธ‰ +- **cyanburu.com** ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ (ํ›„์ด์ฆˆ) +- **MSI ๋ผ์šฐํ„ฐ** ํฌํŠธํฌ์›Œ๋”ฉ ์„ค์ • (80/443) +- **CoreDNS** ๋‚ด๋ถ€ ๋„๋ฉ”์ธ ๋“ฑ๋ก (ํ—ค์–ดํ•€ NAT ์šฐํšŒ) +- **HTTPS ์ž๋™ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ** ์ ์šฉ +- ์ตœ์ข… ์ ‘์† URL: `https://cyanburu.com`