Pular para o conteúdo

Como atualizar a NooviChat via linha de comando

Se você não usa o Portainer, este guia mostra como atualizar a NooviChat diretamente pelo terminal — tanto via Docker Compose quanto via Docker Swarm.

Antes de começar

Faça o backup do banco de dados antes de qualquer atualização. É um passo rápido e pode salvar horas de trabalho em caso de problema.

Backup obrigatório

Execute no terminal do servidor, dentro do container do postgres:

bash
# Se estiver usando Docker Compose
docker compose exec postgres pg_dump -U noovichat noovichat > backup_$(date +%Y%m%d_%H%M).sql

# Se estiver usando Docker Swarm
docker exec $(docker ps -q -f name=noovichat_postgres) \
  pg_dump -U noovichat noovichat > backup_$(date +%Y%m%d_%H%M).sql

Volumes: o que apagar?

Em atualizações normais, não é necessário apagar nenhum volume. Apague volumes apenas quando o suporte NooviAI solicitar explicitamente.

✓ Se você usa MinIO ou S3

Os arquivos das conversas (imagens, vídeos, documentos, áudios) estão no bucket externo. O volume de storage local é apenas cache e pode ser removido com segurança se solicitado — sem perda de dados.

✗ Se você NÃO usa MinIO nem S3

Todos os arquivos enviados nas conversas ficam dentro do volume local noovichat_storage. Remover este volume causa perda permanente e irreversível de todo o conteúdo de mídia — imagens, vídeos, documentos e áudios das conversas. Não há como recuperar.

VolumeConteúdoAtualização normal
noovichat_storageArquivos de conversas (mídia)Manter
noovichat_postgresBanco de dados completoManter
noovichat_redisCache e filas (temporário)Manter

Atualizar via Docker Compose

Use este método se o seu servidor roda com docker-compose.yml.

1

Acesse o diretório da instalação

bash
cd /caminho/para/sua/instalacao/noovichat
2

Atualize o arquivo docker-compose.yml (se necessário)

Se precisar mudar para uma versão específica, edite a tag da imagem nos serviços app e sidekiq. Se estiver usando :latest, pule este passo.

yaml
# No docker-compose.yml, localize e atualize:
services:
  app:
    image: nooviai/noovichat:3.12.0   # <-- versão nova

  sidekiq:
    image: nooviai/noovichat:3.12.0   # <-- mesma versão
3

Baixe a nova imagem

bash
docker compose pull
4

Pare os serviços

bash
docker compose down
5

Suba os serviços novamente

bash
docker compose up -d
6

Rode a migração do banco

Aguarde o serviço app estar no ar (30 a 60 segundos) e execute:

bash
docker compose exec app bundle exec rails db:migrate

Atualizar via Docker Swarm

Use este método se o seu servidor roda em modo Swarm (sem Portainer).

1

Baixe a nova imagem em todos os nodes

bash
docker pull nooviai/noovichat:latest
# ou com tag específica:
docker pull nooviai/noovichat:3.12.0
2

Atualize o serviço app

bash
# Com latest
docker service update --image nooviai/noovichat:latest noovichat_app

# Com versão específica
docker service update --image nooviai/noovichat:3.12.0 noovichat_app
3

Atualize o serviço sidekiq

Não esqueça do sidekiq

App e sidekiq precisam estar sempre na mesma versão.

bash
docker service update --image nooviai/noovichat:latest noovichat_sidekiq
# ou com versão específica:
docker service update --image nooviai/noovichat:3.12.0 noovichat_sidekiq
4

Aguarde os serviços estabilizarem

Monitore até ambos estarem com status Running:

bash
# Acompanhe o status em tempo real
watch docker service ls

# Ou verifique um serviço específico
docker service ps noovichat_app
5

Rode a migração do banco

bash
# Encontre o ID do container app em execução
docker ps --filter "name=noovichat_app" --format "{{.ID}}"

# Execute a migration
docker exec <ID_DO_CONTAINER> bundle exec rails db:migrate

Usando stack file (docker stack deploy)?

Se você gerencia o Swarm via arquivo de stack, atualize a tag da imagem no arquivo e faça um redeploy:

bash
docker stack deploy -c docker-compose.prod.yml noovichat --with-registry-auth

Detalhes do db:migrate

O db:migrate aplica mudanças estruturais no banco — novas colunas, tabelas e índices que acompanham a nova versão. Ele não apaga dados.

bash
# Docker Compose
docker compose exec app bundle exec rails db:migrate

Aplica migrations pendentes via Docker Compose.

bash
# Docker Swarm (substitua <ID> pelo ID real do container)
docker exec <ID> bundle exec rails db:migrate

Aplica migrations pendentes via Docker Swarm.

bash
# Verificar status das migrations
docker compose exec app bundle exec rails db:migrate:status

"up" = aplicada, "down" = pendente.

bash
# Desfazer última migration (emergência)
docker compose exec app bundle exec rails db:rollback

Use apenas se a migration causou erro e você precisa reverter.

Verificação pós-atualização

bash
# Verificar containers/serviços rodando
docker compose ps           # Docker Compose
docker service ls           # Docker Swarm

# Verificar logs do app (últimas 50 linhas)
docker compose logs --tail=50 app

# Verificar logs do sidekiq
docker compose logs --tail=50 sidekiq

# Testar se a aplicação responde
curl -I https://chat.seudominio.com

O que verificar nos logs

Logs saudáveis mostram mensagens como Listening on ou Sidekiq starting. Erros recorrentes do tipo PG::UndefinedTable indicam que o db:migrate não foi executado.

Problemas comuns

docker compose pull não baixa a nova versão

Se estiver usando :latest, o Docker pode ter a imagem em cache. Force o pull com: docker compose pull --no-cache ou especifique a tag exata da nova versão no compose file.

Erro "no such service: app" ao rodar db:migrate

O nome do serviço no seu compose pode ser diferente. Verifique com docker compose ps e use o nome correto (pode ser "noovichat", "web" ou outro).

Container sobe mas cai imediatamente

Veja os logs: docker compose logs app. O erro mais comum é uma variável de ambiente faltando ou incorreta. Verifique o arquivo .env.

Swarm não atualiza o serviço (stays at old version)

Confirme que o docker pull foi executado no node correto. Em ambientes multi-node, todos os workers precisam ter a imagem baixada. Use docker pull em cada node ou configure um registry privado.

Mensagens pararam de ser processadas após a atualização

Verifique os logs do sidekiq. Provavelmente o db:migrate não foi executado ou o sidekiq está com uma versão diferente da imagem do app.