- Dokku là một PaaS mã nguồn mở giúp bạn sử dụng một VPS đơn lẻ như Heroku, rất phù hợp cho công việc cá nhân hoặc quy mô nhỏ muốn triển khai nhiều ứng dụng với chi phí thấp trên hạ tầng do chính mình sở hữu
- Các workload không dùng GPU đang chạy trên VPS OVHcloud 7 USD/tháng, giúp giảm chi phí và độ phức tạp triển khai trong những môi trường thường xuyên phải đưa ứng dụng lên như tư vấn LLM
- Ứng dụng dựa trên Dockerfile có thể được triển khai chỉ bằng cách tạo app Dokku, thêm Git remote, rồi chạy
git push dokku main, và có thể điều chỉnh số tiến trình bằng dokku ps:scale
- Ngay cả trang tĩnh cũng có thể triển khai từ kho GitHub riêng tư và bảo vệ bằng mật khẩu bằng cách kết hợp
_site, .static, nginx buildpack và dokku-http-auth
- Nếu kết nối thêm GitHub Actions, lệnh SSH từ xa, vô hiệu hóa Docker cache và rebuild không cần push, bạn có thể biến nó thành một môi trường PaaS cá nhân có thể vận hành lặp lại
Dùng Dokku để biến một VPS đơn lẻ thành Heroku
- Dokku là một PaaS mã nguồn mở chạy trên một máy chủ đơn lẻ do người dùng lựa chọn
- Nó mang lại trải nghiệm triển khai tương tự Heroku, nhưng hạ tầng là do người dùng trực tiếp sở hữu
- Vì chi phí Heroku có thể tăng cao, nên trong công việc tư vấn LLM cần triển khai nhiều ứng dụng, một nền tảng triển khai tiết kiệm chi phí là rất quan trọng
- Tác giả đang vận hành một máy chủ Dokku trên VPS OVHcloud 7 USD/tháng cho các workload không dùng GPU
Trải nghiệm triển khai kiểu Heroku và các tính năng vận hành
- Dokku cung cấp một luồng triển khai dễ dùng giống Heroku
- Hỗ trợ quản lý chứng chỉ SSL tự động thông qua Let’s Encrypt
- Có thể đặt bảo vệ bằng mật khẩu cho website bằng Basic Auth
- Có thể scale up/down chỉ với một lệnh duy nhất
- Hỗ trợ nhiều loại ứng dụng như Node, Python, và khi cần cũng có thể tự định nghĩa Docker container
- Có nhiều plugin chính thức, nên có thể mở rộng hầu hết các tính năng cần thiết
- Việc triển khai có thể thực hiện chỉ bằng các lệnh Git
Triển khai ứng dụng bằng Docker container
- Sau khi cài đặt Dokku trên VPS, nếu đặt Dockerfile ở thư mục gốc của kho ứng dụng thì có thể triển khai dưới dạng Docker container
- Dockerfile ví dụ sử dụng image
python:3.10, sao chép mã nguồn vào /app, rồi chạy pip install .
entrypoint.sh được dùng để chạy ứng dụng dễ dàng trong môi trường local hoặc Docker container
- Ví dụ chạy ứng dụng FastAPI bằng
uvicorn main:app --port "$PORT" --host 0.0.0.0
- Trước tiên tạo ứng dụng trên host Dokku
dokku apps:create myapp
- Ở local, cấu hình thông tin truy cập host Dokku trong
~/.ssh/config và đặt tên host đó là dokku
- Thêm Dokku làm remote cho kho Git local rồi push để triển khai
git remote add dokku dokku@dokku:myapp
git push dokku main
- Sau khi triển khai, URL ứng dụng sẽ được in ra trong log local, mặc định có dạng
myapp.yourdomain.com
- Có thể điều chỉnh số worker bằng lệnh sau
dokku ps:scale myapp web=2
Trang tĩnh riêng tư và Basic Auth
- GitHub Pages khá bất tiện nếu muốn dễ dàng triển khai trang tĩnh riêng tư vì cần tài khoản Enterprise đắt đỏ
- Với Dokku, bạn có thể triển khai trang tĩnh từ kho GitHub riêng tư và bảo vệ bằng mật khẩu
- Giả sử trang tĩnh nằm trong thư mục
_site của kho Git
- Tạo ứng dụng trên host Dokku và đặt biến môi trường
NGINX_ROOT thành _site
dokku apps:create mysite
dokku config:set static-site NGINX_ROOT=_site
sudo dokku plugin:install https://github.com/dokku/dokku-http-auth.git
sudo chmod +x /home/dokku
- Tại thư mục gốc của kho Git chứa trang tĩnh, thực hiện các thao tác sau
touch .static
echo BUILDPACK_URL=https://github.com/dokku/buildpack-nginx > .env
git remote add dokku dokku@dokku:mysite
.static dùng để báo cho Dokku biết đây là một trang tĩnh
BUILDPACK_URL chỉ định sử dụng nginx buildpack
- Thông thường nó được tự động phát hiện, nhưng trong các dự án có cả mã nguồn và trang tĩnh thì nên chỉ rõ nginx buildpack để tránh nhầm lẫn
- Việc triển khai được thực hiện bằng
git push dokku main
- Bật xác thực trên host Dokku bằng lệnh sau
dokku http-auth:enable mysite <username> <password>
- Có thể thêm nhiều cặp tên người dùng/mật khẩu và cũng có thể lọc theo IP cụ thể
- HTTPS có thể được thiết lập bằng Let’s Encrypt Plugin và cũng hỗ trợ tự động gia hạn
- Nếu xử lý HTTPS bằng proxy Cloudflare thì có thể để Cloudflare đảm nhiệm thay vì dùng plugin Let’s Encrypt
Tự động triển khai bằng GitHub Actions
- Ứng dụng Dokku có thể được tự động triển khai bằng GitHub Actions
- Không cần lặp đi lặp lại thao tác push trực tiếp lên host Dokku theo cách thủ công
- Workflow ví dụ chạy khi
workflow_dispatch và khi có push lên nhánh main
- Thiết lập
concurrency sẽ hủy job trước đó để tránh deploy lock của Dokku
- Workflow sẽ checkout mã nguồn, tạo SSH private key từ
secrets.DOKKU_SSH_PRIVATE_KEY, thêm Git remote, rồi force push lên Dokku
name: CI
on:
workflow_dispatch:
push:
branches: [main]
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
deploy-dokku:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install SSH key
run: |
echo "${{ secrets.DOKKU_SSH_PRIVATE_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: Add remote and push
run: |
git remote add dokku dokku@rechat.co:llm-eval
GIT_SSH_COMMAND="ssh -i private_key.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git push dokku main -f
Lệnh vận hành từ xa và rebuild
- Tên ứng dụng ví dụ là
llm-eval, host là rechat.co
- Không cần SSH đăng nhập trực tiếp vào host Dokku, vẫn có thể chạy lệnh từ xa với người dùng
dokku
ssh dokku@rechat.co apps:list
- Có thể vô hiệu hóa Docker cache để thực hiện build mới
ssh dokku@rechat.co repo:purge-cache llm-eval
- Khi cần rebuild mà không push, có nhiều cách khác nhau, một cách là dùng lệnh sau
ssh dokku@rechat.co ps:rebuild llm-eval
Tài liệu tham khảo cá nhân cho việc triển khai lặp lại
- Tác giả tổng hợp lại vì mỗi lần triển khai ứng dụng mới đều phải tra cứu lại cùng một loạt chi tiết
- Đây được lưu lại như tài liệu tham khảo có thể tái sử dụng để cấu hình một nền tảng triển khai cá nhân bằng Dokku
Chưa có bình luận nào.