Cơn ác mộng của việc triển khai thủ công
Nếu bạn từng mất cả giờ để gỡ lỗi cấu hình Nginx bị hỏng sau một lệnh git pull đơn giản, bạn sẽ hiểu sự mệt mỏi của việc triển khai (deployment) thủ công. Tôi từng dành những đêm thứ Sáu để SSH vào máy chủ, khởi động lại các dịch vụ systemd bằng tay và cầu nguyện rằng một bản cập nhật dependency nhỏ sẽ không làm sập toàn bộ hệ thống. Cách này có thể ổn với một ứng dụng, nhưng sẽ là công thức dẫn đến kiệt sức khi bạn phải quản lý năm hoặc sáu microservices khác nhau.
Có thể bạn nhìn vào mức giá 25 USD/tháng cho một gói Heroku dyno cơ bản và ước gì sự đơn giản đó có mặt trên gói DigitalOcean droplet 5 USD của mình. Đây chính là lúc Dokku tỏa sáng. Nó lấp đầy khoảng cách giữa hạ tầng thô và các nền tảng cấp cao. Từ kinh nghiệm thực chiến, tôi thấy Dokku là công cụ tốt nhất cho các nhà phát triển muốn tập trung vào code thay vì bảo trì máy chủ.
Chính xác thì Dokku là gì?
Dokku là một PaaS (Platform as a Service) nhẹ chạy trên máy chủ của riêng bạn. Hãy coi nó như một lớp vỏ thông minh bao quanh Docker và Herokuish. Nó sử dụng Buildpacks để tự động nhận diện xem bạn đang đẩy code Node.js, Python, Ruby hay Go. Sau đó, nó xây dựng một môi trường container hóa mà bạn không cần phải chạm vào Dockerfile.
Hãy quên việc viết các tệp YAML CI/CD phức tạp cho từng dự án nhỏ. Với Dokku, bạn chỉ cần thêm một Git remote vào kho lưu trữ (repository) cục bộ và thực hiện lệnh push. Nền tảng sẽ đảm nhận phần việc nặng nhọc: xây dựng image, quản lý vòng đời container và cấu hình lại Nginx reverse proxy để điều hướng lưu lượng truy cập đến bản triển khai mới ngay lập tức.
Các điều kiện cần thiết cho PaaS cá nhân
Trước khi chạy cài đặt, hãy đảm bảo môi trường của bạn đáp ứng các yêu cầu cơ bản sau:
- Một máy chủ chạy Ubuntu 22.04 hoặc 24.04.
- Ít nhất 1GB RAM (Dokku có thể chạy 5-10 container nhỏ dễ dàng với mức này).
- Tối thiểu 10GB ổ cứng SSD.
- Một tên miền với bản ghi A wildcard (ví dụ:
*.yourdomain.com) trỏ về IP máy chủ của bạn.
Bước 1: Cài đặt Dokku
Cách đáng tin cậy nhất để bắt đầu là sử dụng script bootstrap chính thức. Nó tự động hóa việc cài đặt Docker, Dokku và các dependency cốt lõi cần thiết trong khoảng năm phút.
# Tải và chạy script cài đặt Dokku
wget -qO- https://packagecloud.io/dokku/dokku/gpgkey | sudo gpg --dearmor -o /etc/apt/keyrings/dokku.gpg
echo "deb [signed-by=/etc/apt/keyrings/dokku.gpg] https://packagecloud.io/dokku/dokku/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/dokku.list
sudo apt-get update
sudo apt-get install dokku
Sau khi cài đặt các gói, bạn phải xác định tên miền toàn cục. Điều này cho phép Dokku tự động tạo các subdomain cho mọi ứng dụng bạn tạo.
# Thay thế yourdomain.com bằng tên miền thực tế của bạn
sudo dokku domains:set-global yourdomain.com
Bước 2: Thêm SSH Key
Dokku sử dụng SSH để triển khai. Bạn cần thông báo cho máy chủ rằng máy cục bộ của bạn được phép đẩy code. Chạy lệnh này từ terminal cục bộ, không phải console của máy chủ:
# Thay thế 'user' và 'ip-address' bằng thông tin máy chủ của bạn
cat ~/.ssh/id_rsa.pub | ssh user@ip-address "sudo dokku ssh-keys:add admin"
Tôi thấy nhiều lập trình viên bỏ qua bước này và bực bội vì các yêu cầu nhập mật khẩu. Việc thêm key chính xác đảm bảo rằng chỉ cần một lệnh git push đơn giản là đủ để kích hoạt toàn bộ chu trình triển khai.
Bước 3: Tạo ứng dụng đầu tiên
Nền tảng cần một namespace cho dự án của bạn. Hãy tạo một chỗ lưu trữ cho ứng dụng Node.js có tên là “api-service”.
# Chạy lệnh này trên máy chủ
dokku apps:create api-service
Bước 4: Triển khai chỉ với một lệnh Git Push
Di chuyển đến thư mục dự án cục bộ của bạn. Nếu nó chưa phải là một kho lưu trữ Git, hãy chạy git init. Đây là lúc quá trình tự động hóa bắt đầu. Thêm máy chủ của bạn làm đích đến remote và đẩy code lên.
# Terminal cục bộ
git remote add dokku [email protected]:api-service
git push dokku main
Quan sát kết quả trên terminal. Bạn sẽ thấy Dokku nhận diện ngôn ngữ của bạn, cài đặt các dependency như npm packages và khởi chạy container. Trong vài giây, ứng dụng của bạn sẽ hoạt động tại http://api-service.yourdomain.com.
Bước 5: Thêm cơ sở dữ liệu (PostgreSQL)
Hầu hết các ứng dụng không chỉ là các tệp tĩnh; chúng cần một nơi lưu trữ dữ liệu. Dokku sử dụng hệ thống plugin mạnh mẽ để quản lý các dịch vụ như Postgres, Redis hoặc MariaDB.
# Cài đặt plugin Postgres
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres
# Tạo instance cơ sở dữ liệu
dokku postgres:create production-db
# Liên kết nó với ứng dụng của bạn
dokku postgres:link production-db api-service
Liên kết là phần thông minh nhất. Nó chèn một biến môi trường DATABASE_URL trực tiếp vào ứng dụng của bạn. Code của bạn chỉ cần đọc biến này để kết nối, nghĩa là bạn không bao giờ phải viết cứng mật khẩu trong mã nguồn.
Bước 6: Bảo mật với SSL (Let’s Encrypt)
Ngày nay, HTTPS là yêu cầu bắt buộc, không phải là một tùy chọn xa xỉ. Dokku xử lý các chứng chỉ SSL và tự động gia hạn sau mỗi 90 ngày thông qua plugin Let’s Encrypt.
# Cài đặt plugin
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
# Thiết lập email của bạn để nhận cảnh báo ACME
dokku config:set --no-restart api-service [email protected]
# Kích hoạt SSL
dokku letsencrypt:enable api-service
Quản lý các biến môi trường
Các quy tắc bảo mật tốt nhất yêu cầu các API key và bí mật phải nằm ngoài kho lưu trữ của bạn. Dokku quản lý chúng thông qua lệnh config. Nó an toàn hơn đáng kể so với việc để các tệp .env nằm trên ổ đĩa.
# Thiết lập một secret key
dokku config:set api-service STRIPE_KEY=sk_test_51Mz...
# Liệt kê tất cả các biến đang hoạt động
dokku config:show api-service
Bất cứ khi nào bạn cập nhật một biến cấu hình, Dokku sẽ thực hiện khởi động lại mà không gây gián đoạn dịch vụ (zero-downtime restart). Nó sẽ khởi chạy một container mới với các cài đặt mới trước khi tắt container cũ.
Tại sao điều này thay đổi quy trình làm việc của bạn
Việc chuyển từ quản lý máy chủ thủ công sang một PaaS riêng tư là một cú hích lớn về năng suất. Bạn không chỉ tiết kiệm được 20 USD mỗi tháng; bạn đang xây dựng một môi trường có thể dự đoán được, nơi việc triển khai trở nên đơn giản và có khả năng lặp lại.
Tôi sử dụng thiết lập này cho mọi thứ, từ các bản mẫu cho khách hàng đến các công cụ giám sát nội bộ. Nếu một dự án thất bại hoặc không còn cần thiết, lệnh dokku apps:destroy api-service sẽ xóa sạch mọi thứ trong 30 giây. Không có tiến trình rác. Không có tệp cấu hình lộn xộn. Chỉ là một máy chủ sạch sẽ sẵn sàng cho ý tưởng lớn tiếp theo của bạn.
Tổng kết
Thiết lập Dokku là một sự thay đổi hoàn toàn trong cách bạn xử lý các dự án phụ (side projects). Bạn có được sức mạnh của Docker và sự đơn giản của quy trình làm việc dựa trên Git mà không cần đến sự phức tạp của Kubernetes. Một khi máy chủ Ubuntu của bạn đã được cấu hình, bạn có thể ngừng đóng vai quản trị viên hệ thống và quay lại làm một nhà phát triển. Hãy xây dựng các tính năng của bạn và để Dokku lo phần hạ tầng.

