From f60dc622e4576771d92e3d8ffe8ea8dc0a346782 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 09:17:39 -0500 Subject: [PATCH 01/19] initial Nginx server config for API and frontend --- docker/nginx.conf | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docker/nginx.conf diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 00000000..3bd94f77 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,18 @@ +server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://server:3001/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} \ No newline at end of file From 0714ea6a151313184b461a033355d13495a687e5 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 09:18:20 -0500 Subject: [PATCH 02/19] setup Dockerfiles for client and backend --- Dockerfile.client | 32 ++++++++++++-------------------- Dockerfile.server | 41 +++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/Dockerfile.client b/Dockerfile.client index f585d215..bd460a74 100644 --- a/Dockerfile.client +++ b/Dockerfile.client @@ -1,31 +1,23 @@ -# Build stage -FROM node:18-alpine as build +# Use a Node.js image for building the React app +FROM node:18 AS builder +# Set the working directory inside the container WORKDIR /app -# Copy package files -COPY package*.json ./ - # Install dependencies -RUN npm ci - -# Copy source code -COPY . . +COPY package.json package-lock.json ./ +RUN npm install -# Build the app +# Copy all files and build the app +COPY ./ ./ RUN npm run build -# Production stage +# Use Nginx to serve the built files FROM nginx:alpine +COPY --from=builder /app/build /usr/share/nginx/html -# Copy built assets from build stage -COPY --from=build /app/build /usr/share/nginx/html - -# Copy nginx config -COPY nginx.conf /etc/nginx/conf.d/default.conf - -# Expose port 80 +# Expose port 80 for the Nginx server EXPOSE 80 -# Start nginx -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file +# Start Nginx +CMD ["nginx", "-g", "daemon off;"] diff --git a/Dockerfile.server b/Dockerfile.server index f8121b56..b233157b 100644 --- a/Dockerfile.server +++ b/Dockerfile.server @@ -1,25 +1,34 @@ -# Build stage -FROM node:18-alpine +# Use a Node.js image for the server +FROM node:18 +# Set the working directory to match the project root structure WORKDIR /app -# Copy package files for both root and server -COPY package*.json ./ -COPY server/package*.json ./server/ +# Copy root package files for api/ and agents/ dependencies +COPY package.json package-lock.json ./ +RUN npm install -# Install dependencies for both -RUN npm ci -RUN cd server && npm ci +# Copy server package files and install its dependencies +COPY server/package.json server/package-lock.json ./server/ +WORKDIR /app/server +RUN npm install -# Copy source code -COPY . . +# Copy all required directories maintaining the project structure +WORKDIR /app +COPY api/ ./api/ +COPY config/ ./config/ +COPY models/ ./models/ +COPY agents/ ./agents/ +COPY server/ ./server/ + +# Copy environment variables to root so ../.env works from server directory +COPY .env ./server/ -# Environment variables will be provided at runtime -ENV PORT=3001 -ENV NODE_ENV=production +# Set working directory back to server for starting the app +WORKDIR /app/server -# Expose the port +# Expose the backend server port (3001 by default) EXPOSE 3001 -# Start the server -CMD ["node", "server/server.js"] \ No newline at end of file +# Start the backend server +CMD ["npm", "start"] From e62a392e1a539df6dc96e065c2766e83d62bd245 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 09:19:03 -0500 Subject: [PATCH 03/19] add docker-compose setup for local development --- docker-compose.yml | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..11caa1e5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,60 @@ +version: '3.8' + +services: + client: + build: + context: . + dockerfile: Dockerfile.client + container_name: ai-answers-client + ports: + - '80:80' + volumes: + - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf + depends_on: + - server + + server: + build: + context: . + dockerfile: Dockerfile.server + container_name: ai-answers-server + ports: + - '3001:3001' + environment: + - MONGODB_URI=mongodb://admin:password@mongodb:27017/?authSource=admin + depends_on: + - mongodb + + mongodb: + image: mongo:latest + container_name: mongodb + ports: + - '27017:27017' + volumes: + - mongo-data:/data/db + environment: + MONGO_INITDB_ROOT_USERNAME: admin + MONGO_INITDB_ROOT_PASSWORD: password + + mongo-express: + image: mongo-express:latest + container_name: mongo-express + ports: + - '9191:8081' + environment: + ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' + ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' + ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' + ME_CONFIG_BASICAUTH_USERNAME: 'admin' + ME_CONFIG_BASICAUTH_PASSWORD: 'password' + ME_CONFIG_MONGODB_SERVER: mongodb + ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' + depends_on: + - mongodb + +volumes: + mongo-data: + +networks: + default: + name: ai-answers-network From a2e4dde5e37c6e0ede86935c7c645d48517efae6 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 14:29:52 -0500 Subject: [PATCH 04/19] Update the dev container to use docker-compose --- .devcontainer/devcontainer.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c4f107ea..a5b827cb 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,9 +1,8 @@ { - "name": "React Development", - "build": { - "dockerfile": "Dockerfile", - "context": ".." - }, + "name": "AI Answers Development", + "dockerComposeFile": "../docker-compose.yml", + "service": "server", + "workspaceFolder": "/workspaces/ai-answers", "customizations": { "vscode": { "extensions": [ From 4385e64210156eefb84284ad8c4c603511ef2cbd Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 14:40:49 -0500 Subject: [PATCH 05/19] Delete docker-compose-mongodb.yml --- docker/docker-compose-mongodb.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 docker/docker-compose-mongodb.yml diff --git a/docker/docker-compose-mongodb.yml b/docker/docker-compose-mongodb.yml deleted file mode 100644 index 8eb9ca16..00000000 --- a/docker/docker-compose-mongodb.yml +++ /dev/null @@ -1,29 +0,0 @@ -services: - mongodb: - image: mongo:latest - container_name: mongodb - ports: - - "27017:27017" - volumes: - - mongo-data:/data/db - environment: - MONGO_INITDB_ROOT_USERNAME: admin - MONGO_INITDB_ROOT_PASSWORD: password - - mongo-express: - image: mongo-express:latest - container_name: mongo-express - ports: - - "9191:8081" - environment: - ME_CONFIG_MONGODB_ENABLE_ADMIN: "true" - ME_CONFIG_MONGODB_ADMINUSERNAME: "admin" - ME_CONFIG_MONGODB_ADMINPASSWORD: "password" - ME_CONFIG_BASICAUTH_USERNAME: "admin" - ME_CONFIG_BASICAUTH_PASSWORD: "password" - ME_CONFIG_MONGODB_SERVER: mongodb - ME_CONFIG_MONGODB_URL: "mongodb://admin:password@mongodb:27017/" - depends_on: - - mongodb -volumes: - mongo-data: From 89f3e39533328d625fffae0fe1be7c07a6705f0f Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 14:41:14 -0500 Subject: [PATCH 06/19] Relocate docker files to docker directory --- docker-compose.yml | 6 ++---- Dockerfile.client => docker/Dockerfile.client | 4 ++-- Dockerfile.server => docker/Dockerfile.server | 16 ++++++++-------- 3 files changed, 12 insertions(+), 14 deletions(-) rename Dockerfile.client => docker/Dockerfile.client (88%) rename Dockerfile.server => docker/Dockerfile.server (71%) diff --git a/docker-compose.yml b/docker-compose.yml index 11caa1e5..b24a8de2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,8 @@ -version: '3.8' - services: client: build: context: . - dockerfile: Dockerfile.client + dockerfile: docker/Dockerfile.client container_name: ai-answers-client ports: - '80:80' @@ -16,7 +14,7 @@ services: server: build: context: . - dockerfile: Dockerfile.server + dockerfile: docker/Dockerfile.server container_name: ai-answers-server ports: - '3001:3001' diff --git a/Dockerfile.client b/docker/Dockerfile.client similarity index 88% rename from Dockerfile.client rename to docker/Dockerfile.client index bd460a74..4e75b34d 100644 --- a/Dockerfile.client +++ b/docker/Dockerfile.client @@ -5,11 +5,11 @@ FROM node:18 AS builder WORKDIR /app # Install dependencies -COPY package.json package-lock.json ./ +COPY ../package.json ../package-lock.json ./ RUN npm install # Copy all files and build the app -COPY ./ ./ +COPY ../ ./ RUN npm run build # Use Nginx to serve the built files diff --git a/Dockerfile.server b/docker/Dockerfile.server similarity index 71% rename from Dockerfile.server rename to docker/Dockerfile.server index b233157b..340c1007 100644 --- a/Dockerfile.server +++ b/docker/Dockerfile.server @@ -5,24 +5,24 @@ FROM node:18 WORKDIR /app # Copy root package files for api/ and agents/ dependencies -COPY package.json package-lock.json ./ +COPY ../package.json ../package-lock.json ./ RUN npm install # Copy server package files and install its dependencies -COPY server/package.json server/package-lock.json ./server/ +COPY ../server/package.json ../server/package-lock.json ./server/ WORKDIR /app/server RUN npm install # Copy all required directories maintaining the project structure WORKDIR /app -COPY api/ ./api/ -COPY config/ ./config/ -COPY models/ ./models/ -COPY agents/ ./agents/ -COPY server/ ./server/ +COPY ../api/ ./api/ +COPY ../config/ ./config/ +COPY ../models/ ./models/ +COPY ../agents/ ./agents/ +COPY ../server/ ./server/ # Copy environment variables to root so ../.env works from server directory -COPY .env ./server/ +COPY ../.env ./server/ # Set working directory back to server for starting the app WORKDIR /app/server From efc3bf8d9c62fdbd3b755c5f3686fab620724e2b Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Wed, 29 Jan 2025 15:44:43 -0500 Subject: [PATCH 07/19] Update docker files to work with dev container --- .devcontainer/devcontainer.json | 2 +- docker-compose.yml | 2 ++ docker/Dockerfile.server | 27 ++++++++++++--------------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a5b827cb..9cde8fe7 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "name": "AI Answers Development", "dockerComposeFile": "../docker-compose.yml", "service": "server", - "workspaceFolder": "/workspaces/ai-answers", + "workspaceFolder": "/workspace", "customizations": { "vscode": { "extensions": [ diff --git a/docker-compose.yml b/docker-compose.yml index b24a8de2..36bc6493 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,8 @@ services: context: . dockerfile: docker/Dockerfile.server container_name: ai-answers-server + volumes: + - .:/workspace:cached ports: - '3001:3001' environment: diff --git a/docker/Dockerfile.server b/docker/Dockerfile.server index 340c1007..77a03e9b 100644 --- a/docker/Dockerfile.server +++ b/docker/Dockerfile.server @@ -1,31 +1,28 @@ # Use a Node.js image for the server FROM node:18 -# Set the working directory to match the project root structure -WORKDIR /app +# Set the working directory to match devcontainer workspace +WORKDIR /workspaces/ai-answers # Copy root package files for api/ and agents/ dependencies -COPY ../package.json ../package-lock.json ./ +COPY package.json package-lock.json ./ RUN npm install # Copy server package files and install its dependencies -COPY ../server/package.json ../server/package-lock.json ./server/ -WORKDIR /app/server +COPY server/package.json server/package-lock.json ./server/ +WORKDIR /workspaces/ai-answers/server RUN npm install # Copy all required directories maintaining the project structure -WORKDIR /app -COPY ../api/ ./api/ -COPY ../config/ ./config/ -COPY ../models/ ./models/ -COPY ../agents/ ./agents/ -COPY ../server/ ./server/ - -# Copy environment variables to root so ../.env works from server directory -COPY ../.env ./server/ +WORKDIR /workspaces/ai-answers +COPY api/ ./api/ +COPY config/ ./config/ +COPY models/ ./models/ +COPY agents/ ./agents/ +COPY server/ ./server/ # Set working directory back to server for starting the app -WORKDIR /app/server +WORKDIR /workspaces/ai-answers/server # Expose the backend server port (3001 by default) EXPOSE 3001 From f01f843d845fed74e327dabf0f32dc1f51c0569a Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Thu, 30 Jan 2025 11:28:03 -0500 Subject: [PATCH 08/19] Relocate docker files and remove unnecessary configs --- .devcontainer/Dockerfile | 24 -------- {docker => .devcontainer}/Dockerfile.client | 0 {docker => .devcontainer}/Dockerfile.server | 0 .devcontainer/docker-compose.yml | 61 ++++++++++++++++++--- docker-compose.yml | 60 -------------------- docker/nginx.conf | 18 ------ 6 files changed, 54 insertions(+), 109 deletions(-) delete mode 100644 .devcontainer/Dockerfile rename {docker => .devcontainer}/Dockerfile.client (100%) rename {docker => .devcontainer}/Dockerfile.server (100%) delete mode 100644 docker-compose.yml delete mode 100644 docker/nginx.conf diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 091c7ead..00000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM node:lts - -# Install basic development tools -RUN apt-get update && apt-get install -y \ - git \ - procps \ - && rm -rf /var/lib/apt/lists/* - -# Ensure default `node` user has access to `sudo` -ARG USERNAME=node -RUN apt-get update \ - && apt-get install -y sudo \ - && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ - && chmod 0440 /etc/sudoers.d/$USERNAME - -ENV NODE_ENV=development - -# Set the default user -USER node - -EXPOSE 3000 - -# Set the working directory -WORKDIR /workspace \ No newline at end of file diff --git a/docker/Dockerfile.client b/.devcontainer/Dockerfile.client similarity index 100% rename from docker/Dockerfile.client rename to .devcontainer/Dockerfile.client diff --git a/docker/Dockerfile.server b/.devcontainer/Dockerfile.server similarity index 100% rename from docker/Dockerfile.server rename to .devcontainer/Dockerfile.server diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index af512052..00bb1e15 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,13 +1,60 @@ -version: '3.8' services: - app: - build: + client: + build: context: . - dockerfile: .devcontainer/Dockerfile + dockerfile: docker/Dockerfile.client + container_name: ai-answers-client + ports: + - '80:80' + volumes: + - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf + depends_on: + - server + + server: + build: + context: . + dockerfile: docker/Dockerfile.server + container_name: ai-answers-server volumes: - .:/workspace:cached ports: - - "3000:3000" + - '3001:3001' environment: - - NODE_ENV=development - command: sleep infinity \ No newline at end of file + - MONGODB_URI=mongodb://admin:password@mongodb:27017/?authSource=admin + depends_on: + - mongodb + +# mongodb: +# image: mongo:latest +# container_name: mongodb +# ports: +# - '27017:27017' +# volumes: +# - mongo-data:/data/db +# environment: +# MONGO_INITDB_ROOT_USERNAME: admin +# MONGO_INITDB_ROOT_PASSWORD: password + +# mongo-express: +# image: mongo-express:latest +# container_name: mongo-express +# ports: +# - '9191:8081' +# environment: +# ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' +# ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' +# ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' +# ME_CONFIG_BASICAUTH_USERNAME: 'admin' +# ME_CONFIG_BASICAUTH_PASSWORD: 'password' +# ME_CONFIG_MONGODB_SERVER: mongodb +# ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' +# depends_on: +# - mongodb + +# volumes: +# mongo-data: + +networks: + default: + name: ai-answers-network diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 36bc6493..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,60 +0,0 @@ -services: - client: - build: - context: . - dockerfile: docker/Dockerfile.client - container_name: ai-answers-client - ports: - - '80:80' - volumes: - - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf - depends_on: - - server - - server: - build: - context: . - dockerfile: docker/Dockerfile.server - container_name: ai-answers-server - volumes: - - .:/workspace:cached - ports: - - '3001:3001' - environment: - - MONGODB_URI=mongodb://admin:password@mongodb:27017/?authSource=admin - depends_on: - - mongodb - - mongodb: - image: mongo:latest - container_name: mongodb - ports: - - '27017:27017' - volumes: - - mongo-data:/data/db - environment: - MONGO_INITDB_ROOT_USERNAME: admin - MONGO_INITDB_ROOT_PASSWORD: password - - mongo-express: - image: mongo-express:latest - container_name: mongo-express - ports: - - '9191:8081' - environment: - ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' - ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' - ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' - ME_CONFIG_BASICAUTH_USERNAME: 'admin' - ME_CONFIG_BASICAUTH_PASSWORD: 'password' - ME_CONFIG_MONGODB_SERVER: mongodb - ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' - depends_on: - - mongodb - -volumes: - mongo-data: - -networks: - default: - name: ai-answers-network diff --git a/docker/nginx.conf b/docker/nginx.conf deleted file mode 100644 index 3bd94f77..00000000 --- a/docker/nginx.conf +++ /dev/null @@ -1,18 +0,0 @@ -server { - listen 80; - server_name localhost; - - location / { - root /usr/share/nginx/html; - try_files $uri $uri/ /index.html; - } - - location /api/ { - proxy_pass http://server:3001/api/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_cache_bypass $http_upgrade; - } -} \ No newline at end of file From ca27265876cce53933e409147fc89ad80dd27dd2 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Thu, 30 Jan 2025 12:17:15 -0500 Subject: [PATCH 09/19] Rename app to AI-answers --- .github/workflows/tf_apply_staging.yml | 8 ++++---- .github/workflows/tf_plan_staging.yml | 10 +++++----- package-lock.json | 4 ++-- package.json | 2 +- terragrunt/aws/ecr/ecr.tf | 2 +- terragrunt/env/root.hcl | 2 +- terragrunt/env/staging/env_vars.hcl | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/tf_apply_staging.yml b/.github/workflows/tf_apply_staging.yml index eb572dff..c58a5b8c 100644 --- a/.github/workflows/tf_apply_staging.yml +++ b/.github/workflows/tf_apply_staging.yml @@ -1,4 +1,4 @@ -name: 'Terraform apply staging' +name: "Terraform apply staging" on: workflow_dispatch: @@ -6,9 +6,9 @@ on: branches: - main paths: - - 'terragrunt/**' - - '!terragrunt/env/staging/**' - - '.github/workflows/tf_apply_staging.yml' + - "terragrunt/**" + - "!terragrunt/env/staging/**" + - ".github/workflows/tf_apply_staging.yml" env: AWS_REGION: ca-central-1 diff --git a/.github/workflows/tf_plan_staging.yml b/.github/workflows/tf_plan_staging.yml index d799fc40..c811235b 100644 --- a/.github/workflows/tf_plan_staging.yml +++ b/.github/workflows/tf_plan_staging.yml @@ -1,12 +1,12 @@ -name: 'Terraform plan staging' +name: "Terraform plan staging" on: workflow_dispatch: pull_request: paths: - - 'terragrunt/**' - - '!terragrunt/env/staging/**' - - '.github/workflows/tf_plan_staging.yml' + - "terragrunt/**" + - "!terragrunt/env/staging/**" + - ".github/workflows/tf_plan_staging.yml" env: AWS_REGION: ca-central-1 @@ -52,7 +52,7 @@ jobs: uses: cds-snc/terraform-plan@v3.2.2 with: comment-delete: true - comment-title: 'Staging: ${{ matrix.module }}' + comment-title: "Staging: ${{ matrix.module }}" directory: ./terragrunt/env/staging/${{ matrix.module }} github-token: ${{ secrets.GITHUB_TOKEN }} terragrunt: true diff --git a/package-lock.json b/package-lock.json index 5165e106..2f1c99cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "react-answers", + "name": "ai-answers", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "react-answers", + "name": "ai-answers", "version": "0.1.0", "dependencies": { "@anthropic-ai/sdk": "^0.33.1", diff --git a/package.json b/package.json index 57584500..9952719e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "react-answers", + "name": "ai-answers", "version": "0.1.0", "type": "module", "private": true, diff --git a/terragrunt/aws/ecr/ecr.tf b/terragrunt/aws/ecr/ecr.tf index d5ab52b8..39f5d2b2 100644 --- a/terragrunt/aws/ecr/ecr.tf +++ b/terragrunt/aws/ecr/ecr.tf @@ -1,5 +1,5 @@ resource "aws_ecr_repository" "react_answers" { - name = "react-answers" + name = "ai-answers" image_tag_mutability = "MUTABLE" image_scanning_configuration { diff --git a/terragrunt/env/root.hcl b/terragrunt/env/root.hcl index a6811cfb..d0ee6789 100644 --- a/terragrunt/env/root.hcl +++ b/terragrunt/env/root.hcl @@ -5,7 +5,7 @@ locals { # DO NOT CHANGE ANYTHING BELOW HERE UNLESS YOU KNOW WHAT YOU ARE DOING inputs = { - product_name = "react-answers" + product_name = "ai-answers" account_id = "${local.vars.inputs.account_id}" domain = "${local.vars.inputs.domain}" env = "${local.vars.inputs.env}" diff --git a/terragrunt/env/staging/env_vars.hcl b/terragrunt/env/staging/env_vars.hcl index 538e3f2f..9569431d 100644 --- a/terragrunt/env/staging/env_vars.hcl +++ b/terragrunt/env/staging/env_vars.hcl @@ -1,6 +1,6 @@ inputs = { account_id = "992382783569" env = "staging" - cost_center_code = "react-answers-staging" - domain = "react-answers.cdssandbox.xyz" + cost_center_code = "ai-answers-staging" + domain = "ai-answers.cdssandbox.xyz" } \ No newline at end of file From 5bff056092f7c129a0448599e9112917a72f4eef Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Thu, 30 Jan 2025 12:28:26 -0500 Subject: [PATCH 10/19] update Docker Compose reference and add forwarded ports --- .devcontainer/devcontainer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9cde8fe7..3d3aa942 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "AI Answers Development", - "dockerComposeFile": "../docker-compose.yml", + "dockerComposeFile": "docker-compose.yml", "service": "server", "workspaceFolder": "/workspace", "customizations": { @@ -21,7 +21,7 @@ } } }, - "forwardPorts": [3000], + "forwardPorts": [3000, 3001, 27017, 9191], "postCreateCommand": "npm install", "remoteUser": "node", "features": { From 852e6dc8043cf1a1a9b6bd51bcb937b2aaab2be5 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Thu, 30 Jan 2025 12:28:53 -0500 Subject: [PATCH 11/19] fix service paths, update Dockerfiles, and restore MongoDB services --- .devcontainer/Dockerfile.client | 23 ++++------ .devcontainer/Dockerfile.server | 8 ++-- .devcontainer/docker-compose.yml | 72 ++++++++++++++++---------------- 3 files changed, 50 insertions(+), 53 deletions(-) diff --git a/.devcontainer/Dockerfile.client b/.devcontainer/Dockerfile.client index 4e75b34d..3e2f76c1 100644 --- a/.devcontainer/Dockerfile.client +++ b/.devcontainer/Dockerfile.client @@ -1,23 +1,18 @@ -# Use a Node.js image for building the React app -FROM node:18 AS builder +# Use a Node.js image for the React app +FROM node:18 # Set the working directory inside the container WORKDIR /app # Install dependencies -COPY ../package.json ../package-lock.json ./ +COPY package.json package-lock.json ./ RUN npm install -# Copy all files and build the app -COPY ../ ./ -RUN npm run build +# Copy all files +COPY ./ ./ -# Use Nginx to serve the built files -FROM nginx:alpine -COPY --from=builder /app/build /usr/share/nginx/html +# Expose port 3000 for the React development server +EXPOSE 3000 -# Expose port 80 for the Nginx server -EXPOSE 80 - -# Start Nginx -CMD ["nginx", "-g", "daemon off;"] +# Start the React development server +CMD ["npm", "start"] \ No newline at end of file diff --git a/.devcontainer/Dockerfile.server b/.devcontainer/Dockerfile.server index 77a03e9b..6f17de8d 100644 --- a/.devcontainer/Dockerfile.server +++ b/.devcontainer/Dockerfile.server @@ -2,7 +2,7 @@ FROM node:18 # Set the working directory to match devcontainer workspace -WORKDIR /workspaces/ai-answers +WORKDIR /workspace # Copy root package files for api/ and agents/ dependencies COPY package.json package-lock.json ./ @@ -10,11 +10,11 @@ RUN npm install # Copy server package files and install its dependencies COPY server/package.json server/package-lock.json ./server/ -WORKDIR /workspaces/ai-answers/server +WORKDIR /workspace/server RUN npm install # Copy all required directories maintaining the project structure -WORKDIR /workspaces/ai-answers +WORKDIR /workspace COPY api/ ./api/ COPY config/ ./config/ COPY models/ ./models/ @@ -22,7 +22,7 @@ COPY agents/ ./agents/ COPY server/ ./server/ # Set working directory back to server for starting the app -WORKDIR /workspaces/ai-answers/server +WORKDIR /workspace/server # Expose the backend server port (3001 by default) EXPOSE 3001 diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 00bb1e15..757441a9 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,23 +1,23 @@ services: client: build: - context: . - dockerfile: docker/Dockerfile.client + context: .. + dockerfile: .devcontainer/Dockerfile.client container_name: ai-answers-client ports: - - '80:80' - volumes: - - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf + - '3000:3000' depends_on: - server server: build: - context: . - dockerfile: docker/Dockerfile.server + context: .. + dockerfile: .devcontainer/Dockerfile.server container_name: ai-answers-server volumes: - - .:/workspace:cached + - ../:/workspace:cached + - server-node-modules:/workspace/server/node_modules + - root-node-modules:/workspace/node_modules ports: - '3001:3001' environment: @@ -25,35 +25,37 @@ services: depends_on: - mongodb -# mongodb: -# image: mongo:latest -# container_name: mongodb -# ports: -# - '27017:27017' -# volumes: -# - mongo-data:/data/db -# environment: -# MONGO_INITDB_ROOT_USERNAME: admin -# MONGO_INITDB_ROOT_PASSWORD: password + mongodb: + image: mongo:latest + container_name: mongodb + ports: + - '27017:27017' + volumes: + - mongo-data:/data/db + environment: + MONGO_INITDB_ROOT_USERNAME: admin + MONGO_INITDB_ROOT_PASSWORD: password -# mongo-express: -# image: mongo-express:latest -# container_name: mongo-express -# ports: -# - '9191:8081' -# environment: -# ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' -# ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' -# ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' -# ME_CONFIG_BASICAUTH_USERNAME: 'admin' -# ME_CONFIG_BASICAUTH_PASSWORD: 'password' -# ME_CONFIG_MONGODB_SERVER: mongodb -# ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' -# depends_on: -# - mongodb + mongo-express: + image: mongo-express:latest + container_name: mongo-express + ports: + - '9191:8081' + environment: + ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' + ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' + ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' + ME_CONFIG_BASICAUTH_USERNAME: 'admin' + ME_CONFIG_BASICAUTH_PASSWORD: 'password' + ME_CONFIG_MONGODB_SERVER: mongodb + ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' + depends_on: + - mongodb -# volumes: -# mongo-data: +volumes: + mongo-data: + server-node-modules: + root-node-modules: networks: default: From e80b2c255b6c4e3fa615bc79bbba75c0db64631d Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Thu, 30 Jan 2025 14:06:03 -0500 Subject: [PATCH 12/19] Update Account IDs & Update name to "ai-answers" --- .github/workflows/tf_apply_staging.yml | 2 +- .github/workflows/tf_plan_staging.yml | 2 +- terragrunt/aws/ecr/ecr.tf | 2 +- terragrunt/aws/ecr/outputs.tf | 4 ++-- terragrunt/aws/hosted_zone/outputs.tf | 2 +- terragrunt/aws/hosted_zone/route_53.tf | 2 +- terragrunt/aws/network/outputs.tf | 8 ++++---- terragrunt/aws/network/security_groups.tf | 2 +- terragrunt/aws/network/vpc.tf | 2 +- terragrunt/env/staging/ecr/.terraform.lock.hcl | 1 + terragrunt/env/staging/env_vars.hcl | 2 +- 11 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/tf_apply_staging.yml b/.github/workflows/tf_apply_staging.yml index c58a5b8c..48074c63 100644 --- a/.github/workflows/tf_apply_staging.yml +++ b/.github/workflows/tf_apply_staging.yml @@ -38,7 +38,7 @@ jobs: - name: Configure aws credentials using OIDC uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: - role-to-assume: arn:aws:iam::992382783569:role/ai-answers-apply + role-to-assume: arn:aws:iam::730335533085:role/ai-answers-apply role-session-name: TFApply aws-region: ${{ env.AWS_REGION }} diff --git a/.github/workflows/tf_plan_staging.yml b/.github/workflows/tf_plan_staging.yml index c811235b..4ec29f73 100644 --- a/.github/workflows/tf_plan_staging.yml +++ b/.github/workflows/tf_plan_staging.yml @@ -44,7 +44,7 @@ jobs: - name: Configure aws credentials using OIDC uses: aws-actions/configure-aws-credentials@v4.0.2 with: - role-to-assume: arn:aws:iam::992382783569:role/ai-answers-plan + role-to-assume: arn:aws:iam::730335533085:role/ai-answers-plan role-session-name: TFPlan aws-region: ${{ env.AWS_REGION }} diff --git a/terragrunt/aws/ecr/ecr.tf b/terragrunt/aws/ecr/ecr.tf index 39f5d2b2..f103740f 100644 --- a/terragrunt/aws/ecr/ecr.tf +++ b/terragrunt/aws/ecr/ecr.tf @@ -1,4 +1,4 @@ -resource "aws_ecr_repository" "react_answers" { +resource "aws_ecr_repository" "ai_answers" { name = "ai-answers" image_tag_mutability = "MUTABLE" diff --git a/terragrunt/aws/ecr/outputs.tf b/terragrunt/aws/ecr/outputs.tf index cefbfa04..c93761cc 100644 --- a/terragrunt/aws/ecr/outputs.tf +++ b/terragrunt/aws/ecr/outputs.tf @@ -1,9 +1,9 @@ output "ecr_repository_url" { description = "URL of the React Answers ECR" - value = aws_ecr_repository.react_answers.repository_url + value = aws_ecr_repository.ai_answers.repository_url } output "ecr_repository_arn" { description = "Arn of the ECR Repository" - value = aws_ecr_repository.react_answers.arn + value = aws_ecr_repository.ai_answers.arn } \ No newline at end of file diff --git a/terragrunt/aws/hosted_zone/outputs.tf b/terragrunt/aws/hosted_zone/outputs.tf index 18ee7fa6..ca76c7a1 100644 --- a/terragrunt/aws/hosted_zone/outputs.tf +++ b/terragrunt/aws/hosted_zone/outputs.tf @@ -1,4 +1,4 @@ output "hosted_zone_id" { description = "Route53 hosted zone ID that will hold our DNS records" - value = aws_route53_zone.react_answers.zone_id + value = aws_route53_zone.ai_answers.zone_id } \ No newline at end of file diff --git a/terragrunt/aws/hosted_zone/route_53.tf b/terragrunt/aws/hosted_zone/route_53.tf index cb138c02..02f6b3e6 100644 --- a/terragrunt/aws/hosted_zone/route_53.tf +++ b/terragrunt/aws/hosted_zone/route_53.tf @@ -2,7 +2,7 @@ # Hosted zone for React Answers app # -resource "aws_route53_zone" "react_answers" { +resource "aws_route53_zone" "ai_answers" { name = var.domain tags = { diff --git a/terragrunt/aws/network/outputs.tf b/terragrunt/aws/network/outputs.tf index 7d991263..c65ae8d9 100644 --- a/terragrunt/aws/network/outputs.tf +++ b/terragrunt/aws/network/outputs.tf @@ -1,21 +1,21 @@ output "vpc_id" { description = "The VPC id" - value = module.react_answers_vpc.vpc_id + value = module.ai_answers_vpc.vpc_id } output "vpc_private_subnet_ids" { description = "List of the React Answers app VPC private subnet ids" - value = module.react_answers_vpc.private_subnet_ids + value = module.ai_answers_vpc.private_subnet_ids } output "vpc_public_subnet_ids" { description = "List of the React Answers App VPC public subnet ids" - value = module.react_answers_vpc.public_subnet_ids + value = module.ai_answers_vpc.public_subnet_ids } output "vpc_cidr_block" { description = "List of cidr block ips for the React Answers VPC" - value = module.react_answers_vpc.cidr_block + value = module.ai_answers_vpc.cidr_block } diff --git a/terragrunt/aws/network/security_groups.tf b/terragrunt/aws/network/security_groups.tf index ced08a8f..cc3f6b0c 100644 --- a/terragrunt/aws/network/security_groups.tf +++ b/terragrunt/aws/network/security_groups.tf @@ -17,7 +17,7 @@ resource "aws_security_group" "app" { description = "Security Group for the React Answers App" # ID of the VPC where this SG will be created - vpc_id = module.react_answers_vpc.vpc_id + vpc_id = module.ai_answers_vpc.vpc_id # Ensures Terraform removes associated rules upon SG destruction or modification revoke_rules_on_delete = true diff --git a/terragrunt/aws/network/vpc.tf b/terragrunt/aws/network/vpc.tf index 1cc188d7..c1e72ea2 100644 --- a/terragrunt/aws/network/vpc.tf +++ b/terragrunt/aws/network/vpc.tf @@ -3,7 +3,7 @@ # # Use the terraform-modules/vpc module to create the VPC for the react answers app -module "react_answers_vpc" { +module "ai_answers_vpc" { source = "github.com/cds-snc/terraform-modules//vpc?ref=v10.2.2" name = var.product_name billing_tag_value = var.billing_tag_value diff --git a/terragrunt/env/staging/ecr/.terraform.lock.hcl b/terragrunt/env/staging/ecr/.terraform.lock.hcl index b3226c1f..6c22b66b 100644 --- a/terragrunt/env/staging/ecr/.terraform.lock.hcl +++ b/terragrunt/env/staging/ecr/.terraform.lock.hcl @@ -5,6 +5,7 @@ provider "registry.terraform.io/hashicorp/aws" { version = "5.84.0" constraints = "~> 5.0" hashes = [ + "h1:OJ53RNte7HLHSMxSkzu1S6H8sC0T8qnCAOcNLjjtMpc=", "h1:dwpeFUdcxgXVAc0JSqO57xf0/r2qOBLPloombCQWFz8=", "zh:078f77438aba6ec8bf9154b7d223e5c71c48d805d6cd3bcf9db0cc1e82668ac3", "zh:1f6591ff96be00501e71b792ed3a5a14b21ff03afec9a1c4a3fd9300e6e5b674", diff --git a/terragrunt/env/staging/env_vars.hcl b/terragrunt/env/staging/env_vars.hcl index 9569431d..253c21bb 100644 --- a/terragrunt/env/staging/env_vars.hcl +++ b/terragrunt/env/staging/env_vars.hcl @@ -1,5 +1,5 @@ inputs = { - account_id = "992382783569" + account_id = "730335533085" env = "staging" cost_center_code = "ai-answers-staging" domain = "ai-answers.cdssandbox.xyz" From c852148a570c00a6d7e718c3f66314033141dd12 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Fri, 31 Jan 2025 11:41:09 -0500 Subject: [PATCH 13/19] Update node version to LTS --- .devcontainer/Dockerfile.client | 2 +- .devcontainer/Dockerfile.server | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/Dockerfile.client b/.devcontainer/Dockerfile.client index 3e2f76c1..5aba7038 100644 --- a/.devcontainer/Dockerfile.client +++ b/.devcontainer/Dockerfile.client @@ -1,5 +1,5 @@ # Use a Node.js image for the React app -FROM node:18 +FROM node:22.13.1 # Set the working directory inside the container WORKDIR /app diff --git a/.devcontainer/Dockerfile.server b/.devcontainer/Dockerfile.server index 6f17de8d..8649e69e 100644 --- a/.devcontainer/Dockerfile.server +++ b/.devcontainer/Dockerfile.server @@ -1,5 +1,5 @@ # Use a Node.js image for the server -FROM node:18 +FROM node:22.13.1 # Set the working directory to match devcontainer workspace WORKDIR /workspace From 9e4d444992183fd98533c61f328da53de53d10c5 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Fri, 31 Jan 2025 15:13:05 -0500 Subject: [PATCH 14/19] Revert all devcontainer changes to when it was working. --- .devcontainer/Dockerfile | 24 ++++++++++++ .devcontainer/Dockerfile.client | 18 --------- .devcontainer/Dockerfile.server | 31 --------------- .devcontainer/devcontainer.json | 11 +++--- .devcontainer/docker-compose.yml | 67 +++++--------------------------- 5 files changed, 39 insertions(+), 112 deletions(-) create mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/Dockerfile.client delete mode 100644 .devcontainer/Dockerfile.server diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..091c7ead --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,24 @@ +FROM node:lts + +# Install basic development tools +RUN apt-get update && apt-get install -y \ + git \ + procps \ + && rm -rf /var/lib/apt/lists/* + +# Ensure default `node` user has access to `sudo` +ARG USERNAME=node +RUN apt-get update \ + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME + +ENV NODE_ENV=development + +# Set the default user +USER node + +EXPOSE 3000 + +# Set the working directory +WORKDIR /workspace \ No newline at end of file diff --git a/.devcontainer/Dockerfile.client b/.devcontainer/Dockerfile.client deleted file mode 100644 index 5aba7038..00000000 --- a/.devcontainer/Dockerfile.client +++ /dev/null @@ -1,18 +0,0 @@ -# Use a Node.js image for the React app -FROM node:22.13.1 - -# Set the working directory inside the container -WORKDIR /app - -# Install dependencies -COPY package.json package-lock.json ./ -RUN npm install - -# Copy all files -COPY ./ ./ - -# Expose port 3000 for the React development server -EXPOSE 3000 - -# Start the React development server -CMD ["npm", "start"] \ No newline at end of file diff --git a/.devcontainer/Dockerfile.server b/.devcontainer/Dockerfile.server deleted file mode 100644 index 8649e69e..00000000 --- a/.devcontainer/Dockerfile.server +++ /dev/null @@ -1,31 +0,0 @@ -# Use a Node.js image for the server -FROM node:22.13.1 - -# Set the working directory to match devcontainer workspace -WORKDIR /workspace - -# Copy root package files for api/ and agents/ dependencies -COPY package.json package-lock.json ./ -RUN npm install - -# Copy server package files and install its dependencies -COPY server/package.json server/package-lock.json ./server/ -WORKDIR /workspace/server -RUN npm install - -# Copy all required directories maintaining the project structure -WORKDIR /workspace -COPY api/ ./api/ -COPY config/ ./config/ -COPY models/ ./models/ -COPY agents/ ./agents/ -COPY server/ ./server/ - -# Set working directory back to server for starting the app -WORKDIR /workspace/server - -# Expose the backend server port (3001 by default) -EXPOSE 3001 - -# Start the backend server -CMD ["npm", "start"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3d3aa942..c4f107ea 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,8 +1,9 @@ { - "name": "AI Answers Development", - "dockerComposeFile": "docker-compose.yml", - "service": "server", - "workspaceFolder": "/workspace", + "name": "React Development", + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, "customizations": { "vscode": { "extensions": [ @@ -21,7 +22,7 @@ } } }, - "forwardPorts": [3000, 3001, 27017, 9191], + "forwardPorts": [3000], "postCreateCommand": "npm install", "remoteUser": "node", "features": { diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 757441a9..af512052 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,62 +1,13 @@ +version: '3.8' services: - client: - build: - context: .. - dockerfile: .devcontainer/Dockerfile.client - container_name: ai-answers-client - ports: - - '3000:3000' - depends_on: - - server - - server: - build: - context: .. - dockerfile: .devcontainer/Dockerfile.server - container_name: ai-answers-server - volumes: - - ../:/workspace:cached - - server-node-modules:/workspace/server/node_modules - - root-node-modules:/workspace/node_modules - ports: - - '3001:3001' - environment: - - MONGODB_URI=mongodb://admin:password@mongodb:27017/?authSource=admin - depends_on: - - mongodb - - mongodb: - image: mongo:latest - container_name: mongodb - ports: - - '27017:27017' + app: + build: + context: . + dockerfile: .devcontainer/Dockerfile volumes: - - mongo-data:/data/db - environment: - MONGO_INITDB_ROOT_USERNAME: admin - MONGO_INITDB_ROOT_PASSWORD: password - - mongo-express: - image: mongo-express:latest - container_name: mongo-express + - .:/workspace:cached ports: - - '9191:8081' + - "3000:3000" environment: - ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' - ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' - ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' - ME_CONFIG_BASICAUTH_USERNAME: 'admin' - ME_CONFIG_BASICAUTH_PASSWORD: 'password' - ME_CONFIG_MONGODB_SERVER: mongodb - ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' - depends_on: - - mongodb - -volumes: - mongo-data: - server-node-modules: - root-node-modules: - -networks: - default: - name: ai-answers-network + - NODE_ENV=development + command: sleep infinity \ No newline at end of file From 3fb0c2bcca55f2d9f8dcc0c32a525d8a83764a12 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Fri, 31 Jan 2025 15:19:06 -0500 Subject: [PATCH 15/19] Local dockerfiles --- Dockerfile.client | 18 ++++++++++++++ Dockerfile.server | 25 +++++++++++++++++++ docker-compose.yml | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 Dockerfile.client create mode 100644 Dockerfile.server create mode 100644 docker-compose.yml diff --git a/Dockerfile.client b/Dockerfile.client new file mode 100644 index 00000000..8892999b --- /dev/null +++ b/Dockerfile.client @@ -0,0 +1,18 @@ +# Use a Node.js image for the React app +FROM node:lts + +# Set the working directory inside the container +WORKDIR /app + +# Install dependencies +COPY package.json package-lock.json ./ +RUN npm install + +# Copy all files +COPY ./ ./ + +# Expose port 3000 for the React development server +EXPOSE 3000 + +# Start the React development server +CMD ["npm", "start"] \ No newline at end of file diff --git a/Dockerfile.server b/Dockerfile.server new file mode 100644 index 00000000..b4e0d62d --- /dev/null +++ b/Dockerfile.server @@ -0,0 +1,25 @@ +# Use a Node.js image for the server +FROM node:lts + +# Set the working directory to match devcontainer workspace +WORKDIR /workspace + +# Copy all required directories maintaining the project structure +COPY api/ ./api/ +COPY config/ ./config/ +COPY models/ ./models/ +COPY agents/ ./agents/ +COPY server/ ./server/ + +# Copy package files and install dependencies +COPY package.json package-lock.json ./ +RUN npm install + +# Set working directory to server for starting the app +WORKDIR /workspace/server + +# Expose the backend server port (3001 by default) +EXPOSE 3001 + +# Start the backend server +CMD ["npm", "start"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..1c3e82b0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,62 @@ +services: + client: + build: + context: . + dockerfile: Dockerfile.client + container_name: ai-answers-client + ports: + - '3000:3000' + depends_on: + - server + + server: + build: + context: . + dockerfile: Dockerfile.server + container_name: ai-answers-server + volumes: + - .:/workspace:cached + - server-node-modules:/workspace/server/node_modules + - root-node-modules:/workspace/node_modules + ports: + - '3001:3001' + environment: + - MONGODB_URI=mongodb://admin:password@mongodb:27017/?authSource=admin + depends_on: + - mongodb + + mongodb: + image: mongo:latest + container_name: mongodb + ports: + - '27017:27017' + volumes: + - mongo-data:/data/db + environment: + MONGO_INITDB_ROOT_USERNAME: admin + MONGO_INITDB_ROOT_PASSWORD: password + + mongo-express: + image: mongo-express:latest + container_name: mongo-express + ports: + - '9191:8081' + environment: + ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' + ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' + ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' + ME_CONFIG_BASICAUTH_USERNAME: 'admin' + ME_CONFIG_BASICAUTH_PASSWORD: 'password' + ME_CONFIG_MONGODB_SERVER: mongodb + ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' + depends_on: + - mongodb + +volumes: + mongo-data: + server-node-modules: + root-node-modules: + +networks: + default: + name: ai-answers-network From cacaea3a5a5dc080e522b989794dab074821a7df Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Tue, 4 Feb 2025 08:36:03 -0500 Subject: [PATCH 16/19] update AWS ID to staging --- .github/workflows/tf_apply_staging.yml | 2 +- .github/workflows/tf_plan_staging.yml | 2 +- terragrunt/env/staging/env_vars.hcl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tf_apply_staging.yml b/.github/workflows/tf_apply_staging.yml index 48074c63..c58a5b8c 100644 --- a/.github/workflows/tf_apply_staging.yml +++ b/.github/workflows/tf_apply_staging.yml @@ -38,7 +38,7 @@ jobs: - name: Configure aws credentials using OIDC uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: - role-to-assume: arn:aws:iam::730335533085:role/ai-answers-apply + role-to-assume: arn:aws:iam::992382783569:role/ai-answers-apply role-session-name: TFApply aws-region: ${{ env.AWS_REGION }} diff --git a/.github/workflows/tf_plan_staging.yml b/.github/workflows/tf_plan_staging.yml index 4ec29f73..c811235b 100644 --- a/.github/workflows/tf_plan_staging.yml +++ b/.github/workflows/tf_plan_staging.yml @@ -44,7 +44,7 @@ jobs: - name: Configure aws credentials using OIDC uses: aws-actions/configure-aws-credentials@v4.0.2 with: - role-to-assume: arn:aws:iam::730335533085:role/ai-answers-plan + role-to-assume: arn:aws:iam::992382783569:role/ai-answers-plan role-session-name: TFPlan aws-region: ${{ env.AWS_REGION }} diff --git a/terragrunt/env/staging/env_vars.hcl b/terragrunt/env/staging/env_vars.hcl index 253c21bb..9569431d 100644 --- a/terragrunt/env/staging/env_vars.hcl +++ b/terragrunt/env/staging/env_vars.hcl @@ -1,5 +1,5 @@ inputs = { - account_id = "730335533085" + account_id = "992382783569" env = "staging" cost_center_code = "ai-answers-staging" domain = "ai-answers.cdssandbox.xyz" From 8ea15da05df22681faa2c7ab2552687205a52e6f Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh Date: Tue, 4 Feb 2025 11:29:22 -0500 Subject: [PATCH 17/19] Update docker-compose to use document-db --- docker-compose.yml | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1c3e82b0..75abb078 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,39 +21,10 @@ services: ports: - '3001:3001' environment: - - MONGODB_URI=mongodb://admin:password@mongodb:27017/?authSource=admin - depends_on: - - mongodb - - mongodb: - image: mongo:latest - container_name: mongodb - ports: - - '27017:27017' - volumes: - - mongo-data:/data/db - environment: - MONGO_INITDB_ROOT_USERNAME: admin - MONGO_INITDB_ROOT_PASSWORD: password - - mongo-express: - image: mongo-express:latest - container_name: mongo-express - ports: - - '9191:8081' - environment: - ME_CONFIG_MONGODB_ENABLE_ADMIN: 'true' - ME_CONFIG_MONGODB_ADMINUSERNAME: 'admin' - ME_CONFIG_MONGODB_ADMINPASSWORD: 'password' - ME_CONFIG_BASICAUTH_USERNAME: 'admin' - ME_CONFIG_BASICAUTH_PASSWORD: 'password' - ME_CONFIG_MONGODB_SERVER: mongodb - ME_CONFIG_MONGODB_URL: 'mongodb://admin:password@mongodb:27017/?authSource=admin' - depends_on: - - mongodb + # Replace these values with your AWS DocumentDB details + - MONGODB_URI=mongodb://${DOCDB_USERNAME}:${DOCDB_PASSWORD}@${DOCDB_CLUSTER_ENDPOINT}:27017/${DOCDB_DATABASE}?tls=true&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false volumes: - mongo-data: server-node-modules: root-node-modules: From 43f223bee602dab04d17462166180055a5e393f6 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh <32944558+HamzaAburaneh@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:32:19 +0000 Subject: [PATCH 18/19] Update terraform lock --- .../env/staging/ecr/.terraform.lock.hcl | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/terragrunt/env/staging/ecr/.terraform.lock.hcl b/terragrunt/env/staging/ecr/.terraform.lock.hcl index 6c22b66b..908af929 100644 --- a/terragrunt/env/staging/ecr/.terraform.lock.hcl +++ b/terragrunt/env/staging/ecr/.terraform.lock.hcl @@ -2,25 +2,24 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/aws" { - version = "5.84.0" + version = "5.85.0" constraints = "~> 5.0" hashes = [ - "h1:OJ53RNte7HLHSMxSkzu1S6H8sC0T8qnCAOcNLjjtMpc=", - "h1:dwpeFUdcxgXVAc0JSqO57xf0/r2qOBLPloombCQWFz8=", - "zh:078f77438aba6ec8bf9154b7d223e5c71c48d805d6cd3bcf9db0cc1e82668ac3", - "zh:1f6591ff96be00501e71b792ed3a5a14b21ff03afec9a1c4a3fd9300e6e5b674", - "zh:2ab694e022e81dd74485351c5836148a842ed71cf640664c9d871cb517b09602", - "zh:33c8ccb6e3dc496e828a7572dd981366c6271075c1189f249b9b5236361d7eff", - "zh:6f31068ebad1d627e421c72ccdaafe678c53600ca73714e977bf45ff43ae5d17", - "zh:7488623dccfb639347cae66f9001d39cf06b92e8081975235a1ac3a0ac3f44aa", - "zh:7f042b78b9690a8725c95b91a70fc8e264011b836605bcc342ac297b9ea3937d", - "zh:88b56ac6c7209dc0a775b79975a371918f3aed8f015c37d5899f31deff37c61a", + "h1:VQKf997wuPoP0TFxUJ0P+nXkJx97FcoqCZEaGOZBqI4=", + "zh:047bfefb24b64de7fdac48d85ab0950591c96092ca093d530cc61a54ffbb0f21", + "zh:1c459bab3e99fc760ddb57b935965888c38ebff032b451927a277c00a60f382c", + "zh:568df3a039ae4ca3a0e9591a4b3dbc3a23b8efeee8cd64e0abf860aa03b0630b", + "zh:7463d353c8c47030a7489238e53b9ef86ebbf4b8ce0628d6b0b293795fc85c50", + "zh:7639c24e110aec4145a792238c86aa1b70881e1dedfc2b51ca12d32f92fc3a9d", + "zh:893c8a8542c2cec74168094d9f8cc05e6cfadc02d9be2ee63c6564b00c4d608c", + "zh:8e0f0c3352b6099e2e44fd5c644f9a27830207c667c45b56a103f756a5731828", "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:a1979ba840d704af0932f8de5f541cbb4caa9b6bbd25ed552a24e6772175ba07", - "zh:b058c0533dae580e69d1adbc1f69e6a80632374abfc10e8634d06187a108e87b", - "zh:c88610af9cf957f8dcf4382e0c9ca566ef10e3290f5de01d4d90b2d81b078aa8", - "zh:e9562c055a2247d0c287772b55abef468c79f8d66a74780fe1c5e5dae1a284a9", - "zh:f7a7c71d28441d925a25c08c4485c015b2d9f0338bc9707443e91ff8e161d3d9", - "zh:fee533e81976d0900aa6fa443dc54ef171cbd901847f28a6e8edb1d161fa6fde", + "zh:9f138a702f568cc891ab377a32d1baaf5b3baa93f80e50a0e36dfd642b1a15a4", + "zh:c1e1752ef5d8539e400e297f78a83ddf3d888a40139e48abfbb92d561b524981", + "zh:ce7af121ba5587925ce488d7514269fcab3f77562e9d10195e16359b1be3cf00", + "zh:d78df6b63765f3829f0fc664ca9be3bbcbe3a0b5c072c8b81b259b55530f2d52", + "zh:e14a5f0a5091eb20583763a2e4a75191de0355edf98aaab2904d487124e05877", + "zh:eb893b3c2cc3fc26db278ed9fff10c1c5a1bcdf40b37fe44f6073f79d1a93031", + "zh:f741f29f4d1a570a6ccbf5e139747d417177bc7cd00f039ca657d81d456e304e", ] } From 498e905241d32e9bbf5bee87d26dc5cb4c950531 Mon Sep 17 00:00:00 2001 From: Hamza Aburaneh <32944558+HamzaAburaneh@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:57:37 +0000 Subject: [PATCH 19/19] Combine docker files into one and remove docker-compose --- Dockerfile | 31 +++++++++++++++++++++++++++++++ Dockerfile.client | 18 ------------------ Dockerfile.server | 25 ------------------------- docker-compose.yml | 33 --------------------------------- 4 files changed, 31 insertions(+), 76 deletions(-) create mode 100644 Dockerfile delete mode 100644 Dockerfile.client delete mode 100644 Dockerfile.server delete mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..c4a95378 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +# Use Node.js LTS as the base image +FROM node:lts + +# Set environment variable for MongoDB (can be overridden at runtime) +ENV MONGODB_URI="mongodb://${DOCDB_USERNAME}:${DOCDB_PASSWORD}@${DOCDB_CLUSTER_ENDPOINT}:27017/${DOCDB_DATABASE}?tls=true&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false" + +# Set up client +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm install +COPY ./ ./ + +# Set up server +WORKDIR /workspace +COPY package.json package-lock.json ./ +RUN npm install +COPY api/ ./api/ +COPY config/ ./config/ +COPY models/ ./models/ +COPY agents/ ./agents/ +COPY server/ ./server/ + +# Create start script +RUN echo '#!/bin/sh\ncd /app && npm start &\ncd /workspace/server && npm start' > /start.sh && \ + chmod +x /start.sh + +# Expose both ports +EXPOSE 3000 3001 + +# Start both services +CMD ["/start.sh"] \ No newline at end of file diff --git a/Dockerfile.client b/Dockerfile.client deleted file mode 100644 index 8892999b..00000000 --- a/Dockerfile.client +++ /dev/null @@ -1,18 +0,0 @@ -# Use a Node.js image for the React app -FROM node:lts - -# Set the working directory inside the container -WORKDIR /app - -# Install dependencies -COPY package.json package-lock.json ./ -RUN npm install - -# Copy all files -COPY ./ ./ - -# Expose port 3000 for the React development server -EXPOSE 3000 - -# Start the React development server -CMD ["npm", "start"] \ No newline at end of file diff --git a/Dockerfile.server b/Dockerfile.server deleted file mode 100644 index b4e0d62d..00000000 --- a/Dockerfile.server +++ /dev/null @@ -1,25 +0,0 @@ -# Use a Node.js image for the server -FROM node:lts - -# Set the working directory to match devcontainer workspace -WORKDIR /workspace - -# Copy all required directories maintaining the project structure -COPY api/ ./api/ -COPY config/ ./config/ -COPY models/ ./models/ -COPY agents/ ./agents/ -COPY server/ ./server/ - -# Copy package files and install dependencies -COPY package.json package-lock.json ./ -RUN npm install - -# Set working directory to server for starting the app -WORKDIR /workspace/server - -# Expose the backend server port (3001 by default) -EXPOSE 3001 - -# Start the backend server -CMD ["npm", "start"] diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 75abb078..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,33 +0,0 @@ -services: - client: - build: - context: . - dockerfile: Dockerfile.client - container_name: ai-answers-client - ports: - - '3000:3000' - depends_on: - - server - - server: - build: - context: . - dockerfile: Dockerfile.server - container_name: ai-answers-server - volumes: - - .:/workspace:cached - - server-node-modules:/workspace/server/node_modules - - root-node-modules:/workspace/node_modules - ports: - - '3001:3001' - environment: - # Replace these values with your AWS DocumentDB details - - MONGODB_URI=mongodb://${DOCDB_USERNAME}:${DOCDB_PASSWORD}@${DOCDB_CLUSTER_ENDPOINT}:27017/${DOCDB_DATABASE}?tls=true&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false - -volumes: - server-node-modules: - root-node-modules: - -networks: - default: - name: ai-answers-network