Blog ZoCloud Dùng thử

Đăng ngày 17/10/2026 · cập nhật 19/10/2026

Deploy app Node.js có PostgreSQL lên cloud tại Việt Nam

Để deploy app Node.js có PostgreSQL lên ZoCloud, bạn tạo một project, bấm Thêm → PostgreSQL để có database được quản lý ngay trong project, rồi gắn biến DATABASE_URL=${{pg.DATABASE_URL}} cho service và deploy từ GitHub hoặc bằng lệnh zo deploy. Không cần cài PostgreSQL, không cần deploy database riêng: app đọc chuỗi kết nối từ biến môi trường, còn máy chủ và bản sao lưu chính đặt tại Việt Nam.

Bài này đi từng bước, từ lúc tạo tài khoản tới khi app chạy trên tên miền riêng có HTTPS.

Chuẩn bị app Node.js

ZoCloud tự nhận diện framework (Express, Fastify, NestJS, Next.js…) và chọn lệnh cài, build, chạy. Bạn chỉ cần đảm bảo hai điều:

  1. App nghe trên 0.0.0.0 và cổng trong biến PORT. Đây là lỗi deploy hay gặp nhất.
  2. App đọc chuỗi kết nối database từ biến môi trường, không ghi cứng trong code.

Ví dụ tối giản với Express và thư viện pg:

import express from "express";
import pg from "pg";

const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
const app = express();

app.get("/health", (req, res) => res.send("ok"));
app.get("/", async (req, res) => {
  const { rows } = await pool.query("select now() as now");
  res.json(rows[0]);
});

app.listen(process.env.PORT || 3000, "0.0.0.0");

Muốn biết trước ZoCloud sẽ build thư mục thế nào, chạy zo detect trên máy.

Các bước deploy Node.js và PostgreSQL trên ZoCloud

Bước 1: Tạo tài khoản và project

  1. Mở trang đăng ký, điền họ tên, e-mail, mật khẩu, rồi xác minh e-mail.
  2. Hoàn tất thiết lập bằng một trong hai việc: nạp tiền vào ví (số tiền vẫn là của bạn để dùng dịch vụ) hoặc kết nối GitHub.
  3. Ở mục Project, bấm Tạo project, nhập tên (ví dụ shop), chọn Vị trí, bấm Tạo. Bạn vào canvas của project, environment mặc định là production.

Bước 2: Thêm PostgreSQL bằng một chạm

Đây là điểm khác với tự dựng server: database không phải là một app bạn phải deploy.

  1. Trên canvas, bấm Thêm → chọn PostgreSQL dưới mục Database.
  2. Nhập Tên, ví dụ pg. Tên này dùng trong biến tham chiếu.
  3. Bấm Tạo. Database sẵn sàng trong vài giây.

Database chạy trong mạng riêng của ZoCloud, chỉ app trong cùng environment truy cập được, được sao lưu mỗi đêm, mã hoá, bản chính lưu tại Việt Nam. Nếu thích dòng lệnh:

zo db create pg -engine postgres

Bước 3: Nối app với database qua biến DATABASE_URL

Mở service, tab Biến môi trường, thêm:

DATABASE_URL=${{pg.DATABASE_URL}}

${{pg.DATABASE_URL}} là biến tham chiếu: nó trỏ tới database tên pg trong cùng environment và tự cập nhật khi database đổi máy chủ hay mật khẩu. Bạn không cần chép mật khẩu ra đâu cả. Ngoài DATABASE_URL, PostgreSQL còn có PGHOST, PGPORT, PGUSER, PGPASSWORD, PGDATABASE cho thư viện nào cần từng phần riêng.

Với CLI, dùng dấu nháy đơn để shell không hiểu ${{…}} là biến của shell:

zo vars set 'DATABASE_URL=${{pg.DATABASE_URL}}'

Biến được mã hoá khi lưu, dùng cả lúc build và lúc chạy, và có hiệu lực từ lần deploy sau.

Bước 4: Deploy từ GitHub hoặc bằng zo CLI

Cách 1: từ GitHub. Bấm Thêm → Deploy từ Git → thẻ GitHub (cần Kết nối GitHub trước). Chọn repo, kiểm tra Tên service, Nhánh, Thư mục gốc, để trống Lệnh chạy cho ZoCloud tự chọn, rồi bấm Tạo và deploy. Bật Tự deploy khi push thì mỗi lần push lên nhánh là deploy đúng commit đó.

Cách 2: từ máy bằng zo CLI, không cần Git:

curl -fsSL https://app.zocloud.io/install.sh | sh
zo login                       # dán token tạo ở Tài khoản → Token truy cập
zo deploy -to myorg/shop/web   # chạy trong thư mục app

zo đóng gói thư mục, bỏ qua node_modules, .git và các mẫu trong .gitignore, và không bao giờ gửi file .env* (trừ .env.example). Khi xong, zo in địa chỉ HTTPS dạng https://web-shop.zocloud.app.

Theo dõi tiến trình ở tab Deploy. Bản đang chạy vẫn phục vụ khi bản mới lỗi; traffic chỉ chuyển sang khi bản mới khoẻ.

Bước 5: Chạy migration trước khi app khởi động

Nếu dùng Prisma, Knex, Drizzle hay TypeORM, đặt lệnh migration vào prestart trong file zocloud.json ở gốc repo:

{
  "build": {
    "install": "npm ci",
    "build": "npm run build"
  },
  "deploy": {
    "start": "npm start",
    "prestart": "npm run migrate",
    "health_path": "/health"
  }
}

Giá trị trong zocloud.json được ưu tiên hơn các ô trên portal. Nếu đang dùng Railway, ZoCloud cũng đọc railway.json.

Bước 6: Gắn tên miền riêng

  1. Tab Tên miền của service → nhập www.example.vn → Thêm.
  2. Tạo bản ghi CNAME trỏ www về địa chỉ ….zocloud.app mà portal hiện. Tên gốc dùng bản ghi A về các IP portal liệt kê.
  3. ZoCloud kiểm tra DNS mỗi phút; khi đúng, chứng chỉ HTTPS được cấp tự động trong vài phút và tự gia hạn.

Nếu tên miền mua tại ZoCloud, dùng ZoCloud DNS hoặc thuộc zone Cloudflare đã kết nối, bản ghi được tạo tự động. CLI: zo domains add www.example.vn.

Làm việc với dữ liệu PostgreSQL hằng ngày

  • Xem dữ liệu: tab Dữ liệu của database cho xem bảng và chạy SQL, mặc định ở chế độ Chỉ đọc.
  • Kết nối từ máy (TablePlus, DBeaver, psql): bật Truy cập từ Internet, kết nối bắt buộc TLS:
psql "$(zo db vars pg | grep ^DATABASE_PUBLIC_URL= | cut -d= -f2-)"
  • Backup ngay trước khi chạy lệnh ghi lớn. Khôi phục luôn vào một database mới, database cũ vẫn chạy; kiểm tra xong thì đổi biến sang ${{<tên-mới>.DATABASE_URL}} và deploy lại.
  • Staging và preview: tạo environment staging với Database riêng (trống), hoặc bật preview cho Pull Request để mỗi PR có database trống riêng.

Cần thêm cache? Thêm Redis (Valkey) tên cache và đặt REDIS_URL=${{cache.REDIS_URL}}. Cần lưu file upload? Xem object storage S3 trong hướng dẫn storage.

Lỗi thường gặp

Hiện tượng Cách xử lý
App khởi động rồi thoát Kiểm tra app nghe 0.0.0.0:$PORT, kiểm tra đã có DATABASE_URL
DATABASE_URL rỗng Biến chỉ có hiệu lực từ lần deploy sau: bấm Deploy lại
Không clone được repo Repo riêng tư cần GitHub App; kiểm tra nhánh và URL
Build lỗi Xem log build ở tab Deploy, chạy zo detect trên máy

Về chi phí: số lượng database, RAM và dung lượng là giới hạn theo gói; giá hiện trong portal (Bảng giá), thanh toán bằng ví VND và có hoá đơn VAT điện tử.

Câu hỏi thường gặp

Có phải tự cài PostgreSQL trên server khi dùng ZoCloud không?

Không. PostgreSQL là database được quản lý, bạn chỉ cần bấm Thêm → PostgreSQL trong project và database sẵn sàng sau vài giây. ZoCloud lo chạy, sao lưu mỗi đêm và mã hoá bản sao lưu.

App Node.js lấy chuỗi kết nối PostgreSQL bằng cách nào?

Thêm biến DATABASE_URL=${{pg.DATABASE_URL}} vào service, với pg là tên database. Đây là biến tham chiếu, giá trị tự cập nhật nếu database đổi máy chủ hay mật khẩu, nên bạn không phải chép mật khẩu vào code.

Vì sao app Node.js deploy xong lại thoát ngay?

Lỗi hay gặp nhất là app chỉ nghe localhost hoặc một cổng cố định. Trên ZoCloud, app phải nghe 0.0.0.0 và cổng trong biến PORT.

Có kết nối PostgreSQL từ máy cá nhân được không?

Được. Bật Truy cập từ Internet ở tab Kết nối của database, kết nối bắt buộc TLS và chuỗi đầy đủ nằm trong biến DATABASE_PUBLIC_URL. Nên tắt khi không dùng.

Bắt đầu deploy

App Node.js và PostgreSQL của bạn có thể chạy trong vài phút, trên máy chủ tại Việt Nam, trả tiền bằng VND. Đăng ký ZoCloud, rồi đọc thêm hướng dẫn app, hướng dẫn database và zo CLI. Dùng Next.js? Xem hosting Next.js tại Việt Nam. Muốn để AI agent deploy giúp? Xem deploy từ Cursor và Claude Code.

Chạy app của bạn tại Việt Nam trong vài phút.
Deploy từ GitHub, database được quản lý, thanh toán bằng VND, có hoá đơn VAT.
Đăng ký ZoCloud   Xem hướng dẫn