GG.chatbot
Publicar

Docker

A forma mais simples de começar é com o serviço gerenciado oficial na nuvem. Alta disponibilidade, backups, segurança e manutenção ficam por conta de mim, Baptiste, fundador do GG.chatbot. A versão em nuvem economiza bastante tempo e recursos de desenvolvimento. Para a maioria dos sites acaba sendo a melhor relação custo-benefício, e a receita financia a manutenção e a evolução do projeto. Ou seja, você apoia software fair source e ainda recebe um ótimo serviço.

Requisitos

Você precisa de um servidor com Docker instalado. Se o seu servidor não vier com Docker, siga a documentação oficial para instalá-lo.

Instalação

1. Baixar o arquivo compose

No seu servidor, baixe o docker-compose.yml mais recente e o .env inicial:

 wget https://raw.githubusercontent.com/baptisteArno/typebot.io/latest/docker-compose.yml
 wget https://raw.githubusercontent.com/baptisteArno/typebot.io/latest/.env.example -O .env

2. Adicionar a configuração necessária

  1. Você vai precisar de uma chave secreta aleatória de 32 caracteres, usada para criptografar dados sensíveis. Uma forma simples de gerar uma:

    openssl rand -base64 24 | tr -d '\n' ; echo
  2. Preencha o arquivo .env com os seus valores.

  3. Configure pelo menos um provedor de autenticação (e-mail, Google, GitHub, Facebook ou GitLab). Mais informações em Configuração.

Por padrão, o arquivo compose baixa as imagens estáveis mais recentes: baptistearno/typebot-builder:latest e baptistearno/typebot-viewer:latest. Você pode trocar latest por uma versão específica — todas as tags existentes estão aqui.

3. Iniciar o servidor

Com a configuração pronta no arquivo compose, você pode subir o servidor:

docker-compose up -d

Ao executar esse comando, por padrão ele:

  • Cria um banco de dados
  • Executa as migrações
  • Inicia o builder na porta 8080
  • Inicia o viewer na porta 8081
  • Guarda todos os dados na pasta .typebot, dentro do diretório atual

Agora você pode acessar http://typebot.domain.com:8080 e ver a tela de login. Entre com o e-mail de administrador para ter acesso automático a um espaço de trabalho no plano Team.

O servidor em si não faz terminação SSL: ele roda apenas em HTTP não criptografado. Se quiser HTTPS, você precisa colocar um proxy reverso na frente. Veja as instruções abaixo.

Atualizar o GG.chatbot

O GG.chatbot é atualizado com frequência, mas cabe a você aplicar essas atualizações no seu servidor. Por usar Docker, são atualizações seguras e simples de aplicar.

  1. Baixe as novas imagens:

    docker-compose pull typebot-builder
    docker-compose pull typebot-viewer

    Como alternativa, você pode baixar versões específicas:

     docker-compose pull typebot-builder:3.4.2
     docker-compose pull typebot-viewer:3.4.2
  2. Pare o servidor:

    docker-compose down
  3. Inicie o servidor (com as novas imagens):

     docker-compose up -d

A versão auto-hospedada funciona como uma espécie de LTS: recebe as mudanças cerca de uma vez por mês, depois de terem sido testadas na versão em nuvem. Se quiser os recursos assim que ficam prontos, considere ser usuário da nuvem.

Extras opcionais

Proxy reverso

Por padrão, o GG.chatbot roda em HTTP não criptografado, nas portas 8080 (builder) e 8081 (viewer). Recomendamos rodar em HTTPS, atrás de algum proxy reverso. Você pode ou não já ter um proxy no seu servidor — vejamos os dois casos:

Sem proxy reverso existente

Se o seu DNS é gerenciado por um serviço que oferece proxy com SSL automático, use-o à vontade. Você pode usar a Cloudflare como proxy reverso na frente do GG.chatbot, por exemplo.

