Windmill trasforma gli script in webhook, workflow, lavori pianificati e interfacce interne: un’alternativa open source a Retool e Temporal. Auto-ospitarlo è semplice, con un tranello da conoscere prima di iniziare: non usa Redis, checché ne dicano parecchie guide in rete.
Perché auto-ospitare Windmill?
Il piano cloud fattura per utente e per esecuzione. L’auto-hosting elimina entrambi i contatori, cosa che conta in una piattaforma di automazione: i lavori che più vorresti far girare a cadenza regolare sono proprio quelli che accumulerebbero costi di esecuzione. Inoltre tiene script, credenziali e log dei lavori sulla tua macchina, e quegli script contengono abitualmente chiavi API per tutto il resto della tua infrastruttura.
L’edizione community è AGPL-3.0. Quella enterprise sta dietro una chiave di licenza e un tag immagine diverso; non serve per far funzionare la piattaforma.
Scegliere il VPS giusto
Windmill si dimensiona per worker, non per applicazione. La regola pratica è un worker per vCPU con 1-2 GB di RAM ciascuno, oltre a Postgres e al processo server.
| Provider | Piano | vCPU / RAM / Disco | Prezzo | Note | Link |
|---|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 GB / 100 GB SSD | 5,50 EUR/mese netto | Quattro core significano quattro worker in parallelo | Contabo |
| Hetzner Cloud | CX23 | 2 / 4 GB / 40 GB NVMe | 5,49 EUR/mese netto | Adatto allo stack predefinito a due worker | Hetzner |
| DigitalOcean | Basic 4 GB | 2 / 4 GB / 80 GB SSD | 24 USD/mese | Stesse specifiche del CX23 a quattro volte il prezzo | DigitalOcean |
| Vultr | Regular 4 GB | 2 / 4 GB / 80 GB SSD | 20 USD/mese | La scelta di regioni più ampia | Vultr |
| Linode | Linode 4 GB | 2 / 4 GB / 80 GB SSD | 24 USD/mese | Prestazioni prevedibili | Linode |
Poiché la produttività cresce con il numero di worker, qui il numero di core conta più della frequenza. Per un confronto dettagliato, visita la nostra pagina confronto VPS completo.
Prerequisiti
- Un VPS con Ubuntu 24.04 LTS, almeno 2 vCPU e 4 GB di RAM
- Docker Engine e Compose v2
- Un dominio che punti al server, se vuoi il TLS
Passo 1: preparare il VPS
Collegati e aggiorna:
ssh root@il-tuo-ip-vps
apt update && apt upgrade -y
Installa Docker e il plugin Compose:
apt install -y docker.io docker-compose-v2
systemctl enable --now docker
docker compose version
Apri le porte che userà Caddy:
ufw allow OpenSSH && ufw allow 80 && ufw allow 443
ufw enable
Passo 2: scaricare lo stack Compose ufficiale
Non scrivere a mano un file Compose per Windmill. Il progetto ne pubblica uno e collega correttamente worker, indexer e language server:
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
Lo stack appena scaricato avvia sette servizi:
db-postgres:16, il database e la coda dei lavoriwindmill_server- l’API e l’interfaccia web sulla porta 8000windmill_worker- esegue i lavoriwindmill_worker_native- lavori leggeri, circa 0,1 CPU e 128 MBwindmill_indexer- ricerca full-text nello storico dei lavoriwindmill_extra- i language server che animano l’editor nel browsercaddy- reverse proxy sulla porta 80
In quell’elenco non c’è Redis, e non dovrebbe esserci nemmeno nel tuo.
Passo 3: impostare password e dominio
Il .env fornito contiene un valore predefinito volutamente debole:
DATABASE_URL=postgres://postgres:changeme@db/windmill?sslmode=disable
WM_IMAGE=ghcr.io/windmill-labs/windmill:main
Sostituisci changeme con un segreto generato prima del primo avvio, perché il database viene creato proprio in quel momento:
openssl rand -hex 24
Nello stesso file imposta BASE_URL sul tuo dominio. Caddy lo legge per richiedere un certificato.
Passo 4: avviare
docker compose up -d
docker compose ps
Il primo avvio scarica diverse immagini ed esegue le migrazioni del database, quindi concedigli un minuto. Apri il tuo dominio e crea il primo account: diventa il superamministratore dell’istanza.
Passo 5: aggiungere worker quando servono
È la parte che distingue Windmill dalla maggior parte delle applicazioni auto-ospitate. Non scali ingrandendo un processo, ma aggiungendo container worker. Copia il blocco windmill_worker nel docker-compose.yml, dagli un nuovo nome di servizio, mantieni la stessa DATABASE_URL e MODE=worker, poi applica:
docker compose up -d
I worker si coordinano tramite Postgres, nessun’altra configurazione cambia. Metti in conto circa un vCPU e 1-2 GB di RAM per ognuno.
Passo 6: salvare il database
Tutto ciò che conta - script, flow, pianificazioni, risorse, storico dei lavori - vive in Postgres. Il volume della cache delle dipendenze contiene dati derivati e si ricostruisce da solo.
docker compose exec db pg_dump -U postgres windmill | gzip > windmill-$(date +%F).sql.gz
Copialo fuori dal server. Tieni presente che Windmill conserva le credenziali dei tuoi altri sistemi: tratta quel dump come un segreto e cifralo a riposo.
Dove ci si incaglia
Copiare da un blog un file Compose basato su Redis. Windmill non ne ha mai avuto bisogno. Il container si avvierà e resterà semplicemente inattivo mentre ti chiedi perché la coda non lo usi.
Dimensionare sul regime a riposo. L’installazione delle dipendenze è il picco di memoria. Un lavoro Python che importa pandas richiede molta più RAM la prima volta che alle successive: uno stack che sembra a posto da fermo può fallire su un lavoro a freddo.
Lasciare changeme com’è. È la password Postgres nel .env pubblicato ed è la prima cosa che prova una scansione opportunistica se un giorno esponi la porta 5432.
Windmill premia una macchina con più core piuttosto che con core più veloci, il che rende qui particolarmente interessanti i piani europei multicore a basso costo. Dimensiona in base a quanti lavori vuoi far girare insieme, tieni il dump di Postgres cifrato altrove, e il servizio si farà dimenticare.
Per altri progetti e consigli sull’auto-hosting, sfoglia la lista awesome-selfhosted o la comunità r/selfhosted.
Frequently asked questions
Serve Redis per auto-ospitare Windmill?
No, ed è un inciampo comune. Windmill usa PostgreSQL sia come database sia come coda dei lavori, perciò il file Compose ufficiale non contiene alcun servizio Redis né la variabile REDIS_URL. Diverse guide di terze parti ne aggiungono uno lo stesso. Se hai copiato un file Compose con un container Redis, stai facendo girare un servizio a cui Windmill non si collega mai e puoi rimuoverlo senza rischi.
Come aggiungo altri worker a un'istanza di Windmill già avviata?
Aggiungi al file Compose un altro servizio windmill_worker che punta alla stessa DATABASE_URL con MODE=worker, poi esegui docker compose up -d. I worker si coordinano tramite Postgres, quindi non serve riconfigurare altro. Il limite pratico è il numero di core: ogni worker standard esegue un lavoro alla volta e vuole circa un vCPU e 1-2 GB di RAM.
Come metto Windmill dietro HTTPS?
Lo stack include già Caddy, che per impostazione predefinita serve HTTP semplice sulla porta 80. Per ottenere il TLS automatico imposta BASE_URL sul tuo dominio e modifica il Caddyfile e il servizio caddy per esporre la porta 443, come descrivono i commenti nel file .env fornito. Punta il DNS al server prima di avviarlo, così il certificato viene emesso al primo avvio.