Ở bài viết này mình sẽ cùng các bạn tìm hiểu về cách build app nodejs trên 1 host heroku hoàn toàn miễn phí (đương nhiên là vẫn có phí với các phụ thuộc cao hơn). Việc sử dụng heroku để build app lên server cho các bạn chưa có điều kiện trả phí là rất hữu ích và cũng như làm quen được hơn với một số triển khai lên môi trường server. Tại bài viết này mình sẽ cùng các bạn điểm qua một số phần như sau:
- Tổng quan về heroku
- Triển khai ứng dụng đầu tiên
- Giải thích các thiết lâp cơ bản khi làm việc với heroku
- Tổng hợp 1 số lệnh hữu ích khác khi làm việc với heroku
- Khắc phục lỗi và một số lưu ý khi build app với heroku
1. Tổng quan về heroku
- Heroku là một nền tảng cũng như dịch vụ cho phép các nhà phát triển xây dựng, phát triển và vận hành các ứng dụng hoàn toàn trên đám mây
- Để làm việc với heroku bạn cần chuẩn bị một số kiến thức cơ bản như
- Sử dụng git command
- Đã tạo 1 tài khoản trên heroku
- Cài đặt thành công heroku cli. Nếu bạn chưa cài đặt vui lòng lựa chọn phiên bản và cài đặt tại đây
- Biết sử dụng một trong các ngôn ngữ mà heroku support tại đây
Oke nếu bạn đã chuẩn bị đẩy đủ các điều kiện trên thì ta sẽ bắt đầu ngay thôi
Chú ý: Trong phạm vi bài viết này mình sẽ hướng dẫn các bạn deploy ứng dụng lên heroku trên nền tảng nodejs các nền tảng khác cũng tương tự.
2. Triển khai ứng dụng đầu tiên
Các bước dưới đây mình sẽ mô tả từng bước một để hoàn thiện và đẩy một ứng dụng lên heroku. (Ở ngay phần 3 trong cùng bài viết mình sẽ giải thích chi tiết từng lệnh đó vậy lên phần này bạn sẽ thấy mình chưa giải thích rõ ràng lên bạn cũng đừng băn khoăn nhé)
Bước 1:Create project: Ở đây mình sẽ tạo một ứng dụng nhỏ từ express bằng công cụ express generator. Bạn nào chưa biết về express-generator thì xem qua tại đây. Đại loại project sau khi khởi tạo sẽ trông như thế này
Trên đây bạn chỉ cần quan tâm 2 file app.js và package.json. File app.js là file thiết lập cơ bản để chạy ứng dụng bằng express framework còn file huyền thoại package.json là thiết lập các package cài đặt.
Bước 2: Mở file app.js bạn thay cho mình dòng cuối cùng module.exports = app; thành đoạn lệnh như sau:
Bước 3: Mở file package.json bạn thêm cho mình đoạn lệnh này vào ở cấp cao nhất. Tức là nó ngang hàng với dependencies hay name, version ...
Bước 4: Tạo file "Procfile" (file này có tên là Procfile không có đuôi không có định dạng gì bạn nhé) và thêm vào file nội dung như sau:
Bước 5: Đẩy ứng dụng lên heroku
Bạn mở cửa sổ command lên và lần lượt thực hiện các đoạn lệnh sau
- cd root_project : trỏ lệnh command tới root project mà bạn vừa tạo
- heroku login: Tại đây nhập các thông tin mà bạn đã đăng ký trên heroku, nếu bạn login thành công nó sẽ báo Logged in as <email_bạn_login>. Nếu nó báo lỗi lệnh heroku không tồn tại nghìa là bạn chưa cài heroku cli như trên bài viết mình đã hướng dẫn
- git init : Khởi tạo mã nguồn quản lý code với git
- heroku create <name_project>: Khởi tạo tên của project và sau này cũng là tên miền được build trên heroku app. (tên không được phép có ký tự đặc biêt ). nếu tên miền bị trùng heroku sẽ tự động báo phải thay đổi sang tên khác. Mặc định khi bạn không chỉ định name_project. Heroku sẽ tự động tạo cho bạn một tên ngẫu nhiên.
- git add -A : thêm vào các thay đổi khi khởi tạo ứng dụng
- git commit -m 'create-example-heroku-app'
- git push heroku master : đẩy ứng dụng lên heroku với nhánh mặc định master
- heroku ps:scale web=1 : scale app vơi 1 dyno, (nếu muốn chỉ định cao hơn 1 bạn phải trả phí, nếu không trình heroku sẽ trả ra lỗi)
- heroku open : Mở ứng dụng trên host đã được build và tận hưởng thành quả
Chú ý: Sau này khi bạn làm việc với các thay đổi trên project thì trước khi bạn push nó lên heroku bạn cần phải login lại heroku trên command và thực hiện các dòng lệnh với các thao tác tập tin thay đổi như làm việc với 1 project sử dụng git bình thường ... git add ..., git commit .... , => cuối cùng chỉ khác duy nhất câu lệnh push thông thường trong git, thay vì git push thì ta sẽ là git push heroku master
3. Giải thích các thiết lập cơ bản khi làm việc với heroku
Mình sẽ bỏ qua bước 1 và 2 để giải thích với bạn từ bước 3. Bởi vì bước 1 và 2 là giải thích code mà code thì bạn đã có thể tự hiểu vơi vài dong code cơ bản rùi 😉
- Tại bước 3: bạn để ý thây mình thiết lập "engine" cho file package.json là bởi vì khi bạn build app lên heroku, trình phân tích sẽ detect các thông tin trong này, điển hình ở đây là phiên bản nodejs và npm. Vì vậy nó sẽ báo cho heroku phải cài đặt phiên bản nodejs và npm phù hợp để chạy ứng dụng của bạn
- Tại bước 4: Mình có tạo file Procfile và thêm vào nội dung "web: node app.js". Khi build app trình phân tích heroku sẽ mặc định sẽ thực hiện bước 3 mình đề cập ở trên và tiếp tục tìm tới file Procfile để tìm tới thiết lập khởi chạy app từ đâu. Dưới client thông thường bạn muốn chạy app của bạn, bạn chỉ việc node ./app.js .. Nhưng trên heroku nó không hiểu lên bạn phải define cho nó là chạy app từ đâu. Ở đây mình define cho nó là chạy từ từ file app.js
- Tại bước 5: chỉ đơn giản là các câu lệnh thao tác với heroku cli command và git command mà mình đã chú thích chi tiết ở trên. (Chú ý bạn cần chạy lệnh git init trước lệnh heroku create để đảm bảo mã nguồn được nạp với tên app heroku create).
4. Tổng hợp 1 số lệnh hữu ích khác khi làm việc với heroku
- Để clone app heroku của bạn về và làm việc tại 1 máy khác ta chỉ việc
- cd folder cần clone app
- heroku login
- heroku git:clone –a app-name
- Thực hiện các thay đổi => và add thay đổi => push heroku master (git push heroku master)
- Xem log khi run app: để xem log của heroku (theo dõi fail hoặc các api đang chạy) bạn thực hiện một trong các đoạn lệnh dưới đây
- heroku logs: Chỉ view ra log hiện tại
- heroku logs --tail (hoặc –t thay cho --tail): view và theo dõi log
- heroku logs -a app_name: hiển thị lịch sử cho app chỉ định trong máy (hữu ích khi trên máy của bạn có nhiều hơn 1 app)
- Chạy trên local app test:
- heroku local web
- Scale app heroku: Mỗi 1 app heroku sẽ có 1 con dyno. Con dyno này sẽ được ngủ sau khoảng nửa tiếng nếu không có request nào gửi đến nó => Điều này lý giải tại sao đôi lúc bật ứng dụng lên sẽ bị delay đi khoảng vài giây (bởi vì nó sẽ mở lại app). Nếu bạn muốn tăng thêm số dyno bạn phải trả phí cho ứng dụng này. Chi tiết bạn có thể xem thêm tại trang chủ heroku. Dưới đây là một số lệnh làm việc với scale app cơ bản.
- heroku ps: kiểm tra xem có bao nhiêu dyno đang chạy
- heroku ps:scale web=1 : Mở rộng số dyno đang chạy, nếu đưa về 0 => ko còn app nào được chạy, nếu mở rộng hơn => xác thực tài khoản
- heroku open --app tên_web_build: lệnh này để chạy tên website chỉ định nếu tại máy tính của bạn có nhiều hơn 1 app heroku :) !
5. Khắc phục lỗi và một số lưu ý khi build app với heroku
- heroku recognition ... : => Bạn chưa cài heroku cli => Khắc phục cài đặt heroku cli như đã đề cập ở trên
- app không thể chạy với một số cú pháp nâng cao như async, await ... => Khắc phục chỉ định engine như bước 3 đề cập ở trên sao cho phù hợp. Vì mặc định khi bạn ko chỉ định engine heroku sẽ cài đặt nodejs 6.8 và npm 3.10.0. (Ở thời điêm mình viết bài này là như vậy). => Một số function nâng cao es7 sẽ ko hỗ trợ với phiên bản này.
- heroku logs: là một view log không thể thiểu để đọc log và giải quyết vấn đề
- Lưu ý khi Sử dụng port default: process.env.PORT … Với các bạn newbie thường ít sử dụng khối lệnh này trước khi chạy ứng dụng mà thường fix cứng 1 port để run. Tuy nhiên khi bạn run trên local máy tính cá nhân của bạn thì không vấn đề vì port mà bạn run sẽ không bị xung đột với port nào đó trên máy tính của bạn chẳng hạn. Tuy nhiên khi build app trên heroku bản chất nó vẫn là một máy chủ VPS ảo và chạy rất nhiều instant không chỉ riêng cho app của bạn mà rất nhiều app khác nữa. Vì vậy khi bạn fix cứng port là ép máy chủ của heroku phải chạy app của bạn trên port đó và rất có thể port đó đang được sử dụng bởi một app khác (hay một instant khác) của một người khác chẳng hạn. Vì vậy bạn phải chỉ định trước khi chạy là process.env.PORT để heroku tự động detech 1 port tài nguyên trên hệ thống của họ để run app của bạn. Bạn cần lưu ý vấn đề này bởi vì sau này khi bạn làm việc với máy chủ Amazon AWS thì cũng sẽ gặp vấn đề này. Với những bạn đã làm việc với nginx thì cũng sẽ hiểu rõ vấn đề về cách set domain cho subdomain heroku.
Các bạn có thể clone project của mình về tại đây: