From c2e5c44a9c0acdd663c1f9cb138a2c3b8996b2f8 Mon Sep 17 00:00:00 2001 From: Lucas Tonon Date: Sun, 17 Nov 2024 17:21:52 -0300 Subject: [PATCH] init --- .env.example | 6 +- .github/workflows/publish_docker_image.yml | 48 ------ .../publish_docker_image_homolog.yml | 48 ------ .../workflows/publish_docker_image_latest.yml | 48 ------ .../workflows/website-backend-cloudrun.yml | 86 +++++++++++ .gitignore | 4 +- docker-compose.yaml | 66 ++++---- prod.Dockerfile | 141 ++++++++++++++++++ 8 files changed, 266 insertions(+), 181 deletions(-) delete mode 100644 .github/workflows/publish_docker_image.yml delete mode 100644 .github/workflows/publish_docker_image_homolog.yml delete mode 100644 .github/workflows/publish_docker_image_latest.yml create mode 100644 .github/workflows/website-backend-cloudrun.yml create mode 100644 prod.Dockerfile diff --git a/.env.example b/.env.example index 54996d0f..832edad7 100644 --- a/.env.example +++ b/.env.example @@ -183,7 +183,7 @@ CONFIG_SESSION_PHONE_VERSION=2.3000.1015901307 # Set qrcode display limit QRCODE_LIMIT=30 # Color of the QRCode on base64 -QRCODE_COLOR='#175197' +QRCODE_COLOR='#000000' # Typebot - Environment variables TYPEBOT_ENABLED=false @@ -210,13 +210,13 @@ DIFY_ENABLED=false # Cache - Environment variables # Redis Cache enabled -CACHE_REDIS_ENABLED=true +CACHE_REDIS_ENABLED=false CACHE_REDIS_URI=redis://redis:6379/6 CACHE_REDIS_TTL=604800 # Prefix serves to differentiate data from one installation to another that are using the same redis CACHE_REDIS_PREFIX_KEY=evolution # Enabling this variable will save the connection information in Redis and not in the database. -CACHE_REDIS_SAVE_INSTANCES=false +CACHE_REDIS_SAVE_INSTANCES=true # Local Cache enabled CACHE_LOCAL_ENABLED=false diff --git a/.github/workflows/publish_docker_image.yml b/.github/workflows/publish_docker_image.yml deleted file mode 100644 index 68a08a31..00000000 --- a/.github/workflows/publish_docker_image.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Build Docker image - -on: - push: - tags: - - "*.*.*" - -jobs: - build_deploy: - name: Build and Deploy - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: atendai/evolution-api - tags: type=semver,pattern=v{{version}} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v5 - with: - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} \ No newline at end of file diff --git a/.github/workflows/publish_docker_image_homolog.yml b/.github/workflows/publish_docker_image_homolog.yml deleted file mode 100644 index 77032dc9..00000000 --- a/.github/workflows/publish_docker_image_homolog.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Build Docker image - -on: - push: - branches: - - develop - -jobs: - build_deploy: - name: Build and Deploy - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: atendai/evolution-api - tags: homolog - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v5 - with: - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/publish_docker_image_latest.yml b/.github/workflows/publish_docker_image_latest.yml deleted file mode 100644 index 641dc5e0..00000000 --- a/.github/workflows/publish_docker_image_latest.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Build Docker image - -on: - push: - branches: - - main - -jobs: - build_deploy: - name: Build and Deploy - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: atendai/evolution-api - tags: latest - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v5 - with: - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/website-backend-cloudrun.yml b/.github/workflows/website-backend-cloudrun.yml new file mode 100644 index 00000000..c15f2c7a --- /dev/null +++ b/.github/workflows/website-backend-cloudrun.yml @@ -0,0 +1,86 @@ +name: Deploying API to Cloud Run + +on: + pull_request: + branches: ["main", "dev", "qa"] + paths: + - "**" + +env: + PROJECT_ID: skysales-ai + GAR_LOCATION: us-central1 + CR_SERVICE: wpp-provider-api + SERVICE: klaus-cloudrun-service + REGION: us-central1 + +jobs: + deploy-backend: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Google Cloud SDK + uses: google-github-actions/setup-gcloud@v2 + with: + project_id: ${{ env.PROJECT_ID }} + service_account_key: ${{ secrets.GCP_SA_KEY }} + export_default_credentials: true + + - name: Docker Auth + uses: "docker/login-action@v1" + with: + username: _json_key + password: "${{ secrets.GCP_SA_KEY }}" + registry: "${{ env.GAR_LOCATION }}-docker.pkg.dev" + + - name: Build and Push Container + run: |- + docker build \ + --build-arg SERVER_TYPE=http \ + --build-arg SERVER_PORT=8080 \ + --build-arg SERVER_URL=http://localhost:8080 \ + --build-arg CORS_ORIGIN=* \ + --build-arg CORS_METHODS=GET,POST,PUT,DELETE \ + --build-arg CORS_CREDENTIALS=true \ + --build-arg LOG_LEVEL=ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,DARK,WEBHOOKS,WEBSOCKET \ + --build-arg LOG_COLOR=true \ + --build-arg LOG_BAILEYS=error \ + --build-arg EVENT_EMITTER_MAX_LISTENERS=50 \ + --build-arg DEL_INSTANCE=false \ + --build-arg DATABASE_PROVIDER=postgresql \ + --build-arg DATABASE_CONNECTION_CLIENT_NAME=evolution_exchange \ + --build-arg DATABASE_SAVE_DATA_INSTANCE=true \ + --build-arg DATABASE_SAVE_DATA_NEW_MESSAGE=true \ + --build-arg DATABASE_SAVE_MESSAGE_UPDATE=true \ + --build-arg DATABASE_SAVE_DATA_CONTACTS=true \ + --build-arg DATABASE_SAVE_DATA_CHATS=true \ + --build-arg DATABASE_SAVE_DATA_LABELS=true \ + --build-arg DATABASE_SAVE_DATA_HISTORIC=true \ + --build-arg DATABASE_SAVE_IS_ON_WHATSAPP=true \ + --build-arg DATABASE_SAVE_IS_ON_WHATSAPP_DAYS=7 \ + --build-arg DATABASE_DELETE_MESSAGE=true \ + --build-arg AUTHENTICATION_API_KEY=2325CBB2-A2BB-4F98-8D88-D0B513435C7F \ + --build-arg AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true \ + --build-arg LANGUAGE=en \ + -t "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.SERVICE }}/wpp-provider-api:${{ github.sha }}" \ + --file ./prod.Dockerfile \ + ./ + docker push "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.SERVICE }}/wpp-provider-api:${{ github.sha }}" + + - name: Authenticate gcloud + uses: "google-github-actions/auth@v2" + with: + credentials_json: ${{ secrets.GCP_SA_KEY }} + service_account: "github-actions@skysales-ai.iam.gserviceaccount.com" + + - name: Deploy to Cloud Run + uses: google-github-actions/deploy-cloudrun@v2.3.0 + with: + service: ${{ env.CR_SERVICE }} + region: ${{ env.REGION }} + image: "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.SERVICE }}/wpp-provider-api:${{ github.sha }}" + secrets: | + DATABASE_CONNECTION_URI=WPP_API_PG_STRING:latest + - name: Show Output + run: echo ${{ steps.deploy.outputs.url }} diff --git a/.gitignore b/.gitignore index 28ec8a55..54221f4a 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,6 @@ lerna-debug.log* /prisma/migrations/* -pgadmin/* \ No newline at end of file +pgadmin/* +.DS_Store + diff --git a/docker-compose.yaml b/docker-compose.yaml index 67bfaaf9..4b0d8129 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,7 +5,7 @@ services: restart: always depends_on: - redis - - postgres + # - postgres ports: - 8080:8080 volumes: @@ -32,39 +32,39 @@ services: - 6379:6379 - postgres: - container_name: postgres - image: postgres:15 - networks: - - evolution-net - command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"] - restart: always - ports: - - 5432:5432 - environment: - - POSTGRES_USER=user - - POSTGRES_PASSWORD=pass - - POSTGRES_DB=evolution - - POSTGRES_HOST_AUTH_METHOD=trust - volumes: - - postgres_data:/var/lib/postgresql/data - expose: - - 5432 + # postgres: + # container_name: postgres + # image: postgres:15 + # networks: + # - evolution-net + # command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"] + # restart: always + # ports: + # - 5432:5432 + # environment: + # - POSTGRES_USER=user + # - POSTGRES_PASSWORD=pass + # - POSTGRES_DB=evolution + # - POSTGRES_HOST_AUTH_METHOD=trust + # volumes: + # - postgres_data:/var/lib/postgresql/data + # expose: + # - 5432 - pgadmin: - image: dpage/pgadmin4 - container_name: pgadmin-container - environment: - PGADMIN_DEFAULT_EMAIL: user@example.com - PGADMIN_DEFAULT_PASSWORD: adm - volumes: - - ./pgadmin:/var/lib/pgadmin - ports: - - "5050:80" - depends_on: - - postgres - networks: - - evolution-net + # pgadmin: + # image: dpage/pgadmin4 + # container_name: pgadmin-container + # environment: + # PGADMIN_DEFAULT_EMAIL: user@example.com + # PGADMIN_DEFAULT_PASSWORD: adm + # volumes: + # - ./pgadmin:/var/lib/pgadmin + # ports: + # - "5050:80" + # depends_on: + # - postgres + # networks: + # - evolution-net volumes: diff --git a/prod.Dockerfile b/prod.Dockerfile new file mode 100644 index 00000000..43e8ffe7 --- /dev/null +++ b/prod.Dockerfile @@ -0,0 +1,141 @@ +# Stage 1: Build +FROM node:20-alpine AS builder + +RUN apk update && \ + apk add git ffmpeg wget curl bash + +LABEL version="2.2.0" description="API to control WhatsApp features through HTTP requests." +LABEL maintainer="Davidson Gomes" git="https://github.com/DavidsonGomes" +LABEL contact="contato@atendai.com" + +WORKDIR /evolution + +COPY ./package.json ./tsconfig.json ./ + +RUN npm install -f + +COPY ./src ./src +COPY ./public ./public +COPY ./prisma ./prisma +COPY ./manager ./manager +COPY ./runWithProvider.js ./ +COPY ./tsup.config.ts ./ + +COPY ./Docker ./Docker + +RUN chmod +x ./Docker/scripts/* && dos2unix ./Docker/scripts/* + +RUN ./Docker/scripts/generate_database.sh + +RUN npm run build + +# Stage 2: Final +FROM node:20-alpine AS final + +RUN apk update && \ + apk add tzdata ffmpeg bash + +ENV TZ=America/Sao_Paulo + +WORKDIR /evolution + +# Copy necessary files from builder +COPY --from=builder /evolution/package.json ./package.json +COPY --from=builder /evolution/package-lock.json ./package-lock.json +COPY --from=builder /evolution/node_modules ./node_modules +COPY --from=builder /evolution/dist ./dist +COPY --from=builder /evolution/prisma ./prisma +COPY --from=builder /evolution/manager ./manager +COPY --from=builder /evolution/public ./public +COPY --from=builder /evolution/Docker ./Docker +COPY --from=builder /evolution/runWithProvider.js ./runWithProvider.js +COPY --from=builder /evolution/tsup.config.ts ./tsup.config.ts + +# Accept build arguments and set as environment variables +# Server Configuration +ARG SERVER_TYPE +ARG SERVER_PORT +ARG SERVER_URL + +ENV SERVER_TYPE=${SERVER_TYPE} +ENV SERVER_PORT=${SERVER_PORT} +ENV SERVER_URL=${SERVER_URL} + +# CORS Configuration +ARG CORS_ORIGIN +ARG CORS_METHODS +ARG CORS_CREDENTIALS + +ENV CORS_ORIGIN=${CORS_ORIGIN} +ENV CORS_METHODS=${CORS_METHODS} +ENV CORS_CREDENTIALS=${CORS_CREDENTIALS} + +# Logging Configuration +ARG LOG_LEVEL +ARG LOG_COLOR +ARG LOG_BAILEYS + +ENV LOG_LEVEL=${LOG_LEVEL} +ENV LOG_COLOR=${LOG_COLOR} +ENV LOG_BAILEYS=${LOG_BAILEYS} + +# Event Emitter Configuration +ARG EVENT_EMITTER_MAX_LISTENERS + +ENV EVENT_EMITTER_MAX_LISTENERS=${EVENT_EMITTER_MAX_LISTENERS} + +# Instance Deletion Configuration +ARG DEL_INSTANCE + +ENV DEL_INSTANCE=${DEL_INSTANCE} + +# Database Configuration +ARG DATABASE_PROVIDER +ARG DATABASE_CONNECTION_URI +ARG DATABASE_CONNECTION_CLIENT_NAME + +ENV DATABASE_PROVIDER=${DATABASE_PROVIDER} +ENV DATABASE_CONNECTION_URI=${DATABASE_CONNECTION_URI} +ENV DATABASE_CONNECTION_CLIENT_NAME=${DATABASE_CONNECTION_CLIENT_NAME} + +# Database Save Options +ARG DATABASE_SAVE_DATA_INSTANCE +ARG DATABASE_SAVE_DATA_NEW_MESSAGE +ARG DATABASE_SAVE_MESSAGE_UPDATE +ARG DATABASE_SAVE_DATA_CONTACTS +ARG DATABASE_SAVE_DATA_CHATS +ARG DATABASE_SAVE_DATA_LABELS +ARG DATABASE_SAVE_DATA_HISTORIC +ARG DATABASE_SAVE_IS_ON_WHATSAPP +ARG DATABASE_SAVE_IS_ON_WHATSAPP_DAYS +ARG DATABASE_DELETE_MESSAGE + +ENV DATABASE_SAVE_DATA_INSTANCE=${DATABASE_SAVE_DATA_INSTANCE} +ENV DATABASE_SAVE_DATA_NEW_MESSAGE=${DATABASE_SAVE_DATA_NEW_MESSAGE} +ENV DATABASE_SAVE_MESSAGE_UPDATE=${DATABASE_SAVE_MESSAGE_UPDATE} +ENV DATABASE_SAVE_DATA_CONTACTS=${DATABASE_SAVE_DATA_CONTACTS} +ENV DATABASE_SAVE_DATA_CHATS=${DATABASE_SAVE_DATA_CHATS} +ENV DATABASE_SAVE_DATA_LABELS=${DATABASE_SAVE_DATA_LABELS} +ENV DATABASE_SAVE_DATA_HISTORIC=${DATABASE_SAVE_DATA_HISTORIC} +ENV DATABASE_SAVE_IS_ON_WHATSAPP=${DATABASE_SAVE_IS_ON_WHATSAPP} +ENV DATABASE_SAVE_IS_ON_WHATSAPP_DAYS=${DATABASE_SAVE_IS_ON_WHATSAPP_DAYS} +ENV DATABASE_DELETE_MESSAGE=${DATABASE_DELETE_MESSAGE} + +# Authentication Configuration +ARG AUTHENTICATION_API_KEY +ARG AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES + +ENV AUTHENTICATION_API_KEY=${AUTHENTICATION_API_KEY} +ENV AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=${AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES} + +# Language Configuration +ARG LANGUAGE + +ENV LANGUAGE=${LANGUAGE} + +# Additional Environment Variables +ENV DOCKER_ENV=true + +EXPOSE 8080 + +ENTRYPOINT ["/bin/bash", "-c", ". ./Docker/scripts/deploy_database.sh && npm run start:prod" ]