commit d725cec0310ee65c08b418c606c6b28280773d99 Author: lsh9672 Date: Mon Jun 16 14:01:32 2025 +0900 test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..18607f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.iml + +.idea/ \ No newline at end of file diff --git a/analytics/.gitkeep b/analytics/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/analytics/deployment.yml b/analytics/deployment.yml new file mode 100644 index 0000000..849ed3a --- /dev/null +++ b/analytics/deployment.yml @@ -0,0 +1,61 @@ +# analytics-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: analytics + namespace: ns-hiorder +spec: + replicas: 1 + selector: + matchLabels: + app: analytics + template: + metadata: + labels: + app: analytics + spec: + enableServiceLinks: false + containers: + - name: analytics + image: acrdigitalgarage03.azurecr.io/hiorder/analytics:2506160200 + ports: + - containerPort: 8084 + env: + # Spring Boot 설정 + - name: SPRING_PROFILES_ACTIVE + value: "common" + - name: JAVA_OPTS + value: "-Xms256m -Xmx512m" + # Redis 연결 설정 (다른 네임스페이스의 Redis 서비스) + - name: REDIS_HOST + value: "redis-service.ns-hiorder.svc.cluster.local" + - name: REDIS_PORT + value: "6379" + # Kubernetes 자동 환경변수 비활성화 + - name: KUBERNETES_SERVICE_HOST + value: "" + - name: KUBERNETES_SERVICE_PORT + value: "" + - name: EXTERNAL_SERVICES_REVIEW + value: "http://review-service:8083" + - name: EXTERNAL_SERVICES_STORE + value: "http://store-service:8082" + - name: EXTERNAL_SERVICES_MEMBER + value: "http://member-service:8081" + - name: CLAUDE_API_KEY + valueFrom: + configMapKeyRef: + name: hiorder-api-config + key: CLAUDE_API_KEY + - name: OPENAI_API_KEY + valueFrom: + configMapKeyRef: + name: hiorder-api-config + key: OPENAI_API_KEY + resources: + requests: + memory: "256Mi" + cpu: "125m" + limits: + memory: "512Mi" + cpu: "250m" diff --git a/analytics/service.yml b/analytics/service.yml new file mode 100644 index 0000000..d2a6b05 --- /dev/null +++ b/analytics/service.yml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: analytics-service + namespace: ns-hiorder +spec: + type: LoadBalancer + ports: + - port: 8084 + targetPort: 8084 + protocol: TCP + name: http + selector: + app: analytics \ No newline at end of file diff --git a/ingress/main-ingress.yml b/ingress/main-ingress.yml new file mode 100644 index 0000000..7d5acb4 --- /dev/null +++ b/ingress/main-ingress.yml @@ -0,0 +1,293 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: hiorder-main-ingress + namespace: ns-hiorder + annotations: + # 기본 Ingress 설정 + nginx.ingress.kubernetes.io/ssl-redirect: "true" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + + # SSL 인증서 자동 발급 (cert-manager) + cert-manager.io/cluster-issuer: "letsencrypt-prod" + + # 파일 업로드 설정 (리뷰 서비스용) + nginx.ingress.kubernetes.io/proxy-body-size: "50m" + nginx.ingress.kubernetes.io/client-max-body-size: "50m" + + # 타임아웃 설정 (외부 API 호출 고려) + nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + + # Rate Limiting (v1.12.1 호환) + nginx.ingress.kubernetes.io/rate-limit-requests-per-second: "100" + nginx.ingress.kubernetes.io/rate-limit-connections: "200" + nginx.ingress.kubernetes.io/rate-limit-window: "1m" + + # CORS 설정 (snippet 없이) + nginx.ingress.kubernetes.io/enable-cors: "true" + nginx.ingress.kubernetes.io/cors-allow-origin: "*" + nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, DELETE, OPTIONS" + nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" + nginx.ingress.kubernetes.io/cors-max-age: "86400" + + # 백엔드 프로토콜 설정 + nginx.ingress.kubernetes.io/backend-protocol: "HTTP" + + # 프록시 설정 + nginx.ingress.kubernetes.io/proxy-buffering: "on" + nginx.ingress.kubernetes.io/proxy-buffer-size: "8k" + + # 업스트림 해시 설정 (세션 어피니티) + nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr" + +spec: + ingressClassName: nginx + # tls: + # - secretName: hiorder-api-tls-secret + rules: + # - host: hiorder-api.20.249.191.180.nio.io + - http: + paths: + + # ============================================== + # 📱 MEMBER SERVICE (회원 관리) - Port 8081 + # ============================================== + # 인증 관련 API (최우선 순위) + - path: /api/auth + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + # 회원 관리 API + - path: /api/members/ + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + # 구독 관리 API + - path: /api/subscriptions + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + # ============================================== + # 🏪 STORE SERVICE (매장 운영) - Port 8082 + # ============================================== + # 매장 관리 API + - path: /api/stores + pathType: Prefix + backend: + service: + name: store-service + port: + number: 8082 + + # 메뉴 관리 API + - path: /api/menus + pathType: Prefix + backend: + service: + name: store-service + port: + number: 8082 + + # 외부 플랫폼 연동 API + - path: /api/external + pathType: Prefix + backend: + service: + name: store-service + port: + number: 8082 + + # ============================================== + # 📝 REVIEW SERVICE (리뷰 관리) - Port 8083 + # ============================================== + # 리뷰 관리 API + - path: /api/reviews + pathType: Prefix + backend: + service: + name: review-service + port: + number: 8083 + + # 파일 업로드 API (이미지 업로드) + - path: /api/files + pathType: Prefix + backend: + service: + name: review-service + port: + number: 8083 + + # ============================================== + # 🤖 ANALYTICS SERVICE (AI 분석) - Port 8084 + # ============================================== + # AI 분석 API + - path: /api/analytics + pathType: Prefix + backend: + service: + name: analytics-service + port: + number: 8084 + + # 실행 계획 API + - path: /api/action-plans + pathType: Prefix + backend: + service: + name: analytics-service + port: + number: 8084 + + # ============================================== + # 🎯 RECOMMEND SERVICE (취향 추천) - Port 8085 + # ============================================== + # 추천 API + - path: /api/recommend + pathType: Prefix + backend: + service: + name: recommend-service + port: + number: 8085 + + # ============================================== + # 📚 SWAGGER UI & API DOCS (개발자 도구) + # ============================================== + # 통합 API 문서 (member-service 기본) + - path: /docs + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + # 각 서비스별 Swagger UI 직접 접근 + - path: /docs/member + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + - path: /docs/store + pathType: Prefix + backend: + service: + name: store-service + port: + number: 8082 + + - path: /docs/review + pathType: Prefix + backend: + service: + name: review-service + port: + number: 8083 + + - path: /docs/analytics + pathType: Prefix + backend: + service: + name: analytics-service + port: + number: 8084 + + - path: /docs/recommend + pathType: Prefix + backend: + service: + name: recommend-service + port: + number: 8085 + + # ============================================== + # 💊 HEALTH CHECKS & MONITORING + # ============================================== + # 통합 헬스체크 + - path: /health + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + # Spring Boot Actuator + - path: /actuator + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + # 개별 서비스 헬스체크 (필요시) + - path: /health/member + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 + + - path: /health/store + pathType: Prefix + backend: + service: + name: store-service + port: + number: 8082 + + - path: /health/review + pathType: Prefix + backend: + service: + name: review-service + port: + number: 8083 + + - path: /health/analytics + pathType: Prefix + backend: + service: + name: analytics-service + port: + number: 8084 + + - path: /health/recommend + pathType: Prefix + backend: + service: + name: recommend-service + port: + number: 8085 + + # ============================================== + # 🏠 DEFAULT ROOT PATH + # ============================================== + # 기본 경로 (API 상태 확인) + - path: / + pathType: Prefix + backend: + service: + name: member-service + port: + number: 8081 \ No newline at end of file diff --git a/member/.gitkeep b/member/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/member/deployment.yml b/member/deployment.yml new file mode 100644 index 0000000..12e0f56 --- /dev/null +++ b/member/deployment.yml @@ -0,0 +1,45 @@ +# member-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: member + namespace: ns-hiorder +spec: + replicas: 1 + selector: + matchLabels: + app: member + template: + metadata: + labels: + app: member + spec: + enableServiceLinks: false + containers: + - name: member + image: acrdigitalgarage03.azurecr.io/hiorder/member:2506131312 + ports: + - containerPort: 8081 + env: + # Spring Boot 설정 + - name: SPRING_PROFILES_ACTIVE + value: "common" + - name: JAVA_OPTS + value: "-Xms256m -Xmx512m" + # Redis 연결 설정 (다른 네임스페이스의 Redis 서비스) + - name: REDIS_HOST + value: "redis-service.ns-hiorder.svc.cluster.local" + - name: REDIS_PORT + value: "6379" + # Kubernetes 자동 환경변수 비활성화 + - name: KUBERNETES_SERVICE_HOST + value: "" + - name: KUBERNETES_SERVICE_PORT + value: "" + resources: + requests: + memory: "256Mi" + cpu: "125m" + limits: + memory: "512Mi" + cpu: "250m" diff --git a/member/service.yml b/member/service.yml new file mode 100644 index 0000000..a5cc13a --- /dev/null +++ b/member/service.yml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: member-service + namespace: ns-hiorder +spec: + type: LoadBalancer + ports: + - port: 8081 + targetPort: 8081 + protocol: TCP + name: http + selector: + app: member \ No newline at end of file diff --git a/recommend/.gitkeep b/recommend/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/recommend/deployment.yml b/recommend/deployment.yml new file mode 100644 index 0000000..07bd508 --- /dev/null +++ b/recommend/deployment.yml @@ -0,0 +1,45 @@ +# recommend-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: recommend + namespace: ns-hiorder +spec: + replicas: 1 + selector: + matchLabels: + app: recommend + template: + metadata: + labels: + app: recommend + spec: + enableServiceLinks: false + containers: + - name: recommend + image: acrdigitalgarage03.azurecr.io/hiorder/recommend:2506160213 + ports: + - containerPort: 8085 + env: + # Spring Boot 설정 + - name: SPRING_PROFILES_ACTIVE + value: "common" + - name: JAVA_OPTS + value: "-Xms256m -Xmx512m" + # Redis 연결 설정 (다른 네임스페이스의 Redis 서비스) + - name: REDIS_HOST + value: "redis-service.ns-hiorder.svc.cluster.local" + - name: REDIS_PORT + value: "6379" + # Kubernetes 자동 환경변수 비활성화 + - name: KUBERNETES_SERVICE_HOST + value: "" + - name: KUBERNETES_SERVICE_PORT + value: "" + resources: + requests: + memory: "256Mi" + cpu: "125m" + limits: + memory: "512Mi" + cpu: "250m" diff --git a/recommend/service.yml b/recommend/service.yml new file mode 100644 index 0000000..41ebe1a --- /dev/null +++ b/recommend/service.yml @@ -0,0 +1,18 @@ +# recommend-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: recommend-service + namespace: ns-hiorder + labels: + app: recommend + service: recommend +spec: + type: LoadBalancer + ports: + - port: 8085 + targetPort: 8085 + protocol: TCP + name: http + selector: + app: recommend \ No newline at end of file diff --git a/redis/deployment.yml b/redis/deployment.yml new file mode 100644 index 0000000..45c60af --- /dev/null +++ b/redis/deployment.yml @@ -0,0 +1,28 @@ + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis + namespace: ns-hiorder +spec: + replicas: 1 + selector: + matchLabels: + app: redis + template: + metadata: + labels: + app: redis + spec: + containers: + - name: redis + image: acrdigitalgarage03.azurecr.io/hiorder/redis:latest + ports: + - containerPort: 6379 + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "512Mi" + cpu: "500m" diff --git a/redis/service.yml b/redis/service.yml new file mode 100644 index 0000000..5f5e989 --- /dev/null +++ b/redis/service.yml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: redis-service + namespace: ns-hiorder +spec: + selector: + app: redis + ports: + - port: 6379 + targetPort: 6379 + type: ClusterIP diff --git a/review/.gitkeep b/review/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/review/deployment.yml b/review/deployment.yml new file mode 100644 index 0000000..624e380 --- /dev/null +++ b/review/deployment.yml @@ -0,0 +1,57 @@ +# review-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: review + namespace: ns-hiorder +spec: + replicas: 1 + selector: + matchLabels: + app: review + template: + metadata: + labels: + app: review + spec: + enableServiceLinks: false + containers: + - name: review + image: acrdigitalgarage03.azurecr.io/hiorder/review:2506160213 + ports: + - containerPort: 8083 + env: + # Spring Boot 설정 + - name: SPRING_PROFILES_ACTIVE + value: "common" + - name: JAVA_OPTS + value: "-Xms512m -Xmx1024m" + # Redis 연결 설정 + - name: REDIS_HOST + value: "redis-service.ns-hiorder.svc.cluster.local" + - name: REDIS_PORT + value: "6379" + # 파일 저장소 설정 + - name: FILE_STORAGE_PATH + value: "/var/hiorder/uploads" + - name: MAX_FILE_SIZE + value: "10MB" + - name: MAX_REQUEST_SIZE + value: "50MB" + # JPA 설정 + - name: JPA_DDL_AUTO + value: "update" + - name: JPA_SHOW_SQL + value: "false" + # Kubernetes 자동 환경변수 비활성화 + - name: KUBERNETES_SERVICE_HOST + value: "" + - name: KUBERNETES_SERVICE_PORT + value: "" + resources: + requests: + memory: "512Mi" + cpu: "250m" + limits: + memory: "1024Mi" + cpu: "500m" diff --git a/review/service.yml b/review/service.yml new file mode 100644 index 0000000..ef4e6d0 --- /dev/null +++ b/review/service.yml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: review-service + namespace: ns-hiorder + labels: + app: review +spec: + type: LoadBalancer + ports: + - port: 8083 + targetPort: 8083 + protocol: TCP + name: http + selector: + app: review diff --git a/store/.gitkeep b/store/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/store/deployment.yml b/store/deployment.yml new file mode 100644 index 0000000..3b46a79 --- /dev/null +++ b/store/deployment.yml @@ -0,0 +1,52 @@ +# store-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: store + namespace: ns-hiorder +spec: + replicas: 1 + selector: + matchLabels: + app: store + template: + metadata: + labels: + app: store + spec: + enableServiceLinks: false + containers: + - name: store + image: acrdigitalgarage03.azurecr.io/hiorder/store:2506160225 + ports: + - containerPort: 8082 + env: + # Spring Boot 설정 + - name: SPRING_PROFILES_ACTIVE + value: "common" + - name: JAVA_OPTS + value: "-Xms512m -Xmx1024m" + # Redis 연결 설정 + - name: REDIS_HOST + value: "redis-service.ns-hiorder.svc.cluster.local" + - name: REDIS_PORT + value: "6379" + # JPA 설정 + - name: JPA_DDL_AUTO + value: "update" + - name: JPA_SHOW_SQL + value: "false" + resources: + requests: + memory: "512Mi" + cpu: "250m" + limits: + memory: "1024Mi" + cpu: "500m" + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + runAsUser: 1000 + capabilities: + drop: + - ALL diff --git a/store/service.yml b/store/service.yml new file mode 100644 index 0000000..318cb8d --- /dev/null +++ b/store/service.yml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: store-service + namespace: ns-hiorder + labels: + app: store +spec: + type: LoadBalancer + ports: + - port: 8082 + targetPort: 8082 + protocol: TCP + name: http + selector: + app: store diff --git a/web/configmap.yaml b/web/configmap.yaml new file mode 100644 index 0000000..a52e574 --- /dev/null +++ b/web/configmap.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: frontend-config + namespace: ns-hiorder +data: + # External IP 기반으로 변경 + AUTH_SERVICE_URL: "http://20.249.131.89:8081" + MEMBER_SERVICE_URL: "http://20.249.131.89:8081" + STORE_SERVICE_URL: "http://20.249.163.158:8082" + REVIEW_SERVICE_URL: "http://20.249.113.225:8083" + ANALYTICS_SERVICE_URL: "http://20.249.113.195:8084" + RECOMMEND_SERVICE_URL: "http://4.217.130.203:8085" + ENVIRONMENT: "production" \ No newline at end of file diff --git a/web/deployment.yaml b/web/deployment.yaml new file mode 100644 index 0000000..9ea6d48 --- /dev/null +++ b/web/deployment.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend-deployment + namespace: ns-hiorder + labels: + app: frontend +spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + spec: + enableServiceLinks: false # 👈 추가 + containers: + - name: frontend + image: acrdigitalgarage03.azurecr.io/hiorder/frontend:2506160207 + ports: + - containerPort: 80 + envFrom: + - configMapRef: + name: frontend-config + env: + - name: APP_VERSION + value: "1.0.0" + - name: KUBERNETES_SERVICE_HOST # 👈 추가 + value: "" + - name: KUBERNETES_SERVICE_PORT # 👈 추가 + value: "" + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "256Mi" + cpu: "200m" + livenessProbe: + httpGet: + path: /health + port: 80 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /health + port: 80 + initialDelaySeconds: 5 + periodSeconds: 5 \ No newline at end of file diff --git a/web/service.yaml b/web/service.yaml new file mode 100644 index 0000000..c011d43 --- /dev/null +++ b/web/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: frontend-service + namespace: ns-hiorder + labels: + app: frontend +spec: + type: LoadBalancer + ports: + - port: 80 + targetPort: 80 + protocol: TCP + selector: + app: frontend \ No newline at end of file