diff --git a/k8s/api-gateway.yaml b/k8s/api-gateway.yaml index a9b7777..dec002a 100644 --- a/k8s/api-gateway.yaml +++ b/k8s/api-gateway.yaml @@ -14,29 +14,39 @@ spec: spec: containers: - name: api-gateway - image: frostbyte-api-gateway:latest + image: 600627355881.dkr.ecr.ap-south-1.amazonaws.com/valerix/api-gateway:latest ports: - - containerPort: 3000 + - containerPort: 8080 + env: - - name: NETWORK_SERVICE_URL - value: http://network-service:3000 - - name: PRODUCT_SERVICE_URL - value: http://product-service:3000 - - name: DEMAND_SERVICE_URL - value: http://demand-service:3000 - - name: VALIDATION_SERVICE_URL - value: http://validation-service:3000 - - name: PORT - value: "3000" + - name: ORDER_SERVICE_URL + value: http://order-service:3001 + - name: INVENTORY_SERVICE_URL + value: http://inventory-service:3002 + + livenessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 20 + periodSeconds: 10 + + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 5 + --- apiVersion: v1 kind: Service metadata: name: api-gateway spec: + type: ClusterIP selector: app: api-gateway ports: - - port: 80 - targetPort: 3000 - type: ClusterIP + - port: 8080 + targetPort: 8080 diff --git a/k8s/frontend.yaml b/k8s/frontend.yaml index e69de29..44562df 100644 --- a/k8s/frontend.yaml +++ b/k8s/frontend.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend +spec: + replicas: 1 + selector: + matchLabels: + app: frontend + template: + metadata: + labels: + app: frontend + spec: + containers: + - name: frontend + image: 600627355881.dkr.ecr.ap-south-1.amazonaws.com/valerix/frontend:latest + ports: + - containerPort: 80 + env: + - name: VITE_API_GATEWAY_URL + value: "http://api-gateway:8080/api" + livenessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 20 + periodSeconds: 10 + readinessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 5 +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend +spec: + type: ClusterIP + selector: + app: frontend + ports: + - port: 80 + targetPort: 80 diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml index e8041e1..f5d373f 100644 --- a/k8s/ingress.yaml +++ b/k8s/ingress.yaml @@ -1,17 +1,23 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: frostbyte-ingress - annotations: - kubernetes.io/ingress.class: nginx + name: valerix-ingress spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: network-service - port: - number: 80 + ingressClassName: nginx + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: frontend + port: + number: 80 + - path: /api + pathType: Prefix + backend: + service: + name: api-gateway + port: + number: 8080 diff --git a/k8s/inventory-db.yaml b/k8s/inventory-db.yaml new file mode 100644 index 0000000..407fc81 --- /dev/null +++ b/k8s/inventory-db.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: inventory-db +spec: + replicas: 1 + selector: + matchLabels: + app: inventory-db + template: + metadata: + labels: + app: inventory-db + spec: + containers: + - name: postgres + image: postgres:15-alpine + env: + - name: POSTGRES_DB + value: inventory_db + - name: POSTGRES_USER + value: user + - name: POSTGRES_PASSWORD + value: password + ports: + - containerPort: 5432 + +--- +apiVersion: v1 +kind: Service +metadata: + name: inventory-db +spec: + type: ClusterIP + selector: + app: inventory-db + ports: + - port: 5432 diff --git a/k8s/inventory-service.yaml b/k8s/inventory-service.yaml new file mode 100644 index 0000000..d0af98f --- /dev/null +++ b/k8s/inventory-service.yaml @@ -0,0 +1,71 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: inventory-service +spec: + replicas: 1 + selector: + matchLabels: + app: inventory-service + template: + metadata: + labels: + app: inventory-service + spec: + containers: + - name: inventory-service + image: 600627355881.dkr.ecr.ap-south-1.amazonaws.com/valerix/inventory-service:latest + ports: + - containerPort: 3002 + + env: + - name: INVENTORY_DB_USER + valueFrom: + secretKeyRef: + name: db-secrets + key: INVENTORY_DB_USER + + - name: INVENTORY_DB_PASSWORD + valueFrom: + secretKeyRef: + name: db-secrets + key: INVENTORY_DB_PASSWORD + + - name: INVENTORY_DB_NAME + valueFrom: + secretKeyRef: + name: db-secrets + key: INVENTORY_DB_NAME + + - name: DATABASE_URL + value: postgresql://$(INVENTORY_DB_USER):$(INVENTORY_DB_PASSWORD)@inventory-db:5432/$(INVENTORY_DB_NAME) + + - name: RABBITMQ_URL + value: "amqp://user:password@rabbitmq:5672" + + livenessProbe: + httpGet: + path: /health + port: 3002 + initialDelaySeconds: 20 + periodSeconds: 10 + + readinessProbe: + httpGet: + path: /health + port: 3002 + initialDelaySeconds: 10 + periodSeconds: 5 + +--- +apiVersion: v1 +kind: Service +metadata: + name: inventory-service +spec: + type: ClusterIP + selector: + app: inventory-service + ports: + - port: 3002 + targetPort: 3002 diff --git a/k8s/inventory.yaml b/k8s/inventory.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/k8s/monitoring.yaml b/k8s/monitoring.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/k8s/order-db.yaml b/k8s/order-db.yaml new file mode 100644 index 0000000..3890c3b --- /dev/null +++ b/k8s/order-db.yaml @@ -0,0 +1,38 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: order-db +spec: + replicas: 1 + selector: + matchLabels: + app: order-db + template: + metadata: + labels: + app: order-db + spec: + containers: + - name: postgres + image: postgres:15-alpine + env: + - name: POSTGRES_DB + value: order_db + - name: POSTGRES_USER + value: user + - name: POSTGRES_PASSWORD + value: password + ports: + - containerPort: 5432 + +--- +apiVersion: v1 +kind: Service +metadata: + name: order-db +spec: + type: ClusterIP + selector: + app: order-db + ports: + - port: 5432 diff --git a/k8s/order-service.yaml b/k8s/order-service.yaml new file mode 100644 index 0000000..e43e9ec --- /dev/null +++ b/k8s/order-service.yaml @@ -0,0 +1,77 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: order-service +spec: + replicas: 1 + selector: + matchLabels: + app: order-service + template: + metadata: + labels: + app: order-service + spec: + containers: + - name: order-service + image: 600627355881.dkr.ecr.ap-south-1.amazonaws.com/valerix/order-service:latest + ports: + - containerPort: 3001 + + env: + - name: ORDER_DB_USER + valueFrom: + secretKeyRef: + name: db-secrets + key: ORDER_DB_USER + + - name: ORDER_DB_PASSWORD + valueFrom: + secretKeyRef: + name: db-secrets + key: ORDER_DB_PASSWORD + + - name: ORDER_DB_NAME + valueFrom: + secretKeyRef: + name: db-secrets + key: ORDER_DB_NAME + + - name: DATABASE_URL + value: postgresql://$(ORDER_DB_USER):$(ORDER_DB_PASSWORD)@order-db:5432/$(ORDER_DB_NAME) + + - name: INVENTORY_SERVICE_URL + value: "http://inventory-service:3002" + + - name: RABBITMQ_URL + value: "amqp://user:password@rabbitmq:5672" + + - name: PORT + value: "3001" + + livenessProbe: + httpGet: + path: /health + port: 3001 + initialDelaySeconds: 20 + periodSeconds: 10 + + readinessProbe: + httpGet: + path: /health + port: 3001 + initialDelaySeconds: 10 + periodSeconds: 5 + +--- +apiVersion: v1 +kind: Service +metadata: + name: order-service +spec: + type: ClusterIP + selector: + app: order-service + ports: + - port: 3001 + targetPort: 3001 diff --git a/k8s/order.yml b/k8s/order.yml deleted file mode 100644 index e69de29..0000000 diff --git a/k8s/rabbitmq.yaml b/k8s/rabbitmq.yaml new file mode 100644 index 0000000..e1fdd9b --- /dev/null +++ b/k8s/rabbitmq.yaml @@ -0,0 +1,41 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rabbitmq +spec: + replicas: 1 + selector: + matchLabels: + app: rabbitmq + template: + metadata: + labels: + app: rabbitmq + spec: + containers: + - name: rabbitmq + image: rabbitmq:3-management + ports: + - containerPort: 5672 + - containerPort: 15672 + env: + - name: RABBITMQ_DEFAULT_USER + value: "user" + - name: RABBITMQ_DEFAULT_PASS + value: "password" +--- +apiVersion: v1 +kind: Service +metadata: + name: rabbitmq +spec: + selector: + app: rabbitmq + ports: + - name: amqp + port: 5672 + targetPort: 5672 + - name: management + port: 15672 + targetPort: 15672 + type: ClusterIP diff --git a/k8s/service-monitor.yaml b/k8s/service-monitor.yaml new file mode 100644 index 0000000..0e795ff --- /dev/null +++ b/k8s/service-monitor.yaml @@ -0,0 +1,22 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: frostbyte-services-monitor + labels: + release: monitoring # Must match the Helm release name usually +spec: + selector: + matchExpressions: + - key: app + operator: In + values: + - order-service + - inventory-service + endpoints: + - port: "3001" # Target port for Order Service (must be named in Service or numeric) + path: /metrics + - port: "3002" # Target port for Inventory Service + path: /metrics + namespaceSelector: + matchNames: + - default diff --git a/services/frontend/Dockerfile.prod b/services/frontend/Dockerfile.prod new file mode 100644 index 0000000..c8b3449 --- /dev/null +++ b/services/frontend/Dockerfile.prod @@ -0,0 +1,13 @@ +# Stage 1: Build +FROM node:18-alpine as builder +WORKDIR /app +COPY package.json ./ +RUN npm install +COPY . . +RUN npm run build + +# Stage 2: Serve +FROM nginx:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"]