Nhật ký hốt sh*t—Chuyện về cái service A
Bài viết mà thằng chả chém gió về cách chả monitoring và debug một sự cố gặp phải khi vận hành hệ thống Elixir
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.
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.
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 deploy và release ứ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?
Có hai thứ gây khá nhiều sự khó chịu khi dùng Heroku Free Dyno đó là
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
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.
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).
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.
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ì.
Bài viết mà thằng chả chém gió về cách chả monitoring và debug một sự cố gặp phải khi vận hành hệ thống Elixir
Bài viết mà thằng chả chém gió về Elixir compiler.
Bài viết là một phần trong paper Time, Clocks, and the Ordering of Events in a Distributed System của Leslie Lamport.
hình như ảnh đầu bị hỏng đó
@dnhuan và con tim đã vui trở lại nha.
Còn dùng heroku không fen?