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é ), 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
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/