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 .env2. Adicionar a configuração necessária
-
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 -
Preencha o arquivo
.envcom os seus valores. -
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 -dAo 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.
-
Baixe as novas imagens:
docker-compose pull typebot-builder docker-compose pull typebot-viewerComo alternativa, você pode baixar versões específicas:
docker-compose pull typebot-builder:3.4.2 docker-compose pull typebot-viewer:3.4.2 -
Pare o servidor:
docker-compose down -
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 -1Esta 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.compara o builderhttps://bot.domain.compara o viewer
Com proxy reverso existente
Se você já roda um proxy reverso, o mais importante é:
- Configurar os hosts virtuais para corresponder ao
NEXTAUTH_URLe aoNEXT_PUBLIC_VIEWER_URLda sua configuração dodocker-compose. - Encaminhar o tráfego para
127.0.0.1:8080ou{ip-address}:8080, e para127.0.0.1:8081ou{ip-address}:8081se 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: alwaysE adicionar estas variáveis ao seu arquivo .env:
SMTP_HOST=mail
NEXT_PUBLIC_SMTP_FROM=notifications@typebot.domain.comVocê 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.comEsta 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_networkAo 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 é 🔥.