Hướng Dẫn Dockerize và Triển Khai Ứng Dụng NestJS Trên Render Miễn Phí
Bạn đã xây dựng ứng dụng NestJS và giờ muốn triển khai nó trực tuyến mà không tốn tiền hay thêm thẻ tín dụng nào? Trong bài viết này, chúng ta sẽ đi qua một quy trình rõ ràng, từng bước để Dockerize ứng dụng của bạn và triển khai nó trên Render miễn phí.
Render cung cấp gói miễn phí giúp bạn dễ dàng triển khai các ứng dụng đã được Docker hóa, trong khi Docker đảm bảo dự án của bạn chạy nhất quán ở mọi nơi. Trong hướng dẫn này, chúng ta sẽ:
- 🐳 Dockerize ứng dụng NestJS sử dụng
pnpm
. - 🚀 Triển khai nó lên Render theo hai cách khác nhau.
- 🔁 Thêm CI/CD cho các triển khai tự động khi có thay đổi trên
main
. - 🎁 Bonus: Giữ ứng dụng Render của bạn hoạt động 24/7 bằng cách sử dụng Cloudflare Worker.
Hãy cùng bắt đầu! 🐳
Tại Sao Sử Dụng Docker Cho NestJS?
Docker giúp đóng gói ứng dụng NestJS của bạn cùng với tất cả các phụ thuộc để nó chạy chính xác như nhau ở mọi môi trường.
Render hỗ trợ hai cách để triển khai ứng dụng Docker:
- Từ Dockerfile → Render tự xây dựng ảnh.
- Từ ảnh Docker đã xây dựng → Bạn đẩy ảnh của mình lên Docker Hub (hoặc bất kỳ registry nào), và Render sẽ kéo về.
Chúng ta sẽ đề cập đến cả hai tùy chọn.
Bước 1: Dockerize Ứng Dụng NestJS
Đầu tiên, chúng ta cần container hóa ứng dụng của mình. Nếu bạn chưa cài đặt Docker, hãy tải về tại đây.
Tạo Dockerfile
Tạo một tệp có tên Dockerfile
trong thư mục gốc của dự án:
Dưới đây là một ví dụ về Dockerfile sử dụng pnpm:
dockerfile
# Sử dụng hình ảnh Node.js nhẹ
FROM node:20-slim
# Đặt thư mục làm việc
WORKDIR /app
# Sao chép các tệp phụ thuộc trước (sử dụng bộ nhớ đệm tốt hơn)
COPY package.json pnpm-lock.yaml* ./
# Cài đặt các phụ thuộc
RUN npm install -g pnpm && pnpm install --frozen-lockfile
# Sao chép phần còn lại của mã nguồn
COPY . .
# Xây dựng dự án NestJS
RUN pnpm run build
# Mở cổng ứng dụng
EXPOSE 3000
# Khởi động ứng dụng
CMD ["pnpm", "run", "start:prod"]
Đừng Quên Tệp .dockerignore
Tạo một tệp .dockerignore
để giữ cho ảnh của bạn nhẹ và hiệu quả bằng cách loại trừ các tệp không cần thiết:
dockerignore
node_modules
dist
.git
Dockerfile
.dockerignore
.env
Kiểm Tra Tại Địa Phương Trước
Trước khi triển khai, hãy xây dựng và chạy container tại địa phương để đảm bảo mọi thứ hoạt động.
bash
docker build -t nest-backend .
docker run -p 3000:3000 nest-backend
Truy cập vào http://localhost:3000 để xác minh ứng dụng của bạn đang chạy. Nếu mọi thứ hoạt động, bạn đã sẵn sàng cho việc triển khai! ✅
Bước 2: Triển Khai Lên Render
Bây giờ ứng dụng NestJS của bạn đã được Docker hóa, hãy triển khai nó lên Render. Chúng ta có hai tùy chọn:
Tùy Chọn A: Cách Đơn Giản (Để Render Xây Dựng Ảnh)
Đây là cách dễ nhất:
- Đẩy mã của bạn lên GitHub/GitLab.
- Trong Dashboard của Render → Mới → Dịch Vụ Web.
- Kết nối kho lưu trữ của bạn.
- Render sẽ phát hiện
Dockerfile
và tự động xây dựng ảnh.
Chỉ vậy thôi! Render sẽ xây dựng ảnh Docker từ Dockerfile
và triển khai ứng dụng của bạn. Dễ dàng. 🎉
Tùy Chọn B: Cách CI/CD (Ảnh Đã Xây Dựng Với GitHub Actions)
Phương pháp này mang lại cho bạn nhiều quyền kiểm soát hơn và cho phép triển khai tự động.
- Xây dựng ảnh Docker tại địa phương.
- Đẩy nó lên Docker Hub.
- Kích hoạt Render kéo ảnh mới.
Điều này cũng cho phép triển khai CI/CD tự động khi có thay đổi.
Bước 1: Đẩy Lên Docker Hub
bash
# Xây dựng ảnh
docker build -t nest-backend .
# Đánh dấu với tên người dùng Docker Hub
docker tag nest-backend your-username/nest-backend:latest
# Đẩy lên Docker Hub
docker push your-username/nest-backend:latest
Trên Render, chọn Triển khai một ảnh Docker hiện có và sử dụng:
bash
docker.io/your-username/nest-backend:latest
Render sẽ lấy ảnh mới nhất mỗi khi bạn kích hoạt một lần triển khai lại.
📝 Ghi chú về các thẻ:
- Render sẽ triển khai lại dựa trên thẻ bạn chỉ định (
latest
,v1.0.0
, v.v.).- Sử dụng
latest
là đơn giản, nhưng thẻ đã phiên bản (ví dụ:v1.0.0
) an toàn hơn cho sản xuất vì chúng giúp việc quay lại dễ dàng hơn.- Render chỉ lấy một ảnh mới từ Docker Hub khi bạn kích hoạt một lần triển khai lại (thủ công hoặc qua CI/CD).
Bước 2: Tự Động Hóa Với GitHub Actions
Tạo tệp .github/workflows/docker-build.yml
:
yaml
name: Build & Push Docker Image
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: your-username/nest-backend:latest
- name: Trigger Render Deploy
run: |
curl -X POST ${{ secrets.RENDER_DEPLOY_HOOK }}
Trong kho lưu trữ GitHub của bạn → Cài đặt → Bí mật → thêm:
DOCKER_USERNAME
→ tên người dùng Docker Hub của bạnDOCKER_PASSWORD
→ mã thông báo truy cập Docker Hub của bạnRENDER_DEPLOY_HOOK
→ từ bảng điều khiển Render (dịch vụ → cài đặt → URL hook triển khai)
Bây giờ mỗi lần đẩy lên main
sẽ:
- Xây dựng ảnh Docker
- Đẩy nó lên Docker Hub
- Kích hoạt một lần triển khai mới trên Render.
🎁 Bonus: Giữ Ứng Dụng Render Của Bạn Hoạt Động 24/7
Trên gói miễn phí của Render, dịch vụ của bạn sẽ ngủ sau 15 phút không hoạt động để tiết kiệm tài nguyên. Khi điều đó xảy ra, yêu cầu tiếp theo có thể cảm thấy chậm vì ứng dụng phải “khởi động lạnh.”
Để ngăn điều này xảy ra, bạn có thể thiết lập một heartbeat đơn giản để ping ứng dụng của bạn mỗi vài phút.
Bạn không cần phải sử dụng Cloudflare Workers — bạn cũng có thể sử dụng:
- n8n (tự lưu trữ hoặc đám mây)
- Google Apps Script
- Bất kỳ dịch vụ cron job bên ngoài nào
Trong hướng dẫn này, chúng ta sẽ sử dụng Cloudflare Workers (gói miễn phí).
Tạo một Worker
Cài đặt Wrangler, CLI của Cloudflare.
bash
npm install -g wrangler
Tạo một worker mới:
bash
wrangler init keep-alive-worker
Cấu Hình Worker
Trong wrangler.toml
:
toml
name = "keep-alive-worker"
main = "src/index.ts"
compatibility_date = "2025-09-13"
# Thêm cái này
[triggers]
crons = ["*/15 * * * *"]
# (Tùy chọn) để bật nhật ký cho worker
[observability.logs]
enabled = true
Mã Worker
Trong src/index.ts
:
javascript
const SERVICES = [
'https://your-app-name.onrender.com', // URL ứng dụng của bạn
// Thêm nhiều dịch vụ ở đây nếu cần!
];
export default {
async scheduled(event, env, ctx) {
for (const url of SERVICES) {
try {
const res = await fetch(url);
console.log(`✅ Đã ping ${url} → ${res.status}`);
} catch (err) {
console.error(`❌ Không thể ping ${url}`, err);
}
}
},
};
Triển Khai Worker
bash
wrangler deploy
Vậy là xong! 🎉 Worker Cloudflare của bạn sẽ tự động ping ứng dụng Render của bạn mỗi 15 phút, giữ cho chúng hoạt động và phản hồi.
Những Lưu Ý Quan Trọng
- Khi sử dụng Docker, hãy luôn kiểm tra các tệp phụ thuộc để đảm bảo mọi thứ hoạt động như mong muốn.
- Đảm bảo rằng bạn có một quy trình CI/CD rõ ràng để quản lý các lần triển khai và cập nhật.
- Sử dụng thẻ phiên bản cho ảnh Docker của bạn để tránh rủi ro khi triển khai vào môi trường sản xuất.
Câu Hỏi Thường Gặp (FAQ)
1. Tôi có thể sử dụng Docker trên máy tính của mình không?
Có, bạn có thể cài đặt Docker trên hầu hết các hệ điều hành như Windows, macOS và Linux.
2. Làm thế nào để kiểm tra xem ứng dụng của tôi đã chạy trên Render chưa?
Bạn có thể vào bảng điều khiển Render và xem trạng thái của ứng dụng của bạn.
3. Tôi có thể sử dụng các dịch vụ khác ngoài Cloudflare để giữ ứng dụng luôn hoạt động không?
Có, bạn có thể sử dụng n8n, Google Apps Script hoặc bất kỳ dịch vụ cron job nào khác.
Kết Luận
Triển khai ứng dụng NestJS trên Render miễn phí bằng cách sử dụng Docker là một quy trình đơn giản và hiệu quả. Hãy thực hiện theo các bước đã mô tả để có được một ứng dụng hoạt động tốt và luôn sẵn sàng phục vụ người dùng. Đừng quên theo dõi các cập nhật từ Render và Docker để tối ưu hóa quy trình phát triển của bạn. Nếu bạn có thắc mắc, hãy để lại câu hỏi dưới bài viết này!