From 4e7c3d83a76107139f8fcd84b23fbc2353b9b467 Mon Sep 17 00:00:00 2001 From: Djalma Araujo Date: Fri, 7 Mar 2025 16:16:42 -0300 Subject: [PATCH 1/3] feat(service): Add Evolution API template --- public/svgs/evolution-api.png | Bin 0 -> 25461 bytes templates/compose/evolution-api.yaml | 160 +++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 public/svgs/evolution-api.png create mode 100644 templates/compose/evolution-api.yaml diff --git a/public/svgs/evolution-api.png b/public/svgs/evolution-api.png new file mode 100644 index 0000000000000000000000000000000000000000..0d26702e9bf08b5dd09160ff36de0823e38e2c6b GIT binary patch literal 25461 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 literal 0 HcmV?d00001 diff --git a/templates/compose/evolution-api.yaml b/templates/compose/evolution-api.yaml new file mode 100644 index 000000000..19ae4477e --- /dev/null +++ b/templates/compose/evolution-api.yaml @@ -0,0 +1,160 @@ +# documentation: https://doc.evolution-api.com/v1/pt/get-started/introduction +# slogan: Evolution API Installation with Postgres and Redis +# tags: evolution-api,evo-api,evolution,whatsapp,api,postgres,redis +# logo: svgs/default.webp +# port: 8080 + +services: + api: + image: 'atendai/evolution-api:latest' + restart: always + depends_on: + - redis + - postgres + environment: + - SERVICE_FQDN_EVO_8080 + - SERVER_URL=$SERVICE_FQDN_EVO + - DB_TYPE=postgresdb + - POSTGRES_DB=${POSTGRES_DB:-postgres} + - DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-postgres} + - DB_POSTGRESDB_HOST=postgres + - DB_POSTGRESDB_PORT=5432 + - DB_POSTGRESDB_USER=$SERVICE_USER_POSTGRES + - DB_POSTGRESDB_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - DATABASE_PROVIDER=postgresql + - DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres} + - DATABASE_CONNECTION_URI=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres} + - DEL_INSTANCE=false + - DATABASE_SAVE_DATA_INSTANCE=true + - DATABASE_SAVE_DATA_NEW_MESSAGE=true + - DATABASE_SAVE_MESSAGE_UPDATE=true + - DATABASE_SAVE_DATA_CONTACTS=true + - DATABASE_SAVE_DATA_CHATS=true + - DATABASE_SAVE_DATA_LABELS=true + - DATABASE_SAVE_DATA_HISTORIC=true + - DATABASE_CONNECTION_CLIENT_NAME=evolution_v2 + - RABBITMQ_ENABLED=false + - RABBITMQ_URI=amqp://admin:admin@rabbitmq:5672/default + - RABBITMQ_EXCHANGE_NAME=evolution_v2 + - RABBITMQ_GLOBAL_ENABLED=false + - RABBITMQ_EVENTS_APPLICATION_STARTUP=false + - RABBITMQ_EVENTS_INSTANCE_CREATE=false + - RABBITMQ_EVENTS_INSTANCE_DELETE=false + - RABBITMQ_EVENTS_QRCODE_UPDATED=false + - RABBITMQ_EVENTS_MESSAGES_SET=false + - RABBITMQ_EVENTS_MESSAGES_UPSERT=true + - RABBITMQ_EVENTS_MESSAGES_EDITED=false + - RABBITMQ_EVENTS_MESSAGES_UPDATE=false + - RABBITMQ_EVENTS_MESSAGES_DELETE=false + - RABBITMQ_EVENTS_SEND_MESSAGE=false + - RABBITMQ_EVENTS_CONTACTS_SET=false + - RABBITMQ_EVENTS_CONTACTS_UPSERT=false + - RABBITMQ_EVENTS_CONTACTS_UPDATE=false + - RABBITMQ_EVENTS_PRESENCE_UPDATE=false + - RABBITMQ_EVENTS_CHATS_SET=false + - RABBITMQ_EVENTS_CHATS_UPSERT=false + - RABBITMQ_EVENTS_CHATS_UPDATE=false + - RABBITMQ_EVENTS_CHATS_DELETE=false + - RABBITMQ_EVENTS_GROUPS_UPSERT=false + - RABBITMQ_EVENTS_GROUP_UPDATE=false + - RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE=false + - RABBITMQ_EVENTS_CONNECTION_UPDATE=true + - RABBITMQ_EVENTS_CALL=false + - RABBITMQ_EVENTS_TYPEBOT_START=false + - RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS=false + - SQS_ENABLED=false + - WEBSOCKET_ENABLED=false + - WEBSOCKET_GLOBAL_EVENTS=false + - WA_BUSINESS_TOKEN_WEBHOOK=evolution + - WA_BUSINESS_URL=https://graph.facebook.com + - WA_BUSINESS_VERSION=v20.0 + - WA_BUSINESS_LANGUAGE=pt_BR + - WEBHOOK_GLOBAL_URL= + - WEBHOOK_GLOBAL_ENABLED=false + - WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false + - WEBHOOK_EVENTS_APPLICATION_STARTUP=false + - WEBHOOK_EVENTS_QRCODE_UPDATED=true + - WEBHOOK_EVENTS_MESSAGES_SET=true + - WEBHOOK_EVENTS_MESSAGES_UPSERT=true + - WEBHOOK_EVENTS_MESSAGES_EDITED=true + - WEBHOOK_EVENTS_MESSAGES_UPDATE=true + - WEBHOOK_EVENTS_MESSAGES_DELETE=true + - WEBHOOK_EVENTS_SEND_MESSAGE=true + - WEBHOOK_EVENTS_CONTACTS_SET=true + - WEBHOOK_EVENTS_CONTACTS_UPSERT=true + - WEBHOOK_EVENTS_CONTACTS_UPDATE=true + - WEBHOOK_EVENTS_PRESENCE_UPDATE=true + - WEBHOOK_EVENTS_CHATS_SET=true + - WEBHOOK_EVENTS_CHATS_UPSERT=true + - WEBHOOK_EVENTS_CHATS_UPDATE=true + - WEBHOOK_EVENTS_CHATS_DELETE=true + - WEBHOOK_EVENTS_GROUPS_UPSERT=true + - WEBHOOK_EVENTS_GROUPS_UPDATE=true + - WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE=true + - WEBHOOK_EVENTS_CONNECTION_UPDATE=true + - WEBHOOK_EVENTS_LABELS_EDIT=true + - WEBHOOK_EVENTS_LABELS_ASSOCIATION=true + - WEBHOOK_EVENTS_CALL=true + - WEBHOOK_EVENTS_TYPEBOT_START=false + - WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false + - WEBHOOK_EVENTS_ERRORS=false + - CONFIG_SESSION_PHONE_CLIENT=Evolution API V2 + - CONFIG_SESSION_PHONE_NAME=Chrome + - CONFIG_SESSION_PHONE_VERSION=2.3000.1015901307 + - QRCODE_LIMIT=30 + - OPENAI_ENABLED=true + - DIFY_ENABLED=true + - TYPEBOT_ENABLED=true + - TYPEBOT_API_VERSION=latest + - CHATWOOT_ENABLED=true + - CHATWOOT_MESSAGE_READ=true + - CHATWOOT_MESSAGE_DELETE=true + - CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres} + - CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=true + - CACHE_REDIS_ENABLED=true + - CACHE_REDIS_URI=redis://redis:6379/6 + - CACHE_REDIS_PREFIX_KEY=evolution_v2 + - CACHE_REDIS_SAVE_INSTANCES=false + - CACHE_LOCAL_ENABLED=false + - S3_ENABLED=false + - AUTHENTICATION_API_KEY=$SERVICE_PASSWORD_EVO + - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true + - LANGUAGE=en + volumes: + - evolution_instances:/evolution/instances + healthcheck: + test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080/health-check"] + interval: 10s + timeout: 5s + retries: 3 + + redis: + image: redis:latest + command: redis-server --port 6379 --appendonly yes + restart: always + volumes: + - evolution_redis:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 30s + timeout: 10s + retries: 5 + + postgres: + image: postgres:16-alpine + command: + - postgres + - -c + - max_connections=1000 + environment: + - POSTGRES_USER=$SERVICE_USER_POSTGRES + - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - POSTGRES_DB=${POSTGRES_DB:-postgres} + restart: always + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $SERVICE_USER_POSTGRES -d ${POSTGRES_DB:-postgres}"] + interval: 30s + timeout: 10s + retries: 5 \ No newline at end of file From dcfd236b8c115edf2955fa81a1e97e59b59f6206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Djalma=20Ara=C3=BAjo?= Date: Fri, 7 Mar 2025 16:21:24 -0300 Subject: [PATCH 2/3] Fix logo path --- templates/compose/evolution-api.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/compose/evolution-api.yaml b/templates/compose/evolution-api.yaml index 19ae4477e..85cd600fb 100644 --- a/templates/compose/evolution-api.yaml +++ b/templates/compose/evolution-api.yaml @@ -1,7 +1,7 @@ # documentation: https://doc.evolution-api.com/v1/pt/get-started/introduction # slogan: Evolution API Installation with Postgres and Redis # tags: evolution-api,evo-api,evolution,whatsapp,api,postgres,redis -# logo: svgs/default.webp +# logo: svgs/evolution-api.png # port: 8080 services: @@ -157,4 +157,4 @@ services: test: ["CMD-SHELL", "pg_isready -U $SERVICE_USER_POSTGRES -d ${POSTGRES_DB:-postgres}"] interval: 30s timeout: 10s - retries: 5 \ No newline at end of file + retries: 5 From d43e50a71890145ebc72d105b8b0786a538bedea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Djalma=20Ara=C3=BAjo?= Date: Fri, 7 Mar 2025 16:22:17 -0300 Subject: [PATCH 3/3] Update evolution-api.yaml --- templates/compose/evolution-api.yaml | 83 ++++++++++++++-------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/templates/compose/evolution-api.yaml b/templates/compose/evolution-api.yaml index 85cd600fb..ed57a1505 100644 --- a/templates/compose/evolution-api.yaml +++ b/templates/compose/evolution-api.yaml @@ -4,9 +4,10 @@ # logo: svgs/evolution-api.png # port: 8080 +version: '3.8' services: api: - image: 'atendai/evolution-api:latest' + image: 'atendai/evolution-api:latest' # Change to specific version if needed. restart: always depends_on: - redis @@ -15,15 +16,14 @@ services: - SERVICE_FQDN_EVO_8080 - SERVER_URL=$SERVICE_FQDN_EVO - DB_TYPE=postgresdb - - POSTGRES_DB=${POSTGRES_DB:-postgres} - - DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-postgres} + - 'DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-postgres}' - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - - DB_POSTGRESDB_USER=$SERVICE_USER_POSTGRES - - DB_POSTGRESDB_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - 'DB_POSTGRESDB_USER=${SERVICE_USER_POSTGRES}' + - 'DB_POSTGRESDB_PASSWORD=${SERVICE_PASSWORD_POSTGRES}' - DATABASE_PROVIDER=postgresql - - DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres} - - DATABASE_CONNECTION_URI=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres} + - 'DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-postgres}' + - 'DATABASE_CONNECTION_URI=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-postgres}' - DEL_INSTANCE=false - DATABASE_SAVE_DATA_INSTANCE=true - DATABASE_SAVE_DATA_NEW_MESSAGE=true @@ -34,7 +34,7 @@ services: - DATABASE_SAVE_DATA_HISTORIC=true - DATABASE_CONNECTION_CLIENT_NAME=evolution_v2 - RABBITMQ_ENABLED=false - - RABBITMQ_URI=amqp://admin:admin@rabbitmq:5672/default + - 'RABBITMQ_URI=amqp://admin:admin@rabbitmq:5672/default' - RABBITMQ_EXCHANGE_NAME=evolution_v2 - RABBITMQ_GLOBAL_ENABLED=false - RABBITMQ_EVENTS_APPLICATION_STARTUP=false @@ -63,13 +63,17 @@ services: - RABBITMQ_EVENTS_TYPEBOT_START=false - RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS=false - SQS_ENABLED=false + - SQS_ACCESS_KEY_ID= + - SQS_SECRET_ACCESS_KEY= + - SQS_ACCOUNT_ID= + - SQS_REGION= - WEBSOCKET_ENABLED=false - WEBSOCKET_GLOBAL_EVENTS=false - WA_BUSINESS_TOKEN_WEBHOOK=evolution - - WA_BUSINESS_URL=https://graph.facebook.com + - 'WA_BUSINESS_URL=https://graph.facebook.com' - WA_BUSINESS_VERSION=v20.0 - WA_BUSINESS_LANGUAGE=pt_BR - - WEBHOOK_GLOBAL_URL= + - "WEBHOOK_GLOBAL_URL=''" - WEBHOOK_GLOBAL_ENABLED=false - WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false - WEBHOOK_EVENTS_APPLICATION_STARTUP=false @@ -98,7 +102,8 @@ services: - WEBHOOK_EVENTS_TYPEBOT_START=false - WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false - WEBHOOK_EVENTS_ERRORS=false - - CONFIG_SESSION_PHONE_CLIENT=Evolution API V2 + - WEBHOOK_EVENTS_ERRORS_WEBHOOK= + - 'CONFIG_SESSION_PHONE_CLIENT=Evolution API V2' - CONFIG_SESSION_PHONE_NAME=Chrome - CONFIG_SESSION_PHONE_VERSION=2.3000.1015901307 - QRCODE_LIMIT=30 @@ -109,52 +114,48 @@ services: - CHATWOOT_ENABLED=true - CHATWOOT_MESSAGE_READ=true - CHATWOOT_MESSAGE_DELETE=true - - CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres} + - 'CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-chatwoot}' - CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=true - CACHE_REDIS_ENABLED=true - - CACHE_REDIS_URI=redis://redis:6379/6 + - 'CACHE_REDIS_URI=redis://redis:6379/6' - CACHE_REDIS_PREFIX_KEY=evolution_v2 - CACHE_REDIS_SAVE_INSTANCES=false - CACHE_LOCAL_ENABLED=false - S3_ENABLED=false - - AUTHENTICATION_API_KEY=$SERVICE_PASSWORD_EVO + - S3_ACCESS_KEY= + - S3_SECRET_KEY= + - S3_BUCKET=evolution + - S3_PORT=443 + - S3_ENDPOINT=files.site.com + - S3_USE_SSL=true + - 'AUTHENTICATION_API_KEY=${SERVICE_AUTHENTICATION_API_KEY}' - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true - LANGUAGE=en volumes: - - evolution_instances:/evolution/instances - healthcheck: - test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080/health-check"] - interval: 10s - timeout: 5s - retries: 3 - + - 'evolution_instances:/evolution/instances' + expose: + - 8080 redis: - image: redis:latest - command: redis-server --port 6379 --appendonly yes + image: 'redis:latest' + command: "redis-server --port 6379 --appendonly yes\n" restart: always volumes: - - evolution_redis:/data - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 30s - timeout: 10s - retries: 5 - + - 'evolution_redis:/data' postgres: - image: postgres:16-alpine + image: 'postgres:16-alpine' command: - postgres - - -c + - '-c' - max_connections=1000 environment: - - POSTGRES_USER=$SERVICE_USER_POSTGRES - - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - - POSTGRES_DB=${POSTGRES_DB:-postgres} + - 'POSTGRES_USER=${SERVICE_USER_POSTGRES}' + - 'POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}' + - 'POSTGRES_DB=${POSTGRES_DB:-postgres}' + - 'AUTHENTICATION_API_KEY=${SERVICE_AUTHENTICATION_API_KEY}' restart: always volumes: - - postgres_data:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U $SERVICE_USER_POSTGRES -d ${POSTGRES_DB:-postgres}"] - interval: 30s - timeout: 10s - retries: 5 + - 'postgres_data:/var/lib/postgresql/data' +volumes: + evolution_instances: null + evolution_redis: null + postgres_data: null