Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
263 lines
8.7 KiB
Plaintext
263 lines
8.7 KiB
Plaintext
---
|
|
title: Docker Compose
|
|
icon: docker
|
|
---
|
|
|
|
<Warning>
|
|
Os contêineres Docker são para hospedagem em produção ou auto-hospedagem. Para contribuir, consulte a [Configuração local](/l/pt/developers/contribute/capabilities/local-setup).
|
|
</Warning>
|
|
|
|
## Visão geral
|
|
|
|
Este guia fornece instruções passo a passo para instalar e configurar o aplicativo Twenty usando Docker Compose. O objetivo é tornar o processo simples e evitar armadilhas comuns que possam quebrar sua configuração.
|
|
|
|
**Importante:** Modifique apenas as configurações explicitamente mencionadas neste guia. Alterar outras configurações pode levar a problemas.
|
|
|
|
Consulte [Configurar Variáveis de Ambiente](/l/pt/developers/self-host/capabilities/setup) para configuração avançada. Todas as variáveis de ambiente devem ser declaradas no arquivo `docker-compose.yml` no nível do servidor e/ou do trabalhador, dependendo da variável.
|
|
|
|
## Requisitos do Sistema
|
|
|
|
* RAM: Certifique-se de que seu ambiente tenha pelo menos 2GB de RAM. Memória insuficiente pode causar falhas nos processos.
|
|
* Docker & Docker Compose: Certifique-se de que ambos estão instalados e atualizados.
|
|
|
|
## Opção 1: Script de uma linha
|
|
|
|
Instale a versão estável mais recente do Twenty com um único comando:
|
|
|
|
```bash
|
|
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
|
|
```
|
|
|
|
Para instalar uma versão ou branch específica:
|
|
|
|
```bash
|
|
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
|
|
```
|
|
|
|
* Substitua x.y.z pelo número da versão desejada.
|
|
* Substitua branch-name pelo nome da branch que você deseja instalar.
|
|
|
|
## Opção 2: Etapas manuais
|
|
|
|
Siga estas etapas para uma configuração manual.
|
|
|
|
### Etapa 1: Configure o arquivo de ambiente
|
|
|
|
1. **Crie o arquivo .env**
|
|
|
|
Copie o exemplo de arquivo de ambiente para um novo arquivo .env no seu diretório de trabalho:
|
|
|
|
```bash
|
|
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
|
|
```
|
|
|
|
2. **Gerar uma chave de criptografia**
|
|
|
|
Execute o seguinte comando para gerar uma string aleatória única:
|
|
|
|
```bash
|
|
openssl rand -base64 32
|
|
```
|
|
|
|
**Importante:** Mantenha este valor em segredo / não o compartilhe. Perder `ENCRYPTION_KEY` significa perder o acesso a todos os segredos armazenados no banco de dados (tokens OAuth, variáveis de aplicação, segredos TOTP, etc.).
|
|
|
|
3. **Atualize o `.env`**
|
|
|
|
Substitua o valor do espaço reservado no seu arquivo .env pelo token gerado:
|
|
|
|
```ini
|
|
ENCRYPTION_KEY=random_string
|
|
```
|
|
|
|
Consulte o [guia de rotação de chaves](/l/pt/developers/self-host/capabilities/key-rotation) para obter instruções sobre como fazer a rotação sem tempo de inatividade.
|
|
|
|
4. **Defina a Senha do Postgres**
|
|
|
|
Atualize o valor `PG_DATABASE_PASSWORD` no arquivo .env com uma senha forte sem caracteres especiais.
|
|
|
|
```ini
|
|
PG_DATABASE_PASSWORD=my_strong_password
|
|
```
|
|
|
|
### Etapa 2: Obtenha o arquivo Docker Compose
|
|
|
|
Baixe o arquivo `docker-compose.yml` para o seu diretório de trabalho:
|
|
|
|
```bash
|
|
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
|
|
```
|
|
|
|
### Etapa 3: Inicie o Aplicativo
|
|
|
|
Inicie os contêineres Docker:
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
### Etapa 4: Acesse o Aplicativo
|
|
|
|
Se você hospedar o twentyCRM no seu próprio computador, abra o navegador e acesse [http://localhost:3000](http://localhost:3000).
|
|
|
|
Se você hospedar em um servidor, verifique se o servidor está em execução e se está tudo ok com
|
|
|
|
```bash
|
|
curl http://localhost:3000
|
|
```
|
|
|
|
## Configuração
|
|
|
|
### Expor o Twenty para Acesso Externo
|
|
|
|
Por padrão, o Twenty é executado em `localhost` na porta `3000`. A interface acessa a API a partir da origem do próprio navegador, portanto pode ser carregada de qualquer nome de host que alcance o contêiner — ainda assim, defina `SERVER_URL` como sua URL pública: o servidor a utiliza para gerar links (e-mails, callbacks de OAuth) e para detectar HTTPS e definir cookies seguros.
|
|
|
|
#### Compreendendo `SERVER_URL`
|
|
|
|
* **Protocolo:** Use `http` ou `https` dependendo da sua configuração.
|
|
* Use `http` se você não configurou SSL.
|
|
* Use `https` se você tiver SSL configurado.
|
|
* **Domínio/IP:** Este é o nome de domínio ou endereço IP onde seu aplicativo está acessível.
|
|
* **Porta:** Inclua o número da porta se você não estiver usando as portas padrão (`80` para `http`, `443` para `https`).
|
|
|
|
### Requisitos de SSL
|
|
|
|
SSL (HTTPS) é necessário para que certos recursos do navegador funcionem corretamente. Embora esses recursos possam funcionar durante o desenvolvimento local (já que os navegadores tratam o localhost de modo diferente), é necessária uma configuração adequada de SSL ao hospedar o Twenty em um domínio normal.
|
|
|
|
Por exemplo, a API da área de transferência pode exigir um contexto seguro - alguns recursos, como botões de cópia através do aplicativo, podem não funcionar sem HTTPS ativado.
|
|
|
|
Recomendamos fortemente configurar o Twenty atrás de um proxy reverso com terminação SSL para segurança e funcionalidade ótimas.
|
|
|
|
#### Configurando `SERVER_URL`
|
|
|
|
1. **Determine sua URL de Acesso**
|
|
* **Sem Proxy Reverso (Acesso Direto):**
|
|
|
|
Se você estiver acessando o aplicativo diretamente sem um proxy reverso:
|
|
|
|
```ini
|
|
SERVER_URL=http://your-domain-or-ip:3000
|
|
```
|
|
|
|
* **Com Proxy Reverso (Portas Padrão):**
|
|
|
|
Se você estiver usando um proxy reverso como Nginx ou Traefik e tiver SSL configurado:
|
|
|
|
```ini
|
|
SERVER_URL=https://your-domain-or-ip
|
|
```
|
|
|
|
* **Com Proxy Reverso (Portas Customizadas):**
|
|
|
|
Se você estiver usando portas não-padrão:
|
|
|
|
```ini
|
|
SERVER_URL=https://your-domain-or-ip:custom-port
|
|
```
|
|
|
|
2. **Atualize o arquivo `.env`**
|
|
|
|
Abra seu arquivo `.env` e atualize o `SERVER_URL`:
|
|
|
|
```ini
|
|
SERVER_URL=http(s)://your-domain-or-ip:your-port
|
|
```
|
|
|
|
**Exemplos:**
|
|
|
|
* Acesso direto sem SSL:
|
|
```ini
|
|
SERVER_URL=http://123.45.67.89:3000
|
|
```
|
|
* Acesso via domínio com SSL:
|
|
```ini
|
|
SERVER_URL=https://mytwentyapp.com
|
|
```
|
|
|
|
3. **Reinicie o Aplicativo**
|
|
|
|
Para que as alterações entrem em vigor, reinicie os contêineres Docker:
|
|
|
|
```bash
|
|
docker compose down
|
|
docker compose up -d
|
|
```
|
|
|
|
#### Considerações
|
|
|
|
* **Configuração de Proxy Reverso:**
|
|
|
|
Certifique-se de que seu proxy reverso encaminha as solicitações para a porta interna correta (`3000` por padrão). Configure a terminação SSL e quaisquer cabeçalhos necessários.
|
|
|
|
* **Configurações de Firewall:**
|
|
|
|
Abra as portas necessárias no seu firewall para permitir acesso externo.
|
|
|
|
* **Consistência:**
|
|
|
|
A `SERVER_URL` deve corresponder à forma como os usuários acessam seu aplicativo nos navegadores.
|
|
|
|
#### Persistência
|
|
|
|
* **Volumes de Dados:**
|
|
|
|
A configuração do Docker Compose usa volumes para persistir dados para o banco de dados e armazenamento do servidor.
|
|
|
|
* **Ambientes Sem Estado:**
|
|
|
|
Se estiver implantando em um ambiente sem estado (por exemplo, certos serviços de nuvem), configure armazenamento externo para persistir dados.
|
|
|
|
## Backup e restauração
|
|
|
|
Backups regulares protegem os dados do seu CRM contra perda.
|
|
|
|
### Crie um backup do banco de dados
|
|
|
|
```bash
|
|
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
|
|
```
|
|
|
|
### Automatize backups diários
|
|
|
|
Adicione ao seu crontab (`crontab -e`):
|
|
|
|
```bash
|
|
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
|
|
```
|
|
|
|
### Restaurar a partir de um backup
|
|
|
|
1. Pare o aplicativo:
|
|
|
|
```bash
|
|
docker compose stop server worker
|
|
```
|
|
|
|
2. Restaure o banco de dados:
|
|
|
|
```bash
|
|
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
|
|
```
|
|
|
|
3. Reinicie os serviços:
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
### Melhores práticas de backup
|
|
|
|
* **Teste as restaurações regularmente** — verifique se os backups realmente funcionam
|
|
* **Armazene os backups fora das instalações** — use armazenamento em nuvem (S3, GCS, etc.)
|
|
* **Criptografe dados confidenciais** — proteja os backups com criptografia
|
|
* **Mantenha várias cópias** — guarde backups diários, semanais e mensais
|
|
|
|
## Resolução de Problemas
|
|
|
|
Se encontrar algum problema, verifique [Resolução de Problemas](/l/pt/developers/self-host/capabilities/troubleshooting) para soluções.
|
|
|
|
## Hospedagem Gerenciada
|
|
|
|
<Tip>
|
|
Prefere não executar e manter o Twenty você mesmo? [Encontre um parceiro Twenty certificado de hospedagem](https://twenty.com/partners/list?categories=HOSTING\&ref=docs-docker-compose) para implantar, hospedar e gerir a sua instância de ponta a ponta. *(Ou entre em contato com a nossa equipe: [contact@twenty.com](mailto:contact@twenty.com).)*
|
|
</Tip>
|