Windmill zet scripts om in webhooks, workflows, geplande taken en interne interfaces - een open-source alternatief voor Retool en Temporal. Zelf hosten is rechttoe rechtaan, met één addertje dat je vooraf moet kennen: het gebruikt geen Redis, wat een aantal gidsen op het web ook beweert.
Waarom Windmill zelf hosten?
Het cloudabonnement rekent per gebruiker én per uitvoering af. Zelf hosten schrapt beide tellers, wat bij een automatiseringsplatform zwaar weegt: juist de taken die je het liefst periodiek laat lopen, zouden anders voortdurend uitvoeringskosten opstapelen. Bovendien blijven je scripts, inloggegevens en taaklogboeken op je eigen machine, en die scripts bevatten doorgaans API-sleutels voor al het andere dat je beheert.
De community-editie is AGPL-3.0. De enterprise-versie zit achter een licentiesleutel en een andere image-tag; voor het draaien van het platform heb je die niet nodig.
De juiste VPS kiezen
Windmill dimensioneer je per worker, niet per applicatie. De vuistregel is één worker per vCPU met 1-2 GB RAM elk, bovenop Postgres en het serverproces.
| Aanbieder | Pakket | vCPU / RAM / Schijf | Prijs | Opmerkingen | Link |
|---|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8 GB / 100 GB SSD | 5.50 EUR/mnd excl. btw | Vier kernen betekent vier workers parallel | Contabo |
| Hetzner Cloud | CX23 | 2 / 4 GB / 40 GB NVMe | 5.49 EUR/mnd excl. btw | Past bij de standaardstack met twee workers | Hetzner |
| DigitalOcean | Basic 4 GB | 2 / 4 GB / 80 GB SSD | 24 USD/mnd | Dezelfde specificaties als de CX23 tegen vier keer de prijs | DigitalOcean |
| Vultr | Regular 4 GB | 2 / 4 GB / 80 GB SSD | 20 USD/mnd | De ruimste keuze aan regio’s | Vultr |
| Linode | Linode 4 GB | 2 / 4 GB / 80 GB SSD | 24 USD/mnd | Voorspelbare prestaties | Linode |
Omdat de doorvoer meegroeit met het aantal workers, telt hier het aantal kernen zwaarder dan de kloksnelheid. Voor een uitgebreide vergelijking, bezoek onze pagina volledige VPS-vergelijking.
Vereisten
- Een VPS met Ubuntu 24.04 LTS en minstens 2 vCPU en 4 GB RAM
- Docker Engine en Compose v2
- Een domein dat naar de server wijst als je TLS wilt
Stap 1: De VPS voorbereiden
Verbind en werk bij:
ssh root@jouw-vps-ip
apt update && apt upgrade -y
Installeer Docker en de Compose-plug-in:
apt install -y docker.io docker-compose-v2
systemctl enable --now docker
docker compose version
Zet de poorten open die Caddy gebruikt:
ufw allow OpenSSH && ufw allow 80 && ufw allow 443
ufw enable
Stap 2: De officiële Compose-stack ophalen
Schrijf voor Windmill geen eigen Compose-bestand. Het project publiceert er een, en dat verbindt de workers, indexer en language servers correct:
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
De stack die je zojuist hebt opgehaald draait zeven diensten:
db-postgres:16, de database én de takenwachtrijwindmill_server- de API en webinterface op poort 8000windmill_worker- voert taken uitwindmill_worker_native- lichte taken, ongeveer 0,1 CPU en 128 MBwindmill_indexer- zoeken in de volledige taakgeschiedeniswindmill_extra- language servers die de editor in de browser aandrijvencaddy- reverse proxy op poort 80
In die lijst staat geen Redis, en in de jouwe hoort er ook geen te staan.
Stap 3: Wachtwoord en domein instellen
De meegeleverde .env bevat een bewust zwakke standaardwaarde:
DATABASE_URL=postgres://postgres:changeme@db/windmill?sslmode=disable
WM_IMAGE=ghcr.io/windmill-labs/windmill:main
Vervang changeme door een gegenereerd geheim vóór de eerste start, want de database wordt bij precies die start aangemaakt:
openssl rand -hex 24
Stel in hetzelfde bestand BASE_URL in op je domein. Caddy leest die om een certificaat aan te vragen.
Stap 4: Starten
docker compose up -d
docker compose ps
De eerste start haalt meerdere images op en voert de databasemigraties uit, dus gun het een minuut. Open je domein en maak het eerste account aan - dat wordt de superbeheerder van de instantie.
Stap 5: Workers toevoegen wanneer je ze nodig hebt
Dit is wat Windmill onderscheidt van de meeste zelfgehoste toepassingen. Je schaalt niet door één proces groter te maken, maar door workercontainers toe te voegen. Kopieer het blok windmill_worker in de docker-compose.yml, geef het een nieuwe dienstnaam, houd dezelfde DATABASE_URL en MODE=worker aan, en pas toe:
docker compose up -d
De workers stemmen af via Postgres, verder verandert er niets aan de configuratie. Reken op ongeveer één vCPU en 1-2 GB RAM per stuk.
Stap 6: De database back-uppen
Alles wat ertoe doet - scripts, flows, planningen, resources, taakgeschiedenis - zit in Postgres. Het volume met de afhankelijkheidscache bevat afgeleide gegevens en bouwt zichzelf opnieuw op.
docker compose exec db pg_dump -U postgres windmill | gzip > windmill-$(date +%F).sql.gz
Kopieer het van de server af. Let op: Windmill bewaart inloggegevens voor je andere systemen, dus behandel die dump als een geheim en versleutel hem in rust.
Waar mensen vastlopen
Een Redis-gebaseerd Compose-bestand van een blog kopiëren. Windmill heeft er nooit een nodig gehad. De container start en blijft eenvoudigweg stilstaan terwijl jij je afvraagt waarom de wachtrij hem niet gebruikt.
Dimensioneren op de ruststand. Het installeren van afhankelijkheden is de geheugenpiek. Een Python-taak die pandas importeert heeft de eerste keer veel meer RAM nodig dan bij elke run daarna, dus een stack die er stil goed uitziet kan op een koude taak stukslaan.
changeme laten staan. Dat is het Postgres-wachtwoord in de gepubliceerde .env, en het eerste wat een opportunistische scan probeert als je poort 5432 ooit naar buiten openzet.
Windmill beloont een machine met meer kernen eerder dan met snellere, wat de goedkope Europese multicore-pakketten hier ongewoon aantrekkelijk maakt. Dimensioneer op het aantal taken dat je tegelijk wilt draaien, bewaar de Postgres-dump versleuteld elders, en de dienst laat zich makkelijk beheren.
Voor meer zelfhostingprojecten en tips: de lijst awesome-selfhosted of de community r/selfhosted.
Frequently asked questions
Heb ik Redis nodig om Windmill zelf te hosten?
Nee, en hier gaan veel mensen de mist in. Windmill gebruikt PostgreSQL zowel als database als als takenwachtrij, dus het officiële Compose-bestand bevat geen Redis-dienst en geen REDIS_URL. Diverse handleidingen van derden voegen er toch een toe. Heb je een Compose-bestand met een Redis-container gekopieerd, dan draai je een dienst waar Windmill nooit verbinding mee maakt en die je gerust kunt verwijderen.
Hoe voeg ik meer workers toe aan een draaiende Windmill-instantie?
Voeg aan het Compose-bestand nog een windmill_worker-dienst toe die naar dezelfde DATABASE_URL wijst met MODE=worker, en draai daarna docker compose up -d. De workers stemmen af via Postgres, dus verder hoeft er niets herconfigureerd te worden. De praktische grens is je aantal kernen: elke standaardworker voert één taak tegelijk uit en wil ongeveer één vCPU en 1-2 GB RAM.
Hoe zet ik Windmill achter HTTPS?
De stack levert Caddy al mee, dat standaard gewone HTTP op poort 80 serveert. Voor automatische TLS stel je BASE_URL in op je domein en pas je het Caddyfile en de caddy-dienst aan om poort 443 open te zetten, zoals de opmerkingen in de meegeleverde .env beschrijven. Laat DNS naar de server wijzen voordat je start, zodat het certificaat bij de eerste keer opstarten kan worden uitgegeven.