feat: 허브 홈페이지 구축 및 URL 구조 개편 (2026-05)

- hub/ 신규 추가: cyanburu.com/ 허브 홈페이지 (에디토리얼+사이버펑크 디자인)
- hub/index.html: /portal/api/homepage/cards 동적 카드 로딩
- k8s/00-hub.yaml: hub 네임스페이스 + Deployment + Service
- k8s/13-ingress-hub.yaml: cyanburu.com/ → hub 라우팅
- k8s/08-ingress.yaml: cyanburu.com/ → cyanburu.com/portal 경로 변경
- backend/main.py: homepage_cards CRUD API 추가, root_path=/portal 설정
- frontend/index.html: API 경로 /portal/api 수정, 홈 카드 관리 탭 추가
- README.md: 2026-05 변경 이력 추가
This commit is contained in:
qorgh529
2026-06-10 18:18:53 +09:00
parent 72689d8647
commit 54877f8e96
7 changed files with 1019 additions and 17 deletions

61
k8s/00-hub.yaml Executable file
View File

@@ -0,0 +1,61 @@
---
# hub 네임스페이스
apiVersion: v1
kind: Namespace
metadata:
name: hub
---
# 허브 홈페이지 Deployment
# index.html을 정적으로 서빙하는 nginx 파드
apiVersion: apps/v1
kind: Deployment
metadata:
name: hub
namespace: hub
spec:
replicas: 1
selector:
matchLabels:
app: hub
template:
metadata:
labels:
app: hub
spec:
imagePullSecrets:
- name: gitea-registry-secret
containers:
- name: hub
image: 192.168.10.101:30000/qorgh529/hub:latest
ports:
- containerPort: 80
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "64Mi"
cpu: "100m"
---
# hub Service (ClusterIP)
apiVersion: v1
kind: Service
metadata:
name: hub-service
namespace: hub
spec:
selector:
app: hub
ports:
- port: 80
targetPort: 80
---
# hub용 Gitea Registry Secret
# kubectl create secret docker-registry gitea-registry-secret \
# --namespace=hub \
# --docker-server=192.168.10.101:30000 \
# --docker-username=<계정> \
# --docker-password=<패스워드>

View File

@@ -4,24 +4,28 @@ metadata:
name: web-portal-ingress
namespace: web-portal
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
# Rate limiting (기존 유지)
nginx.ingress.kubernetes.io/limit-rps: "10"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- cyanburu.com
secretName: web-portal-tls
- hosts:
- cyanburu.com
secretName: cyanburu-tls
rules:
- host: cyanburu.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- host: cyanburu.com
http:
paths:
# /portal 경로 → web-portal 프론트엔드
# rewrite-target: /portal/foo → /foo 로 strip
- path: /portal(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: frontend-service
port:
number: 80

26
k8s/13-ingress-hub.yaml Executable file
View File

@@ -0,0 +1,26 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hub-ingress
namespace: hub
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- cyanburu.com
secretName: cyanburu-tls
rules:
- host: cyanburu.com
http:
paths:
# / (루트) → 허브 홈페이지 정적 파일
- path: /
pathType: Prefix
backend:
service:
name: hub-service
port:
number: 80