diff --git a/blueprints/evolutioncrm/docker-compose.yml b/blueprints/evolutioncrm/docker-compose.yml new file mode 100644 index 00000000..50a37b8b --- /dev/null +++ b/blueprints/evolutioncrm/docker-compose.yml @@ -0,0 +1,251 @@ +services: + evo-auth: + image: evoapicloud/evo-auth-service-community:latest + command: sh -c "bundle exec rails db:prepare && bundle exec rails s -p 3001 -b 0.0.0.0" + restart: always + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:3001/up"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 120s + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + environment: + - RAILS_ENV=production + - RAILS_MAX_THREADS=5 + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - EVOAI_CRM_API_TOKEN=${EVOAI_CRM_API_TOKEN} + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_USERNAME=postgres + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DATABASE=evo_crm_production + - POSTGRES_SSLMODE=disable + - REDIS_URL=redis://redis:6379/3 + - FRONTEND_URL=${FRONT_URL} + - BACKEND_URL=${BACK_URL} + - CORS_ORIGINS=${FRONT_URL},${BACK_URL} + - DOORKEEPER_JWT_SECRET_KEY=${DOORKEEPER_JWT_SECRET_KEY} + - DOORKEEPER_JWT_ALGORITHM=${DOORKEEPER_JWT_ALGORITHM} + - DOORKEEPER_JWT_ISS=${DOORKEEPER_JWT_ISS} + - MFA_ISSUER=${MFA_ISSUER} + + evo-auth-sidekiq: + image: evoapicloud/evo-auth-service-community:latest + command: ["bundle", "exec", "sidekiq", "-C", "config/sidekiq.yml"] + restart: always + healthcheck: + disable: true + depends_on: + evo-auth: + condition: service_healthy + environment: + - RAILS_ENV=production + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - EVOAI_CRM_API_TOKEN=${EVOAI_CRM_API_TOKEN} + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_USERNAME=postgres + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DATABASE=evo_crm_production + - POSTGRES_SSLMODE=disable + - REDIS_URL=redis://redis:6379/3 + - DOORKEEPER_JWT_SECRET_KEY=${DOORKEEPER_JWT_SECRET_KEY} + - DOORKEEPER_JWT_ALGORITHM=${DOORKEEPER_JWT_ALGORITHM} + - DOORKEEPER_JWT_ISS=${DOORKEEPER_JWT_ISS} + - MFA_ISSUER=EvoCRM + - SIDEKIQ_CONCURRENCY=10 + + evo-crm: + image: evoapicloud/evo-ai-crm-community:latest + command: sh -c "bundle exec rails db:prepare && bundle exec rails s -p 3000 -b 0.0.0.0" + restart: always + healthcheck: + test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:3000/health/live"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 120s + depends_on: + evo-auth: + condition: service_healthy + environment: + - RAILS_ENV=production + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - EVOAI_CRM_API_TOKEN=${EVOAI_CRM_API_TOKEN} + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_USERNAME=postgres + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DATABASE=evo_crm_production + - POSTGRES_SSLMODE=disable + - REDIS_URL=redis://redis:6379/3 + - EVO_AUTH_SERVICE_URL=http://evo-auth:3001 + - EVO_AI_CORE_SERVICE_URL=http://evo-core:5555 + - BACKEND_URL=${BACK_URL} + - FRONTEND_URL=${FRONT_URL} + - CORS_ORIGINS=${FRONT_URL},${BACK_URL} + - EVOLUTION_API_ONLY_SERVER=true + - DISABLE_TELEMETRY=true + - LOG_LEVEL=info + - ENABLE_ACCOUNT_SIGNUP=true + - ENABLE_PUSH_RELAY_SERVER=true + - ENABLE_INBOX_EVENTS=true + - BOT_RUNTIME_URL=http://evo-bot-runtime:8080 + - BOT_RUNTIME_SECRET=${BOT_RUNTIME_SECRET} + - BOT_RUNTIME_POSTBACK_BASE_URL=${BACK_URL} + volumes: + - evo-crm-data:/app/storage + + evo-crm-sidekiq: + image: evoapicloud/evo-ai-crm-community:latest + command: ["bundle", "exec", "sidekiq", "-C", "config/sidekiq.yml"] + healthcheck: + disable: true + depends_on: + evo-crm: + condition: service_healthy + environment: + - RAILS_ENV=production + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - EVOAI_CRM_API_TOKEN=${EVOAI_CRM_API_TOKEN} + - POSTGRES_HOST=postgres + - POSTGRES_PORT=5432 + - POSTGRES_USERNAME=postgres + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DATABASE=evo_crm_production + - POSTGRES_SSLMODE=disable + - REDIS_URL=redis://redis:6379/3 + - EVO_AUTH_SERVICE_URL=${AUTH_URL} + - EVO_AI_CORE_SERVICE_URL=http://evo-core:5555 + - BACKEND_URL=${BACK_URL} + - FRONTEND_URL=${FRONT_URL} + - CORS_ORIGINS=${FRONT_URL},${BACK_URL},${AUTH_URL} + - DISABLE_TELEMETRY=true + - LOG_LEVEL=info + - ENABLE_ACCOUNT_SIGNUP=true + - ENABLE_PUSH_RELAY_SERVER=true + - ENABLE_INBOX_EVENTS=true + - BOT_RUNTIME_URL=http://evo-bot-runtime:8080 + - BOT_RUNTIME_SECRET=${BOT_RUNTIME_SECRET} + - BOT_RUNTIME_POSTBACK_BASE_URL=${BACK_URL} + - SIDEKIQ_CONCURRENCY=10 + + evo-core: + image: evoapicloud/evo-ai-core-service-community:latest + restart: always + depends_on: + postgres: + condition: service_healthy + environment: + - DB_HOST=postgres + - DB_PORT=5432 + - DB_USER=postgres + - DB_PASSWORD=${POSTGRES_PASSWORD} + - DB_NAME=evo_crm_production + - DB_SSLMODE=disable + - DB_MAX_IDLE_CONNS=10 + - DB_MAX_OPEN_CONNS=100 + - DB_CONN_MAX_LIFETIME=1h + - DB_CONN_MAX_IDLE_TIME=30m + - PORT=5555 + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - JWT_ALGORITHM=HS256 + - ENCRYPTION_KEY=${ENCRYPTION_KEY} + - EVOLUTION_BASE_URL=http://evo-crm:3000 + - EVO_AUTH_BASE_URL=http://evo-auth:3001 + - AI_PROCESSOR_URL=http://evo-processor:8000 + - AI_PROCESSOR_VERSION=v1 + + evo-processor: + image: evoapicloud/evo-ai-processor-community:latest + depends_on: + evo-crm: + condition: service_healthy + environment: + - POSTGRES_CONNECTION_STRING=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/evo_crm_production + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_SSL=false + - REDIS_DB=3 + - REDIS_KEY_PREFIX="a2a:" + - REDIS_TTL=3600 + - HOST=0.0.0.0 + - PORT=8000 + - DEBUG=false + - SECRET_KEY_BASE=${SECRET_KEY_BASE} + - ENCRYPTION_KEY=${ENCRYPTION_KEY} + - EVOAI_CRM_API_TOKEN=${EVOAI_CRM_API_TOKEN} + - EVO_AI_CRM_URL=http://evo-crm:3000 + - CORE_SERVICE_URL=http://evo-core:5555/api/v1 + - EVO_AUTH_BASE_URL=http://evo-auth:3001 + - APP_URL=${FRONT_URL} + - API_URL=${PROCESSOR_URL} + - API_TITLE=Agent Processor Community + - API_DESCRIPTION=Agent Processor Community for Evolution AI + - API_VERSION=1.0.0 + - ORGANIZATION_NAME=Evolution CRM + - TOOLS_CACHE_ENABLED=true + - TOOLS_CACHE_TTL=3600 + + evo-bot-runtime: + image: evoapicloud/evo-bot-runtime:latest + environment: + - LISTEN_ADDR=0.0.0.0:8080 + - REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/3 + - AI_PROCESSOR_URL=http://evo-processor:8000 + - BOT_RUNTIME_SECRET=${BOT_RUNTIME_SECRET} + - AI_CALL_TIMEOUT_SECONDS=30 + + evo-crm-frontend: + image: evoapicloud/evo-ai-frontend-community:latest + environment: + - VITE_APP_ENV=production + - VITE_API_URL=${BACK_URL} + - VITE_AUTH_API_URL=${AUTH_URL} + - VITE_EVOAI_API_URL=${EVOIA_URL} + - VITE_AGENT_PROCESSOR_URL=${PROCESSOR_URL} + - VITE_WS_URL=wss://${BACK_DOMAIN} + - VITE_FRONT_URL=${FRONT_URL} + + postgres: + image: postgres:16-alpine + restart: always + volumes: + - postgres-data:/var/lib/postgresql/data + environment: + - POSTGRES_DB=${POSTGRES_DATABASE} + - POSTGRES_USER=${POSTGRES_USERNAME} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 10 + start_period: 10s + + redis: + image: redis:alpine + restart: always + volumes: + - redis-data:/data + healthcheck: + test: ["CMD-SHELL", "redis-cli ping"] + interval: 5s + timeout: 5s + retries: 10 + +volumes: + postgres-data: + redis-data: + evo-processor-data: + evo-crm-data: diff --git a/blueprints/evolutioncrm/evolutionapi.png b/blueprints/evolutioncrm/evolutionapi.png new file mode 100644 index 00000000..bd9b3850 Binary files /dev/null and b/blueprints/evolutioncrm/evolutionapi.png differ diff --git a/blueprints/evolutioncrm/meta.json b/blueprints/evolutioncrm/meta.json new file mode 100644 index 00000000..e18b0de6 --- /dev/null +++ b/blueprints/evolutioncrm/meta.json @@ -0,0 +1,20 @@ +{ + "id": "evolutioncrm", + "name": "Evolution CRM", + "version": "latest", + "description": "Evo CRM Community is the open-source edition of the Evo CRM platform — a complete suite for AI-assisted customer support. It brings together authentication, CRM, AI agents, agent processing, bot pipelines and a modern frontend into a unified, self-hostable stack.", + "logo": "evolutionapi.png", + "links": { + "github": "https://github.com/evolution-foundation/evo-crm-community", + "docs": "https://docs.evolutionfoundation.com.br", + "website": "https://evolutionfoundation.com.br" + }, + "tags": [ + "crm", + "ai", + "agent", + "processing", + "bot", + "pipeline" + ] +} diff --git a/blueprints/evolutioncrm/template.toml b/blueprints/evolutioncrm/template.toml new file mode 100644 index 00000000..a81c5e4e --- /dev/null +++ b/blueprints/evolutioncrm/template.toml @@ -0,0 +1,67 @@ +[variables] +auth_domain = "${domain}" +front_domain = "${domain}" +api_domain = "${domain}" +evoia_domain = "${domain}" +processor_domain = "${domain}" +postgres_password = "${password}" +secret_key_base = "${base64:64}" +jwt_secret_key = "${base64:64}" +api_token = "${base64:64}" +doorkeeper_jwt_secret_key = "${base64:64}" +bot_runtime_secret = "${base64:64}" +encryption_key = "${base64:32}" +global_api_key = "${base64:64}" + +[config] +env = [ + "SECRET_KEY_BASE=${secret_key_base}", + "JWT_SECRET_KEY=${jwt_secret_key}", + "EVOAI_CRM_API_TOKEN=${api_token}", + "GLOBAL_API_KEY=${global_api_key}", + "POSTGRES_PASSWORD=${postgres_password}", + "POSTGRES_DATABASE=evo_crm_community", + "POSTGRES_USERNAME=postgres", + "REDIS_URL=redis://redis:6379/3", + "FRONT_DOMAIN=${front_domain}", + "FRONT_URL=\"http://${front_domain}\"", + "BACK_DOMAIN=${api_domain}", + "BACK_URL=\"http://${api_domain}\"", + "AUTH_DOMAIN=${auth_domain}", + "AUTH_URL=\"http://${auth_domain}\"", + "PROCESSOR_DOMAIN=${processor_domain}", + "PROCESSOR_URL=\"http://${processor_domain}\"", + "EVOIA_DOMAIN=${evoia_domain}", + "EVOIA_URL=\"http://${evoia_domain}\"", + "DOORKEEPER_JWT_SECRET_KEY=${doorkeeper_jwt_secret_key}", + "DOORKEEPER_JWT_ALGORITHM=hs256", + "DOORKEEPER_JWT_ISS=evo-auth-service", + "MFA_ISSUER=EvoCRM", + "BOT_RUNTIME_SECRET=${bot_runtime_secret}", + "ENCRYPTION_KEY=${encryption_key}", +] + +mounts = [] + +[[config.domains]] +serviceName = "evo-auth" +port = 3001 +host = "${auth_domain}" + + +[[config.domains]] +serviceName = "evo-crm-frontend" +port = 80 +host = "${front_domain}" + + +[[config.domains]] +serviceName = "evo-crm" +port = 3000 +host = "${api_domain}" + + +[[config.domains]] +serviceName = "evo-processor" +port = 8000 +host = "${processor_domain}" diff --git a/blueprints/evolutiongo/docker-compose.yml b/blueprints/evolutiongo/docker-compose.yml new file mode 100644 index 00000000..2ad80181 --- /dev/null +++ b/blueprints/evolutiongo/docker-compose.yml @@ -0,0 +1,41 @@ +services: + evolution-go: + image: evoapicloud/evolution-go:latest + restart: always + environment: + - SERVER_PORT=${SERVER_PORT} + - CLIENT_NAME=${CLIENT_NAME} + - GLOBAL_API_KEY=${AUTHENTICATION_API_KEY} + - POSTGRES_AUTH_DB=${DATABASE_CONNECTION_URI}/evogo_auth?sslmode=disable + - POSTGRES_USERS_DB=${DATABASE_CONNECTION_URI}/evogo_users?sslmode=disable + - DATABASE_SAVE_MESSAGES=${DATABASE_SAVE_MESSAGES} + - WADEBUG=${WADEBUG} + - LOGTYPE=${LOGTYPE} + volumes: + - evolution-go-data:/app/dbdata + - evolution-go-logs:/app/logs + depends_on: + - evolution-postgres + + evolution-gateway: + image: nginx:alpine + restart: always + volumes: + - ../files/gateway.conf:/etc/nginx/conf.d/default.conf:ro + depends_on: + - evolution-go + + evolution-postgres: + image: postgres:16-alpine + restart: always + environment: + - POSTGRES_DB=${POSTGRES_DATABASE} + - POSTGRES_USER=${POSTGRES_USERNAME} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + volumes: + - evolution-postgres-data:/var/lib/postgresql/data + +volumes: + evolution-postgres-data: + evolution-go-data: + evolution-go-logs: diff --git a/blueprints/evolutiongo/evolutionapi.png b/blueprints/evolutiongo/evolutionapi.png new file mode 100644 index 00000000..bd9b3850 Binary files /dev/null and b/blueprints/evolutiongo/evolutionapi.png differ diff --git a/blueprints/evolutiongo/meta.json b/blueprints/evolutiongo/meta.json new file mode 100644 index 00000000..9c0b14a6 --- /dev/null +++ b/blueprints/evolutiongo/meta.json @@ -0,0 +1,17 @@ +{ + "id": "evolutiongo", + "name": "Evolution GO", + "version": "latest", + "description": "Evolution Go is a high-performance implementation of the WhatsApp API, written in Go. Built with Go’s standard library and modern development practices, it provides a robust and efficient solution for WhatsApp integration using the whatsmeow library.", + "logo": "evolutionapi.png", + "links": { + "github": "https://github.com/evolution-foundation/evolution-go", + "docs": "https://docs.evolutionfoundation.com.br/evolution-go", + "website": "https://docs.evolutionfoundation.com.br/evolution-go" + }, + "tags": [ + "api", + "whatsapp", + "messaging" + ] +} diff --git a/blueprints/evolutiongo/template.toml b/blueprints/evolutiongo/template.toml new file mode 100644 index 00000000..37957061 --- /dev/null +++ b/blueprints/evolutiongo/template.toml @@ -0,0 +1,59 @@ +[variables] +main_domain = "${domain}" +api_key = "${base64:64}" +postgres_password = "${password}" + +[config] +env = [ + "SERVER_URL=https://${main_domain}", + "SERVER_PORT=8080", + "AUTHENTICATION_API_KEY=${api_key}", + "CLIENT_NAME=Evolution", + "DATABASE_SAVE_MESSAGES=false", + "WADEBUG=INFO", + "LOGTYPE=console", + "POSTGRES_DATABASE=evolution", + "POSTGRES_USERNAME=postgresql", + "POSTGRES_PASSWORD=${postgres_password}", + "DATABASE_CONNECTION_URI=postgres://postgresql:${postgres_password}@evolution-postgres:5432", +] + +[[config.mounts]] +filePath = "gateway.conf" +content = """ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +server { + listen 80; + server_name _; + absolute_redirect off; + client_max_body_size 100m; + + # Evolution GO has no route on "/" (and the API answers 503 until the + # license is activated), so send visitors to the bundled manager UI. + location = / { + return 302 /manager/login; + } + + location / { + proxy_pass http://evolution-go:8080; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + } +} +""" + +[[config.domains]] +serviceName = "evolution-gateway" +port = 80 +host = "${main_domain}"