Back to articles
Technology Insight

Deploying Windmill.dev on a VPS: The Ultra-Fast Workflow Engine Replacing n8n and Temporal

June 2, 2026

Introduction to the Workflow Automation Revolution

In the modern DevOps and enterprise automation landscape, choosing the right workflow engine can make or break operational efficiency. For years, development teams have been caught between two extremes. On one hand, we have low-code tools like n8n or Make, which excel at quick integrations but rapidly become unwieldy, difficult to version control, and resource-intensive when handling complex logic. On the other hand, we have code-first frameworks like Temporal or AWS Step Functions, which offer immense scalability but require steep learning curves, heavy boilerplate, and dedicated infrastructure management.

Enter Windmill.dev. Windmill bridges this gap by offering a developer-first, ultra-fast, and open-source developer platform where workflows are defined as code (Python, TypeScript, Go, or Bash) or built via a sleek low-code UI. Powered by a high-performance Rust backend, Windmill delivers sub-millisecond execution overhead, making it an exceptionally lean and cost-effective solution for Virtual Private Server (VPS) deployments. This comprehensive guide will walk you through why Windmill is disrupting the market and how to deploy it successfully on your own VPS infrastructure.

Why Windmill.dev is Outperforming n8n and Temporal

To understand why engineering teams are migrating to Windmill, we must analyze its core architectural advantages over incumbent solutions across three primary vectors: performance, developer experience, and resource efficiency.

1. The Performance and Resource Efficiency Gap

n8n is built on Node.js, which, while highly versatile, can consume significant memory and CPU when processing thousands of concurrent webhook events or heavy data transformations. Temporal, while incredibly robust for distributed state management, requires a complex stack including an external database (PostgreSQL/Cassandra) and a separate visibility layer, making it overkill for single-VPS hosting.

Windmill is engineered in Rust. Its worker architecture is lightweight, allowing it to idle at negligible resource usage while executing scripts with minimal latency. A modest 2-core, 4GB RAM VPS that might struggle under a heavy n8n load can comfortably handle millions of executions per day on Windmill.

2. True Developer-First Multi-Language Support

Unlike n8n, where you are often locked into JavaScript nodes or visual configurations, Windmill treats code as a first-class citizen. You can write individual steps in:

  • TypeScript/JavaScript (executed via ultra-fast Deno or Node.js)
  • Python (with native support for virtual environments and pip packages)
  • Go (for high-performance computational steps)
  • Bash (for direct infrastructure and CLI orchestration)

Windmill automatically parses your code's main function arguments to generate a structured UI frontend and validation schema out-of-the-box. This capability eliminates the friction of building internal tooling UIs.

3. State Management and Long-Running Workflows

Temporal is famous for durable execution, but it requires writing complex, deterministic code to prevent state corruption. Windmill achieves durable, long-running workflows through an intuitive reactive architecture. If a workflow step fails or requires manual approval, Windmill suspends execution state efficiently to the database without consuming active CPU cycles, resuming seamlessly when triggered.

Prerequisites for VPS Deployment

Before initiating the deployment process, ensure your Virtual Private Server meets the following minimum requirements to guarantee stable production operations:

Recommended Minimal Hardware Specifications:
• CPU: 2 vCPUs (Dedicated threads preferred for production loads)
• RAM: 4 GB minimum (Allows sufficient room for Python/Node heavy runtime processes)
• Storage: 40 GB NVMe SSD
• OS: Ubuntu 22.04 LTS or Ubuntu 24.04 LTS

Additionally, you will need a fully qualified domain name (FQDN) pointed to your VPS IP address (e.g., windmill.yourcompany.com) and ports 80 and 443 open on your firewall.

Step-by-Step Guide: Deploying Windmill via Docker Compose

Deploying Windmill via Docker Compose is the most robust, maintainable method for VPS environments. It encapsulates the Windmill frontend, backend, database, and worker nodes into synchronized containers.

Step 1: System Update and Docker Installation

Connect to your VPS via SSH and execute the following commands to ensure your operating system and package managers are fully up to date:

sudo apt update && sudo apt upgrade -y
sudo apt install curl git software-properties-common -y

Next, install the official Docker Engine and Docker Compose plugin:

