evolution-api:
image: atendai/evolution-api:v2.2.3
restart: always
depends_on:
- mysql
environment:
# Banco de dados interno
DATABASE_ENABLED: true
DATABASE_PROVIDER: mysql
DATABASE_CONNECTION_URI: mysql://bla-cla-bla
DATABASE_CONNECTION_DB_PREFIX_NAME: evolution
# Autenticação
AUTHENTICATION_TYPE: apikey
AUTHENTICATION_API_KEY: xxx
# Configuração do servidor
SERVER_URL: https://domain.com
# WebSocket
WEBSOCKET_ENABLED: true
WEBSOCKET_GLOBAL_EVENTS: true
# Informações do cliente
CONFIG_SESSION_PHONE_CLIENT: EvolutionAPI
CONFIG_SESSION_PHONE_NAME: Chrome
# Logs
LOG_LEVEL: ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,DARK,WEBHOOKS
LOG_COLOR: true
LOG_BAILEYS: trace
# Armazenamento temporário
STORE_MESSAGES: true
STORE_CONTACTS: true
STORE_CHATS: true
CLEAN_STORE_CLEANING_INTERVAL: 3600
CLEAN_STORE_MESSAGES: true
CLEAN_STORE_CONTACTS: true
CLEAN_STORE_CHATS: true
# Armazenamento persistente (MySQL)
DATABASE_SAVE_DATA_INSTANCE: true
DATABASE_SAVE_DATA_NEW_MESSAGE: true
DATABASE_SAVE_DATA_CONTACTS: true
DATABASE_SAVE_DATA_CHATS: true
# Webhook
WEBHOOK_GLOBAL_ENABLED: true
WEBHOOK_GLOBAL_URL: https://domain.com/xyz/xxx
# CORS
CORS_ORIGIN: "*"
CORS_METHODS: POST,GET,PUT,DELETE
CORS_CREDENTIALS: true
# Cache
CACHE_REDIS_ENABLED: false
CACHE_LOCAL_ENABLED: true
volumes:
- ./evolution-api/data/instances:/evolution/instances
- ./evolution-api/data/store:/evolution/store
evolution-api-1 | 2025-05-10T06:40:09.957499624Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:09 VERBOSE [CacheEngine] [string] LocalCache initialized for groups
evolution-api-1 | 2025-05-10T06:40:09.958466152Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:09 VERBOSE [CacheService] [string] cacheservice created using cache engine: ae
evolution-api-1 | 2025-05-10T06:40:10.199827510Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 VERBOSE [CacheEngine] [string] LocalCache initialized for instance
evolution-api-1 | 2025-05-10T06:40:10.199959802Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 VERBOSE [CacheService] [string] cacheservice created using cache engine: ae
evolution-api-1 | 2025-05-10T06:40:10.199969032Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 VERBOSE [CacheEngine] [string] LocalCache initialized for baileys
evolution-api-1 | 2025-05-10T06:40:10.199973042Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 VERBOSE [CacheService] [string] cacheservice created using cache engine: ae
evolution-api-1 | 2025-05-10T06:40:10.211881220Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 INFO [WA MODULE] [string] Module - ON
evolution-api-1 | 2025-05-10T06:40:10.508076948Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 INFO [PrismaRepository] [string] Repository:Prisma - ON
evolution-api-1 | 2025-05-10T06:40:10.515542924Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 INFO [WebsocketController] [string] Socket.io initialized
evolution-api-1 | 2025-05-10T06:40:10.522437446Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:10 LOG [SERVER] [string] HTTP - ON: 8080
evolution-api-1 | 2025-05-10T06:40:21.096536671Z create instance {
evolution-api-1 | 2025-05-10T06:40:21.096575351Z instanceName: 'xxx',
evolution-api-1 | 2025-05-10T06:40:21.096578741Z integration: 'WHATSAPP-BAILEYS',
evolution-api-1 | 2025-05-10T06:40:21.096582031Z token: 'xxx-yyy-zzz-xxx'
evolution-api-1 | 2025-05-10T06:40:21.096585361Z }
evolution-api-1 | 2025-05-10T06:40:21.129465937Z [Evolution API] v2.2.3 170 - Sat May 10 2025 03:40:21 ERROR [InstanceController] [string]
evolution-api-1 | 2025-05-10T06:40:21.129505307Z Invalid `S.integrationSession.update()` invocation in
evolution-api-1 | 2025-05-10T06:40:21.129510697Z /evolution/dist/main.js:161:10171
evolution-api-1 | 2025-05-10T06:40:21.129514006Z
evolution-api-1 | 2025-05-10T06:40:21.129516827Z 158 `));let g="";d.bold&&(g+="*"),d.italic&&(g+="_"),d.underline&&(g+="~");let m=`${g}${u}${g.split("").reverse().join("")}`;return d.url&&(m=d.children[0]?.text?`[${m}]
evolution-api-1 | 2025-05-10T06:40:21.129520636Z 159 (${d.url})`:`${d.url}`),m}async function l(d,u,g,m,h,y,w,S){for(let E of m){if(E.type==="text"){let b="";for(let C of E.content.richText){for(let N of C.children)b+=w(N);b+=`
evolution-api-1 | 2025-05-10T06:40:21.129525697Z 160 `}if(b=b.replace(/\*\*/g,"").replace(/__/,"").replace(/~~/,"").replace(/\n$/,""),b=b.replace(/\n$/,""),b.includes("[list]")){let C={number:s.split("@")[0],title:"",description:"",buttonText:"",footerText:"",sections:[]},N=b.match(/\[title\]([\s\S]*?)(?=\[description\])/),_=b.match(/\[description\]([\s\S]*?)(?=\[buttonText\])/),x=b.match(/\[buttonText\]([\s\S]*?)(?=\[footerText\])/),L=b.match(/\[footerText\]([\s\S]*?)(?=\[menu\])/);N&&(C.title=N[1].trim()),_&&(C.description=_[1].trim()),x&&(C.buttonText=x[1].trim()),L&&(C.footerText=L[1].trim());let W=b.match(/\[menu\]([\s\S]*?)\[\/menu\]/)?.[1];if(W){let G=W.match(/\[section\]([\s\S]*?)(?=\[section\]|\[\/section\]|\[\/menu\])/g);G&&G.forEach(K=>{let V=K.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim(),$=K.match(/\[row\]([\s\S]*?)(?=\[row\]|\[\/row\]|\[\/section\]|\[\/menu\])/g),X={title:V,rows:$?.map(Cn=>({title:Cn.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim(),description:Cn.match(/description: (.*?)(?:\n|$)/)?.[1]?.trim(),rowId:Cn.match(/rowId: (.*?)(?:\n|$)/)?.[1]?.trim()}))||[]};C.sections.push(X)})}await d.listMessage(C)}else if(b.includes("[buttons]")){let C={number:s.split("@")[0],thumbnailUrl:void 0,title:"",description:"",footer:"",buttons:[]},N=b.match(/\[thumbnailUrl\]([\s\S]*?)(?=\[title\])/),_=b.match(/\[title\]([\s\S]*?)(?=\[description\])/),x=b.match(/\[description\]([\s\S]*?)(?=\[footer\])/),L=b.match(/\[footer\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url))/);_&&(C.title=_[1].trim()),N&&(C.thumbnailUrl=N[1].trim()),x&&(C.description=x[1].trim()),L&&(C.footer=L[1].trim());let W={reply:/\[reply\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,pix:/\[pix\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,copy:/\[copy\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,call:/\[call\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,url:/\[url\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g};for(let[G,K]of Object.entries(W)){let V;for(;(V=K.exec(b))!==null;){let $=V[1].trim(),X={type:G};switch(G){case"pix":X.currency=$.match(/currency: (.*?)(?:\n|$)/)?.[1]?.trim(),X.name=$.match(/name: (.*?)(?:\n|$)/)?.[1]?.trim(),X.keyType=$.match(/keyType: (.*?)(?:\n|$)/)?.[1]?.trim(),X.key=$.match(/key: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"reply":X.displayText=$.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),X.id=$.match(/id: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"copy":X.displayText=$.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),X.copyCode=$.match(/copyCode: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"call":X.displayText=$.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),X.phoneNumber=$.match(/phone: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"url":X.displayText=$.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),X.url=$.match(/url: (.*?)(?:\n|$)/)?.[1]?.trim();break}Object.keys(X).length>1&&C.buttons.push(X)}}await d.buttonMessage(C)}else await d.textMessage({number:s.split("@")[0],delay:g?.delayMessage||1e3,text:b},!1);H("/message/sendText")}E.type==="image"&&(await d.mediaMessage({number:s.split("@")[0],delay:g?.delayMessage||1e3,mediatype:"image",media:E.content.url},null,!1),H("/message/sendMedia")),E.type==="video"&&(await d.mediaMessage({number:s.split("@")[0],delay:g?.delayMessage||1e3,mediatype:"video",media:E.content.url},null,!1),H("/message/sendMedia")),E.type==="audio"&&(await d.audioWhatsapp({number:s.split("@")[0],delay:g?.delayMessage||1e3,encoding:!0,audio:E.content.url},!1),H("/message/sendWhatsAppAudio"));let I=a(y,E.id);I&&await new Promise(b=>setTimeout(b,I*1e3))}if(console.log("input",h),h){if(h.type==="choice input"){let E="",I=h.items;for(let b of I)E+=`\u25B6\uFE0F ${b.content}
evolution-api-1 | 2025-05-10T06:40:21.129555777Z → 161 `;if(E=E.replace(/\n$/,""),E.includes("[list]")){let b={number:s.split("@")[0],title:"",description:"",buttonText:"",footerText:"",sections:[]},C=E.match(/\[title\]([\s\S]*?)(?=\[description\])/),N=E.match(/\[description\]([\s\S]*?)(?=\[buttonText\])/),_=E.match(/\[buttonText\]([\s\S]*?)(?=\[footerText\])/),x=E.match(/\[footerText\]([\s\S]*?)(?=\[menu\])/);C&&(b.title=C[1].trim()),N&&(b.description=N[1].trim()),_&&(b.buttonText=_[1].trim()),x&&(b.footerText=x[1].trim());let L=E.match(/\[menu\]([\s\S]*?)\[\/menu\]/)?.[1];if(L){let W=L.match(/\[section\]([\s\S]*?)(?=\[section\]|\[\/section\]|\[\/menu\])/g);W&&W.forEach(G=>{let K=G.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim(),V=G.match(/\[row\]([\s\S]*?)(?=\[row\]|\[\/row\]|\[\/section\]|\[\/menu\])/g),$={title:K,rows:V?.map(X=>({title:X.match(/title: (.*?)(?:\n|$)/)?.[1]?.trim(),description:X.match(/description: (.*?)(?:\n|$)/)?.[1]?.trim(),rowId:X.match(/rowId: (.*?)(?:\n|$)/)?.[1]?.trim()}))||[]};b.sections.push($)})}await d.listMessage(b)}else if(E.includes("[buttons]")){let b={number:s.split("@")[0],thumbnailUrl:void 0,title:"",description:"",footer:"",buttons:[]},C=E.match(/\[thumbnailUrl\]([\s\S]*?)(?=\[title\])/),N=E.match(/\[title\]([\s\S]*?)(?=\[description\])/),_=E.match(/\[description\]([\s\S]*?)(?=\[footer\])/),x=E.match(/\[footer\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url))/);N&&(b.title=N[1].trim()),C&&(b.thumbnailUrl=C[1].trim()),_&&(b.description=_[1].trim()),x&&(b.footer=x[1].trim());let L={reply:/\[reply\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,pix:/\[pix\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,copy:/\[copy\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,call:/\[call\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g,url:/\[url\]([\s\S]*?)(?=\[(?:reply|pix|copy|call|url)|$)/g};for(let[W,G]of Object.entries(L)){let K;for(;(K=G.exec(E))!==null;){let V=K[1].trim(),$={type:W};switch(W){case"pix":$.currency=V.match(/currency: (.*?)(?:\n|$)/)?.[1]?.trim(),$.name=V.match(/name: (.*?)(?:\n|$)/)?.[1]?.trim(),$.keyType=V.match(/keyType: (.*?)(?:\n|$)/)?.[1]?.trim(),$.key=V.match(/key: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"reply":$.displayText=V.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),$.id=V.match(/id: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"copy":$.displayText=V.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),$.copyCode=V.match(/copyCode: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"call":$.displayText=V.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),$.phoneNumber=V.match(/phone: (.*?)(?:\n|$)/)?.[1]?.trim();break;case"url":$.displayText=V.match(/displayText: (.*?)(?:\n|$)/)?.[1]?.trim(),$.url=V.match(/url: (.*?)(?:\n|$)/)?.[1]?.trim();break}Object.keys($).length>1&&b.buttons.push($)}}await d.buttonMessage(b)}else await d.textMessage({number:s.split("@")[0],delay:g?.delayMessage||1e3,text:E},!1);H("/message/sendText")}await S.integrationSession.update(
evolution-api-1 | 2025-05-10T06:40:21.129573987Z The column `wavoipToken` does not exist in the current database.
Welcome!
What did you do?
Failed to start: The column
wavoipTokendoes not exist in the current database.What did you expect?
Work
What did you observe instead of what you expected?
Screenshots/Videos
No response
Which version of the API are you using?
2.2.3
What is your environment?
Linux
Other environment specifications
If applicable, paste the log output
Additional Notes
Something related to:
evolution-api/prisma/mysql-schema.prisma
Line 267 in 427c994