Part5 - Build chat, firebase, mongodb sử dụng với heroku

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

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

Có thể bạn đã bị missing