From 902ba822b00b446973193d37f2f0a4c568bebd56 Mon Sep 17 00:00:00 2001 From: Bui Dung <78098285+Thdeathz@users.noreply.github.com> Date: Thu, 28 Dec 2023 03:39:16 +0700 Subject: [PATCH] feat(*): setup auto deploy (#44) --- .github/workflows/aws-deploy.yml | 111 ++++++++++++++++++ client/.dockerignore | 1 + client/README.md | 59 ++++------ .../battle/components/OngoingBattle/index.tsx | 1 - deploy/client.Dockerfile | 15 +++ deploy/nginx/Dockerfile | 7 ++ deploy/nginx/nginx.conf | 30 +++++ deploy/server.Dockerfile | 15 +++ docker-compose.prod.yml | 84 +++++++++++++ server/.dockerignore | 1 + server/README.md | 68 ++++------- server/src/api/services/game.service.ts | 2 +- 12 files changed, 310 insertions(+), 84 deletions(-) create mode 100644 .github/workflows/aws-deploy.yml create mode 100644 deploy/client.Dockerfile create mode 100644 deploy/nginx/Dockerfile create mode 100644 deploy/nginx/nginx.conf create mode 100644 deploy/server.Dockerfile create mode 100644 docker-compose.prod.yml diff --git a/.github/workflows/aws-deploy.yml b/.github/workflows/aws-deploy.yml new file mode 100644 index 0000000..7288c23 --- /dev/null +++ b/.github/workflows/aws-deploy.yml @@ -0,0 +1,111 @@ +name: Build and Deploy to AWS + +on: + push: + branches: + - main + +env: + # root env + POSTGRES_PORT: ${{ secrets.POSTGRES_PORT }} + POSTGRES_USER: ${{ secrets.POSTGRES_USER }} + POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} + POSTGRES_DB: ${{ secrets.POSTGRES_DB }} + REDIS_PORT: ${{ secrets.REDIS_PORT }} + REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }} + # client env + VITE_API_URL: ${{ secrets.VITE_API_URL }} + VITE_SOCKET_URL: ${{ secrets.VITE_SOCKET_URL }} + VITE_FIREBASE_APP_ID: ${{ secrets.VITE_FIREBASE_APP_ID }} + VITE_FIREBASE_API_KEY: ${{ secrets.VITE_FIREBASE_API_KEY }} + VITE_FIREBASE_AUTH_DOMAIN: ${{ secrets.VITE_FIREBASE_AUTH_DOMAIN }} + VITE_FIREBASE_PROJECT_ID: ${{ secrets.VITE_FIREBASE_PROJECT_ID }} + VITE_FIREBASE_STORAGE_BUCKET: ${{ secrets.VITE_FIREBASE_STORAGE_BUCKET }} + VITE_FIREBASE_MESSAGE_SENDER_ID: ${{ secrets.VITE_FIREBASE_MESSAGE_SENDER_ID }} + VITE_FIREBASE_MEASUREMENT_ID: ${{ secrets.VITE_FIREBASE_MEASUREMENT_ID }} + # server env + APP_URL: ${{ secrets.APP_URL }} + DATABASE_URL: ${{ secrets.DATABASE_URL }} + REDIS_URL: ${{ secrets.REDIS_URL }} + ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }} + REFRESH_TOKEN_SECRET: ${{ secrets.REFRESH_TOKEN_SECRET }} + FIREBASE_PROJECT_ID: ${{ secrets.FIREBASE_PROJECT_ID }} + FIREBASE_PRIVATE_KEY_ID: ${{ secrets.FIREBASE_PRIVATE_KEY_ID }} + FIREBASE_PRIVATE_KEY: ${{ secrets.FIREBASE_PRIVATE_KEY }} + FIREBASE_CLIENT_EMAIL: ${{ secrets.FIREBASE_CLIENT_EMAIL }} + FIREBASE_CLIENT_ID: ${{ secrets.FIREBASE_CLIENT_ID }} + FIREBASE_AUTH_URI: ${{ secrets.FIREBASE_AUTH_URI }} + FIREBASE_TOKEN_URI: ${{ secrets.FIREBASE_TOKEN_URI }} + FIREBASE_AUTH_PROVIDER_X509_CERT_URL: ${{ secrets.FIREBASE_AUTH_PROVIDER_X509_CERT_URL }} + FIREBASE_CLIENT_X509_CERT_URL: ${{ secrets.FIREBASE_CLIENT_X509_CERT_URL }} + MAILER_EMAIL: ${{ secrets.MAILER_EMAIL }} + MAILER_PASSWORD: ${{ secrets.MAILER_PASSWORD }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install client dependencies + working-directory: ./client + run: | + yarn install + export VITE_API_URL=$VITE_API_URL + export VITE_SOCKET_URL=$VITE_SOCKET_URL + export VITE_FIREBASE_APP_ID=$VITE_FIREBASE_APP_ID + export VITE_FIREBASE_API_KEY=$VITE_FIREBASE_API_KEY + export VITE_FIREBASE_AUTH_DOMAIN=$VITE_FIREBASE_AUTH_DOMAIN + export VITE_FIREBASE_PROJECT_ID=$VITE_FIREBASE_PROJECT_ID + export VITE_FIREBASE_STORAGE_BUCKET=$VITE_FIREBASE_STORAGE_BUCKET + export VITE_FIREBASE_MESSAGE_SENDER_ID=$VITE_FIREBASE_MESSAGE_SENDER_ID + export VITE_FIREBASE_MEASUREMENT_ID=$VITE_FIREBASE_MEASUREMENT_ID + + - name: Install server dependencies + working-directory: ./server + run: | + yarn install + export APP_URL=$APP_URL + export DATABASE_URL=$DATABASE_URL + export REDIS_URL=$REDIS_URL + export ACCESS_TOKEN_SECRET=$ACCESS_TOKEN_SECRET + export REFRESH_TOKEN_SECRET=$REFRESH_TOKEN_SECRET + export FIREBASE_PROJECT_ID=$FIREBASE_PROJECT_ID + export FIREBASE_PRIVATE_KEY_ID=$FIREBASE_PRIVATE_KEY_ID + export FIREBASE_PRIVATE_KEY=$FIREBASE_PRIVATE_KEY + export FIREBASE_CLIENT_EMAIL=$FIREBASE_CLIENT_EMAIL + export FIREBASE_CLIENT_ID=$FIREBASE_CLIENT_ID + export FIREBASE_AUTH_URI=$FIREBASE_AUTH_URI + export FIREBASE_TOKEN_URI=$FIREBASE_TOKEN_URI + export FIREBASE_AUTH_PROVIDER_X509_CERT_URL=$FIREBASE_AUTH_PROVIDER_X509_CERT_URL + export FIREBASE_CLIENT_X509_CERT_URL=$FIREBASE_CLIENT_X509_CERT_URL + export MAILER_EMAIL=$MAILER_EMAIL + export MAILER_PASSWORD=$MAILER_PASSWORD + + - name: Build client image + working-directory: ./client + run: docker build -t thdeathz/kanjigami-prod:client-${{github.run_number}} -t thdeathz/kanjigami-prod:client-latest -f ../deploy/client.Dockerfile . + + - name: Build server image + working-directory: ./server + run: docker build -t thdeathz/kanjigami-prod:server-${{github.run_number}} -t thdeathz/kanjigami-prod:server-latest -f ../deploy/server.Dockerfile . + + - name: Build nginx image + working-directory: ./deploy/nginx + run: docker build -t thdeathz/kanjigami-prod:nginx-${{github.run_number}} -t thdeathz/kanjigami-prod:nginx-latest . + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.docker-auth.DOCKER_USERNAME }} + password: ${{ secrets.docker-auth.DOCKER_PASSWORD }} + + - name: Push Docker Images to Docker Hub + run: | + docker push thdeathz/kanjigami-prod:client-${{github.run_number}} + docker push thdeathz/kanjigami-prod:client-latest + docker push thdeathz/kanjigami-prod:server-${{github.run_number}} + docker push thdeathz/kanjigami-prod:server-latest + docker push thdeathz/kanjigami-prod:nginx-${{github.run_number}} + docker push thdeathz/kanjigami-prod:nginx-latest diff --git a/client/.dockerignore b/client/.dockerignore index b6137e2..81f8432 100644 --- a/client/.dockerignore +++ b/client/.dockerignore @@ -1,3 +1,4 @@ +dev-dist node_modules Dockerfile diff --git a/client/README.md b/client/README.md index c6cbf4d..1c32576 100644 --- a/client/README.md +++ b/client/README.md @@ -1,44 +1,25 @@ -# React + Typescript - -## Features - -- Ant Design (Antd) and Tailwind CSS for user interface. -- Redux Toolkit for state management. -- RTK Query for making API calls. - -## Getting Started - -Install the dependencies: - -```bash -yarn -``` - -Create a `.env` file in the client folder and add the following variables: - -```bash -VITE_NODE_ENV= -VITE_API_URL= -``` - -Start the client: - -```bash -yarn dev -``` - -The client will start running at `http://localhost:3000`. - ## Folder Structure ``` +├── public # Static files (favicon, robots.txt, etc.) ├── src -│ ├── @types # Contains global types -│ ├── app # Contains redux store and rtk query configuration -│ ├── components # Contains reusable components -│ ├── config # Contains enum variable -│ ├── features # Contains feature modules (e.g., Redux slices) -│ └── hooks # Contains custom hook -├── App.tsx # Entry point of the application -└── README.md # This file +│ ├── @types # Global types +│ ├── app # Redux store and rtk query configuration +│ ├── assets # Static assets (images, fonts, etc.) +│ ├── components # Reusable components +│ ├── config # Enum variables, constants, and configuration +│ ├── features # Feature modules (e.g., Redux slices) +│ │ ├── auth # Auth feature module +│ │ │ ├── @types # Types for auth feature module +│ │ │ ├── components # Components for auth feature module +│ │ │ ├── store +│ │ │ │ ├── authService.ts # Auth service to call API +│ │ │ │ └── authSlice.ts # Auth state and reducer +│ │ │ ├── utils # Utility functions for auth feature module +│ │ │ └── ...tsx # Pages for auth feature module +│ │ └── ... +│ ├── hooks # Global custom hooks +│ └── utils # Utility functions +├── App.tsx # Application route setup +└── main.tsx # Entry point ``` diff --git a/client/src/features/battle/components/OngoingBattle/index.tsx b/client/src/features/battle/components/OngoingBattle/index.tsx index c3238d3..da27833 100644 --- a/client/src/features/battle/components/OngoingBattle/index.tsx +++ b/client/src/features/battle/components/OngoingBattle/index.tsx @@ -106,7 +106,6 @@ function OngoingBattle({ eventId, refetch }: PropsType) {
- <>{console.log('==> joined users', joinedUser)} {!isFirstRoundStarted ? ( <>