diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml index 90f6e90..2c9165a 100644 --- a/.github/workflows/build-and-push.yml +++ b/.github/workflows/build-and-push.yml @@ -1,4 +1,4 @@ -name: Build and deploy image +name: Build and deploy images on: workflow_call: @@ -12,7 +12,8 @@ on: env: REGISTRY: samanthamorris684 - IMAGE_NAME: catbot + FRONTEND_IMAGE_NAME: catbot-frontend + BACKEND_IMAGE_NAME: catbot-backend USERNAME: ${{ vars.DOCKERHUB_USERNAME }} PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} @@ -36,12 +37,21 @@ jobs: endpoint: "demonstrationorg/default" install: true - - name: Build and push + - name: Build and push frontend uses: docker/build-push-action@v6 with: push: true + file: Dockerfile.frontend platforms: linux/amd64 - tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} + tags: ${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} + + - name: Build and push backend + uses: docker/build-push-action@v6 + with: + push: true + file: Dockerfile.backend + platforms: linux/amd64 + tags: ${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} diff --git a/.github/workflows/deploy-to-eks.yml b/.github/workflows/deploy-to-eks.yml index 048ef05..4887ac8 100644 --- a/.github/workflows/deploy-to-eks.yml +++ b/.github/workflows/deploy-to-eks.yml @@ -12,7 +12,8 @@ on: env: REGISTRY: samanthamorris684 - IMAGE_NAME: catbot + FRONTEND_IMAGE_NAME: catbot-frontend + BACKEND_IMAGE_NAME: catbot-backend EKS_CLUSTER_NAME: catbot-cluster NAMESPACE: cat-chatbot AWS_REGION: us-east-1 @@ -35,5 +36,7 @@ jobs: - name: Deploy to EKS run: | aws eks update-kubeconfig --name ${{ env.EKS_CLUSTER_NAME }} --region ${{ env.AWS_REGION }} - kubectl set image deployment/server server=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} -n ${{ env.NAMESPACE }} - kubectl rollout status deployment/server -n ${{ env.NAMESPACE }} + kubectl set image deployment/frontend frontend=${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} -n ${{ env.NAMESPACE }} + kubectl rollout status deployment/frontend -n ${{ env.NAMESPACE }} + kubectl set image deployment/backend backend=${{ env.REGISTRY }}/${{ env.BACKEND_IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} -n ${{ env.NAMESPACE }} + kubectl rollout status deployment/backend -n ${{ env.NAMESPACE }} diff --git a/.github/workflows/scout.yml b/.github/workflows/scout.yml index 2eee64f..152c167 100644 --- a/.github/workflows/scout.yml +++ b/.github/workflows/scout.yml @@ -11,7 +11,7 @@ on: env: REGISTRY: samanthamorris684 - IMAGE_NAME: catbot + FRONTEND_IMAGE_NAME: catbot-frontend # Change from latest COMPARE_TAG: latest USERNAME: ${{ vars.DOCKERHUB_USERNAME }} @@ -27,13 +27,13 @@ jobs: username: ${{ env.USERNAME }} password: ${{ env.PASSWORD }} - - name: Docker Scout + - name: Docker Scout (Frontend) id: docker-scout uses: docker/scout-action@v1 with: command: compare - image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} - to: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.COMPARE_TAG }} + image: ${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ inputs.IMAGE_TAG }} + to: ${{ env.REGISTRY }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ env.COMPARE_TAG }} ignore-unchanged: true only-severities: critical,high write-comment: true diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index cbead92..0000000 --- a/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# syntax=docker/dockerfile:1 - -# Comments are provided throughout this file to help you get started. -# If you need more help, visit the Dockerfile reference guide at -# https://docs.docker.com/go/dockerfile-reference/ - -# Want to help us make this template better? Share your feedback here: https://forms.gle/ybq9Krt8jtBL3iCk7 - -ARG NODE_VERSION=23.10.0 - -FROM node:${NODE_VERSION}-alpine - -WORKDIR /usr/src/app - -# Copy the rest of the source files into the image. - -COPY package.json package-lock.json /usr/src/app/ - -RUN npm install - -COPY server.js . - -COPY src/ ./src - -COPY public/ ./public - -# Expose the port that the application listens on. -EXPOSE 3000 - -# To access server.js -EXPOSE 5001 - -# Expose dev port -EXPOSE 5002 - -# Run the application. -CMD npm run start:prod diff --git a/Dockerfile.backend b/Dockerfile.backend new file mode 100644 index 0000000..56ed5d3 --- /dev/null +++ b/Dockerfile.backend @@ -0,0 +1,31 @@ +# syntax=docker/dockerfile:1 + +# Build stage +ARG NODE_VERSION=23.10.0 +FROM node:${NODE_VERSION}-alpine AS builder + +WORKDIR /usr/src/app + +COPY package.json package-lock.json ./ + +# Install production dependencies only +RUN npm ci --only=production + +# Copy app code +COPY server.js ./ + +# Runtime stage: new clean container +FROM node:${NODE_VERSION}-alpine + +WORKDIR /usr/src/app + +# Copy production node_modules and server.js +COPY --from=builder /usr/src/app/node_modules ./node_modules +COPY --from=builder /usr/src/app/server.js ./server.js + +# Expose backend ports +EXPOSE 5001 +EXPOSE 5002 + +# Start the backend +CMD ["node", "server.js"] diff --git a/Dockerfile.frontend b/Dockerfile.frontend new file mode 100644 index 0000000..0380db3 --- /dev/null +++ b/Dockerfile.frontend @@ -0,0 +1,36 @@ +# syntax=docker/dockerfile:1 + +# Build Stage +ARG NODE_VERSION=23.10.0 +FROM node:${NODE_VERSION}-alpine AS builder + +WORKDIR /usr/src/app + +# Copy package files first (cache layer) +COPY package.json package-lock.json ./ + +# Install all dependencies +RUN npm ci + +# Copy source files +COPY src/ ./src +COPY public/ ./public + +# Runtime Stage +FROM node:${NODE_VERSION}-alpine + +WORKDIR /usr/src/app + +# Copy node_modules from builder +COPY --from=builder /usr/src/app/node_modules ./node_modules + +# Copy app source +COPY src/ ./src +COPY public/ ./public +COPY package.json package-lock.json ./ + +# Expose the port that the app listens on +EXPOSE 3000 + +# Run the application +CMD ["npm", "start"] diff --git a/compose.yaml b/compose.yaml index 3534f28..803f6e5 100644 --- a/compose.yaml +++ b/compose.yaml @@ -8,19 +8,31 @@ # database or a cache. For examples, see the Awesome Compose repository: # https://github.com/docker/awesome-compose services: - server: - container_name: server - command: npm run start:dev + frontend: + container_name: frontend depends_on: - - model + - backend build: context: . + dockerfile: Dockerfile.frontend volumes: - ./:/usr/src/app env_file: - .env.compose ports: - 3000:3000 + backend: + container_name: backend + depends_on: + - model + build: + context: . + dockerfile: Dockerfile.backend + volumes: + - ./:/usr/src/app + env_file: + - .env.compose + ports: - 5002:5002 model: container_name: model diff --git a/out/base/server-deployment.yaml b/out/base/backend-deployment.yaml old mode 100755 new mode 100644 similarity index 75% rename from out/base/server-deployment.yaml rename to out/base/backend-deployment.yaml index c6d76a3..0e95e7b --- a/out/base/server-deployment.yaml +++ b/out/base/backend-deployment.yaml @@ -3,36 +3,34 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: server + name: backend namespace: cat-chatbot labels: com.docker.compose.project: cat-chatbot - com.docker.compose.service: server + com.docker.compose.service: backend-service spec: replicas: 2 selector: matchLabels: com.docker.compose.project: cat-chatbot - com.docker.compose.service: server + com.docker.compose.service: backend-service strategy: type: Recreate template: metadata: labels: com.docker.compose.project: cat-chatbot - com.docker.compose.service: server + com.docker.compose.service: backend-service com.docker.compose.network.default: "true" spec: containers: - - name: server - image: samanthamorris684/catbot:latest + - name: backend + image: samanthamorris684/catbot-backend:latest imagePullPolicy: Always env: - name: NODE_ENV value: "production" ports: - - name: app-3000 - containerPort: 3000 - name: server-5001 containerPort: 5001 resources: diff --git a/out/base/server-backend.yaml b/out/base/backend-service.yaml similarity index 73% rename from out/base/server-backend.yaml rename to out/base/backend-service.yaml index 5d75764..2226569 100644 --- a/out/base/server-backend.yaml +++ b/out/base/backend-service.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: server-backend + name: backend-service namespace: cat-chatbot spec: selector: com.docker.compose.project: cat-chatbot - com.docker.compose.service: server + com.docker.compose.service: backend-service ports: - name: api port: 5001 diff --git a/out/base/frontend-deployment.yaml b/out/base/frontend-deployment.yaml new file mode 100755 index 0000000..510f4ea --- /dev/null +++ b/out/base/frontend-deployment.yaml @@ -0,0 +1,41 @@ +#! server-deployment.yaml +# Generated code, do not edit +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + namespace: cat-chatbot + labels: + com.docker.compose.project: cat-chatbot + com.docker.compose.service: frontend-service +spec: + replicas: 2 + selector: + matchLabels: + com.docker.compose.project: cat-chatbot + com.docker.compose.service: frontend-service + strategy: + type: Recreate + template: + metadata: + labels: + com.docker.compose.project: cat-chatbot + com.docker.compose.service: frontend-service + com.docker.compose.network.default: "true" + spec: + containers: + - name: frontend + image: samanthamorris684/catbot-frontend:latest + imagePullPolicy: Always + env: + - name: NODE_ENV + value: "production" + ports: + - name: app-3000 + containerPort: 3000 + resources: + requests: + cpu: "250m" + memory: "1Gi" + imagePullSecrets: + - name: regcred diff --git a/out/base/server-frontend.yaml b/out/base/frontend-service.yaml similarity index 72% rename from out/base/server-frontend.yaml rename to out/base/frontend-service.yaml index 051f17f..e8c5bbc 100644 --- a/out/base/server-frontend.yaml +++ b/out/base/frontend-service.yaml @@ -1,12 +1,12 @@ apiVersion: v1 kind: Service metadata: - name: server-frontend + name: frontend-service namespace: cat-chatbot spec: selector: com.docker.compose.project: cat-chatbot - com.docker.compose.service: server + com.docker.compose.service: frontend-service ports: - name: http port: 80 diff --git a/out/base/kustomization.yaml b/out/base/kustomization.yaml index 8c5219b..c27c3fb 100755 --- a/out/base/kustomization.yaml +++ b/out/base/kustomization.yaml @@ -8,6 +8,7 @@ resources: - model-deployment.yaml - model-expose.yaml - model-service.yaml - - server-deployment.yaml - - server-expose.yaml - - server-service.yaml + - frontend-deployment.yaml + - frontend-service.yaml + - backend-deployment.yaml + - backend-service.yaml diff --git a/out/base/server-expose.yaml b/out/base/server-expose.yaml deleted file mode 100644 index 978cc93..0000000 --- a/out/base/server-expose.yaml +++ /dev/null @@ -1,21 +0,0 @@ -#! server-expose.yaml - # Generated code, do not edit - apiVersion: v1 - kind: Service - metadata: - name: server - namespace: cat-chatbot - labels: - com.docker.compose.project: cat-chatbot - com.docker.compose.service: server - spec: - selector: - com.docker.compose.project: cat-chatbot - com.docker.compose.service: server - ports: - - name: app-3000 - port: 3000 - targetPort: app-3000 - - name: server-5001 - port: 5001 - targetPort: server-5001 \ No newline at end of file diff --git a/out/overlays/desktop/server-service.yaml b/out/overlays/desktop/catbot-ingress.yaml similarity index 91% rename from out/overlays/desktop/server-service.yaml rename to out/overlays/desktop/catbot-ingress.yaml index 2e3fd39..043b5e7 100755 --- a/out/overlays/desktop/server-service.yaml +++ b/out/overlays/desktop/catbot-ingress.yaml @@ -18,13 +18,13 @@ spec: pathType: Prefix backend: service: - name: server-frontend + name: frontend-service port: number: 80 - path: /api pathType: Prefix backend: service: - name: server-backend + name: backend-service port: number: 5001 diff --git a/out/overlays/desktop/kustomization.yaml b/out/overlays/desktop/kustomization.yaml index 0458ce0..ae5dca8 100755 --- a/out/overlays/desktop/kustomization.yaml +++ b/out/overlays/desktop/kustomization.yaml @@ -6,4 +6,4 @@ resources: - ../../base patches: - path: model-service.yaml - - path: server-service.yaml + #- path: catbot-ingress.yaml diff --git a/package.json b/package.json index 8bc355c..e9fdda6 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,7 @@ "web-vitals": "^2.1.4" }, "scripts": { - "start:prod": "concurrently \"node server.js\" \"react-scripts start\"", - "start:dev": "concurrently \"node server.js\" \"react-scripts start\"", + "start": "react-scripts start", "build": "react-scripts build", "test": "jest --detectOpenHandles --forceExit", "eject": "react-scripts eject" diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index a11777c..0000000 Binary files a/public/favicon.ico and /dev/null differ diff --git a/public/logo192.png b/public/logo192.png deleted file mode 100644 index fc44b0a..0000000 Binary files a/public/logo192.png and /dev/null differ diff --git a/public/logo512.png b/public/logo512.png deleted file mode 100644 index a4e47a6..0000000 Binary files a/public/logo512.png and /dev/null differ diff --git a/public/manifest.json b/public/manifest.json index 080d6c7..62371ce 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,21 +1,11 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "CatBot", + "name": "CatBot - Talk to your cats!", "icons": [ { - "src": "favicon.ico", + "src": "pebble.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" } ], "start_url": ".", diff --git a/src/App.js b/src/App.js index 873f5e8..2a3b461 100644 --- a/src/App.js +++ b/src/App.js @@ -210,7 +210,7 @@ function App() { type="text" value={catName} onChange={(e) => setCatName(e.target.value)} - placeholder="e.g., Pebble" + placeholder="e.g., Bug" required /> diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file