# Instalação no seu próprio servidor

Você pode rodar o draften no seu próprio servidor. Os e-mails, os rascunhos e as
chaves ficam então com você; só sai o que você envia ao provedor do modelo de
linguagem (ou nada, com um modelo local).

Esta página é uma visão geral de como uma instalação é montada. O procedimento
em si está em [Instalação passo a passo](/pt/admin/installing).

## O pacote e a licença

Cada versão do draften é um único **pacote**, um arquivo `draften-<version>.tar`.
Ele contém as imagens de todos os serviços, os arquivos que os iniciam, uma lista
assinada de tudo o que está dentro e o comando `./draften`, que gerencia a
instalação. O servidor não precisa de nada além do Docker.

Para rodá-lo você precisa de uma **licença** – um arquivo que você recebe de nós
e carrega na interface. Ela limita o número de caixas de e-mail e de assistentes,
e a chave dela também é usada para baixar novas versões. Mais em
[A licença](/pt/admin/licence).

## Do que uma instalação é feita

Tudo roda no Docker por meio do `docker compose`:

| Serviço | O que faz |
|---|---|
| `db` | o banco de dados MariaDB – guarda tudo: configurações, instruções, mensagens, rascunhos, segredos criptografados. Nada de outra máquina tem acesso a ele |
| `worker` | lê as caixas de e-mail, chama os modelos, escreve rascunhos, aprende, executa os passos da configuração guiada. Podem rodar vários |
| `web-blue`, `web-green` | a interface web e a API em duas cores: uma atende, a outra espera a próxima versão – é por isso que as atualizações não causam interrupção |
| `proxy` | a porta de entrada de fora: alterna entre as cores da interface web e, opcionalmente, termina o HTTPS |
| `updater` | opcional: executa o que o operador pede em Instalação (atualização, volta para a versão anterior, número de processos, troca da chave, backup) e faz backup do banco de dados todos os dias |
| `cloudflared` | opcional: publicação da interface por um Cloudflare Tunnel |

A interface e o worker não conversam diretamente – os dois trabalham com o
mesmo banco de dados; o que precisa dos e-mails ou de um modelo, a interface
coloca na fila como um job para o worker.

## Do que você vai precisar

- um servidor x86-64 com Linux e Docker 24 ou mais recente (com o plugin
  compose), 4 GB de memória e 20 GB de disco,
- o endereço em que a interface vai estar acessível, com HTTPS – um certificado
  diretamente no draften, ou o seu proxy reverso ou túnel,
- acesso às caixas de e-mail: um registro de aplicativo no Microsoft Entra, uma
  conta de serviço do Google Workspace ou os dados de IMAP,
- uma chave de API de modelo (Anthropic, OpenAI) ou o seu próprio servidor
  compatível com a OpenAI,
- uma licença nossa.

## HTTPS

- **No draften**: informe ao instalador o certificado e a chave dele (PEM).
  O draften então escuta na porta 443 e redireciona da porta 80. Um certificado
  renovado você implanta com `./draften certificate new.pem new.key` sem perder
  uma única requisição. O certificado você mesmo obtém (de uma autoridade
  certificadora ou com um cliente ACME).
- **Na frente do draften**: sem certificado, o draften escuta em
  `127.0.0.1:8085` e o seu proxy ou túnel termina o HTTPS.

## O updater

O updater é um serviço opcional que executa o que o operador pede em
**Instalação → Instalação**: uma atualização para uma nova versão, a volta para
a anterior, a alteração do número de processos de worker, a troca da chave de
criptografia e um backup do banco de dados. Além disso, ele mesmo faz backup do
banco de dados todos os dias. Para isso ele executa o mesmo `./draften` que
você executaria.

O updater tem acesso ao Docker, o que significa direitos de root no servidor. A
interface em si nunca mexe no Docker – ela só grava uma solicitação no banco de
dados para o updater. Ele é ativado na instalação (`COMPOSE_PROFILES=updater`
no `.env`); sem ele, tudo funciona pela linha de comando.

## Configurações no `.env`

O arquivo `.env`, no diretório da instalação, é gravado pelo instalador e só
pode ser lido pelo proprietário dele. Ele guarda a infraestrutura e os segredos;
tudo o que diz respeito aos assistentes fica no banco de dados e é definido na
interface.

| Variável | Para quê |
|---|---|
| `DRAFTEN_VERSION`, `DRAFTEN_EDITION` | a versão em execução e a edição (`onprem`) |
| `DB_ROOT_PASSWORD`, `DB_PASSWORD` | senhas do banco de dados |
| `MASTER_KEY` | a chave que criptografa os segredos no banco de dados (chaves de API, acesso às caixas de e-mail, clientes de login). **Guarde uma cópia fora do servidor** |
| `MASTER_KEY_PREVIOUS` | a chave anterior depois da troca, enquanto `backups/` tiver dumps de antes dela |
| `WEB_APP_SECRET` | uma sequência aleatória que assina as sessões |
| `WEB_PUBLIC_URL` | o endereço em que as pessoas abrem a interface; os endereços de redirecionamento do login são montados a partir dele |
| `WEB_BIND`, `DRAFTEN_TLS`, `WEB_TLS_BIND` | onde o HTTP e o HTTPS escutam |
| `COMPOSE_PROFILES` | serviços opcionais: `updater`, `tunnel` |
| `DRAFTEN_BACKUPS` | quantos dumps do banco de dados de antes de uma atualização manter em `backups/` (padrão 3) |
| `DRAFTEN_DAILY_BACKUPS` | quantos backups diários e sob demanda manter (padrão 7; `0` desativa o diário) |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | o horário do backup diário e o fuso dele (padrão `01:00`, `Europe/Prague`); um horário definido na interface tem prioridade |
| `CLOUDFLARE_TUNNEL_TOKEN` | só com um Cloudflare Tunnel |
| `INTERVAL_SECONDS`, `WORKER_CONCURRENCY` | o intervalo padrão de verificação e as verificações simultâneas (melhor definir na interface) |
| `WORKER_REPLICAS` | quantos processos `worker` rodam nesta máquina (padrão 1), veja [Operação e capacidade](/pt/admin/operations) |

Um valor com o sinal `$` precisa ser escrito como `$$` no `.env` – caso
contrário, a parte depois do cifrão se perde sem aviso. Chaves geradas com
`openssl rand -hex 32` nunca contêm cifrão.

## Onde fica cada coisa

| | |
|---|---|
| `.env` | as configurações e os segredos da instalação |
| `compose.yaml`, `proxy/` | como os contêineres rodam; cada atualização os substitui |
| `backups/` | dumps do banco de dados: diários, sob demanda e de antes das atualizações – copie-os para fora do servidor |
| `data/` | o log e os relatórios do worker |
| `updates/` | pacotes esperando para ser instalados; o updater também baixa para cá |
| `NOTES.md` | o que a versão instalada mudou |

## Próximos passos

- [Instalação passo a passo](/pt/admin/installing),
- [Administração da instalação](/pt/admin/installation-admin) – versão,
  licença, chaves e remetente padrão, organizações,
- [Atualizar com o updater](/pt/admin/updating-with-the-updater)
  e [pela linha de comando](/pt/admin/updating),
- [Operação e capacidade](/pt/admin/operations),
- [Backup e restauração](/pt/admin/backup-and-restore),
- [Solução de problemas](/pt/admin/troubleshooting).
