diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..c6ec2a5 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,77 @@ +name: Docker Image CI + +on: + push: + branches: ["master" ] + pull_request: + branches: ["master"] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Docker Checkout + uses: actions/checkout@v3 + + - name: Docker Login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and Push + env: + POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} + POSTGRES_USER: ${{ secrets.POSTGRES_USER }} + POSTGRES_DB: ${{ secrets.POSTGRES_DB }} + NEXT_PORT: ${{ secrets.NEXT_PORT }} + DB_NAME: ${{ secrets.DB_NAME }} + HOME: ${{ secrets.HOME }} + SERVER_PORT: ${{ secrets.SERVER_PORT }} + AUTH0_SECRET: ${{ secrets.AUTH0_SECRET }} + AUTH0_BASE_URL: ${{ secrets.AUTH0_BASE_URL }} + AUTH0_ISSUER_BASE_URL: ${{ secrets.AUTH0_ISSUER_BASE_URL }} + AUTH0_CLIENT_ID: ${{ secrets.AUTH0_CLIENT_ID }} + AUTH0_CLIENT_SECRET: ${{ secrets.AUTH0_CLIENT_SECRET }} + LOCAL_DATABASE_URL: ${{ secrets.LOCAL_DATABASE_URL }} + REMOTE_DATABASE_URL: ${{ secrets.REMOTE_DATABASE_URL }} + run: | + docker compose build + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} + docker compose push + + - name: copy file via ssh password + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.AWS_HOST }} + username: ${{ secrets.AWS_USERNAME }} + key: ${{ secrets.AWS_KEYPAIR }} + source: "docker-compose.yaml" + target: "/home/ubuntu/" + + - name: SSH to AWS Instance and Pull Image + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.AWS_HOST }} + username: ${{ secrets.AWS_USERNAME }} + key: ${{ secrets.AWS_KEYPAIR }} + script: | + touch .env + echo "POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" > .env + echo "POSTGRES_USER=${{ secrets.POSTGRES_USER }}" >> .env + echo "POSTGRES_DB=${{ secrets.POSTGRES_DB }}" >> .env + echo "NEXT_PORT=${{ secrets.NEXT_PORT }}" >> .env + echo "DB_NAME=${{ secrets.DB_NAME }}" >> .env + echo "HOME=${{ secrets.HOME }}" >> .env + echo "SERVER_PORT=${{ secrets.SERVER_PORT }}" >> .env + echo "AUTH0_SECRET=${{ secrets.AUTH0_SECRET }}" >> .env + echo "AUTH0_BASE_URL=http://ec2-13-233-97-162.ap-south-1.compute.amazonaws.com:3000" >> .env + echo "AUTH0_ISSUER_BASE_URL=${{ secrets.AUTH0_ISSUER_BASE_URL }}" >> .env + echo "AUTH0_CLIENT_ID=${{ secrets.AUTH0_CLIENT_ID }}" >> .env + echo "AUTH0_CLIENT_SECRET=${{ secrets.AUTH0_CLIENT_SECRET }}" >> .env + echo "LOCAL_DATABASE_URL=${{ secrets.LOCAL_DATABASE_URL }}" >> .env + echo "REMOTE_DATABASE_URL=${{ secrets.REMOTE_DATABASE_URL }}" >> .env + sudo docker compose down --rmi all --volumes || true + sudo docker compose pull + sudo docker compose down || true + sudo docker compose up -d diff --git a/Dockerfile b/Dockerfile index 7bc5e65..2f676da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,18 @@ -FROM node:latest +FROM node:20-alpine AS builder WORKDIR /app COPY package.json ./ RUN npm install - COPY . . +RUN npx prisma generate +RUN npm run build +RUN npm prune --production +# --omit=dev + + +FROM node:20-alpine +WORKDIR /app +COPY --from=builder /app/package.json ./package.json +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/public ./public EXPOSE 3000 -RUN npx prisma generate \ No newline at end of file diff --git a/README.md b/README.md index 73ea1f0..d9e73fb 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ You can start editing the page by modifying `app/page.tsx`. The page auto-update This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. -## Learn More +## Learn More To learn more about Next.js, take a look at the following resources: diff --git a/docker-compose.yaml b/docker-compose.yaml index 8ee650f..5dd0e5f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,4 +1,3 @@ -version: "3.0" services: postgresdb: image: postgres @@ -12,23 +11,29 @@ services: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + retries: 5 + start_period: 30s networks: - - internalnet + - nextinternalnet volumes: - - C:/Users/promact/postgresdatabase:/var/lib/postgresql/data + - $HOME/postgresdatabase:/var/lib/postgresql/data - nextjsapp: + nextapp: build: context: ./ dockerfile: Dockerfile - image: nextjsapp:1.0 + image: jainilp12/nextapp:2.0 expose: - ${SERVER_PORT} ports: - - 3000:${SERVER_PORT} + - 80:${SERVER_PORT} command: > - sh -c "npx prisma db push - npm run dev" + sh -c " + npm run start" + environment: DATABASE_URL: ${REMOTE_DATABASE_URL} AUTH0_SECRET: ${AUTH0_SECRET} @@ -36,11 +41,13 @@ services: AUTH0_ISSUER_BASE_URL: ${AUTH0_ISSUER_BASE_URL} AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID} AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET} + depends_on: - - postgresdb + postgresdb: + condition: service_healthy networks: - - internalnet + - nextinternalnet networks: - internalnet: - driver: bridge \ No newline at end of file + nextinternalnet: + driver: bridge