Control total
Instalación manual con Portainer
Usa este camino si Docker Swarm, Portainer, Traefik y una instancia de FZAP ya están preparados. Podrás revisar el stack y cada variable antes del deploy.
Antes de empezar
15–25 min- Docker Swarm activo con Portainer accesible
- Traefik y dominio configurados
- Una instancia de FZAP ya instalada, con ADMIN_TOKEN a mano
- PostgreSQL con pgvector (el stack ya incluye un servicio listo)
Crea los volúmenes
Crea los volúmenes externos usados por la base de datos y los archivos de medios de Chatme.
bashdocker volume create chatme_pgdata docker volume create chatme_mediaPega el stack en Portainer
En Portainer, abre Stacks → Add stack, usa el nombre
chatmey pega el stack oficial de abajo. Usa ese nombre: la configuración de dominios propios cuenta con él.Abrir stack oficial en GitHubstack.ymlversion: "3.7" services: postgres: image: pgvector/pgvector:pg16 networks: - ChatmeNet environment: - TZ=America/Sao_Paulo - POSTGRES_DB=chatme - POSTGRES_USER=chatme - POSTGRES_PASSWORD=troque_esta_senha volumes: - chatme_pgdata:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager resources: limits: cpus: "1" memory: 1024M labels: - io.portainer.accesscontrol.users=admin chatme: image: dncarbonell/chatme:latest networks: - ChatmeNet - proxy volumes: - chatme_media:/var/lib/chatme/storage environment: # --- Configurações Gerais --- - TZ=America/Sao_Paulo - PORT=8081 - PUBLIC_BASE_URL=https://app.exemplo.com.br # URL pública final da instância - sempre com "https://". O host desta URL é o domínio da licença #- LOG_LEVEL=info # debug, info, warn, error (padrão: info) # --- Banco de Dados (PostgreSQL/pgvector) --- - DATABASE_URL=postgres://chatme:troque_esta_senha@postgres:5432/chatme?sslmode=disable # --- Segurança --- - SECURE_COOKIES=true # true em produção (atrás de TLS); false só para testar login por cookie em http - TRUST_PROXY_HEADERS=true # o Traefik termina o HTTPS e sobrescreve X-Forwarded-For; o serviço não tem porta publicada #- SAFE_FETCH_ALLOW_PRIVATE_NETWORK=false # webhooks de bots bloqueiam rede privada por padrão (proteção SSRF); ative só p/ endpoints internos confiáveis # --- Chave mestra da instalação (OBRIGATÓRIA) --- # Raiz da qual o app deriva, por HKDF, uma chave para cada finalidade (credenciais # de IA, segredos de bots, etc). Vem só do ambiente, precisa ser a MESMA em todas # as réplicas e nunca deve trocar depois do primeiro boot. Gere com: openssl rand -hex 32 - CHATME_MASTER_KEY=troque_esta_chave_mestra # --- Licença (entregue pela Flouds) --- # Deixe vazio para rodar em modo "unlicensed" (funcional, com aviso, 1 tenant/1 pessoa) - CHATME_LICENSE_KEY= # --- Domínios próprios das contas (opcional, Chatme 0.7.0+) --- # Cada conta pode atender no domínio do cliente (ex.: atendimento.cliente.com.br), # cadastrado no console sem editar esta stack. Exige preparar o Traefik uma vez: # deploy/dominios-proprios/README.md. Descomente os 3 juntos; parcial impede o boot. # A licença continua no domínio de PUBLIC_BASE_URL. #- CUSTOM_DOMAINS_IPS=203.0.113.10 # IP(s) público(s) da VPS, separados por vírgula #- CUSTOM_DOMAINS_PROXY_TOKEN=troque_este_segredo # openssl rand -hex 32 (o mesmo vai na stack do Traefik) #- CUSTOM_DOMAINS_UPSTREAM_URL=http://chatme_chatme:8081 # <stack>_<serviço>; stack com outro nome muda aqui # A porta interna 8082 (consultada pelo Traefik) NÃO deve ser publicada. # Padrões, se o seu Traefik usa outros nomes: #- CUSTOM_DOMAINS_HTTP_ENTRYPOINT=web #- CUSTOM_DOMAINS_ENTRYPOINT=websecure #- CUSTOM_DOMAINS_CERT_RESOLVER=letsencryptresolver # --- Branding-base da instalação (fallback do primeiro boot) --- # Pode deixar em branco e configurar depois pelo próprio Chatme #- PRODUCT_NAME= #- LOGO_URL= #- COLOR_PRIMARY= #- SUPPORT_EMAIL= # --- fzap global (conector WhatsApp - infra interna, o cliente final não vê) --- - FZAP_BASE_URL=https://fzap.exemplo.com.br - FZAP_ADMIN_TOKEN=troque_este_token # --- Armazenamento de mídia (anexos das mensagens) --- # Config GLOBAL por instalação (não por tenant). Os bytes de mídia não ficam no # banco: vão para um volume (fs) ou um bucket S3-compatível (s3). - STORAGE_BACKEND=fs # fs (volume, default) | s3 (MinIO, R2, Spaces, AWS S3) # -- Backend fs (volume) -- - STORAGE_ROOT=/var/lib/chatme/storage # Segredo HMAC que assina as URLs temporárias de mídia de SAÍDA (a fzap baixa por # essa URL). Obrigatório no backend fs. Gere com: openssl rand -hex 32 - STORAGE_SIGN_SECRET=troque_este_segredo # -- Backend s3 (S3-compatível) -- #- STORAGE_ENDPOINT= # host:porta; vazio = AWS S3 #- STORAGE_REGION=us-east-1 #- STORAGE_BUCKET=chatme-media #- STORAGE_ACCESS_KEY_ID= #- STORAGE_SECRET_ACCESS_KEY= #- STORAGE_FORCE_PATH_STYLE=true # true para MinIO e afins #- STORAGE_USE_SSL=true # -- Comuns de storage -- #- STORAGE_SIGNED_URL_TTL=15m # validade das URLs assinadas de saída #- STORAGE_MAX_UPLOAD_BYTES=26214400 # teto de upload de mídia de saída (bytes) - default 25 MiB # --- Transcrição de áudio (opcional, feita pelo próprio Chatme) --- # Disponibiliza o provedor para a instalação; cada tenant ainda ativa em Configurações > Recursos #- TRANSCRIPTION_ENABLED=false #- TRANSCRIPTION_PROVIDER=openai # openai | groq #- TRANSCRIPTION_API_KEY= #- TRANSCRIPTION_MODEL= # default: whisper-1 (openai) | whisper-large-v3 (groq) #- TRANSCRIPTION_BASE_URL= # endpoint opcional; default oficial de cada provider #- TRANSCRIPTION_LANGUAGE=pt # ISO-639-1; vazio = detecção automática #- TRANSCRIPTION_HTTP_TIMEOUT=90s deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager resources: limits: cpus: "1" memory: 512M labels: - io.portainer.accesscontrol.users=admin # Configuração Traefik - traefik.enable=true - traefik.swarm.network=proxy - traefik.http.routers.chatme.rule=Host(`app.exemplo.com.br`) - traefik.http.routers.chatme.entrypoints=websecure - traefik.http.routers.chatme.tls=true - traefik.http.routers.chatme.tls.certresolver=letsencryptresolver - traefik.http.routers.chatme.service=chatme - traefik.http.services.chatme.loadbalancer.server.port=8081 - traefik.http.services.chatme.loadbalancer.passHostHeader=true volumes: chatme_pgdata: name: chatme_pgdata external: true chatme_media: name: chatme_media external: true networks: ChatmeNet: name: ChatmeNet proxy: name: proxy external: trueGenera las claves y revisa las variables
Genera
CHATME_MASTER_KEYySTORAGE_SIGN_SECRETcon el comando de abajo. Después revisaPUBLIC_BASE_URL, la contraseña de la base,FZAP_BASE_URLyFZAP_ADMIN_TOKEN.bashopenssl rand -hex 32 # CHATME_MASTER_KEY openssl rand -hex 32 # STORAGE_SIGN_SECRETAtención: Guarda las dos claves en un lugar seguro antes del deploy. No pueden cambiar después del primer arranque.
Haz el deploy
Haz clic en Deploy the stack y espera hasta que el servicio
chatmeesté activo.Crea el administrador
Abre el dominio configurado. En la primera visita, Chatme muestra la pantalla de configuración inicial, donde creas el admin y el primer tenant.