diff --git a/.github/workflows/aws-deploy.yml b/.github/workflows/aws-deploy.yml new file mode 100644 index 0000000..e6a63d1 --- /dev/null +++ b/.github/workflows/aws-deploy.yml @@ -0,0 +1,123 @@ +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 thdeathzz/kanjigami-prod:client-${{github.run_number}} -t thdeathzz/kanjigami-prod:client-latest -f ../deploy/client.Dockerfile . + + - name: Build server image + working-directory: ./server + run: docker build -t thdeathzz/kanjigami-prod:server-${{github.run_number}} -t thdeathzz/kanjigami-prod:server-latest -f ../deploy/server.Dockerfile . + + - name: Build nginx image + working-directory: ./deploy/nginx + run: docker build -t thdeathzz/kanjigami-prod:nginx-${{github.run_number}} -t thdeathzz/kanjigami-prod:nginx-latest . + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + access-token: ${{ secrets.DOCKER_ACCESS_TOKEN }} + + - name: Push Docker Images to Docker Hub + run: | + docker push thdeathzz/kanjigami-prod:client-${{github.run_number}} + docker push thdeathzz/kanjigami-prod:client-latest + docker push thdeathzz/kanjigami-prod:server-${{github.run_number}} + docker push thdeathzz/kanjigami-prod:server-latest + docker push thdeathzz/kanjigami-prod:nginx-${{github.run_number}} + docker push thdeathzz/kanjigami-prod:nginx-latest + + - name: Deploy to Elastic Beanstalk + uses: einaregilsson/beanstalk-deploy@v21 + with: + aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + application_name: ${{ secrets.EB_APP_NAME }} + environment_name: ${{ secrets.EB_ENV_NAME }} + region: ${{ secrets.EB_REGION }} + version_label: 'version-${{ github.run_number }}' + deployment_package: docker-compose.prod.yml 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 ? ( <>