Created
September 30, 2025 02:11
-
-
Save mdestafadilah/9421048657930a50f58cb94239c5ed90 to your computer and use it in GitHub Desktop.
Install EvolutionAPI on VPS (English Version ~ Translated)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| How to Install aaPanel + Evolution API 2.2.3 on a VPS (Step by Step) | |
| π Evolution V2 Installation | |
| 1οΈβ£ System Update and Dependency Installation | |
| Open a terminal and run the following command: | |
| sudo apt-get update ; apt-get install -y apparmor-utils | |
| 2οΈβ£ Server Name Setting | |
| You can replace manager1 with a name of your choice: | |
| hostnamectl set-hostname manager1 | |
| 3οΈβ£ /etc/hosts File Configuration | |
| Edit the hosts file with the command: | |
| nano /etc/hosts | |
| Change the localhost line to the name you defined in the previous step (example: manager1): | |
| 127.0.0.1 manager1 | |
| After editing, save and exit (Ctrl+X, press Y and Enter). | |
| 4οΈβ£ Docker Installation | |
| Run this command to install Docker: | |
| curl -fsSL https://get.docker.com | bash | |
| 5οΈβ£ Swarm Initialization | |
| After installation, start Docker Swarm with: | |
| docker swarm init | |
| 6οΈβ£ Network Creation | |
| Now, create the network for the containers: | |
| docker network create --driver=overlay network_public | |
| 7οΈβ£ Traefik.yaml File Configuration | |
| Open a text editor: | |
| nano traefik.yaml | |
| After editing the file, save and exit (Ctrl+X, press Y and Enter). | |
| 8οΈβ£ Stack Deployment | |
| Finally, run the command below to deploy Traefik: | |
| docker stack deploy --prune --resolve-image always -c traefik.yaml traefik | |
| 9οΈβ£ Portainer Installation | |
| Run the following command to install Portainer: | |
| docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest | |
| π‘ Tip: Verify that the commands were executed correctly before proceeding to the next steps. | |
| WARNING: If you change the Postgres password in the postgres.yaml file, you must update this password in the evolution.yaml file on lines 40 and 75. Failure to do so will result in errors. |
Author
Author
#evolution.yaml
services:
# --- Layanan Evolution API ---
evolution_api:
image: atendai/evolution-api:latest # Atau versi tertentu, misalnya :v2.x.x
container_name: evolution_api_service
restart: always
ports:
- "${EVO_PORT_EXT}:8080" # Mapping port eksternal:internal
volumes:
- evolution_instances:/evolution/instances # Data sesi WhatsApp
networks:
- evo-network
environment:
# Variabel Umum
- AUTHENTICATION_API_KEY=${EVO_API_KEY}
- DEL_INSTANCE=${EVO_DEL_INSTANCE}
- SECRET_KEY=${EVO_SECRET_KEY}
- SERVER_URL=${EVO_SERVER_URL}
# Konfigurasi Database (PostgreSQL)
- DATABASE_ENABLED=true
- DATABASE_PROVIDER=postgresql
- DATABASE_CONNECTION_URI=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:${POSTGRES_PORT_INT}/${POSTGRES_DB}
# Konfigurasi Cache (Redis)
- REDIS_ENABLED=true
- REDIS_URI=redis://redis:${REDIS_PORT_INT}
# --- Layanan PostgreSQL ---
postgres:
image: postgres:15-alpine
container_name: postgres_db
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- ./postgres/data:/var/lib/postgresql/data# Volume data persisten
ports:
- "${POSTGRES_PORT_EXT}:${POSTGRES_PORT_INT}" # Opsional: Untuk akses DB dari luar Docker
networks:
- evo-network
# --- Layanan Redis ---
redis:
image: redis:7-alpine
container_name: redis_cache
restart: always
command: redis-server --appendonly yes
volumes:
- redis_data:/data # Volume data persisten
ports:
- "${REDIS_PORT_EXT}:${REDIS_PORT_INT}" # Opsional: Untuk akses Redis dari luar Docker
networks:
- evo-network
# --- Volume Persisten ---
volumes:
evolution_instances: # Untuk data sesi Evolution API
postgres_data: # Untuk data PostgreSQL
redis_data: # Untuk data Redis
# --- Jaringan ---
networks:
evo-network:
driver: bridge
Author
#redis.yaml
version: "3.7"
services:
redis:
image: redis:latest
command: [
"redis-server",
"--appendonly",
"yes",
"--port",
"6379"
]
volumes:
- redis_data:/data
networks:
- network_public
ports:
- target: 6379
published: 6379
mode: host
deploy:
placement:
constraints:
- node.role == manager
#- node.hostname == worker1
resources:
limits:
cpus: "0.5"
memory: 1024M
volumes:
redis_data:
external: true
name: redis_data
networks:
network_public:
external: true
name: network_public
Author
#postgress.yaml
version: "3.7"
services:
postgres:
image: postgres:14
environment:
- POSTGRES_PASSWORD=Mfcd62!!Mfcd62!!
- TZ=America/Sao_Paulo
networks:
- network_public
ports:
- target: 5432
published: 5432
mode: host
volumes:
- postgres_data:/var/lib/postgresql/data
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
# - node.hostname == worker1
resources:
limits:
cpus: "0.5"
memory: 1024M
volumes:
postgres_data:
external: true
name: postgres_data
networks:
network_public:
external: true
name: network_public
WARNING: If you change the Postgres password in the postgres.yaml file, you must update this password in the evolution.yaml file on lines 40 and 75. Failure to do so will result in errors.
Author
#traefik.yaml
version: "3.7"
services:
traefik:
image: traefik:2.11.2
command:
- "--api.dashboard=true"
- "--providers.docker.swarmMode=true"
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.network=network_public"
- "--entrypoints.web.address=:8888"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
- "--entrypoints.web.http.redirections.entrypoint.permanent=true"
- "--entrypoints.websecure.address=:8443"
- "--certificatesresolvers.letsencryptresolver.acme.httpchallenge=true"
- "--certificatesresolvers.letsencryptresolver.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencryptresolver.acme.email=machineteste24@gmail.com"
- "--certificatesresolvers.letsencryptresolver.acme.storage=/etc/traefik/letsencrypt/acme.json"
- "--log.level=DEBUG"
- "--log.format=common"
- "--log.filePath=/var/log/traefik/traefik.log"
- "--accesslog=true"
- "--accesslog.filepath=/var/log/traefik/access-log"
deploy:
placement:
constraints:
- node.role == manager
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-https.redirectscheme.permanent=true"
- "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
- "traefik.http.routers.http-catchall.entrypoints=web"
- "traefik.http.routers.http-catchall.middlewares=redirect-https@docker"
- "traefik.http.routers.http-catchall.priority=1"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "vol_certificates:/etc/traefik/letsencrypt"
ports:
- target: 8888
published: 8888
mode: host
- target: 8443
published: 8443
mode: host
networks:
- network_public
volumes:
vol_shared:
external: true
name: volume_swarm_shared
vol_certificates:
external: true
name: volume_swarm_certificates
networks:
network_public:
external: true
name: network_public
Author
version: '3.8'
services:
api:
image: 'evoapicloud/evolution-api:latest'
restart: always
depends_on:
- redis
- postgres
environment:
- SERVICE_URL_EVO_8080
- SERVER_URL=$SERVICE_URL_EVO
- 'DB_TYPE=${DB_TYPE:-postgresdb}'
- 'DB_POSTGRESDB_DATABASE=${POSTGRES_DB:-postgres}'
- 'DB_POSTGRESDB_HOST=${DB_POSTGRESDB_HOST:-postgres}'
- 'DB_POSTGRESDB_PORT=${DB_POSTGRESDB_PORT:-5432}'
- 'DB_POSTGRESDB_USER=${SERVICE_USER_POSTGRES}'
- 'DB_POSTGRESDB_PASSWORD=${SERVICE_PASSWORD_POSTGRES}'
- 'DATABASE_PROVIDER=${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=${DEL_INSTANCE:-false}'
- 'DATABASE_SAVE_DATA_INSTANCE=${DATABASE_SAVE_DATA_INSTANCE:-true}'
- 'DATABASE_SAVE_DATA_NEW_MESSAGE=${DATABASE_SAVE_DATA_NEW_MESSAGE:-true}'
- 'DATABASE_SAVE_MESSAGE_UPDATE=${DATABASE_SAVE_MESSAGE_UPDATE:-true}'
- 'DATABASE_SAVE_DATA_CONTACTS=${DATABASE_SAVE_DATA_CONTACTS:-true}'
- 'DATABASE_SAVE_DATA_CHATS=${DATABASE_SAVE_DATA_CHATS:-true}'
- 'DATABASE_SAVE_DATA_LABELS=${DATABASE_SAVE_DATA_LABELS:-true}'
- 'DATABASE_SAVE_DATA_HISTORIC=${DATABASE_SAVE_DATA_HISTORIC:-true}'
- 'DATABASE_CONNECTION_CLIENT_NAME=${DATABASE_CONNECTION_CLIENT_NAME:-evolution_v2}'
- 'RABBITMQ_ENABLED=${RABBITMQ_ENABLED:-false}'
- 'RABBITMQ_URI=${RABBITMQ_URI:-amqp://admin:admin@rabbitmq:5672/default}'
- 'RABBITMQ_EXCHANGE_NAME=${RABBITMQ_EXCHANGE_NAME:-evolution_v2}'
- 'RABBITMQ_GLOBAL_ENABLED=${RABBITMQ_GLOBAL_ENABLED:-false}'
- 'RABBITMQ_EVENTS_APPLICATION_STARTUP=${RABBITMQ_EVENTS_APPLICATION_STARTUP:-false}'
- 'RABBITMQ_EVENTS_INSTANCE_CREATE=${RABBITMQ_EVENTS_INSTANCE_CREATE:-false}'
- 'RABBITMQ_EVENTS_INSTANCE_DELETE=${RABBITMQ_EVENTS_INSTANCE_DELETE:-false}'
- 'RABBITMQ_EVENTS_QRCODE_UPDATED=${RABBITMQ_EVENTS_QRCODE_UPDATED:-false}'
- 'RABBITMQ_EVENTS_MESSAGES_SET=${RABBITMQ_EVENTS_MESSAGES_SET:-false}'
- 'RABBITMQ_EVENTS_MESSAGES_UPSERT=${RABBITMQ_EVENTS_MESSAGES_UPSERT:-true}'
- 'RABBITMQ_EVENTS_MESSAGES_EDITED=${RABBITMQ_EVENTS_MESSAGES_EDITED:-false}'
- 'RABBITMQ_EVENTS_MESSAGES_UPDATE=${RABBITMQ_EVENTS_MESSAGES_UPDATE:-false}'
- 'RABBITMQ_EVENTS_MESSAGES_DELETE=${RABBITMQ_EVENTS_MESSAGES_DELETE:-false}'
- 'RABBITMQ_EVENTS_SEND_MESSAGE=${RABBITMQ_EVENTS_SEND_MESSAGE:-false}'
- 'RABBITMQ_EVENTS_CONTACTS_SET=${RABBITMQ_EVENTS_CONTACTS_SET:-false}'
- 'RABBITMQ_EVENTS_CONTACTS_UPSERT=${RABBITMQ_EVENTS_CONTACTS_UPSERT:-false}'
- 'RABBITMQ_EVENTS_CONTACTS_UPDATE=${RABBITMQ_EVENTS_CONTACTS_UPDATE:-false}'
- 'RABBITMQ_EVENTS_PRESENCE_UPDATE=${RABBITMQ_EVENTS_PRESENCE_UPDATE:-false}'
- 'RABBITMQ_EVENTS_CHATS_SET=${RABBITMQ_EVENTS_CHATS_SET:-false}'
- 'RABBITMQ_EVENTS_CHATS_UPSERT=${RABBITMQ_EVENTS_CHATS_UPSERT:-false}'
- 'RABBITMQ_EVENTS_CHATS_UPDATE=${RABBITMQ_EVENTS_CHATS_UPDATE:-false}'
- 'RABBITMQ_EVENTS_CHATS_DELETE=${RABBITMQ_EVENTS_CHATS_DELETE:-false}'
- 'RABBITMQ_EVENTS_GROUPS_UPSERT=${RABBITMQ_EVENTS_GROUPS_UPSERT:-false}'
- 'RABBITMQ_EVENTS_GROUP_UPDATE=${RABBITMQ_EVENTS_GROUP_UPDATE:-false}'
- 'RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE=${RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE:-false}'
- 'RABBITMQ_EVENTS_CONNECTION_UPDATE=${RABBITMQ_EVENTS_CONNECTION_UPDATE:-true}'
- 'RABBITMQ_EVENTS_CALL=${RABBITMQ_EVENTS_CALL:-false}'
- 'RABBITMQ_EVENTS_TYPEBOT_START=${RABBITMQ_EVENTS_TYPEBOT_START:-false}'
- 'RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS=${RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS:-false}'
- 'SQS_ENABLED=${SQS_ENABLED:-false}'
- 'SQS_ACCESS_KEY_ID=${SQS_ACCESS_KEY_ID:-}'
- 'SQS_SECRET_ACCESS_KEY=${SQS_SECRET_ACCESS_KEY:-}'
- 'SQS_ACCOUNT_ID=${SQS_ACCOUNT_ID:-}'
- 'SQS_REGION=${SQS_REGION:-}'
- 'WEBSOCKET_ENABLED=${WEBSOCKET_ENABLED:-false}'
- 'WEBSOCKET_GLOBAL_EVENTS=${WEBSOCKET_GLOBAL_EVENTS:-false}'
- 'WA_BUSINESS_TOKEN_WEBHOOK=${WA_BUSINESS_TOKEN_WEBHOOK:-evolution}'
- 'WA_BUSINESS_URL=${WA_BUSINESS_URL:-https://graph.facebook.com}'
- 'WA_BUSINESS_VERSION=${WA_BUSINESS_VERSION:-v20.0}'
- 'WA_BUSINESS_LANGUAGE=${WA_BUSINESS_LANGUAGE:-pt_BR}'
- "WEBHOOK_GLOBAL_URL=${WEBHOOK_GLOBAL_URL:-''}"
- 'WEBHOOK_GLOBAL_ENABLED=${WEBHOOK_GLOBAL_ENABLED:-false}'
- 'WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=${WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS:-false}'
- 'WEBHOOK_EVENTS_APPLICATION_STARTUP=${WEBHOOK_EVENTS_APPLICATION_STARTUP:-false}'
- 'WEBHOOK_EVENTS_QRCODE_UPDATED=${WEBHOOK_EVENTS_QRCODE_UPDATED:-true}'
- 'WEBHOOK_EVENTS_MESSAGES_SET=${WEBHOOK_EVENTS_MESSAGES_SET:-true}'
- 'WEBHOOK_EVENTS_MESSAGES_UPSERT=${WEBHOOK_EVENTS_MESSAGES_UPSERT:-true}'
- 'WEBHOOK_EVENTS_MESSAGES_EDITED=${WEBHOOK_EVENTS_MESSAGES_EDITED:-true}'
- 'WEBHOOK_EVENTS_MESSAGES_UPDATE=${WEBHOOK_EVENTS_MESSAGES_UPDATE:-true}'
- 'WEBHOOK_EVENTS_MESSAGES_DELETE=${WEBHOOK_EVENTS_MESSAGES_DELETE:-true}'
- 'WEBHOOK_EVENTS_SEND_MESSAGE=${WEBHOOK_EVENTS_SEND_MESSAGE:-true}'
- 'WEBHOOK_EVENTS_CONTACTS_SET=${WEBHOOK_EVENTS_CONTACTS_SET:-true}'
- 'WEBHOOK_EVENTS_CONTACTS_UPSERT=${WEBHOOK_EVENTS_CONTACTS_UPSERT:-true}'
- 'WEBHOOK_EVENTS_CONTACTS_UPDATE=${WEBHOOK_EVENTS_CONTACTS_UPDATE:-true}'
- 'WEBHOOK_EVENTS_PRESENCE_UPDATE=${WEBHOOK_EVENTS_PRESENCE_UPDATE:-true}'
- 'WEBHOOK_EVENTS_CHATS_SET=${WEBHOOK_EVENTS_CHATS_SET:-true}'
- 'WEBHOOK_EVENTS_CHATS_UPSERT=${WEBHOOK_EVENTS_CHATS_UPSERT:-true}'
- 'WEBHOOK_EVENTS_CHATS_UPDATE=${WEBHOOK_EVENTS_CHATS_UPDATE:-true}'
- 'WEBHOOK_EVENTS_CHATS_DELETE=${WEBHOOK_EVENTS_CHATS_DELETE:-true}'
- 'WEBHOOK_EVENTS_GROUPS_UPSERT=${WEBHOOK_EVENTS_GROUPS_UPSERT:-true}'
- 'WEBHOOK_EVENTS_GROUPS_UPDATE=${WEBHOOK_EVENTS_GROUPS_UPDATE:-true}'
- 'WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE=${WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE:-true}'
- 'WEBHOOK_EVENTS_CONNECTION_UPDATE=${WEBHOOK_EVENTS_CONNECTION_UPDATE:-true}'
- 'WEBHOOK_EVENTS_LABELS_EDIT=${WEBHOOK_EVENTS_LABELS_EDIT:-true}'
- 'WEBHOOK_EVENTS_LABELS_ASSOCIATION=${WEBHOOK_EVENTS_LABELS_ASSOCIATION:-true}'
- 'WEBHOOK_EVENTS_CALL=${WEBHOOK_EVENTS_CALL:-true}'
- 'WEBHOOK_EVENTS_TYPEBOT_START=${WEBHOOK_EVENTS_TYPEBOT_START:-false}'
- 'WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=${WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS:-false}'
- 'WEBHOOK_EVENTS_ERRORS=${WEBHOOK_EVENTS_ERRORS:-false}'
- 'WEBHOOK_EVENTS_ERRORS_WEBHOOK=${WEBHOOK_EVENTS_ERRORS_WEBHOOK:-}'
- 'CONFIG_SESSION_PHONE_CLIENT=${CONFIG_SESSION_PHONE_CLIENT:-Evolution API V2}'
- 'CONFIG_SESSION_PHONE_NAME=${CONFIG_SESSION_PHONE_NAME:-Chrome}'
- 'QRCODE_LIMIT=${QRCODE_LIMIT:-30}'
- 'OPENAI_ENABLED=${OPENAI_ENABLED:-true}'
- 'DIFY_ENABLED=${DIFY_ENABLED:-true}'
- 'FLOWISE_ENABLED=${FLOWISE_ENABLED:-true}'
- 'N8N_ENABLED=${N8N_ENABLED:-true}'
- 'TYPEBOT_ENABLED=${TYPEBOT_ENABLED:-true}'
- 'TYPEBOT_API_VERSION=${TYPEBOT_API_VERSION:-latest}'
- 'CHATWOOT_ENABLED=${CHATWOOT_ENABLED:-true}'
- 'CHATWOOT_MESSAGE_READ=${CHATWOOT_MESSAGE_READ:-true}'
- 'CHATWOOT_MESSAGE_DELETE=${CHATWOOT_MESSAGE_DELETE:-true}'
- 'CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-chatwoot}'
- 'CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=${CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE:-true}'
- 'CACHE_REDIS_ENABLED=${CACHE_REDIS_ENABLED:-true}'
- 'CACHE_REDIS_URI=${CACHE_REDIS_URI:-redis://redis:6379/6}'
- 'CACHE_REDIS_PREFIX_KEY=${CACHE_REDIS_PREFIX_KEY:-evolution_v2}'
- 'CACHE_REDIS_SAVE_INSTANCES=${CACHE_REDIS_SAVE_INSTANCES:-false}'
- 'CACHE_LOCAL_ENABLED=${CACHE_LOCAL_ENABLED:-false}'
- 'S3_ENABLED=${S3_ENABLED:-false}'
- 'S3_ACCESS_KEY=${S3_ACCESS_KEY:-}'
- 'S3_SECRET_KEY=${S3_SECRET_KEY:-}'
- 'S3_BUCKET=${S3_BUCKET:-evolution}'
- 'S3_PORT=${S3_PORT:-443}'
- 'S3_REGION=${S3_REGION:-us-east-1}'
- 'S3_ENDPOINT=${S3_ENDPOINT:-files.site.com}'
- 'S3_USE_SSL=${S3_USE_SSL:-true}'
- 'AUTHENTICATION_API_KEY=${SERVICE_PASSWORD_AUTHENTICATIONAPIKEY}'
- 'AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=${AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES:-true}'
- 'LANGUAGE=${LANGUAGE:-en}'
volumes:
- 'evolution_instances:/evolution/instances'
expose:
- 8080
redis:
image: 'redis:latest'
command: "redis-server --port 6379 --appendonly yes\n"
restart: always
volumes:
- 'evolution_redis:/data'
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}'
- 'AUTHENTICATION_API_KEY=${SERVICE_PASSWORD_AUTHENTICATIONAPIKEY}'
restart: always
volumes:
- 'postgres_data:/var/lib/postgresql/data'
volumes:
evolution_instances: null
evolution_redis: null
postgres_data: null
Author
# π SERVICE URL CONFIG
SERVICE_URL_EVO_8080=http://localhost:8080
SERVICE_URL_EVO=http://localhost:8080
SERVER_URL=${SERVICE_URL_EVO}
# π§ DATABASE CONFIG
DB_TYPE=postgresdb
POSTGRES_DB=postgres
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
SERVICE_USER_POSTGRES=# isi_username_postgres
SERVICE_PASSWORD_POSTGRES=# isi_password_postgres
DATABASE_PROVIDER=postgresql
DATABASE_CONNECTION_CLIENT_NAME=evolution_v2
# π§Ή DATA SAVE OPTIONS
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
# π RABBITMQ
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
# π¨ AWS SQS
SQS_ENABLED=false
SQS_ACCESS_KEY_ID=
SQS_SECRET_ACCESS_KEY=
SQS_ACCOUNT_ID=
SQS_REGION=
# π WEBSOCKET
WEBSOCKET_ENABLED=false
WEBSOCKET_GLOBAL_EVENTS=false
# π¬ WHATSAPP BUSINESS
WA_BUSINESS_TOKEN_WEBHOOK=evolution
WA_BUSINESS_URL=https://graph.facebook.com
WA_BUSINESS_VERSION=v20.0
WA_BUSINESS_LANGUAGE=pt_BR
# π WEBHOOK EVENTS
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
WEBHOOK_EVENTS_ERRORS_WEBHOOK=
# π± CLIENT CONFIG
CONFIG_SESSION_PHONE_CLIENT="Evolution API V2"
CONFIG_SESSION_PHONE_NAME="Chrome"
QRCODE_LIMIT=30
# π§ INTEGRATIONS
OPENAI_ENABLED=true
DIFY_ENABLED=true
FLOWISE_ENABLED=true
N8N_ENABLED=true
TYPEBOT_ENABLED=true
TYPEBOT_API_VERSION=latest
CHATWOOT_ENABLED=true
CHATWOOT_MESSAGE_READ=true
CHATWOOT_MESSAGE_DELETE=true
CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=true
# πΎ CACHE / REDIS
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 CONFIG
S3_ENABLED=false
S3_ACCESS_KEY=
S3_SECRET_KEY=
S3_BUCKET=evolution
S3_PORT=443
S3_REGION=us-east-1
S3_ENDPOINT=files.site.com
S3_USE_SSL=true
# π AUTHENTICATION
SERVICE_PASSWORD_AUTHENTICATIONAPIKEY=# isi_api_key
AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true
# π LANGUAGE
LANGUAGE=en
Author
WORKING VERSION
services:
# --- Layanan Evolution API ---
evolution_api:
image: atendai/evolution-api:latest # Atau versi tertentu, misalnya :v2.x.x
container_name: evolution_api_service
restart: always
ports:
- "${EVO_PORT_EXT}:8080" # Mapping port eksternal:internal
volumes:
- evolution_instances:/evolution/instances # Data sesi WhatsApp
networks:
- evo-network
environment:
# Variabel Umum
- AUTHENTICATION_API_KEY=${EVO_API_KEY}
- DEL_INSTANCE=${EVO_DEL_INSTANCE}
- SECRET_KEY=${EVO_SECRET_KEY}
- SERVER_URL=${EVO_SERVER_URL}
# Konfigurasi Database (PostgreSQL)
- DATABASE_ENABLED=true
- DATABASE_PROVIDER=postgresql
- DATABASE_CONNECTION_URI=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:${POSTGRES_PORT_INT}/${POSTGRES_DB}
# Konfigurasi Cache (Redis)
- REDIS_ENABLED=true
- REDIS_URI=redis://redis:${REDIS_PORT_INT}
# --- Layanan PostgreSQL ---
postgres:
image: postgres:15-alpine
container_name: postgres_db
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- ./postgres/data:/var/lib/postgresql/data# Volume data persisten
ports:
- "${POSTGRES_PORT_EXT}:${POSTGRES_PORT_INT}" # Opsional: Untuk akses DB dari luar Docker
networks:
- evo-network
# --- Layanan Redis ---
redis:
image: redis:7-alpine
container_name: redis_cache
restart: always
command: redis-server --appendonly yes
volumes:
- redis_data:/data # Volume data persisten
ports:
- "${REDIS_PORT_EXT}:${REDIS_PORT_INT}" # Opsional: Untuk akses Redis dari luar Docker
networks:
- evo-network
# --- Volume Persisten ---
volumes:
evolution_instances: # Untuk data sesi Evolution API
postgres_data: # Untuk data PostgreSQL
redis_data: # Untuk data Redis
# --- Jaringan ---
networks:
evo-network:
driver: bridge
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
source: https://www.youtube.com/watch?v=1CgwmJAirwo&t=619s