Nội dung bài viết
Video học lập trình mỗi ngày
Build chat system sử dụng với heroku. Đây là phần thứ 5 trong series "Đề tài: Build một blog + chat sử dụng nodejs, expressjs, mongodb, firebase". Nhiều việc qúa nên hôm nay, mới có thời gian build giao diện chat lên heroku cho các bạn. Bài post này chủ yếu hướng dẫn các bạn push project lên heroku.
Yêu cầu người đọc
- Đọc về những bài trước - Đề tài: Build một blog + chat sử dụng nodejs, expressjs, mongodb, firebase
- Hiểu về heroku
- Đã install node và npm
Trước tiên đi vào bài viết này, tipjs cũng phải nói sơ qua một chút về heroku cho các bạn hiểu, để khỏi bỡ ngỡ. Những bạn biết rồi thì có thể pass qua phần này. Ok, chuẩn bị nào!
Heroku là gì?
Heroku là một nền tảng đám mây như một dịch vụ hỗ trợ một số ngôn ngữ lập trình. Một trong những nền tảng đám mây đầu tiên, Heroku đã được phát triển từ tháng 6 năm 2007, khi nó chỉ hỗ trợ ngôn ngữ lập trình Ruby, nhưng hiện hỗ trợ Java, Node.js, Scala, Clojure, Python, PHP và Go. Theo Wikipedia Nói chi tiết hơn heroku chính là:
- Chạy application của bạn trên một số lượng virtual servers
- Manages releases nhiều môi trường khác nhau như nói ở trên
- Đảm bảo những sự cố từ phía máy chủ sẽ tự động khắc phục
- Xử lý (balancing)cân bằng tải trên nhiều trường hợp ứng dụng, cho phép bạn mở rộng ngay lập tức ứng dụng của mình để hỗ trợ hàng triệu người dùng
- Cho phép bạn nhanh chóng thêm và xóa các khối cơ sở hạ tầng như máy chủ caching và máy chủ database.
- Heroku có bản free và phí. Nhưng free cho chúng ta test cũng qúa ngon rồi.
Chốt lại : Heroku hỗ trợ các ngôn ngữ lập trình Ruby, Node.js, Python, Java, Go, PHP và Scala . Điều này cung cấp dễ dàng triển khai các công nghệ hiện có trên Heroku với các sửa đổi tối thiểu cần thiết.
Heroku hoạt động như thế nào?
Chắc nói nhanh về thằng heroku này thôi chứ để nói chi tiết mất một bài luôn. Nói chung khi tạo tài khoản thì Heroku cho 512 MB RAM, 1 web / 1 worker, đủ để bắt đầu triển khai các ứng dụng như "hệ thống chat" hiện tại. Một trong những lợi ích của việc sử dụng nhà cung cấp như Heroku là bạn chỉ trả tiền cho những gì bạn sử dụng. Trong trường hợp của Heroku, vì họ tính hóa đơn theo gia số giây, đó chính xác là những gì bạn sử dụng. Ở FREE thì nó off một ngày mấy tiếng đó thì phải.
Build application nodejs lên heroku
Đây rồi, bây giờ thì setup thôi. Mỗi bạn một ứng dụng, mỗi bạn một host, có thể làm xong post của mình lên cho anh em thấy nghe. Để build được application lên heroku thì tipjs sẽ hướng dẫn từng bước cho cụ thể.
#step 1 - Đăng ký account ở heroku
Để đăng ký account ở heroku, link đây: Heroku account và nhớ đã install Node.js and npm rồi nhé.
#step 2 - Download and run heroku
Bước này bạn phải install Heroku Command Line Interface hay gọi lạ CLI. Để chúng ta có thể sử dụng CLI, quản lý và mở rộng ứng dụng và đẩy lên host của Heroku. Download Tại đây
#step 3 - Login và kiểm tra install heroku
Sau khi đăng ký và install thành công heroku thì đến đây là khoẻ rồi. Tiếp theo sử dụng lênh command trong mac or window để quản lý và run: Sử dụng heroku login
để login vào Heroku CLI:
$ heroku login heroku: Press any key to open up the browser to login or q to exit › Warning: If browser does not open, visit › https://cli-auth.heroku.com/auth/browser/*** heroku: Waiting for login...
Nó sẽ xuất hiện login trên web , cứ login bình thường nhé. Trước khi tiếp tục, thì bạn phải xem lại những install node, npm, git. Heroku chỉ hoạt động trên node version 8 thôi nhé.
node --version v12.16.3
npm is installed with Node, so check that it’s there. If you don’t have it, install a more recent version of Node:
npm --version 6.14.4
Now check that you have git installed. If not, install it and test again.
git --version git version 2.17.0
#step 4 - Push application lên heroku
Để push lên bạn phải chuẩn bị một application, tipjs đã làm sẵn cho các bạn rồi chỉ cần chạy các lệnh như sau:
AnonyStick$ git clone https://github.com/anonystick/chat-anonystick.git Cloning into 'chat-anonystick'... remote: Enumerating objects: 590, done. remote: Counting objects: 100% (590/590), done. remote: Compressing objects: 100% (465/465), done. remote: Total 590 (delta 101), reused 584 (delta 98), pack-reused 0 Receiving objects: 100% (590/590), 743.76 KiB | 739.00 KiB/s, done. Resolving deltas: 100% (101/101), done.
Sau khi clone về thì tìm đến folder đó
AnonyStick$ cd chat-anonystick/
Tiếp đến chúng ta sẽ tạo name cho riêng mình với cú pháp heroku apps:create clone-chat-anonystick
AnonyStick$ heroku apps:create clone-chat-anonystick › Warning: heroku update available from 7.35.0 to 7.41.1. Creating ⬢ clone-chat-anonystick... done https://clone-chat-anonystick.herokuapp.com/ | https://git.heroku.com/clone-chat-anonystick.git
Notes: clone-chat-anonystick
là name app mỗi người tự đặt ra nhé. Nếu bạn ko biết đặt thì có thể chạy lệnh với without name:
heroku create Creating sharp-rain-871... done, stack is heroku-18 http://sharp-rain-871.herokuapp.com/ | https://git.heroku.com/sharp-rain-871.git Git remote heroku added
Tiếp đến, bạn push code lên heroku bằng cách sử dụng git push heroku master
AnonyStick$ git push heroku master Counting objects: 590, done. Delta compression using up to 8 threads. Compressing objects: 100% (462/462), done. Writing objects: 100% (590/590), 743.76 KiB | 185.94 MiB/s, done. Total 590 (delta 101), reused 590 (delta 101) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Node.js app detected remote: remote: -----> Creating runtime environment remote: remote: NPM_CONFIG_LOGLEVEL=error remote: NODE_ENV=production remote: NODE_MODULES_CACHE=true remote: NODE_VERBOSE=false remote: remote: -----> Installing binaries remote: engines.node (package.json): unspecified remote: engines.npm (package.json): unspecified (use default) remote: remote: Resolving node version 12.x... remote: Downloading and installing node 12.16.3... remote: Using default npm version: 6.14.4 remote: remote: -----> Installing dependencies remote: Prebuild detected (node_modules already exists) remote: Rebuilding any native modules remote: remote: > ejs@3.1.2 postinstall /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/ejs remote: > node --harmony ./postinstall.js remote: remote: body-parser@1.19.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/body-parser remote: bytes@3.1.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/bytes remote: content-type@1.0.4 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/content-type remote: debug@2.6.9 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/debug remote: ms@2.0.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/ms remote: depd@1.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/depd remote: http-errors@1.7.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/http-errors remote: inherits@2.0.3 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/inherits remote: setprototypeof@1.1.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/setprototypeof remote: statuses@1.5.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/statuses remote: toidentifier@1.0.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/toidentifier remote: iconv-lite@0.4.24 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/iconv-lite remote: safer-buffer@2.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/safer-buffer remote: on-finished@2.3.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/on-finished remote: ee-first@1.1.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/ee-first remote: qs@6.7.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/qs remote: raw-body@2.4.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/raw-body remote: unpipe@1.0.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/unpipe remote: type-is@1.6.18 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/type-is remote: media-typer@0.3.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/media-typer remote: mime-types@2.1.27 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/mime-types remote: mime-db@1.44.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/mime-db remote: ejs@3.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/ejs remote: jake@10.6.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/jake remote: async@0.9.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/async remote: chalk@2.4.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/chalk remote: ansi-styles@3.2.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/ansi-styles remote: color-convert@1.9.3 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/color-convert remote: color-name@1.1.3 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/color-name remote: escape-string-regexp@1.0.5 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/escape-string-regexp remote: supports-color@5.5.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/supports-color remote: has-flag@3.0.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/has-flag remote: filelist@1.0.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/filelist remote: minimatch@3.0.4 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/minimatch remote: brace-expansion@1.1.11 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/brace-expansion remote: balanced-match@1.0.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/balanced-match remote: concat-map@0.0.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/concat-map remote: express@4.17.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/express remote: accepts@1.3.7 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/accepts remote: negotiator@0.6.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/negotiator remote: array-flatten@1.1.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/array-flatten remote: content-disposition@0.5.3 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/content-disposition remote: safe-buffer@5.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/safe-buffer remote: cookie@0.4.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/cookie remote: cookie-signature@1.0.6 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/cookie-signature remote: encodeurl@1.0.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/encodeurl remote: escape-html@1.0.3 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/escape-html remote: etag@1.8.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/etag remote: finalhandler@1.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/finalhandler remote: parseurl@1.3.3 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/parseurl remote: fresh@0.5.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/fresh remote: merge-descriptors@1.0.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/merge-descriptors remote: methods@1.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/methods remote: path-to-regexp@0.1.7 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/path-to-regexp remote: proxy-addr@2.0.6 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/proxy-addr remote: forwarded@0.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/forwarded remote: ipaddr.js@1.9.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/ipaddr.js remote: range-parser@1.2.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/range-parser remote: send@0.17.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/send remote: destroy@1.0.4 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/destroy remote: mime@1.6.0 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/mime remote: ms@2.1.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/send/node_modules/ms remote: serve-static@1.14.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/serve-static remote: utils-merge@1.0.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/utils-merge remote: vary@1.1.2 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/vary remote: expressjs@1.0.1 /tmp/build_a4331e8d6358ac52407a1e446a2d8cd1/node_modules/expressjs remote: Installing any new modules (package.json) remote: audited 66 packages in 0.782s remote: found 0 vulnerabilities remote: remote: remote: -----> Build remote: remote: -----> Caching build remote: - node_modules remote: remote: -----> Pruning devDependencies remote: audited 66 packages in 0.781s remote: found 0 vulnerabilities remote: remote: remote: -----> Build succeeded! remote: -----> Discovering process types remote: Procfile declares types -> (none) remote: Default types for buildpack -> web remote: remote: -----> Compressing... remote: Done: 22.9M remote: -----> Launching... remote: Released v3 remote: https://clone-chat-anonystick.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/clone-chat-anonystick.git * [new branch] master -> master
Xong phần deloy lên heroku, giờ đến phần active cho web hoạt động, để làm được việc đó chúng ta sử dụng heroku ps:scale web=1
, và sau đó dùng heroku open
là xong.
AnonyStick$ heroku ps:scale web=1 › Warning: heroku update available from 7.35.0 to 7.41.1. Scaling dynos... done, now running web at 1:Free AnonyStick$ heroku open › Warning: heroku update available from 7.35.0 to 7.41.1. AnonyStick$
Link github source: github.com