Como alternativa, rode um servidor Caddy como proxy reverso. Assim, o certificado SSL fica armazenado na máquina e é gerenciado pelo Let's Encrypt. O Caddy expõe a porta 443, encerra o tráfego SSL e repassa as requisições ao seu servidor.

Veja um exemplo de docker-compose usando o Caddy como proxy reverso:

services:
  caddy-gen:
    container_name: caddy-gen
    image: 'wemakeservices/caddy-gen:latest'
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - {$PWD}/.typebot/caddy-certificates:/data/caddy
    ports:
      - '80:80'
      - '443:443'
    depends_on:
      - typebot-builder
      - typebot-viewer

  typebot-builder:
    labels:
      virtual.host: 'typebot.domain.com' # change to your domain name
      virtual.port: '3000'
      virtual.tls-email: 'admin@example.com' # change to your email

  typebot-viewer:
    labels:
      virtual.host: 'bot.domain.com' # change to your domain name
      virtual.port: '3000'
      virtual.tls-email: 'admin@example.com' # change to your email
      # Necessary to enable message streaming
      virtual.proxy.directives: |
        flush_interval -1

Esta configuração exige que você adicione as seguintes entradas de DNS:

typebot IN A <server_ip>
bot IN A <server_ip>

Você pode juntar este arquivo compose ao primeiro. Certifique-se de que NEXTAUTH_URL esteja como https://typebot.domain.com e NEXT_PUBLIC_VIEWER_URL como https://bot.domain.com.

Ao executar o compose, o SSL deve ser habilitado automaticamente no seu servidor, e você poderá acessar:

  • https://typebot.domain.com para o builder
  • https://bot.domain.com para o viewer

Com proxy reverso existente

Se você já roda um proxy reverso, o mais importante é:

  1. Configurar os hosts virtuais para corresponder ao NEXTAUTH_URL e ao NEXT_PUBLIC_VIEWER_URL da sua configuração do docker-compose.
  2. Encaminhar o tráfego para 127.0.0.1:8080 ou {ip-address}:8080, e para 127.0.0.1:8081 ou {ip-address}:8081 se estiver em uma máquina remota.

SMTP

Recomendo fortemente usar um serviço de SMTP externo. Há muitas opções, como SendInBlue, Mailgun e SendGrid. Isso evita muita dor de cabeça 😅. Depois, basta adicionar as variáveis de configuração de SMTP.

Se ainda assim você não quiser, dá para subir um servidor SMTP no próprio arquivo compose.

services:
  mail:
    image: bytemark/smtp
    restart: always

E adicionar estas variáveis ao seu arquivo .env:

SMTP_HOST=mail
NEXT_PUBLIC_SMTP_FROM=notifications@typebot.domain.com

Você provavelmente precisará garantir que typebot.domain.com tenha um registro SPF válido e que o IP do seu servidor tenha DNS reverso configurado.

Você pode juntar este arquivo compose ao principal.

Armazenamento S3

Se você ainda não tem um armazenamento S3 disponível, pode incluí-lo no seu arquivo compose:

services:
  minio:
    image: minio/minio
    command: server /data
    ports:
      - "9000:9000"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    volumes:
      - s3-data:/data
  # This service just makes sure a bucket with the right policies is created
  createbuckets:
    image: minio/mc
    depends_on:
      - minio
    entrypoint: >
      /bin/sh -c "
      sleep 10;
      /usr/bin/mc alias set minio http://minio:9000 minio minio123;
      /usr/bin/mc mb --ignore-existing minio/typebot;
      /usr/bin/mc anonymous set public minio/typebot/public;
      exit 0;
      "

volumes:
  s3-data:

E adicionar estas variáveis ao seu arquivo .env:

S3_ACCESS_KEY=minio
S3_SECRET_KEY=minio123
S3_BUCKET=typebot
S3_ENDPOINT=storage.domain.com

Esta configuração exige que você adicione a seguinte entrada de DNS:

storage IN A <server_ip>

Você pode juntar este arquivo compose ao principal.

