📄 SKILL.md

← Vault

name: chatwoot-inbox-creation-rails-console

description: Criar inboxes no Chatwoot via Rails console quando a API/ui falha (bug conhecido no Chatwoot 4.12.1)

category: devops


Chatwoot — Criar Inboxes via Rails Console (quando API falha)

Contexto

O Chatwoot 4.12.1 tem um bug conhecido: ao criar inboxes via API (POST /api/v1/accounts/:id/inboxes) ou pela interface web (que usa a mesma API por baixo), ocorre:

`

NoMethodError (undefined method '[]' for nil)

app/controllers/api/v1/accounts/inboxes_controller.rb:86:in `create_channel'

`

Solução: criar as inboxes diretamente via Rails console, bypassando o endpoint com bug.

Passo a Passo

1. SSH no VPS

`bash

ssh root@31.97.243.106

senha: Marcia19671951@

`

2. Identificar o container Rails

`bash

docker ps --format "{{.Names}}" | grep rails

deve retornar algo como: root-rails-1

`

3. Criar as inboxes via Rails console

`ruby

Exemplo: criar uma inbox de canal API (Uazapi)

docker exec root-rails-1 bundle exec rails runner "

account = Account.find(1)

# Dados da instância Uazapi

phone = '5511940746066'

token = 'TOKEN-GERADO-PELO-UAZAPI'

webhook = 'https://rochasales.uazapi.com/chatwoot/webhook/' + token

# Criar canal e inbox

channel = Channel::Api.create!(account_id: account.id, webhook_url: webhook)

inbox = Inbox.create!(name: phone, channel: channel, account: account)

puts \"Inbox criada! ID: #{inbox.id}, Nome: #{inbox.name}\"

"

`

4. Configurar o Uazapi (em cada instância)

`bash

PUT https://rochasales.uazapi.com/chatwoot/config

Header: token:

curl -s -X PUT "https://rochasales.uazapi.com/chatwoot/config" \

-H "token: TOKEN-DA-INSTÂNCIA" \

-H "Content-Type: application/json" \

-d '{

"enabled": true,

"url": "https://chat.rochasalesseguros.com.br",

"access_token": "REDACTED",

"account_id": 1,

"inbox_id": ID_DA_INBOX_CRIADA

}'

`

5. Verificar configuração no Uazapi

`bash

curl -s -X GET "https://rochasales.uazapi.com/chatwoot/config" \

-H "token: TOKEN-DA-INSTÂNCIA" | python3 -c "

import sys, json

d = json.load(sys.stdin)

s = d.get('integration_status', {})

print(f\" webhook: {s.get('webhook_url','N/A')}\")

print(f\" inbox: {s.get('inbox_name','N/A')}\")

print(f\" inbox_exists: {s.get('inbox_exists','N/A')}\")

print(f\" webhook_configured: {s.get('webhook_configured','N/A')}\")

print(f\" status: {s.get('status','N/A')}\")

"

`

Esperado: status: ok, inbox_exists: True, webhook_configured: True

Encontrar o account_id correto

`bash

docker exec root-rails-1 bundle exec rails runner "

Account.all.pluck(:id, :name).each { |id, name| puts \"\#{id}: \#{name}\" }

"

`

Encontrar o access_token do Chatwoot

`bash

docker exec root-rails-1 bundle exec rails runner "

User.first&.access_token || 'não encontrado'

"

`

Encontrar o inbox_id (para verificar)

`bash

docker exec root-rails-1 bundle exec rails runner "

Inbox.all.pluck(:id, :name).each { |id, name| puts \"\#{id}: \#{name}\" }

"

`

Armadilhas Conhecidas