curl -fsSL [https://get.docker.com](https://get.docker.com) -o get-docker.sh
sudo sh get-docker.sh

Step 2: Configuring the Windmill Environment

Clone the official Windmill repository or create a dedicated directory for your configuration files. We will create a structured configuration natively:

mkdir -p /opt/windmill && cd /opt/windmill

Create a docker-compose.yml file using your preferred text editor. This configuration will deploy PostgreSQL as the database layer, the Windmill server core, and the enterprise-ready distributed worker infrastructure:

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    restart: unless-stopped
    volumes:
      - wm_db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: super_secure_password_here
      POSTGRES_DB: windmill
    ports:
      - "5432:5432"

  windmill-server:
    image: ghcr.io/windmill-labs/windmill:main
    restart: unless-stopped
    environment:
      - DATABASE_URL=postgres://postgres:super_secure_password_here@db:5432/windmill?sslmode=disable
      - MODE=server
      - JWT_SECRET=change_this_to_a_long_random_string
    ports:
      - "8000:8000"
    depends_on:
      - db

  windmill-worker:
    image: ghcr.io/windmill-labs/windmill:main
    restart: unless-stopped
    environment:
      - DATABASE_URL=postgres://postgres:super_secure_password_here@db:5432/windmill?sslmode=disable
      - MODE=worker
    depends_on:
      - db

volumes:
  wm_db_data:

Note: Ensure you change the POSTGRES_PASSWORD and JWT_SECRET to secure, randomly generated strings prior to running the stack in a production environment.

Step 3: Launching the Services

With the configuration file successfully populated, pull the container images and launch Windmill in detached mode:

docker compose up -d

Verify that all containers are operating optimally by checking the runtime logs:

docker compose ps

Securing Windmill with a Reverse Proxy (Caddy or Nginx)

Exposing port 8000 directly to the internet is highly insecure. To protect your workflow inputs, secrets, and API tokens, you must route your traffic through an SSL-encrypted reverse proxy. We highly recommend Caddy Server for its automatic, hassle-free Let's Encrypt SSL management.

Install Caddy on your Ubuntu VPS:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf '[https://dl.cloudsmith.io/public/caddy/stable/gpg.key](https://dl.cloudsmith.io/public/caddy/stable/gpg.key)' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf '[https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt](https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt)' | sudo tee /etc/apt/sources.list.p/caddy-stable.list
sudo apt update
sudo apt install caddy -y

Configure your routing domain by editing the Caddyfile located at /etc/caddy/Caddyfile:

windmill.yourcompany.com {
    reverse_proxy localhost:8000
}

Restart Caddy to apply the changes and automatically provision your SSL certificate:

sudo systemctl restart caddy

Optimizing Windmill Performance on a VPS

To extract maximum performance from your VPS deployment, minor optimizations within the Windmill interface and host settings can yield massive throughput enhancements.

  1. Adjust Worker Concurrency: By default, Windmill scales execution threads automatically. If you notice high CPU throttling during parallel loop iterations, you can cap the worker threads using the NUM_WORKERS environment variable inside your worker container configuration.
  2. Database Indexing & Maintenance: As you run millions of automation steps, historical logs can bloat PostgreSQL. Implement a cron-based cleanup script or configure Windmill's native retention policies within the workspace settings to prune historical event tracking beyond 30 days.
  3. Utilize Dependency Caching: Windmill excels at caching third-party libraries (such as npm modules or Python wheels). Avoid forced cache reloads inside your script setups to ensure step executions remain in the sub-millisecond range.

Conclusion

Windmill.dev represents a paradigm shift in the workflow orchestration arena. By combining the raw execution speed and low footprint of Rust with the flexible developer freedom of writing code in Python, TypeScript, or Go, it effectively eliminates the scaling walls frequently hit when using n8n, without inheriting the massive operational complexity of Temporal. Deploying it on a modest VPS grants your engineering organization enterprise-grade automation capability at a fraction of the cost of SaaS platforms. As modern business operations demand higher performance and deeper programmatic control, self-hosting Windmill stands out as an exceptionally forward-thinking infrastructure investment.

Deploying Windmill.dev on a VPS: The Ultra-Fast Workflow Engine Replacing n8n and Temporal | DPTCloud