Exemplo de configuração com todos os extras

Veja um exemplo que sobe o GG.chatbot com HTTPS, SMTP e armazenamento S3.

services:
  caddy-gen:
    image: 'wemakeservices/caddy-gen:latest'
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - {$PWD}/.typebot/caddy-certificates:/data/caddy
    ports:
      - '80:80'
      - '443:443'
    depends_on:
      - typebot-builder
      - typebot-viewer
  typebot-db:
    image: postgres:16
    restart: always
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=typebot
      - POSTGRES_PASSWORD=typebot
    healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 5s
        timeout: 5s
        retries: 5
  typebot-builder:
    labels:
      virtual.host: 'typebot.domain.com' # change to your domain
      virtual.port: '3000'
      virtual.tls-email: 'admin@example.com' # change to your email
    image: baptistearno/typebot-builder:latest
    depends_on:
      typebot-db:
        condition: service_healthy
    restart: always
    extra_hosts:
      - 'host.docker.internal:host-gateway'
    # See https://docs.ggchatbot.com/self-hosting/configuration for more configuration options
    env_file:
      - .env
  typebot-viewer:
    labels:
      virtual.host: 'bot.domain.com' # change to your domain
      virtual.port: '3000'
      virtual.tls-email: 'admin@example.com' # change to your email
      # Necessary to enable message streaming
      virtual.proxy.directives: |
        flush_interval -1
    image: baptistearno/typebot-viewer:latest
    depends_on:
      typebot-db:
        condition: service_healthy
    restart: always
    # See https://docs.ggchatbot.com/self-hosting/configuration for more configuration options
    env_file:
      - .env
  mail:
    image: bytemark/smtp
    restart: always
  minio:
    labels:
      virtual.host: 'storage.domain.com' # change to your domain
      virtual.port: '9000'
      virtual.tls-email: 'admin@example.com' # change to your email
    image: minio/minio
    command: server /data
    ports:
      - '9000:9000'
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    volumes:
      - s3-data:/data
  # This service just make sure a bucket with the right policies is created
  createbuckets:
    image: minio/mc
    depends_on:
      - minio
    entrypoint: >
      /bin/sh -c "
      sleep 10;
      /usr/bin/mc alias set minio http://minio:9000 minio minio123;
      /usr/bin/mc mb --ignore-existing minio/typebot;
      /usr/bin/mc anonymous set public minio/typebot/public;
      exit 0;
      "

volumes:
  db-data:
  s3-data:

Criar suas próprias imagens

Para criar sua própria imagem Docker do builder:

docker build -t typebot-builder --build-arg SCOPE=builder .

Para criar sua própria imagem Docker do viewer:

docker build -t typebot-viewer --build-arg SCOPE=viewer .

Solução de problemas

Evitando problemas de rede ao migrar no Portainer

Se você migrar uma stack entre instâncias do Portainer, a resolução de nomes pode falhar, e o typebot-viewer pode não conseguir se conectar ao typebot-db.

Antes de publicar a stack no Portainer, garanta que a rede esteja explicitamente definida como anexável no docker-compose.yml:

networks:
  typebot_network:
    driver: bridge
    attachable: true

services:
  typebot-db:
    ...
    networks:
      - typebot_network
  typebot-builder:
    ...
    networks:
      - typebot_network
  typebot-viewer:
    ...
    networks:
      - typebot_network

Ao publicar a stack, o Portainer criará a rede com as configurações corretas. Isso evita problemas de resolução de nomes após a migração.

Se você hospeda o GG.chatbot por conta própria, me patrocinar é uma ótima forma de retribuir à comunidade e contribuir para a sustentabilidade do projeto a longo prazo. E ainda dá acesso a alguns benefícios, como suporte prioritário e workshops privados. ❤️

Esta documentação foi inspirada na documentação do Plausible. Eles têm uma solução de auto-hospedagem parecida, e a documentação deles é 🔥.

On this page