O Windmill transforma scripts em webhooks, fluxos de trabalho, tarefas agendadas e interfaces internas - uma alternativa open source ao Retool e ao Temporal. Alojá-lo por conta própria é simples, com um senão que convém conhecer antes de começar: não usa Redis, digam o que disserem vários guias na web.
Porquê alojar o Windmill por conta própria?
O plano na nuvem cobra por utilizador e por execução. Alojar por conta própria elimina ambos os contadores, o que conta numa plataforma de automatização: as tarefas que mais quer pôr a correr com regularidade são justamente as que acumulariam encargos de execução. Além disso mantém os seus scripts, credenciais e registos de tarefas na sua própria máquina, e esses scripts guardam habitualmente chaves de API para tudo o resto que administra.
A edição comunitária é AGPL-3.0. A empresarial fica atrás de uma chave de licença e de outra etiqueta de imagem; não é precisa para pôr a plataforma a funcionar.
Escolher o VPS certo
O Windmill dimensiona-se por worker, não por aplicação. A regra prática é um worker por vCPU com 1-2 GB de RAM cada, além do Postgres e do processo servidor.
| Fornecedor | Plano | vCPU / RAM / Disco | Preço | Notas | Ligação |
|---|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 GB / 100 GB SSD | 5,50 EUR/mês s/ IVA | Quatro núcleos significam quatro workers em paralelo | Contabo |
| Hetzner Cloud | CX23 | 2 / 4 GB / 40 GB NVMe | 5,49 EUR/mês s/ IVA | Assenta na pilha predefinida de dois workers | Hetzner |
| DigitalOcean | Basic 4 GB | 2 / 4 GB / 80 GB SSD | 24 USD/mês | Mesmas especificações do CX23 por quatro vezes o preço | DigitalOcean |
| Vultr | Regular 4 GB | 2 / 4 GB / 80 GB SSD | 20 USD/mês | A maior escolha de regiões | Vultr |
| Linode | Linode 4 GB | 2 / 4 GB / 80 GB SSD | 24 USD/mês | Desempenho previsível | Linode |
Como o débito cresce com o número de workers, aqui o número de núcleos conta mais do que a frequência. Para uma comparação detalhada, visite a nossa página comparação completa de VPS.
Pré-requisitos
- Um VPS com Ubuntu 24.04 LTS e pelo menos 2 vCPU e 4 GB de RAM
- Docker Engine e Compose v2
- Um domínio a apontar para o servidor, se quiser TLS
Passo 1: Preparar o VPS
Ligue-se e atualize:
ssh root@o-seu-ip-vps
apt update && apt upgrade -y
Instale o Docker e o plugin Compose:
apt install -y docker.io docker-compose-v2
systemctl enable --now docker
docker compose version
Abra as portas que o Caddy vai usar:
ufw allow OpenSSH && ufw allow 80 && ufw allow 443
ufw enable
Passo 2: Obter a pilha Compose oficial
Não escreva um ficheiro Compose à mão para o Windmill. O projeto publica um, e liga corretamente os workers, o indexador e os servidores de linguagem:
mkdir -p ~/windmill && cd ~/windmill
curl -fsSL -o docker-compose.yml https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml
curl -fsSL -o .env https://raw.githubusercontent.com/windmill-labs/windmill/main/.env
curl -fsSL -o Caddyfile https://raw.githubusercontent.com/windmill-labs/windmill/main/Caddyfile
A pilha que acabou de descarregar corre sete serviços:
db-postgres:16, a base de dados e a fila de tarefaswindmill_server- a API e a interface web na porta 8000windmill_worker- executa as tarefaswindmill_worker_native- tarefas leves, cerca de 0,1 CPU e 128 MBwindmill_indexer- pesquisa de texto integral no histórico de tarefaswindmill_extra- servidores de linguagem que animam o editor no navegadorcaddy- proxy inverso na porta 80
Nessa lista não há Redis, e na sua também não deve haver.
Passo 3: Definir palavra-passe e domínio
O .env fornecido traz um valor por omissão deliberadamente fraco:
DATABASE_URL=postgres://postgres:changeme@db/windmill?sslmode=disable
WM_IMAGE=ghcr.io/windmill-labs/windmill:main
Substitua changeme por um segredo gerado antes do primeiro arranque, já que a base de dados é criada nesse mesmo arranque:
openssl rand -hex 24
No mesmo ficheiro, defina BASE_URL com o seu domínio. O Caddy lê-o para pedir um certificado.
Passo 4: Arrancar
docker compose up -d
docker compose ps
O primeiro arranque descarrega várias imagens e corre as migrações da base de dados, por isso dê-lhe um minuto. Abra o seu domínio e crie a primeira conta - passa a ser a superadministradora da instância.
Passo 5: Acrescentar workers à medida das necessidades
É esta a parte que distingue o Windmill da maioria das aplicações auto-alojadas. Não escala engordando um processo, mas acrescentando contentores worker. Copie o bloco windmill_worker do docker-compose.yml, dê-lhe um novo nome de serviço, mantenha a mesma DATABASE_URL e MODE=worker, e aplique:
docker compose up -d
Os workers coordenam-se através do Postgres, mais nenhuma configuração muda. Conte com cerca de um vCPU e 1-2 GB de RAM para cada um.
Passo 6: Salvaguardar a base de dados
Tudo o que importa - scripts, fluxos, agendamentos, recursos, histórico de tarefas - vive no Postgres. O volume da cache de dependências contém dados derivados e reconstrói-se sozinho.
docker compose exec db pg_dump -U postgres windmill | gzip > windmill-$(date +%F).sql.gz
Copie-o para fora do servidor. Note que o Windmill guarda credenciais dos seus outros sistemas: trate essa cópia como um segredo e cifre-a em repouso.
Onde as pessoas ficam presas
Copiar de um blogue um ficheiro Compose assente em Redis. O Windmill nunca precisou de um. O contentor arranca e fica simplesmente parado enquanto se interroga sobre por que razão a fila não o usa.
Dimensionar pelo regime em repouso. A instalação de dependências é o pico de memória. Uma tarefa em Python que importa o pandas precisa de bastante mais RAM na primeira execução do que em qualquer outra a seguir, pelo que uma pilha que parece saudável em repouso pode falhar numa tarefa a frio.
Deixar changeme como está. É a palavra-passe do Postgres no .env publicado e a primeira coisa que uma varredura oportunista experimenta se algum dia expuser a porta 5432.
O Windmill recompensa uma máquina com mais núcleos em vez de núcleos mais rápidos, o que torna aqui especialmente interessantes os planos europeus multinúcleo baratos. Dimensione pelo número de tarefas que quer a correr ao mesmo tempo, guarde a cópia do Postgres cifrada noutro sítio, e o serviço dá pouco trabalho.
Para mais projetos e sugestões de auto-alojamento, percorra a lista awesome-selfhosted ou a comunidade r/selfhosted.
Frequently asked questions
Preciso de Redis para alojar o Windmill por conta própria?
Não, e é aqui que muita gente tropeça. O Windmill usa o PostgreSQL como base de dados e como fila de tarefas, pelo que o ficheiro Compose oficial não contém serviço Redis nem variável REDIS_URL. Vários guias de terceiros acrescentam um mesmo assim. Se copiou um ficheiro Compose com um contentor Redis, está a correr um serviço ao qual o Windmill nunca se liga e pode removê-lo sem risco.
Como acrescento mais workers a uma instância do Windmill já em funcionamento?
Acrescente ao ficheiro Compose outro serviço windmill_worker a apontar para a mesma DATABASE_URL com MODE=worker e execute docker compose up -d. Os workers coordenam-se através do Postgres, por isso não é preciso reconfigurar mais nada. O limite prático é o número de núcleos: cada worker padrão executa uma tarefa de cada vez e quer cerca de um vCPU e 1-2 GB de RAM.
Como coloco o Windmill atrás de HTTPS?
A pilha já inclui o Caddy, que por omissão serve HTTP simples na porta 80. Para obter TLS automático, defina BASE_URL com o seu domínio e edite o Caddyfile e o serviço caddy de modo a expor a porta 443, tal como descrevem os comentários do .env fornecido. Aponte o DNS ao servidor antes de o iniciar, para que o certificado seja emitido no primeiro arranque.