0
0
Lập trình
TT

Hướng Dẫn Dockerize và Triển Khai Ứng Dụng NestJS Trên Render Miễn Phí

Đăng vào 4 tuần trước

• 7 phút đọc

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 Copy
# 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 Copy
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 Copy
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:

  1. Đẩy mã của bạn lên GitHub/GitLab.
  2. Trong Dashboard của Render → Mới → Dịch Vụ Web.
  3. Kết nối kho lưu trữ của bạn.
  4. 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.

  1. Xây dựng ảnh Docker tại địa phương.
  2. Đẩy nó lên Docker Hub.
  3. 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 Copy
# 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 Copy
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 Copy
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ạn
  • DOCKER_PASSWORD → mã thông báo truy cập Docker Hub của bạn
  • RENDER_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 Copy
npm install -g wrangler

Tạo một worker mới:

bash Copy
wrangler init keep-alive-worker

Cấu Hình Worker

Trong wrangler.toml:

toml Copy
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 Copy
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 Copy
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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào