Deploy app Elixir với Distillery và Dicon
elixir
35
deployment
10
White

Cẩm Huỳnh viết ngày 28/06/2017

Đây là một trong những bài thuộc series Ship your Elixir app with confidence của mình.

Các bài trong series:

  1. Deploy app Elixir với Distillery và Dicon.
  2. Release app Elixir với Travis CI và Github Release.

Mở bài

Một ngày trở trời, đột nhiên bạn code xong một app dùng Elixir và định deploy nhưng chưa biết làm thế nào? Bài viết này sẽ hướng dẫn chi tiết từng bước để làm việc đó.

Có 2 bước chính để deploy một app Elixir:

  1. Đóng gói app theo đúng môi trường định chạy trên production (thường là prod).
  2. Upload app đã được đóng gói lên trên host, giải nén và chạy.

Đóng gói

Để đóng gói một app Elixir thì ta sẽ dùng một tool tên là Distillery, vốn được xem là phiên bản tiếp theo của exrm.

Trước hết thêm distillery vào mix file của bạn và đừng quên mix deps.get để kéo thư viện về.

# mix.exs

defp deps do
  [{:distillery, "~> 1.4"}]
end

Sau đó chạy lệnh mix release.init để khởi tạo file rel/config.exs, file được tạo ra sẽ có hình thù như ở dưới, tùy chỉnh lại một chút cho vừa ý bạn.

use Mix.Releases.Config,
    # This sets the default release built by `mix release`
    default_release: :default,
    # This sets the default environment used by `mix release`
    default_environment: Mix.env()

# For a full list of config options for both releases
# and environments, visit https://hexdocs.pm/distillery/configuration.html


# You may define one or more environments in this file,
# an environment's settings will override those of a release
# when building in that environment, this combination of release
# and environment configuration is called a profile

environment :dev do
  set dev_mode: true
  set include_erts: false
  set cookie: :"o^E1!DHIKosXS2jfNRm>[b$$aiz%_$1&on^k19I}B:<S]uKHq`32_Z$oHmO5Bpg["
end

environment :prod do
  set include_erts: true
  set include_src: false
  set cookie: :"$_J$g>{ho3<e2QO[toXf$le76KCwt|JIYJc3RhaaU6|_EVyQcUPOj}>CJc(IC/tR"
end

# You may define one or more releases in this file.
# If you have not set a default release, or selected one
# when running `mix release`, the first release in the file
# will be used by default

release :myapp do
  set version: current_version(:myapp)
  set applications: [
    :myapp
  ]
end

Ghi chú: Có một tùy chọn khá là gây nhầm lẫn ở đây là :cookie, cookie ở đây được Erlang dùng để bảo mật giao tiếp của các node trong app, trong trường hợp bạn có ý định chạy app của bạn trên nhiều node. Bạn có thể đọc ở đây nếu muốn tìm hiểu thêm.

Sau khi chỉnh sửa xong xuôi, về cơ bản bạn đã có thể đóng gói app được rồi. Để đóng gói app Distillery cung cấp cho một Mix task khá là hữu dụng là release.

MIX_ENV=prod mix release

# ==> Release successfully built!
# You can run it in one of the following ways:
# Interactive: _build/prod/rel/myapp/bin/myapp console
# Foreground: _build/prod/rel/myapp/bin/myapp foreground
# Daemon: _build/prod/rel/myapp/bin/myapp start

Tất nhiên là bạn có thể chạy thử xem nó có chạy không. Chú ý là file tar ball có thể được tìm thấy ở _build/prod/rel/releases/myapp/:version/myapp.tar.gz, file này sẽ chứa toàn bộ những thứ cần thiết để chạy app như là BEAM và các thứ linh tinh khác.

Lúc này thì bạn có thể upload cái file lên server, giải nén và chạy thôi. Chú ý là build môi trường nào thì chạy server đó, build app bằng Mac thì chạy app trên OSX server nhé. :trollface:

Bạn có thể xem thêm bài này để buid một app Phoenix với Distillery nhé.

Upload và chạy

Tất nhiên là như phần trước đã nói, bạn có thể upload tar ball bằng tay lên server và chạy, tuy nhiên có một tool có thể giúp bạn dễ dàng làm điều đó là dicon.

Dicon, đọc là đi côn, viết tắt của Digital Conveyor. Dicon giúp bạn làm những thao tác như upload file lên server, giải nén, switch version một cách dễ dàng. Cơ mà nếu không thích dùng Dicon thì bạn dùng an côn (Analog Conveyor) cũng được), ra tiệm thuốc tây 10k một chai thôi.

alt text

Cho dicon vào mix file và mix deps.get.

def deps do
    [{:dicon, ">= 0.0.0", only: :dev}]
end

Để sử dụng Dicon ở môi trường :dev thì bạn cần config một chút trong trong file config/dev.exs của bạn.

use Mix.Config

os_env = %{
  "DATABASE_URL" => "postgres://user:pass@host:port/database",
}

config :dicon,
  otp_app: :myapp, # Tên cái app của bạn
  target_dir: "myapp", # thư mục mà Dicon sẽ upload app của bạn lên.
  hosts: [:"myapp-01", :"myapp-02"] # Các host mà dicon sẽ upload lên, config các host theo như bên dưới.

config :dicon, :"myapp-01", # Config các thông số SSH vào host, chú ý là dấu : không có dư, tên cần phải là atom.
  authority: "deploy@myapp-01.example.com",
  os_env: os_env

config :dicon, :"myapp-02",
  authority: "deploy@myapp-02.example.com",
  os_env: os_env

Và trong một ngày đẹp trời, bạn đã config xong Dicon.

Để upload app lên server bạn có thể dùng lên dicon.deploy

mix dicon.deploy /path/to/your/tar/ball 0.1.0

Như mình đã nói ở trên, đường dẫn tới file tarball sau khi Distillery build ra là _build/prod/rel/releases/myapp/:version/myapp.tar.gz, chú ý tham số thứ 2 là version mà đã build cho file tarball đó.

Bạn báo cho Dicon biết bạn muốn dùng version 0.1.0, bạn dùng lệnh dicon.switch, Dicon sẽ trỏ lệnh đường dẫn current cho bạn.

mix dicon.switch 0.1.0

Sau đó, cuối cùng, sau bao chờ đợi, ta đã có thể dùng lệnh dicon.control để chạy app lên.

mix dicon.control start

Sau khi chạy app bạn cũng có thể dùng dicon.control ping để ping thử xem app đã chạy chưa.

mix dicon.control ping

Một số lệnh tương tự là mix dicon.controller [ping|restart|stop|start].

Kết luận

Hết rồi.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Cẩm Huỳnh

45 bài viết.
429 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
51 5
image cover]imgcover] “Make it work, make it right, make it fast.” Bạn vừa viết xong một ứng dụng web :tada:. Mọi thứ chạy ổn. Code cũng đã được...
Cẩm Huỳnh viết 24 ngày trước
51 5
White
43 9
(Ảnh) Vì sao lại là Bật Đèn? Ai từng đọc qua Tắt Đèn hẳn đã biết tác phẩm được kết thúc bằng tình huống: Buông tay, chị vội choàng dậy, mở cửa...
Cẩm Huỳnh viết hơn 1 năm trước
43 9
White
41 25
Vừa rồi mình vừa tiết kiệm được $5 mỗi tháng sau khi migrate cái (Link) từ Digital Ocean sang Heroku Free Dyno. (Ảnh) Kết quả thật mĩ mãn vì hầu ...
Cẩm Huỳnh viết hơn 1 năm trước
41 25
Bài viết liên quan
White
8 6
Chưa xem phần 2? Xem (Link) Trong bài viết này tôi giới thiệu cho các bạn về khái niệm function arity, một cách gọi mĩ miều của số lượng argument ...
Lơi Rệ viết 3 năm trước
8 6
White
5 0
Bạn đang viết application với Elixir? Bạn sắp release sản phẩm hay đơn giản thỉnh thoảng bạn không biết tại sao service A lại lăn đùng ra chết hay ...
Trần Việt Thắng viết 1 tháng trước
5 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
45 bài viết.
429 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!