Hướng dẫn deploy website C++ (CppCMS) trên Heroku

TL;DR
+ Hard to understand

Mình vốn là dân chuyên xài hàng chùa (miễn phí chứ không crack nhé :confused:), vậy nên cứ cho xài free là mình mò cách sử dụng. Dạo này đang tìm hiểu cấu trúc của SPA(đại khái là website chỉ có 1 trang gì ấy), thấy viết trên CppCMS(C++) kết hợp ReactJs khá hợp lí, nên quyết định tìm 1 thằng hỗ trợ deploy miễn phí để làm host.

=> Chọn Heroku
// Các bước đăng kí Heroku và CLI các bạn tự học nhé, dễ ấy mà, mất vài ngày, chậm vài tháng là cùng =))

Đen là Heroku chỉ cho chúng ta deploy các loại website viết trên NodeJs, PHP, Java, Python, Ruby, và một vài ngôn ngữ khác, không hỗ trợ GCC, G++, vậy nên không thể trực tiếp xài lệnh build website.
=> Chỉ còn cách là build sẵn file binary rồi run trên đó, ngoài ra không còn biện pháp nào khác.

Sau khi tìm hiểu về cách làm việc của Heroku thì đại khái khi chúng ta push repository lên trên đó, Heroku sẽ tự đọc project và xác định ngôn ngữ/platform dành cho project. Sau đó sẽ gọi file Procfile, và chạy lệnh trong đó.
=> Ta sẽ “đánh lừa” heroku là app chúng ta đang chạy trên node js bằng cách tạo file package.json với nội dung:
https://github.com/HadesD/CppCMS-Heroku-Deploy/blob/master/package.json
=> Giả sử chương trình của ta là file main và có ARGV[0] là port sẽ chạy chương trình, ta sẽ tạo file Procfile với nội dung như sau:

web: ./main $PORT
# $PORT là biến môi trường mỗi lần thực hiện git push heroku master,
# heroku sẽ tự động tạo cổng mặc định cho ứng dụng 
# và khi truy cập từ trình duyệt ta sẽ thấy nội dung 
# ứng dụng của chúng ta đang chạy trên port đó

Để chạy được 1 project của CppCMS, ta cần các lib:

libcppcms.so.1
libcppbooster.so.0
# Adding:
libcppdb.so.0

Vì không thể build được lib trực tiếp trên Heroku, => để chạy được các lib này ta phải build nó trên máy rồi đưa lên Heroku, trường hợp không trùng ELF(đại khái là cái gì x86/x64 ấy) của file so với hệ điều hành thì sẽ không thể chạy được.
=> Xem os info của Heroku
Ở Heroku CLI, khi gõ lệnh

heroku run bash
uname -a 

Ta được:

Linux XXX 3.13.0-123-generic #172-Ubuntu SMP Mon Jun 26 18:04:35 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

=> Đang chạy trên x64 Ubuntu

Máy mình đang xài cũng là Ubuntu x64, vậy nên giờ việc cần làm là build library, build file main và push lên heroku kèm 1 file config.json cấu hình website của CppCMS.
https://github.com/HadesD/CppCMS-Heroku-Deploy/blob/master/config.json
Dòng cuối cùng mình không điền sẵn port vì ta chưa biết heroku cho app chạy trên port nào, vậy nên để trống, và cho Procfile trỏ tới 1 file trung gian là run.sh, với chức năng ghi port vào trong file config sau mỗi lần push
Procfile:
https://github.com/HadesD/CppCMS-Heroku-Deploy/blob/master/Procfile
run.sh
https://github.com/HadesD/CppCMS-Heroku-Deploy/blob/master/run.sh

Vậy là xong, chỉ với vài chiêu trick là ta có thể chạy 1 website bằng file binary của bất ngôn ngữ nào, miễn là hỗ trợ Ubuntu x64.

Bài viết chắc có phần khó hiểu và lủng củng về câu văn do hồi đi học toàn cúp môn Tiếng Việt với Tập làm văn nên đành chịu :grin:

Các bạn có thể trực tiếp deploy demo của mình lên đó sẽ thấy:
https://github.com/HadesD/CppCMS-Heroku-Deploy

Test demo: https://darkhades.herokuapp.com/

8 Likes

bạn ơi cho mình hỏi ví dụ mình muốn cài thêm 1 ứng dụng ngoài lên host của heroku được không , vd: google chrome , hôm trước có sài build pack googlechrome của chính thằng heroku này nhưng vẫn không chạy được…

Bạn cài bị lỗi gì?

Vì heroku dùng ubuntu x64 nên bạn có thể dùng cách của mình.
Build sẵn file binary trên máy rồi cho lên đó, heroku bản miễn phí cho rất ít build pack.
Chạy nếu có lỗi thì vào log xem nó báo thiếu gì cài đó, cài bằng cách tạo folder libs và export LD_LIBRARY_DIR cái folder đó là xong

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?