Quần Cam Blog

Tôi đã tiết kiệm $5 mỗi tháng với Heroku như thế nào?

Vừa rồi mình vừa tiết kiệm được $5 mỗi tháng sau khi migrate cái blog cá nhân từ Digital Ocean sang Heroku Free Dyno.

alt text

Kết quả thật mĩ mãn vì hầu như những thứ mình cần cho một một blog cá nhân, Heroku Free Dyno đều đáp ứng cả, với một số thủ thuật cần thiết.

Deploy lên Heroku

Blog cá nhân mình được viết dùng Elixir và trước đây mình đã từng viết một số bài về cách deployrelease ứng dụng Elixir.

Tuy nhiên với Heroku thì bạn không thể release bằng cách dùng Dicon, vì Heroku không phải là một host như Digital Ocean, nên ta sẽ bày keo khác.

Thật may vì một đồng môn Luyện Dịch Viên đã viết sẵn buildpack cho Elixir app tại https://github.com/HashNuke/heroku-buildpack-elixir, tuy nó không phải một buildpack được Heroku hỗ trợ chính thức nhưng được sử dụng khá rộng rãi (theo mình biết theo trang hex.pm cũng dùng buildpack này) nên các bạn có thể yên tâm sử dụng.

Bạn có thể config buildpack bằng cách

heroku buildpacks:set https://github.com/HashNuke/heroku-buildpack-elixir.git

Bạn có thể commit thêm file elixir_buildpack.config vào repo để chọn config Erlang/Elixir version hay tương tự.

elixir_version=1.4.2
erlang_version=19.2

Và Procfile

web: PORT=$PORT MIX_ENV=prod mix run --no-halt

Không còn gì có thể đơn giản hơn đúng không?

Always running

Có hai thứ gây khá nhiều sự khó chịu khi dùng Heroku Free Dyno đó là

  • Heroku chỉ cho 550 giờ mỗi tháng để sử dụng.
  • dyno sẽ bị tắt khi không có traffic trong vòng 30 phút (khi bạn thấy bạn truy cập vào mà trang web bị đơ chừng 15s, đó là do dyno đã bị tắt).

Tuy nhiên bạn có thể tăng số lượng giờ đồng hồ sử dụng lên con số 1000 nếu như bạn cài đặt phương thức thanh toán vào trong tài khoản. 1000 giờ đồng hồ là quá đủ để blog cá nhân của bạn chạy êm ru cả tháng (31 ngày * 24 giờ = 744 giờ). Xem thêm chi tiết cài đặt ở https://devcenter.heroku.com/categories/billing.

Về việc dyno bị tắt khi không có traffic, cách đơn giản nhất là tự tạo traffic cho nó. Cách dễ nhất là dùng Pingdom để ping trang blog của bạn thường xuyên giữ cho dyno không bị tắt.

Cài đặt Pingdom khá đơn giản, chỉ việc điền thông tin và nhấn chừng 3-4 cái nút. Cài đặt tại: https://www.pingdom.com/free

SSL

Trước đây mình dùng Let’s Encrypt SSL cho host DO, nhưng khi qua Heroku thì phải dùng cách khác.

Heroku Free Dyno cho bạn kết nối SSL miễn phí nếu truy cập trang web qua subdomain *.herokuapp.com nhưng nếu bạn muốn dùng domain của riêng bạn, thì cần một số thủ thuật.

Ở đây mình dùng Cloudflare để làm DNS và Cloudflare hỗ trợ miễn phí kết nối Full SSL đến host.

alt text

Khác với Flexible SSL, với Full SSL thì kết nối từ user đến host của Cloudflare và từ host của Cloudflare đến host của bạn (ở đây là Heroku) sẽ đều là kết nối SSL.

SSL Cert miễn phí của Cloudflare là loại chứng chỉ chia sẻ (hình như chừng 5 tài khoản khác), nên nguy cơ bảo mật ở đây không phải là không có, các bạn cần chú ý điều này nếu bạn cần cái gì đó bảo mật tuyệt đối Đồng thời với Full SSL, nguy cơ dính lỗ hổng bảo mật Man in the middle ở đây khá khó nhưng không phải là không có. Xem thêm ở đây. Bạn cũng nên cân nhắc thêm một số drawbacks của Cloudflare trước khi dùng nó https://www.reddit.com/r/privacy/comments/41cb4k/be_careful_with_cloudflare/

Để tiến hành thì trước hết bạn sẽ phải trỏ một CNAME record về heroku app của bạn (my-xyz-app.herokuapp.com chẳng hạn).

alt text

Sau đó thì bạn chỉ cần bật Full SSL mode trong tab Crypto là xong, có thể bạn sẽ cần phải chờ 24 giờ để SSL cert có hiệu lực, nhưng thường bạn sẽ thấy sau vài phút. ¯\_(ツ)_/¯Tất cả phụ thuộc vào tạo hóa.

alt text

Hết

Xong, bây giờ thì vào và tận hưởng thành quả thôi.


Edit:

Có vẻ hơi nóng vội và chủ quan cơ mà thành quả trước mắt sau khi migrate là throughput đã tăng lên gần 5 lần (~2000req/s so với ~400req/s với wrk trên máy local của mình) dù không để làm gì.


NGUY HIỂM! KHU VỰC NHIỀU GIÓ!
Khuyến cáo giữ chặt bàn phím và lướt thật nhanh khi đi qua khu vực này.
Chức năng này hỗ trợ markdown và các thứ liên quan.
dnhuan chém vào lúc

hình như ảnh đầu bị hỏng đó

qcam chém vào lúc

@dnhuan và con tim đã vui trở lại nha.

Bài viết cùng chủ đề

Bundler Gotcha

A few days ago I encountered a strange behavior of Bundler so this post notes down how my experience with it was.

UX for CLI app

As a terminal lover, I always want to get everything done on my terminal, instead of switching to browser or an external app. I personally built up a couple of CLI apps for my personal use (checkout worque and 3llo).

Five Rails Gotchas

It’s undeniable that Rails is a great framework to speedily build up your application. However, despite of its handiness, like other frameworks, Rails has its own flaws and is never a silver bullet. This post is going to show you some of the gotchas (or pitfalls you name it) I encountered while working with Rails.