Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
e0613fb
sync: 0.6.1 from main (165801be5912844fe0cdeb598c386751d3cf15c3)
github-actions[bot] Mar 25, 2026
00767d7
sync: 0.6.1 from main (7eec22f9c7fe6c2c042be960827ae32bfc172e5d)
github-actions[bot] Mar 25, 2026
77a22ee
sync: 0.6.1 from main (109f0d6ef42e7b3992f26beea7a5c0d60fc3f1a3)
github-actions[bot] Mar 25, 2026
95cc8e0
sync: 0.6.1 from main (d5cdb462f2a225c584cde27aa7f2f4ace7f79d11)
github-actions[bot] Mar 25, 2026
ec8cf23
sync: 0.6.1 from main (abb48b9715bbc5374cd4f5135d99a1a224ec3db0)
github-actions[bot] Mar 25, 2026
71c3c77
sync: 0.6.1 from main (f423e1104b5f6aabd9726609f404c9263a3c6d41)
github-actions[bot] Mar 25, 2026
89eaae3
sync: 0.6.1 from main (b6656c724fa3741bf63f7b74078026bff80c3643)
github-actions[bot] Mar 25, 2026
569491e
docs(swagger): add swagger models and update API annotations
oismaelash Mar 31, 2026
97cd8a7
refactor: update interactive message structure to include headers, co…
oismaelash Apr 9, 2026
23c46c3
sync: 0.7.0 from main (759eb02deab38d02dc6b4a0156c30eec9b440e68)
github-actions[bot] Apr 17, 2026
0e7287c
feat(minio): ensure bucket exists on storage init
oismaelash Apr 20, 2026
1002ba4
feat: implement AlwaysOnline presence feature
edilsonoliveirama Apr 20, 2026
141ae98
fix(group): fix GET /group/myall to handle WhatsApp LID JID format
edilsonoliveirama Apr 20, 2026
bf24078
refactor(presence): address code review feedback on AlwaysOnline feature
edilsonoliveirama Apr 20, 2026
7c6b6b0
fix(group): address code review feedback on GetMyGroups
edilsonoliveirama Apr 20, 2026
59fb736
feat(dashboard): add real metrics to manager dashboard
edilsonoliveirama Apr 20, 2026
f8c7d23
fix(dashboard): prevent XSS and handle missing API key clearly
edilsonoliveirama Apr 20, 2026
bd9f000
fix(chat): enable chat operations and make mute duration configurable
edilsonoliveirama Apr 20, 2026
64527d5
fix(chat): validate and clamp mute duration
edilsonoliveirama Apr 20, 2026
35d3166
feat(metrics): expose Prometheus /metrics endpoint
edilsonoliveirama Apr 20, 2026
8cd9848
fix(instance): return 200 with disconnected status instead of 400 on #20
edilsonoliveirama Apr 20, 2026
bfa9d92
fix(instance): resolve empty pairing code on POST /instance/pair
edilsonoliveirama Apr 20, 2026
18c7e05
feat: add PIX payment and fix interactive messages (buttons, list, ca…
impa365 Apr 20, 2026
c459dcb
refactor(metrics): address PR #37 review feedback from @paluan-batista
edilsonoliveirama Apr 23, 2026
381782f
refactor(metrics): address PR #37 review feedback from @paluan-batista
edilsonoliveirama Apr 23, 2026
7b9af5a
Merge branch 'main' into docs/swager-update
oismaelash Apr 24, 2026
9f0eb34
sync: 0.7.1 from main (afbdef430763055e4604be35b2787046e72ef833)
github-actions[bot] Apr 24, 2026
61f823d
Merge branch 'EvolutionAPI:main' into main
oismaelash Apr 25, 2026
46801c6
feat(message): add /message/markplayed endpoint for played receipt
brunohenriquecontente Apr 27, 2026
84eb096
remove unnecessary checks in formatBRNumber function
VitorS0uza Apr 27, 2026
19db9be
fix: clone whatsmeow-lib directly for Railway deployment
May 4, 2026
7176aba
Merge branch 'EvolutionAPI:main' into main
felipersd8 May 5, 2026
94c0fa9
feat(events): forward Picture, UserAbout, BusinessName webhook events
walterdiazesa May 9, 2026
7e90eb8
Add CTWA referral passthrough and persistence
juliomuhlbauer May 9, 2026
355ca80
Log message persistence failures
juliomuhlbauer May 9, 2026
8f1209e
feat(group): expose UpdateGroupSettings endpoint
lucas-eduardo May 22, 2026
5ffb965
docs(swagger): mark groupJid and action as required in UpdateGroupSet…
lucas-eduardo May 22, 2026
5516340
chore(railway): add Railway config and fix port resolution
lucas-eduardo May 22, 2026
a7a43e4
revert: restore original SERVER_PORT usage in main.go
lucas-eduardo May 22, 2026
02f8193
fix(docker): clone whatsmeow-lib submodule during build
lucas-eduardo May 22, 2026
9498836
Merge remote-tracking branch 'upstream/main'
felipersd8 May 23, 2026
d584b9a
Merge branch 'pr-33'
felipersd8 May 23, 2026
c05c6b0
Merge branch 'pr-34'
felipersd8 May 23, 2026
6ed9b35
Merge branch 'pr-35'
felipersd8 May 23, 2026
cff2206
Merge branch 'pr-36'
felipersd8 May 23, 2026
a6cdeed
Merge branch 'pr-37'
felipersd8 May 23, 2026
4e03e2c
Merge branch 'pr-38'
felipersd8 May 23, 2026
dbae3dc
Merge branch 'pr-39'
felipersd8 May 23, 2026
891832f
Merge branch 'pr-40'
felipersd8 May 23, 2026
93c8125
Merge branch 'pr-43'
felipersd8 May 23, 2026
8db73f5
Merge branch 'pr-44'
felipersd8 May 23, 2026
6797263
Merge branch 'pr-46'
felipersd8 May 23, 2026
6ffc2b1
Merge branch 'pr-47'
felipersd8 May 23, 2026
07a752f
Merge branch 'pr-57'
felipersd8 May 23, 2026
53d98c6
Merge branch 'pr-58'
felipersd8 May 23, 2026
fe557f6
Merge branch 'pr-64'
felipersd8 May 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ Makefile
*_test.go
*.test

# Reference code (analysis only)
evo que funciona*/
ANALISE-CORRECOES-CAROUSEL-PIX.md

# Manager/dist é necessário - serve arquivos estáticos do frontend React
# Não excluir - precisa estar na imagem final para ser acessado via /manager

Expand Down
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,15 @@ coverage.*
.idea/
.vscode/
.DS_Store
manager/node_modules/
manager/src/
manager/package.json
manager/package-lock.json
manager/postcss.config.js
manager/tailwind.config.ts
manager/tsconfig*.json
manager/vite.config.ts
manager/index.html
evo que funciona botõtes carossel pix etc para analise/
docker-compose.yml
docker/
7 changes: 5 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ WORKDIR /build
# Copiar apenas arquivos de dependências primeiro para cachear o download
COPY go.mod go.sum ./

# Copiar whatsmeow-lib que é uma dependência local
COPY whatsmeow-lib/ ./whatsmeow-lib/
# Clonar whatsmeow-lib diretamente (submodule não é inicializado pelo Railway)
RUN git clone https://github.com/EvolutionAPI/whatsmeow.git whatsmeow-lib && \
cd whatsmeow-lib && \
git checkout 0923702fb3fac8525241f15331b92116485d69eb

# Agora fazer download das dependências (com replace funcionando)
RUN go mod download
Expand All @@ -27,6 +29,7 @@ WORKDIR /app

COPY --from=build /build/server .
COPY --from=build /build/manager/dist ./manager/dist
COPY --from=build /build/manager/dashboard ./manager/dashboard
COPY --from=build /build/VERSION ./VERSION

ENV TZ=America/Sao_Paulo
Expand Down
31 changes: 19 additions & 12 deletions cmd/evolution-go/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
community_service "github.com/EvolutionAPI/evolution-go/pkg/community/service"
config "github.com/EvolutionAPI/evolution-go/pkg/config"
"github.com/EvolutionAPI/evolution-go/pkg/core"
"github.com/EvolutionAPI/evolution-go/pkg/metrics"
producer_interfaces "github.com/EvolutionAPI/evolution-go/pkg/events/interfaces"
nats_producer "github.com/EvolutionAPI/evolution-go/pkg/events/nats"
rabbitmq_producer "github.com/EvolutionAPI/evolution-go/pkg/events/rabbitmq"
Expand Down Expand Up @@ -67,19 +68,12 @@ import (

var devMode = flag.Bool("dev", false, "Enable development mode")

var version = "0.0.0"

func init() {
// ldflags -X main.version= sets this at compile time.
// If not set (or still default), try reading from VERSION file.
if version == "0.0.0" {
if v, err := os.ReadFile("VERSION"); err == nil {
if trimmed := strings.TrimSpace(string(v)); trimmed != "" {
version = trimmed
}
}
var version = func() string {
if v, err := os.ReadFile("VERSION"); err == nil {
return strings.TrimSpace(string(v))
}
}
return "dev"
}()

func setupRouter(db *gorm.DB, authDB *sql.DB, sqliteDB *sql.DB, config *config.Config, conn *amqp.Connection, exPath string, runtimeCtx *core.RuntimeContext) *gin.Engine {
killChannel := make(map[string](chan bool))
Expand Down Expand Up @@ -158,6 +152,7 @@ func setupRouter(db *gorm.DB, authDB *sql.DB, sqliteDB *sql.DB, config *config.C
}

instanceRepository := instance_repository.NewInstanceRepository(db)

messageRepository := message_repository.NewMessageRepository(db)
labelRepository := label_repository.NewLabelRepository(db)

Expand Down Expand Up @@ -201,6 +196,9 @@ func setupRouter(db *gorm.DB, authDB *sql.DB, sqliteDB *sql.DB, config *config.C

r := gin.Default()

metricsRegistry := metrics.New(version, instanceRepository)
r.GET("/metrics", gin.WrapH(metricsRegistry.Handler()))

// CORS middleware — must be before everything else
r.Use(func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
Expand All @@ -215,6 +213,7 @@ func setupRouter(db *gorm.DB, authDB *sql.DB, sqliteDB *sql.DB, config *config.C
c.Next()
})

r.Use(metricsRegistry.GinMiddleware())
r.Use(core.GateMiddleware(runtimeCtx))

// License routes (always accessible, even without license)
Expand All @@ -240,6 +239,14 @@ func setupRouter(db *gorm.DB, authDB *sql.DB, sqliteDB *sql.DB, config *config.C
go whatsmeowService.ConnectOnStartup(config.ClientName)
}

// @Summary WebSocket Connection
// @Description Connect to the WebSocket
// @Tags WebSocket
// @Param token query string true "Global API Key"
// @Param instanceId query string true "Instance ID"
// @Success 101 {string} string "Switching Protocols"
// @Failure 401 {object} gin.H "Unauthorized"
// @Router /ws [get]
r.GET("/ws", func(c *gin.Context) {
token := c.Query("token")
instanceId := c.Query("instanceId")
Expand Down
89 changes: 89 additions & 0 deletions docker/stack-evocrm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
version: '3.8'

services:
evolution_go:
image: intrategica/evg:1
networks:
- papi
environment:
# Servidor
SERVER_PORT: 3300
CLIENT_NAME: "evolution"

# Segurança (ALTERE a chave abaixo)
GLOBAL_API_KEY: "429683C4C977415CAAFCCE10F7D57E11"

# Banco de Dados PostgreSQL (serviço 'postgres' já existente)
POSTGRES_AUTH_DB: "postgresql://pastorini:pastorini123@postgres:5432/pastorini_api?sslmode=disable"
POSTGRES_USERS_DB: "postgresql://pastorini:pastorini123@postgres:5432/pastorini_api?sslmode=disable"
POSTGRES_HOST: "postgres"
POSTGRES_PORT: "5432"
POSTGRES_USER: "pastorini"
POSTGRES_PASSWORD: "pastorini123"
POSTGRES_DB: "pastorini_api"
DATABASE_SAVE_MESSAGES: "false"

# Logs e Debug
WADEBUG: "INFO"
LOGTYPE: "console"
LOG_DIRECTORY: "/app/logs"
LOG_MAX_SIZE: "100"
LOG_MAX_BACKUPS: "5"
LOG_MAX_AGE: "30"
LOG_COMPRESS: "true"

# Conexão
CONNECT_ON_STARTUP: "true"
WEBHOOKFILES: "true"

# Sistema
OS_NAME: "Linux"

# Eventos
EVENT_IGNORE_GROUP: "false"
EVENT_IGNORE_STATUS: "true"

# MinIO/S3 (Opcional)
MINIO_ENABLED: "false"
MINIO_ENDPOINT: ""
MINIO_ACCESS_KEY: ""
MINIO_SECRET_KEY: ""
MINIO_BUCKET: ""
MINIO_USE_SSL: "false"

volumes:
- evolution_go_data:/app/dbdata
- evolution_go_logs:/app/logs

deploy:
replicas: 1
placement:
constraints:
- node.role == manager
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
labels:
- traefik.enable=true
- traefik.docker.network=papi
- traefik.http.routers.evocrm.rule=Host(`evocrm.intrategica.com.br`)
- traefik.http.routers.evocrm.entrypoints=websecure
- traefik.http.routers.evocrm.tls=true
- traefik.http.routers.evocrm.tls.certresolver=letsencryptresolver
- traefik.http.routers.evocrm.service=evocrm
- traefik.http.services.evocrm.loadbalancer.server.port=3300
- traefik.http.services.evocrm.loadbalancer.passHostHeader=true

volumes:
evolution_go_data:
external: true
name: evolution_go_data
evolution_go_logs:
external: true
name: evolution_go_logs

networks:
papi:
external: true
name: papi
Loading