Quay lại danh sách
Tin tức công nghệ

Triển khai Windmill trên VPS: Nền tảng thay thế Retool và Temporal siêu tốc bằng TypeScript và Python

29 tháng 5, 2026

Giới thiệu xu hướng tối ưu hóa hạ tầng tự động hóa

Trong kỷ nguyên số hóa và tự động hóa hạ tầng (Infrastructure as Code - IaC), các DevOps Engineer luôn đối mặt với bài toán tối ưu hóa quy trình làm việc (Workflows) và xây dựng công cụ nội bộ (Internal Tools). Từ lâu, Temporal đã là tiêu chuẩn vàng cho các hệ thống Distributed Workflow phức tạp, trong khi Retool thống trị mảng xây dựng giao diện quản trị nhanh chóng. Tuy nhiên, việc duy trì cả hai hệ thống này thường đi kèm chi phí bản quyền đắt đỏ từ Retool và độ phức tạp vận hành cực cao từ Temporal.

Sự xuất hiện của Windmill chính là câu trả lời toàn diện cho bài toán này. Windmill là một nền tảng developer-first, mã nguồn mở (Open-source), cho phép lập trình viên biến các đoạn mã script đơn giản (TypeScript, Python, Go, Bash) thành các workflow sản xuất an toàn, các tác vụ background định kỳ (cron jobs), và các giao diện người dùng (UI dashboards) chất lượng cao chỉ trong vài phút.

Tại sao Windmill là giải pháp thay thế hoàn hảo cho Retool và Temporal?

Để hiểu tại sao Windmill đang trở thành xu hướng trong cộng đồng DevOps, chúng ta cần đặt lên bàn cân so sánh các khía cạnh cốt lõi sau:

  • Hợp nhất Workflow và UI: Khác với việc phải viết backend trên Temporal rồi cấu hình frontend trên Retool, Windmill cho phép định nghĩa logic xử lý và tự động sinh ra UI (Auto-generated UIs) hoặc thiết kế UI kéo thả (Low-code builder) trên cùng một nền tảng.
  • Học tập và thích ứng nhanh: Temporal bắt buộc bạn phải hiểu sâu về kiến trúc Event-sourcing và tuân thủ nghiêm ngặt các quy tắc deterministic code. Với Windmill, bạn chỉ cần viết các hàm Python hoặc TypeScript thuần túy, Windmill sẽ tự động xử lý việc phân tách bước, quản lý trạng thái (state) và phân phối hàng đợi tác vụ.
  • Tối ưu hóa tài nguyên: Windmill được viết bằng Rust, mang lại hiệu năng xử lý cực cao, độ trễ thấp và tiêu thụ cực ít tài nguyên RAM/CPU so với các giải pháp chạy trên nền tảng JVM hoặc NodeJS thuần túy. Điều này giúp việc vận hành trên các máy chủ ảo (VPS) cấu hình khiêm tốn trở nên khả thi và mượt mà.

Kiến trúc cốt lõi của Windmill dưới góc nhìn DevOps

Một hệ thống Windmill tiêu chuẩn bao gồm các thành phần cốt lõi được thiết kế phi tập trung, giúp dễ dàng mở rộng quy mô (Scaling):

  1. Windmill Server (Backend): Được phát triển bằng Rust, chịu trách nhiệm điều phối, quản lý API, phân quyền (RBAC), và lưu trữ trạng thái vào cơ sở dữ liệu PostgreSQL.
  2. Windmill Workers: Các tiến trình độc lập chịu trách nhiệm thực thi các script hoặc workflow. Bạn có thể scale số lượng worker lên hàng trăm instance tùy thuộc vào tải lượng hệ thống. Các worker này hỗ trợ cơ chế sandbox bảo mật cao để chạy mã nguồn một cách an toàn.
  3. PostgreSQL Database: Trái tim lưu trữ toàn bộ dữ liệu cấu hình, lịch sử thực thi (run logs), và trạng thái của các luồng công việc.
Windmill tận dụng sức mạnh của Postgres để làm hàng đợi công việc (Job Queue) thông qua cơ chế LISTEN/NOTIFY và FOR UPDATE SKIP LOCKED, loại bỏ hoàn toàn sự phụ thuộc vào các hệ thống phức tạp như RabbitMQ hay Redis.

Hướng dẫn chi tiết cách triển khai Windmill trên VPS bằng Docker Compose

Để chuẩn bị cho việc triển khai, bạn cần sở hữu một máy chủ VPS (Ubuntu 22.04 LTS trở lên là khuyến nghị) với cấu hình tối thiểu từ 2 vCPU và 4GB RAM. Hãy đảm bảo bạn đã cài đặt sẵn Docker và Docker Compose trên hệ thống.

Bước 1: Khởi tạo thư mục dự án và tệp cấu hình

Kết nối SSH vào VPS của bạn và chạy các lệnh sau để tạo thư mục làm việc:

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

Bước 2: Tạo tệp docker-compose.yml

Sử dụng trình chỉnh sửa văn bản (nano hoặc vim) để tạo tệp docker-compose.yml với nội dung cấu hình chuẩn hóa, tối ưu hóa hiệu năng sau:

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    restart: unless-stopped
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: windmill
      POSTGRES_USER: wm_user
      POSTGRES_PASSWORD: SecretPassword123
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U wm_user -d windmill"]
      interval: 5s
      timeout: 5s
      retries: 5

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

  worker:
    image: ghcr.io/windmill-labs/windmill:main
    restart: unless-stopped
    environment:
      - DATABASE_URL=postgres://wm_user:SecretPassword123@db:5432/windmill?sslmode=disable
      - MODE=worker
      - NUM_WORKERS=4
    depends_on:
      db:
        condition: service_healthy

volumes:
  db_data:

Bước 3: Khởi chạy hệ thống và cấu hình ban đầu

Khởi chạy các container bằng lệnh:

docker compose up -d

Kiểm tra trạng thái hoạt động của các dịch vụ bằng lệnh docker compose ps. Khi tất cả các container đều hiển thị trạng thái Up hoặc healthy, bạn có thể truy cập vào giao diện quản trị thông qua địa chỉ IP của VPS tại cổng 8000 (Ví dụ: http://your_vps_ip:8000).

Tài khoản quản trị mặc định ban đầu để đăng nhập là:

Khuyến nghị bảo mật: Ngay sau khi đăng nhập thành công, việc đầu tiên bạn cần làm là thay đổi mật khẩu quản trị và thiết lập phân quyền truy cập thông qua Reverse Proxy (Nginx hoặc Caddy) kết hợp chứng chỉ SSL Let's Encrypt.

Xây dựng Luồng Công Việc (Workflow) đầu tiên với TypeScript và Python

Điểm mạnh nhất của Windmill là khả năng kết hợp mượt mà giữa các ngôn ngữ lập trình phổ biến nhất hiện nay trong cùng một luồng xử lý dữ liệu.

1. Viết Script lấy dữ liệu hệ thống (Python)

Tạo một Script mới bằng Python để kiểm tra dung lượng ổ đĩa của hệ thống. Đoạn mã cực kỳ đơn giản nhờ cách Windmill tự động chuyển đổi tham số đầu vào và đầu ra:

import shutil

def main(path: str = "/"):
    total, used, free = shutil.disk_usage(path)
    percent_used = (used / total) * 100
    return {
        "total_gb": total // (2**30),
        "used_gb": used // (2**30),
        "percent_used": round(percent_used, 2)
    }

2. Viết Script xử lý và cảnh báo (TypeScript)

Tiếp theo, tạo một Script bằng TypeScript nhận kết quả từ bước Python trước đó để đưa ra quyết định gửi cảnh báo qua Slack hoặc Telegram Webhook nếu dung lượng ổ đĩa vượt ngưỡng an toàn:

export async function main(input: { percent_used: number; used_gb: number }) {
  const threshold = 80;
  if (input.percent_used > threshold) {
    return {
      status: "WARNING",
      message: `Cảnh báo: Ổ đĩa đã sử dụng ${input.percent_used}%. Vui lòng dọn dẹp hệ thống.`
    };
  }
  return {
    status: "OK",
    message: "Hệ thống hoạt động bình thường."
  };
}

3. Liên kết thành Flow hoàn chỉnh

Sử dụng giao diện kéo thả trực quan của Windmill, bạn có thể dễ dàng nối đầu ra (output) của Script Python thành đầu vào (input) của Script TypeScript. Hệ thống sẽ tự động chuyển dữ liệu dạng JSON qua lại giữa các bước một cách chính xác mà không cần cấu hình thêm bất kỳ middleware nào.

Kết luận và định hướng vận hành nâng cao

Việc triển khai Windmill trên VPS mang lại một giải pháp thay thế mạnh mẽ, linh hoạt và tiết kiệm chi phí vượt trội so với việc sử dụng các dịch vụ SaaS thương mại hoặc cài đặt các hệ thống phức tạp cấp doanh nghiệp. Với khả năng xử lý bất kỳ ngôn ngữ nào thông qua môi trường thực thi hiệu năng cao, Windmill xứng đáng là một công cụ chiến lược trong bộ công cụ (toolkit) của mọi DevOps Engineer hiện đại.

Để vận hành trong môi trường production thực tế, bạn nên cân nhắc mở rộng hệ thống bằng cách cấu hình lưu trữ log tập trung (S3/MinIO compatible), tích hợp hệ thống định danh doanh nghiệp (OAuth2/OIDC) và liên kết với các kho lưu trữ Git (GitHub/GitLab) để triển khai GitOps - đồng bộ hóa mã nguồn tự động.

Triển khai Windmill trên VPS: Nền tảng thay thế Retool và Temporal siêu tốc bằng TypeScript và Python | DPTCloud