Triển khai Coolify trên VPS Ubuntu: Nền tảng PaaS mã nguồn mở tự host để quản lý ứng dụng đa máy chủ

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Vấn đề: Chi phí ẩn của Cloud PaaS và gánh nặng quản trị Bare-Metal

Năm ngoái, hóa đơn cloud hosting của chúng tôi đã vượt mốc 840 USD mỗi tháng. Hệ thống lúc đó chỉ gồm vài API staging, ba ứng dụng Next.js production, các worker chạy ngầm cùng hai instance PostgreSQL phân bổ trên Heroku và AWS App Runner. Sự tiện lợi của các nền tảng này là không thể bàn cãi, nhưng mức giá chênh lệch cho tài nguyên tính toán đã trở nên quá vô lý. Một container chỉ với 2GB RAM ngốn chi phí gấp năm lần so với một cấu hình VPS tiêu chuẩn có sức mạnh tương đương.

Quay lại với bare metal là một ý nghĩ đầy cám dỗ. Thế nhưng việc tự cấu hình VPS thuần lại kéo theo hàng tá phiền toái: tự viết file Docker Compose thủ công, các cron job gia hạn SSL chập chờn, cùng những script bash triển khai dễ lỗi. Chúng tôi muốn có trải nghiệm git-push là deploy ngay, tự động tạo preview environment và khởi tạo cơ sở dữ liệu tức thì mà không phải trả hóa đơn 800 USD mỗi tháng. Coolify chính là giải pháp cân bằng hoàn hảo cho bài toán này.

Khái niệm cốt lõi: Kiến trúc của Coolify hoạt động ra sao

Coolify là một nền tảng PaaS (Platform-as-a-Service) mã nguồn mở, cho phép tự host. Nó không thay thế Docker hay tự tạo ra một container engine riêng biệt. Thay vào đó, Coolify đóng gói các công cụ Linux tiêu chuẩn, Docker API và reverse proxy bên dưới một giao diện web trực quan, tinh gọn.

Control Plane và Remote Worker

Hệ thống tách biệt hoàn toàn giữa tác vụ quản trị và tải xử lý của ứng dụng:

  • Coolify Instance (Control Plane): Chạy giao diện web, cơ sở dữ liệu nội bộ SQLite hoặc PostgreSQL để lưu trữ trạng thái ứng dụng, Redis queue và các task runner phục vụ triển khai.
  • Destination Server (Worker): Bất kỳ máy chủ Ubuntu hoặc Debian sạch nào có thể kết nối qua SSH. Coolify điều khiển các remote worker này thông qua SSH key gốc và lệnh Docker socket tiêu chuẩn. Bạn không cần phải cài đặt bất kỳ agent bên thứ ba nặng nề nào lên các node chạy ứng dụng.

Traefik Reverse Proxy & Điều hướng Edge tự động

Traefik đóng vai trò là edge router mặc định của Coolify. Mỗi khi bạn khởi chạy một service, Traefik sẽ tự động đọc các Docker label của container đó. Nó sẽ ánh xạ hostname công khai của bạn, định tuyến các HTTP request gửi đến port nội bộ của container đích và tự động yêu cầu cấp chứng chỉ TLS miễn phí từ Let’s Encrypt. Toàn bộ quy trình định tuyến này diễn ra tức thì trong thời gian thực mà không cần reload cấu hình.

Mô hình Multi-Server chuẩn kiến trúc

Các thiết lập chạy trên một node duy nhất thường đặt cả dashboard quản trị lẫn traffic production trên cùng một máy chủ. Điều này tiềm ẩn rất nhiều rủi ro. Nếu một đợt deploy làm bộ nhớ tăng đột biến và kích hoạt cơ chế Linux Out-Of-Memory (OOM) killer, toàn bộ control panel của bạn có thể bị đánh sập. Coolify giải quyết triệt để vấn đề này bằng cách cho phép bạn chạy một VPS giá rẻ 5 USD/tháng (2GB RAM) chỉ dành riêng cho dashboard, trong khi toàn bộ tải production được phân bổ sang các VPS riêng biệt có giá từ 10 đến 20 USD.

Thực hành: Triển khai Coolify trên Ubuntu 22.04/24.04

Dưới đây là các bước thiết lập chuẩn production mà chúng tôi đang áp dụng trên toàn bộ hạ tầng với hệ điều hành Ubuntu 22.04 hoặc 24.04 LTS mới tinh.

Bước 1: Chuẩn bị và tăng cường bảo mật cho máy chủ Ubuntu

Khởi tạo một máy chủ Ubuntu với tối thiểu 2 vCPU, 2GB RAM và 30GB dung lượng ổ cứng SSD. Đăng nhập qua SSH, cập nhật các gói hệ thống và cấu hình tường lửa cơ bản với UFW:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl ufw fail2ban

# Cấu hình các quy tắc tường lửa
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8000/tcp
sudo ufw enable

Cổng 8000 dùng để truy cập giao diện thiết lập ban đầu. Cổng 80 và 443 phục vụ lưu lượng web và xác thực Let’s Encrypt. Lưu ý: Mặc định Docker có thể vượt qua các quy tắc UFW thông qua iptables; nếu cần giới hạn cổng nghiêm ngặt, hãy cấu hình Docker daemon tuân thủ bảng tường lửa trước khi public các dịch vụ backend nhạy cảm.

Bước 2: Cài đặt Coolify Control Plane

Coolify cung cấp sẵn một script bootstrap duy nhất. Script này sẽ tự động cài đặt Docker Engine, docker-compose plugin và kéo về toàn bộ các core container cần thiết. Hãy chạy lệnh này với quyền root hoặc user có quyền sudo:

curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

Quá trình cài đặt mất khoảng hai phút. Khi script thông báo hoàn tất, hãy mở trình duyệt và truy cập vào địa chỉ:

http://<ip-may-chu-cua-ban>:8000

Hãy tiến hành đăng ký tài khoản quản trị viên ngay lập tức. Người dùng đầu tiên này sẽ tự động được cấp toàn quyền quản trị cao nhất (root).

Bước 3: Kết nối Remote Worker Server

Việc tách biệt môi trường giúp hạn chế tối đa tình trạng cạnh tranh tài nguyên (noisy neighbor). Để kết nối một worker server bên ngoài:

  1. Tạo một SSH key mới trong dashboard Coolify tại mục Keys & Tokens.
  2. Sao chép public key vừa tạo và thêm vào file /root/.ssh/authorized_keys trên VPS worker của bạn.
  3. Cài đặt Docker trên remote worker:
# Chạy trực tiếp trên VPS remote worker của bạn
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
  1. Trong dashboard Coolify, điều hướng đến Servers > + Add Server. Điền địa chỉ IP công khai của worker, chọn SSH key bạn vừa thiết lập và nhấn Validate & Save. Coolify sẽ kết nối, kiểm tra trạng thái Docker daemon và khởi động Traefik edge proxy ngay trên worker.

Bước 4: Triển khai ứng dụng Multi-Container qua Git Webhook

Sau khi máy chủ đã kết nối thành công, bạn có thể triển khai ứng dụng trực tiếp từ repository chứa code:

  1. Liên kết tài khoản GitHub, GitLab hoặc Gitea tự host của bạn trong phần Sources.
  2. Mở Projects, nhấn Add New Project và tạo một môi trường Production.
  3. Chọn Application, sau đó chọn repository và branch mong muốn (ví dụ: main). Chọn build pack phù hợp: Nixpacks (tự động nhận diện ngôn ngữ), Dockerfile thuần hoặc file docker-compose.yml.
  4. Khai báo các biến môi trường (environment variables). Coolify sẽ mã hóa các secret này khi lưu trữ an toàn trong PostgreSQL.
  5. Cấu hình domain production trong mục settings (ví dụ: api.yourdomain.com). Đảm bảo DNS record loại A của bạn đã trỏ về địa chỉ IP của worker server.
  6. Nhấn Deploy.

Coolify sẽ kích hoạt container build, chạy health check, cập nhật route trên Traefik và xin cấp chứng chỉ SSL. Mọi lượt push code tiếp theo vào branch git được chỉ định sẽ tự động kích hoạt quy trình rolling deployment.

Bước 5: Thiết lập lịch bảo trì và sao lưu tự động

Các môi trường container hoạt động liên tục sẽ nhanh chóng làm đầy ổ cứng do build cache cũ và các dangling image. Hãy truy cập vào Server Settings và kích hoạt tính năng tự động dọn dẹp Docker. Chúng tôi thiết lập cho các instance tự động dọn dẹp các dangling image bất cứ khi nào dung lượng đĩa sử dụng vượt quá 80%.

Đối với các cơ sở dữ liệu có lưu trạng thái như PostgreSQL hay MariaDB, hãy thiết lập lịch dump tự động tại tab Backups của database. Coolify có thể tải trực tiếp các bản dump SQL đã nén gzip lên bất kỳ bucket nào tương thích chuẩn S3 (như AWS S3, Cloudflare R2 hoặc MinIO). Chúng tôi thường đặt lịch sao lưu cơ sở dữ liệu hàng ngày vào lúc 02:00 UTC với chu kỳ lưu trữ trong 14 ngày.

Tổng kết: Sau 6 tháng vận hành thực tế

Sau nửa năm vận hành theo kiến trúc này, đội ngũ của chúng tôi hiện chạy 16 microservice, 5 worker ngầm và 3 database production trên hai node worker Hetzner giá 14 USD cùng một instance control plane giá 6 USD. Tổng chi phí hosting hàng tháng đã giảm mạnh từ 840 USD xuống chỉ còn dưới 40 USD.

Control plane chỉ tiêu tốn khoảng 520MB RAM ở trạng thái nghỉ. Thời gian build thông qua Nixpacks trung bình chỉ mất 90 giây, và chúng tôi chưa từng phải chạm tay vào một script SSH deploy thủ công nào kể từ khi chuyển đổi. Việc tự host một hệ thống PaaS đòi hỏi bạn phải có kỹ năng quản trị hệ thống cơ bản, nhưng Coolify đã giải quyết triệt để các rào cản phức tạp mà không ép bạn phải phụ thuộc vào mức giá đắt đỏ của các nhà cung cấp cloud độc quyền.

Share: