Series Chinh phục Heroku | Bài 3: Config Vars & Database - Trái tim của ứng dụng Cloud
Khi làm local, bạn lưu mọi thứ vào file .env (chứa user, password, port DB). Nhưng nguyên tắc sống còn của Git là tuyệt đối không đẩy file .env lên repository.
Vậy khi code đẩy lên Heroku, làm sao ứng dụng biết đọc mật khẩu từ đâu?
Giải pháp của Heroku chính là Config Vars (Configuration Variables). Bạn khai báo biến trên giao diện (hoặc CLI) của Heroku, và nó sẽ tự động bơm vào process.env của Node.js.
1. Thiết lập biến môi trường với Config Vars
Bạn có 2 cách để thiết lập biến môi trường trên Heroku:
Cách 1: Qua giao diện Web (UI)
- Đăng nhập vào Heroku Dashboard.
- Chọn ứng dụng của bạn -> Tab Settings.
- Tìm phần Config Vars -> Nhấn Reveal Config Vars.
- Thêm KEY và VALUE (Ví dụ: Key là
JWT_SECRET, Value làmat_khau_bi_mat_cua_ban).
Cách 2: Qua Terminal (Dành cho kỹ sư hệ thống)
Nhanh và nguy hiểm hơn, bạn gõ thẳng vào Terminal:
# Thêm một biến mới
heroku config:set JWT_SECRET=mat_khau_bi_mat_cua_hieu
# Xem toàn bộ các biến đang có
heroku config
2. Heroku Postgres: Database "1-Click"
Đây là điểm ăn tiền nhất của mô hình PaaS. Nếu dùng VPS tự code, bạn phải tải bộ cài Postgres, cấu hình user, phân quyền... Với Heroku, bạn mua/thêm nó như một "Add-on".
Để khởi tạo một Database Postgres gói cơ bản nhất (mini) cho ứng dụng hiện tại, bạn gõ lệnh:
heroku addons:create heroku-postgresql:mini
Điều kỳ diệu xảy ra ở đây: Ngay khi lệnh chạy xong, Heroku tự động tạo một Database, tự sinh user/password ngẫu nhiên siêu bảo mật, và tự động chèn một biến môi trường tên là DATABASE_URL vào Config Vars của bạn. Bạn không cần quan tâm mật khẩu là gì, vì code Node.js của bạn chỉ cần đọc cái URL đó là xong!
3. Kết nối Node.js với Heroku Postgres
Bây giờ, chúng ta sẽ viết code để ứng dụng Node.js kết nối vào DB. Bạn cần cài thư viện pg:
npm install pg
Trong file database.js hoặc index.js, bạn cấu hình như sau. Đặc biệt lưu ý cái bẫy SSL:
const { Pool } = require('pg');
// Heroku tự động cung cấp process.env.DATABASE_URL
const connectionString = process.env.DATABASE_URL;
const pool = new Pool({
connectionString: connectionString,
ssl: {
// BẮT BUỘC TRÊN HEROKU: Chấp nhận chứng chỉ tự ký của Heroku Postgres
rejectUnauthorized: false
}
});
// Test thử một query lấy thời gian từ hệ thống Database
pool.query('SELECT NOW()', (err, res) => {
if (err) {
console.error('Kết nối Database thất bại:', err.stack);
} else {
console.log('Kết nối thành công! Thời gian DB:', res.rows[0].now);
}
});
module.exports = pool;
Key insight: Tại sao lại cần rejectUnauthorized: false? Bởi vì các gói Postgres trên Heroku được cấu hình bảo mật ép buộc mọi kết nối phải qua SSL. Nếu không bật cấu hình này ở phía client (Node.js), kết nối của bạn sẽ bị từ chối ngay lập tức.
4. Làm sao để xem dữ liệu bên trong Database?
Mặc dù Database nằm trên Cloud, bạn vẫn có thể truy cập nó từ máy tính Local bằng DBeaver, DataGrip hoặc pgAdmin. Chỉ cần gõ lệnh:
heroku pg:credentials:url
Terminal sẽ in ra toàn bộ thông tin: Host, Database, User, Port và Password để bạn copy dán vào phần mềm quản lý Database ở dưới local.
Bây giờ hệ thống của bạn đã có Database thực thụ chạy trên mây, sẵn sàng hứng dữ liệu.
Với một hệ thống đòi hỏi tính bất đồng bộ cao (như nhận file log giao dịch từ máy bán vé AFC), nếu bắt API phải xử lý ngay thì sẽ gây nghẽn. Các hệ thống chuẩn mực thường đẩy tác vụ nặng ra chạy ngầm (Background Jobs).
All rights reserved