Tự xây dựng PaaS ‘cây nhà lá vườn’ với Dokku: Deploy nhanh như Heroku

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Cực hình mang tên “Cấu hình thủ công”

Mỗi lần làm project mới, mình lại thấy ngán ngẩm. Việc ngồi viết Dockerfile, cấu hình Nginx Reverse Proxy hay loay hoay cài SSL Certbot thủ công tốn quá nhiều thời gian. Nếu bạn từng dùng Heroku, chắc hẳn bạn đã quen với cảm giác “sướng” khi chỉ cần gõ git push heroku master là xong. Thế nhưng, chi phí của Heroku hiện tại không hề rẻ. Một dyno cơ bản có giá $7/tháng, và con số này sẽ đội lên nhanh chóng nếu bạn cần thêm Database hay Redis.

Sau 6 tháng chuyển toàn bộ side-project lên Dokku, mình thực sự hối hận vì không biết nó sớm hơn. Nó giúp mình tiết kiệm khoảng 70% thời gian setup môi trường. Quan trọng nhất là mình không còn gặp những lỗi ngớ ngẩn do gõ nhầm lệnh khi cấu hình tay trên server.

Dokku là gì? Tại sao nên dùng nó?

Dokku là một bản “Heroku mã nguồn mở” chạy trực tiếp trên server của bạn. Nó kết hợp sức mạnh của Docker để đóng gói ứng dụng và Nginx để điều hướng traffic. Điểm ăn tiền nhất nằm ở Buildpacks. Dokku sẽ tự động nhận diện ứng dụng của bạn là Node.js, Python hay PHP để cài đặt môi trường tương ứng mà bạn không cần đụng tay vào.

Thực tế, trên một con VPS 2GB RAM (giá khoảng $12/tháng), mình đã chạy ổn định 5 ứng dụng khác nhau. Nếu chạy số lượng này trên Heroku, hóa đơn mỗi tháng có thể lên tới hơn $50. Nhờ cơ chế quản lý container thông minh, Dokku tận dụng tài nguyên tốt hơn nhiều so với việc cài đặt từng dịch vụ riêng lẻ theo cách truyền thống.

Chuẩn bị trước khi bắt đầu

Để mọi thứ trơn tru, bạn cần có:

  • Một VPS chạy Ubuntu 22.04 LTS (RAM tối thiểu 1GB).
  • Một Domain đã trỏ bản ghi A về IP của VPS.
  • SSH Key đã cài sẵn trên máy cá nhân để bảo mật.

Bước 1: Cài đặt Dokku lên VPS

Đội ngũ phát triển Dokku đã tối ưu việc cài đặt chỉ trong một dòng lệnh. Bạn chỉ cần SSH vào server và chạy script bootstrap chính thức:

# Tải và chạy script cài đặt bản stable mới nhất
wget -qO- https://dokku.com/install/v0.34.x/bootstrap.sh | sudo DOKKU_TAG=v0.34.x bash

Quá trình này thường mất từ 5 đến 10 phút. Script sẽ tự động lo liệu mọi thứ từ Docker cho đến các dependency cần thiết. Bạn có thể tranh thủ pha một ly cà phê trong lúc chờ đợi.

Bước 2: Khai báo SSH Key và Domain

Sau khi cài xong, bạn cần cấp quyền cho máy cá nhân để có thể push code. Hãy chạy lệnh sau từ máy của bạn (không phải trên server):

# Đẩy public key lên server để định danh
cat ~/.ssh/id_rsa.pub | ssh root@ip-server "dokku ssh-keys:add admin"

Tiếp theo, hãy thiết lập domain chính. Việc này cực kỳ quan trọng vì Dokku sẽ dựa vào đây để tạo subdomain tự động cho từng ứng dụng của bạn sau này:

# Chạy lệnh này trực tiếp trên server
dokku domains:set-global yourdomain.com

Bước 3: Khởi tạo ứng dụng và Database

Giả sử mình đang phát triển một API bằng Node.js tên là my-awesome-app. Thay vì tạo thư mục hay config Nginx phức tạp, mình chỉ cần vài dòng lệnh:

# Tạo app mới
dokku apps:create my-awesome-app

# Cài đặt plugin Postgres (chỉ cần làm một lần duy nhất)
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git

# Tạo và liên kết database
dokku postgres:create my-db
dokku postgres:link my-db my-awesome-app

Điểm cộng lớn là Dokku tự động inject biến môi trường DATABASE_URL vào ứng dụng. Bạn không cần phải lưu mật khẩu database trong code, giúp giảm thiểu rủi ro bảo mật.

Bước 4: Deploy ứng dụng chỉ với Git Push

Đây là lúc bạn thấy công sức bỏ ra hoàn toàn xứng đáng. Tại thư mục code trên máy cá nhân, hãy thêm remote và đẩy code lên:

git remote add dokku [email protected]:my-awesome-app
git push dokku master

Màn hình terminal sẽ nhảy log liên tục: từ việc cài npm install đến build image Docker. Khi kết thúc, Dokku sẽ cung cấp một đường dẫn như http://my-awesome-app.yourdomain.com để bạn truy cập ngay lập tức.

Bước 5: Kích hoạt SSL miễn phí

Hiện nay, một website không có HTTPS là một thiếu sót lớn. Với Dokku, việc cài SSL miễn phí từ Let’s Encrypt dễ như ăn kẹo. Plugin này còn có tính năng tự động gia hạn, giúp bạn rảnh tay hoàn toàn.

# Cài plugin Let's Encrypt
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git

# Cấu hình email và kích hoạt
dokku config:set --no-restart my-awesome-app [email protected]
dokku letsencrypt:enable my-awesome-app

Vài lưu ý “xương máu” sau 6 tháng sử dụng

Để vận hành Dokku ổn định trên môi trường production, mình có vài lời khuyên nhỏ cho bạn:

  • Theo dõi tài nguyên: Đừng quên dùng lệnh dokku stats. Nó giúp bạn biết chính xác ứng dụng nào đang ngốn RAM nhất để có kế hoạch nâng cấp VPS kịp thời.
  • Chiến lược Backup: Đừng chủ quan với dữ liệu. Mình luôn dùng dokku postgres:export kết hợp với cronjob để đẩy bản backup lên S3 mỗi đêm.
  • Zero-downtime: Dokku mặc định hỗ trợ zero-downtime deploy. Nó chỉ tắt container cũ khi container mới đã sẵn sàng nhận traffic, đảm bảo người dùng không thấy lỗi 502.

Nếu bạn muốn quy trình deploy chuyên nghiệp mà không muốn “đau đầu” vì Kubernetes, Dokku là lựa chọn số một. Nó đơn giản, hiệu quả và cực kỳ tiết kiệm chi phí cho các dự án vừa và nhỏ.

Share: