Cách tự động hóa triển khai Elixir-Phoenix với Distillery và edeliver trên Ubuntu 16.04
Được xây dựng trên ngôn ngữ lập trình Erlang , Elixir là một ngôn ngữ lập trình chức năng phổ biến vì nó tập trung vào năng suất của nhà phát triển và dễ dàng viết các ứng dụng đồng thời và có khả năng mở rộng cao.Phoenix là một khung công tác web được xây dựng trên Elixir để cho phép tạo ra các ứng dụng web có hiệu suất cao.
Và khi kết hợp với hai công cụ bổ sung - Distillery và edeliver - bạn hoàn toàn có thể tự động hóa việc triển khai các dự án Phoenix từ môi trường phát triển của bạn đến một server production .
Nhà máy chưng cất biên dịch các ứng dụng Elixir thành một gói duy nhất mà bạn có thể triển khai ở nơi khác. Nó cũng tạo ra các gói cho phép swap mã nóng , nghĩa là bạn có thể nâng cấp các ứng dụng trực tiếp mà không cần thời gian chết. Tất cả những điều này có thể được thực hiện với rất ít hoặc không cần cấu hình từ phía bạn, điều này đặt Distillery ngoài nhiều tùy chọn khác.
edeliver tự động hóa quy trình xây dựng và triển khai này bằng cách thực hiện các việc lặp đi lặp lại như xây dựng ứng dụng, chuyển gói đã xây dựng đến server , di chuyển database và khởi động / cập nhật server . Nếu cần, bạn thậm chí có thể cấu hình edeliver để cho phép cài đặt giai đoạn trung gian.
Trong hướng dẫn này, bạn sẽ cài đặt Erlang, Elixir và Phoenix 1.3 trên máy phát triển local và trên server production , bạn sẽ đơn giản hóa giao tiếp SSH giữa hai vị trí và sau đó bạn sẽ tạo một dự án Phoenix mẫu để xây dựng và triển khai với edeliver. Cuối cùng, bạn sẽ bảo mật server production bằng Reverse Proxy Nginx và certificate SSL.
Đến cuối hướng dẫn, bạn sẽ có một lệnh duy nhất có thể:
- xây dựng bản phát hành Phoenix tương thích với môi trường production của bạn
- triển khai bản phát hành cho môi trường production của bạn
- bắt đầu ứng dụng của bạn trong môi trường production
- swap nóng bản phát hành production hiện tại bằng cách triển khai bản phát hành mới mà không có bất kỳ thời gian ngừng hoạt động nào
Yêu cầu
Trước khi bắt đầu, hãy đảm bảo bạn có những điều sau:
Một máy phát triển local dựa trên Ubuntu. Mặc dù hướng dẫn của hướng dẫn này được viết cho một máy phát triển local dựa trên Ubuntu, một điểm mạnh của quá trình triển khai này là nó hoàn toàn độc lập với môi trường production . Để biết hướng dẫn về cách cài đặt máy phát triển local trên các hệ điều hành khác, hãy xem tài liệu cài đặt Elixir chính thức . Hoặc, để cài đặt máy phát triển từ xa dựa trên Ubuntu, hãy làm theo hướng dẫn cài đặt server ban đầu này .
Tài khoản user không phải root có quyền sudo trên server production Ubuntu 16.04 với ít nhất 1GB RAM, được cài đặt theo bốn bước đầu tiên trong hướng dẫn cài đặt server ban đầu này .
- Vì mục tiêu của ta là tự động hóa quá trình triển khai, không nhập passphrase (password bảo vệ) SSH khi làm theo Bước 4 của hướng dẫn cài đặt . Ngoài ra, hãy đảm bảo cho phép truy cập vào cổng
4000
trong Bước 7 của hướng dẫn cài đặt bằng lệnhsudo ufw allow 4000
. Đó là cổng mà ta sẽ sử dụng để kiểm tra Phoenix trong suốt hướng dẫn này.
- Vì mục tiêu của ta là tự động hóa quá trình triển khai, không nhập passphrase (password bảo vệ) SSH khi làm theo Bước 4 của hướng dẫn cài đặt . Ngoài ra, hãy đảm bảo cho phép truy cập vào cổng
Nginx được cài đặt trên server production theo hướng dẫn Cách cài đặt Nginx trên Ubuntu 16.04 này .
Tên domain đã đăng ký đầy đủ. Hướng dẫn này sẽ sử dụng
example.com
xuyên suốt. Bạn có thể mua domain trên Namecheap , nhận một domain miễn phí trên Freenom hoặc sử dụng công ty đăng ký domain mà bạn chọn.Cả hai bản ghi DNS sau được cài đặt cho server của bạn. Bạn có thể làm theo hướng dẫn tên server này để biết chi tiết về cách thêm chúng.
- Bản ghi A với
example.com
trỏ đến địa chỉ IP công cộng của server của bạn. - Một bản ghi A với
www. example.com
trỏ đến địa chỉ IP công cộng của server của bạn.
- Bản ghi A với
Nginx được bảo mật bằng certificate SSL theo cài đặt này để Mã hóa khối server Nginx trên hướng dẫn Ubuntu 16.04 . Đảm bảo chọn tùy chọn 2,
Redirect
, trong Bước 4 của hướng dẫn cài đặt Nginx, vì điều này sẽ cung cấp chuyển hướng tự động đến HTTPS trên server production mà ta đang tạo trong hướng dẫn này.
Bước 1 - Cài đặt Elixir và Phoenix trên Máy phát triển local
Vì Elixir chạy trên máy ảo Erlang nên ta cần cài đặt máy ảo trước khi có thể cài đặt chính Elixir. Và vì ta muốn đảm bảo ta đang sử dụng version ổn định mới nhất của Erlang, ta sẽ cài đặt Erlang từ repository Giải pháp Erlang.
Đầu tiên, download và thêm repository Giải pháp Erlang vào máy phát triển local của bạn.
- cd ~
- wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
- sudo dpkg -i erlang-solutions_1.0_all.deb
Bây giờ, hãy cập nhật danh sách gói của bạn và cài đặt gói esl-erlang
cung cấp cả ngôn ngữ lập trình Erlang cũng như các công cụ, thư viện và phần mềm trung gian hữu ích, được gọi chung là nền tảng Erlang / OTP.
- sudo apt-get update
- sudo apt-get install esl-erlang
Sau đó, cài đặt Elixir.
- sudo apt-get install elixir
Tiếp theo, sử dụng Mix - một công cụ xây dựng đi kèm với Elixir để tạo các dự án Elixir và quản lý các phần phụ thuộc - để cài đặt trình quản lý gói riêng của Elixir, Hex , mà bạn sẽ sử dụng sau này để cài đặt Phoenix.
Phần local
bộ của lệnh này yêu cầu Mix cài đặt hex
local .
- mix local.hex
Khi được yêu cầu xác nhận cài đặt, hãy nhập Y
OutputAre you sure you want to install "https://repo.hex.pm/installs/1.5.0/hex-0.17.1.ez"? [Yn] Y * creating .mix/archives/hex-0.17.1
Bây giờ, hãy sử dụng Hex để cài đặt repository Phoenix 1.3.0 Mix, một file Zip chứa mọi thứ bạn cần để tạo một dự án Phoenix cơ sở mới để xây dựng.
- mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new-1.3.0.ez
, khi được yêu cầu xác nhận cài đặt, hãy nhập Y
OutputAre you sure you want to install "https://github.com/phoenixframework/archives/raw/master/phx_new-1.3.0.ez"? [Yn] Y * creating .mix/archives/phx_new-1.3.0
Cảnh báo: Nếu bạn cài đặt Phoenix từ repository phx_new.ez
, bạn sẽ nhận được version mới nhất của Phoenix, version này có thể khác với version ta sử dụng trong hướng dẫn này - 1.3.0. Sau đó, bạn sẽ phải điều chỉnh hướng dẫn này cho phù hợp với version Phoenix mà bạn đang sử dụng.
Với Elixir và Phoenix được cài đặt trên máy phát triển local , hãy cài đặt các phần ta cần trên server production .
Bước 2 - Cài đặt Elixir và Phoenix trên Server production
Bởi vì ta cần dự án Phoenix của bạn chạy trên cả máy phát triển local và server production , ta cần cài đặt tất cả các ngôn ngữ và công cụ giống nhau ở cả hai nơi.
Sử dụng các lệnh tương tự từ Bước 1 , download và thêm repository Giải pháp Erlang vào server production của bạn.
- cd ~
- wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
- sudo dpkg -i erlang-solutions_1.0_all.deb
Cập nhật danh sách gói của bạn và cài đặt gói esl-erlang
.
- sudo apt-get update
- sudo apt-get install esl-erlang
Cài đặt Elixir.
- sudo apt-get install elixir
Sử dụng Mix để cài đặt Hex.
- mix local.hex
Khi được yêu cầu xác nhận cài đặt, hãy nhập Y
OutputAre you sure you want to install "https://repo.hex.pm/installs/1.5.0/hex-0.17.1.ez"? [Yn] Y * creating .mix/archives/hex-0.17.1
Cả máy phát triển local và server production hiện đã sẵn sàng để chạy Phoenix, nhưng hãy giúp kết nối với server production từ máy phát triển local dễ dàng hơn bằng cách cài đặt alias server SSH.
Bước 3 - Cài đặt alias server SSH
Vì mục tiêu của ta là quy trình triển khai hoàn toàn tự động, nên ta đã tạo cặp SSH key trong quá trình cài đặt server production ban đầu không nhắc passphrase (password bảo vệ) .
Ngay bây giờ, ta có thể kết nối từ máy phát triển local đến server production bằng lệnh ssh -i ~/.ssh/ private_key_file sammy @ example.com
.
Ở đây, ta đang kết nối với example.com
với quyền là sammy của user . Cờ -i
cho SSH biết sử dụng file private key nằm tại ~/.ssh/private_key_file
cho kết nối.
Tuy nhiên, ta có thể thực hiện lệnh này - và chính quá trình triển khai - thậm chí còn đơn giản hơn bằng cách cài đặt alias server SSH tự động biết private key , user và domain nào sẽ sử dụng khi kết nối với server production .
Mở ~/.ssh/config
trên máy phát triển local để chỉnh sửa.
- nano ~/.ssh/config
Và, sao chép trong các dòng sau.
Host example.com HostName example.com User sammy IdentityFile ~/.ssh/private_key_file
Lưu ý: Nếu file config
của bạn đã có thứ gì đó trong đó, hãy thêm một dòng trống bổ sung ngăn cách cấu hình mới này với các file nào hiện có.
Dòng Host
cung cấp một alias xác cấu hình cụ thể này. Để dễ nhớ hơn, ta đang sử dụng domain của bạn . Dòng HostName
cho SSH biết server lưu trữ để kết nối. Dòng User
cho phép SSH biết user nào sẽ kết nối và IdentityFile
cho SSH biết file private key nào sẽ sử dụng.
Lưu các thay đổi và đóng file.
Cuối cùng, kiểm tra cấu hình bằng cách kết nối với server production .
- ssh example.com
Bạn đã có thể tạo kết nối mà không cần chỉ định user , file private key hoặc domain . Nếu bạn không thể kết nối, hãy làm theo thông báo trên màn hình và truy cập lại các bước trước đó để giải quyết sự cố.
Bây giờ ta đã đơn giản hóa việc kết nối với server production , ta có thể tạo một dự án Phoenix mẫu để triển khai.
Bước 4 - Tạo một dự án thử nghiệm
Theo mặc định, khi bạn tạo một dự án Phoenix mới, nó được cấu hình với bộ điều hợp database PostgreSQL và Brunch , một công cụ xây dựng ứng dụng web dựa trên JavaScript. Để tránh sự phức tạp bổ sung này, ta sẽ tạo một dự án Phoenix đơn giản có tên là myproject
mà không có bộ điều hợp database và không có Brunch bằng cách chuyển các cờ --no-ecto
và --no-brunch
tương ứng.
Thay đổi folder chính của bạn và tạo dự án mới.
- cd ~
- mix phx.new --no-ecto --no-brunch myproject
Đầu ra bao gồm các folder và file mà Phoenix đã tạo làm giàn giáo cho dự án myproject
, dấu nhắc xác nhận bạn muốn cài đặt các phụ thuộc và hướng dẫn về cách khởi động server tích hợp sẵn của Phoenix.
Nhập Y
khi được yêu cầu xác nhận cài đặt.
Output* creating myproject/config/config.exs * creating myproject/config/dev.exs * creating myproject/config/prod.exs ... Fetch and install dependencies? [Yn] Y * running mix deps.get * running mix deps.compile We are all set! Go into your application by running: $ cd myproject Start your Phoenix app with: $ mix phx.server You can also run your app inside IEx (Interactive Elixir) as: $ iex -S mix phx.server
Bây giờ, hãy xem liệu dự án thử nghiệm của ta có hoạt động không.
Đi vào folder myproject
và chạy lệnh mix phx.server
để biên dịch dự án và khởi động server .
- cd ~/myproject
- mix phx.server
Kết quả kết quả cho bạn biết số lượng và loại file mà Phoenix đã biên dịch, cung cấp cho bạn cảnh báo về các vấn đề mà nó gặp phải trong quá trình thực hiện và nếu thành công, cho bạn biết nơi cần tiếp cận dự án.
Lần đầu tiên bạn biên dịch một ứng dụng dựa trên Elixir trên máy phát triển local của bạn , bạn sẽ được yêu cầu cài đặt Rebar, một công cụ xây dựng và phụ thuộc cho Erlang mà Mix dựa vào. Nhập Y
tại dấu nhắc .
Output==> file_system Compiling 6 files (.ex) Generated file_system app ... Could not find "rebar3", which is needed to build dependency :ranch I can install a local copy which is just used by Mix Shall I install rebar3? (if running non-interactively, use "mix local.rebar --force") [Yn] Y ... Compiling 11 files (.ex) Generated myproject app [info] Running MyprojectWeb.Endpoint with Cowboy using http://0.0.0.0:4000
Để kiểm tra cài đặt hiện tại, hãy trỏ trình duyệt web tới http: // localhost: 4000 . Bạn sẽ thấy trang chủ Phoenix Framework mặc định chào mừng bạn đến với Phoenix. Nếu không, hãy đảm bảo firewall của bạn đang cho phép kết nối trên cổng 4000
và sau đó xem lại kết quả terminal của bạn để được hướng dẫn thêm.
Khi bạn đã xác minh mọi thứ đang hoạt động, hãy nhấn CTRL+C
hai lần để dừng server để nó sẵn sàng cho cấu hình tiếp theo ở Bước 5 .
Đến đây bạn đã có một dự án Phoenix local , đầy đủ chức năng, hãy cấu hình nó để sử dụng Distillery và edeliver.
Bước 5 - Cấu hình Dự án để sử dụng Distillery và edeliver
Các dự án Phoenix lưu trữ chi tiết cấu hình như cổng mà dự án chạy và URL server của dự án trong config/prod.exs
, vì vậy ta sẽ bắt đầu bằng cách chỉnh sửa file đó để cho Phoenix biết cách tiếp cận dự án trong môi trường production .
Mở config/prod.exs
trên máy phát triển local của bạn để chỉnh sửa.
- nano ~/myproject/config/prod.exs
Tìm khối mã sau:
... config :myproject, MyprojectWeb.Endpoint, load_from_system_env: true, url: [host: "example.com", port: 80], cache_static_manifest: "priv/static/cache_manifest.json" ...
Khi load_from_system_env
được đặt thành true
, Phoenix nhận cổng mà dự án sẽ chạy từ biến môi trường PORT
theo mặc định. Đây được gọi là cổng HTTP.
url: [host]
và url: [port]
được sử dụng để tạo các liên kết trong dự án. Sự khác biệt giữa HTTP và URL này đặc biệt hữu ích khi cài đặt proxy trong đó điểm cuối proxy được hiển thị trên một cổng khác với dự án Phoenix.
Để đơn giản, ta sẽ mã hóa cứng trong cổng HTTP mà myproject
chạy trên đó. Điều này sẽ làm giảm số lượng các bộ phận chuyển động, do đó, sẽ tăng độ tin cậy của quá trình triển khai tự động của ta .
Ngoài các tùy chọn mặc định mà ta sẽ sửa đổi, ta cũng sẽ thêm hai tùy chọn mới.
Tùy chọn server
yêu cầu Distillery cấu hình dự án để khởi động server HTTP khi bắt đầu, đó là những gì ta muốn trong quá trình triển khai hoàn toàn tự động.
Tùy chọn code_reloader
yêu cầu dự án làm mới tất cả các trình duyệt web được kết nối khi nào mã của dự án thay đổi. Mặc dù đây có thể là một tính năng rất hữu ích trong quá trình phát triển, nhưng nó không dành cho môi trường production , vì vậy ta sẽ tắt nó đi.
Bây giờ, hãy sửa đổi cấu hình mặc định.
... config :myproject, MyprojectWeb.Endpoint, http: [port: 4000], url: [host: "example.com", port: 80], cache_static_manifest: "priv/static/manifest.json", server: true, code_reloader: false ...
Lưu ý: Để tránh các sự cố cấu hình tiềm ẩn, hãy kiểm tra kỹ xem bạn đã thêm a ,
vào cuối dòng cache_static_manifest
chưa trước khi tiếp tục.
Lưu và đóng config/prod.exs
sau khi bạn đã áp dụng các thay đổi của bạn .
Khi ta tạo dự án myproject
ở Bước 4 , Phoenix đã tự động tạo file .gitignore
mà ta cần ở Bước 6 khi ta đẩy các thay đổi mã lên server xây dựng bằng edeliver.
Theo mặc định, file .gitignore
đó yêu cầu Git bỏ qua các phụ thuộc và xây dựng file để repository không trở nên lớn không cần thiết. Ngoài ra, file đó yêu cầu Git bỏ qua prod.secret.exs
, một file trong folder config
của tất cả các dự án Phoenix chứa thông tin rất nhạy cảm, như password database production và bí mật ứng dụng để ký mã thông báo.
Vì dự án myproject
cần prod.secret.exs
trên server production để hoạt động bình thường và ta không thể di chuyển nó đến đó bằng Git, ta sẽ phải chuyển nó đến server theo cách thủ công.
Trong folder chính của bạn trên server production , hãy tạo một folder mới có tên app_config
. Đây là nơi bạn sẽ lưu trữ prod.secret.exs
.
- cd ~
- mkdir app_config
Bây giờ, sử dụng scp
để sao chép prod.secret.exs
vào folder app_config
trên server production .
- scp ~/myproject/config/prod.secret.exs example.com:/home/sammy/app_config/prod.secret.exs
Cuối cùng, xác minh quá trình chuyển đã xảy ra bằng cách liệt kê nội dung của app_config
trên server production .
- ls ~/app_config
Nếu bạn không thấy prod.secret.exs
trong kết quả , hãy xem lại terminal trên máy phát triển local của bạn để biết thêm thông tin.
Với prod.secret.exs
trên server production , ta đã sẵn sàng cài đặt Distillery cho quá trình xây dựng và edeliver để triển khai bằng cách đưa chúng vào mix.exs
, file cấu hình chính cho dự án myproject
.
Mở mix.exs
trên máy phát triển local của bạn.
- nano ~/myproject/mix.exs
Bây giờ, hãy tìm khối mã sau:
... defp deps do [ {:phoenix, "~> 1.3.0"}, {:phoenix_pubsub, "~> 1.0"}, {:phoenix_html, "~> 2.10"}, {:phoenix_live_reload, "~> 1.0", only: :dev}, {:gettext, "~> 0.11"}, {:cowboy, "~> 1.0"} ] end ...
deps
là một hàm riêng xác định rõ ràng tất cả các phụ thuộc của dự án myproject
của ta . Mặc dù nó không được yêu cầu nghiêm ngặt, nhưng nó giúp giữ cho cấu hình dự án có tổ chức.
Thêm edeliver
và distillery
vào danh sách phụ thuộc.
... defp deps do [ {:phoenix, "~> 1.3.0"}, {:phoenix_pubsub, "~> 1.0"}, {:phoenix_html, "~> 2.10"}, {:phoenix_live_reload, "~> 1.0", only: :dev}, {:gettext, "~> 0.11"}, {:cowboy, "~> 1.0"}, {:edeliver, "~> 1.4.3"}, {:distillery, "~> 1.4"} ] end ...
Lưu ý: Để tránh các sự cố có thể xảy ra với cấu hình, hãy kiểm tra kỹ xem bạn đã thêm a , vào cuối dòng trước mục nhập edeliver
mới edeliver
.
Lưu các thay đổi và đóng mix.exs
.
Bây giờ, hãy yêu cầu mix
tìm nạp các phụ thuộc mới để chúng có sẵn trong thời gian chạy.
- cd ~/myproject/
- mix deps.get
Kết quả kết quả cho ta biết rằng máy edeliver
distillery
và distillery
đã được thêm thành công vào dự án của ta .
OutputResolving Hex dependencies... Dependency resolution completed: ... * Getting edeliver (Hex package) Checking package (https://repo.hex.pm/tarballs/edeliver-1.4.4.tar) Fetched package * Getting distillery (Hex package) Checking package (https://repo.hex.pm/tarballs/distillery-1.5.2.tar) Fetched package
Cuối cùng, khởi động lại server của Phoenix trên máy phát triển local để kiểm tra cấu hình hiện tại.
- mix phx.server
Trỏ trình duyệt của bạn tới http: // localhost: 4000 . Bạn sẽ thấy cùng một trang chủ Phoenix mặc định mà bạn đã thấy ở Bước 4 . Nếu không, hãy theo dõi lại các bước trước đó và xem lại terminal của máy phát triển local của bạn để biết thêm thông tin.
Khi đã sẵn sàng để tiếp tục, hãy nhấn CTRL+C
hai lần để dừng server để nó sẵn sàng cho việc cấu hình thêm trong bước tiếp theo.
Với Distillery và edeliver được cài đặt, ta đã sẵn sàng cấu hình chúng để triển khai.
Bước 6 - Cấu hình Edeliver và Distillery
Nhà máy chưng cất yêu cầu file cấu hình bản dựng không được tạo theo mặc định. Tuy nhiên, ta có thể tạo cấu hình mặc định bằng cách chạy mix release.init
.
Đi vào folder myproject
trên máy phát triển local của bạn và tạo file cấu hình.
- cd ~/myproject
- mix release.init
Kết quả xác nhận file đã được tạo và bao gồm các hướng dẫn thêm về cách chỉnh sửa và xây dựng bản phát hành.
OutputAn example config file has been placed in rel/config.exs, review it, make edits as needed/desired, and then run `mix release` to build the release
edeliver sẽ tìm kiếm các bản phát hành trong folder rel/ myproject
khi thực hiện các nâng cấp nóng, nhưng Distillery đặt các bản phát hành trong folder _build
theo mặc định. Vì vậy, hãy sửa đổi file cấu hình mặc định của Distillery, rel/config.exs
, để đưa các bản phát hành production vào đúng vị trí.
Mở rel/config.exs
trong trình soạn thảo của bạn.
- nano rel/config.exs
Tìm phần sau:
... environment :prod do set include_erts: true set include_src: false set cookie: :"f3a1[Q^31~]3~N=|T|T=0NvN;h7OHK!%%c.}$)iP9!X|TS[X@sqG=m`yBYVt4/`:" end ...
Khối này cho Distillery biết cách ta muốn nó xây dựng các gói phát hành production khép kín. include_erts
cho biết liệu ta có muốn gói Hệ thống thời gian chạy Erlang hay không, hệ thống này hữu ích khi hệ thống đích không được cài đặt Erlang hoặc Elixir. include_src
cho biết liệu ta có muốn bao gồm các file mã nguồn hay không. Và, giá trị cookie
được sử dụng để xác thực các node Erlang để giao tiếp với nhau.
Đóng file .
Bây giờ ta đã sẵn sàng để cấu hình edeliver, nhưng ta sẽ phải tạo file cấu hình của nó theo cách thủ công.
Đi vào folder myproject
trên máy phát triển local của bạn và tạo một folder mới có tên .deliver
, sau đó mở một file mới tại .deliver/config
để chỉnh sửa.
- cd ~/myproject
- mkdir .deliver
- nano .deliver/config
Trong file này, ta sẽ chỉ định chi tiết về server production và xây dựng. Vì ta đang sử dụng cùng một server cho cả quá trình xây dựng và production , server và user của ta giống nhau trong quá trình xây dựng và production . Ngoài ra, ta sẽ thực hiện xây dựng trong folder app_build
và đặt các file production đã biên dịch trong folder app_release
.
Sao chép phần sau vào file .
APP="myproject" BUILD_HOST="example.com" BUILD_USER="sammy" BUILD_AT="/home/sammy/app_build" PRODUCTION_HOSTS="example.com" PRODUCTION_USER="sammy" DELIVER_TO="/home/sammy/app_release"
Tiếp theo, ta sẽ tạo một softlink trong folder xây dựng tới prod.secret.exs
, file mà ta đã chuyển đến folder app_config
trên server production ở Bước 5 . Softlink này được tạo bên trong móc edeliver . Tại mỗi thời điểm trong quá trình xây dựng, giai đoạn và triển khai, một hook cụ thể được gọi bởi edeliver. Đối với cài đặt triển khai tự động của ta , ta đang lắng nghe hook pre_erlang_get_and_update_deps
được gọi trước khi edeliver nhận được các phụ thuộc của ta và bắt đầu biên dịch.
Nối phần sau vào .deliver/config
.
pre_erlang_get_and_update_deps() { local _prod_secret_path="/home/sammy/app_config/prod.secret.exs" if [ "$TARGET_MIX_ENV" = "prod" ]; then __sync_remote " ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs' " fi }
Lưu file khi bạn chỉnh sửa xong.
Vì edeliver sử dụng Git để đẩy mã từ bản commit mới nhất đến server xây dựng để thực hiện thêm hành động, bước cuối cùng trước khi triển khai là tạo repository Git cho dự án của ta .
Trong folder myproject
trên máy phát triển local của bạn, sử dụng git init
để tạo một repository Git trống.
- cd ~/myproject
- git init
Trước khi thêm file của bạn vào index Git, ta cũng cần thêm folder chứa tarball phát hành vào file .gitignore
. Nếu không, repository Git sẽ có kích thước rất lớn sau một vài bản phát hành.
- echo ".deliver/releases/" >> .gitignore
Tiếp theo, thêm tập hợp đầy đủ các file từ dự án myproject
vào vùng dàn dựng Git để chúng sẽ được đưa vào lần commit tiếp theo.
- git add .
Bây giờ, hãy đặt danh tính mà Git sẽ liên kết với repository này. Điều này sẽ giúp bạn theo dõi các thay đổi đối với dự án của bạn đến từ đâu.
- git config user.email "you@example.com"
- git config user.name "Your Name"
Cuối cùng, commit các file vào repository bằng cách sử dụng tùy chọn -m
để mô tả lý do thực hiện commit .
- git commit -m "Setting up automated deployment"
Đầu ra lặp lại thông báo commit của bạn và sau đó báo cáo số lượng file đã thay đổi, số dòng được chèn và tên của file đã được thêm vào repository .
Output- [master (root-commit) e58b766] Setting up automated deployment
- 39 files changed, 2344 insertions(+)
- create mode 100644 .deliver/config
- ...
Với dự án của ta hiện đã commit với Git và Distillery và edeliver được cấu hình đầy đủ, ta đã sẵn sàng cho lần triển khai đầu tiên của bạn .
Bước 7 - Triển khai dự án
Một lợi ích của quá trình triển khai này là bạn sẽ làm hầu hết mọi thứ trên máy phát triển local , hiếm khi cần chạm vào server production .
Bây giờ hãy myproject mọi thứ bằng cách đẩy dự án myproject
lên server production .
Đầu tiên, sử dụng mix
trên máy phát triển local của bạn để tạo bản phát hành của dự án và chuyển nó đến server xây dựng với edeliver.
- cd ~/myproject
- mix edeliver build release
Đầu ra cập nhật cho bạn về từng bước của quá trình xây dựng trong thời gian thực và nếu mọi thứ hoạt động như mong đợi, cho bạn biết rằng quá trình xây dựng đã thành công.
OutputBUILDING RELEASE OF MYPROJECT APP ON BUILD HOST -----> Authorizing hosts -----> Ensuring hosts are ready to accept git pushes -----> Pushing new commits with git to: sammy@example.com -----> Resetting remote hosts to fc86f878d96... -----> Cleaning generated files from last build -----> Fetching / Updating dependencies -----> Compiling sources -----> Generating release -----> Copying release 0.0.1 to local release store -----> Copying myproject.tar.gz to release store RELEASE BUILD OF MYPROJECT WAS SUCCESSFUL!
Nếu quá trình xây dựng của bạn không thành công, edeliver sẽ chỉ ra dòng mã mà nó đang cố gắng thực thi khi gặp sự cố. Bạn có thể sử dụng thông tin đó để khắc phục sự cố.
Khi quá trình xây dựng hoàn tất, hãy chuyển bản phát hành sang server production .
- mix edeliver deploy release to production
, kết quả cập nhật cho bạn về từng bước của quy trình trong thời gian thực và nếu mọi thứ hoạt động, sẽ cho bạn biết bản dựng đã được phát hành chính thức.
OutputDEPLOYING RELEASE OF MYPROJECT APP TO PRODUCTION HOSTS -----> Authorizing hosts -----> Uploading archive of release 0.0.1 from local release store -----> Extracting archive myproject.0.1.tar.gz DEPLOYED RELEASE TO PRODUCTION!
Nếu bạn gặp sự cố khi triển khai, hãy kiểm tra kết quả trong terminal của bạn để biết thêm thông tin.
Cuối cùng, bắt đầu dự án myproject
trên server production .
- mix edeliver start production
Đầu ra cho bạn biết user rằng dự án đang chạy, server mà nó đang chạy và đường dẫn đến bản phát hành mà nó đang sử dụng trên server production . Phản hồi sẽ là START DONE!
.
OutputEDELIVER MYPROJECT WITH START COMMAND -----> starting production servers production node: user : sammy host : example.com path : /home/sammy/app_release response: START DONE!
Kiểm tra quá trình triển khai bằng cách trỏ trình duyệt của bạn tới http:// example.com :4000
. bạn sẽ thấy trang chủ Phoenix Framework mặc định. Nếu không, hãy kiểm tra kỹ xem cổng 4000
có đang mở trên server production hay không và sau đó tham khảo terminal của máy phát triển local để biết thêm thông tin.
Bây giờ ta đã xác minh quá trình xây dựng và triển khai hoàn chỉnh, hãy tiến hành cài đặt của ta thêm một bước bằng cách thực hiện cập nhật mã mà không có bất kỳ thời gian chết nào trên server production .
Bước 8 - Nâng cấp dự án mà không có thời gian ngừng production
Một tính năng trong quy trình xây dựng và triển khai của ta là khả năng swap mã nóng, cập nhật dự án trên server production mà không có bất kỳ thời gian chết nào. Hãy thực hiện một số thay đổi đối với dự án để thử điều này.
Mở file trang chủ của dự án để chỉnh sửa.
- nano ~/myproject/lib/myproject_web/templates/page/index.html.eex
Tìm dòng sau:
... <h2><%= gettext "Welcome to %{name}", name: "Phoenix!" %></h2> ...
<h2>Hello, World!</h2>
Lưu và đóng file .
Bây giờ ta đã cập nhật cơ sở mã, ta cũng cần tăng version ứng dụng. Số version giúp bạn dễ dàng theo dõi các bản phát hành và quay lại các version trước nếu cần.
Mở mix.exs
trên máy phát triển local của bạn.
- nano ~/myproject/mix.exs
Tìm khối sau:
- ...
- def project do
- [app: :myproject,
- version: "0.0.1",
- elixir: "~> 1.2",
- elixirc_paths: elixirc_paths(Mix.env),
- compilers: [:phoenix, :gettext] ++ Mix.compilers,
- build_embedded: Mix.env == :prod,
- start_permanent: Mix.env == :prod,
- deps: deps()]
- end
- ...
Tăng version từ 0.0.1
lên 0.0.2
.
- ...
- def project do
- [app: :myproject,
- version: "0.0.2",
- elixir: "~> 1.2",
- elixirc_paths: elixirc_paths(Mix.env),
- compilers: [:phoenix, :gettext] ++ Mix.compilers,
- build_embedded: Mix.env == :prod,
- start_permanent: Mix.env == :prod,
- deps: deps()]
- end
- ...
Sau đó, lưu file .
Bây giờ ta cần thêm và commit các thay đổi của bạn đối với Git để edeliver biết nó sẽ đẩy chúng lên server xây dựng.
- git add .
- git commit -m "Changed welcome message"
Cuối cùng, ta đã sẵn sàng swap nóng các thay đổi của bạn . Lần này, ta có một lệnh duy nhất tương đương với ba lệnh liên quan mà ta đã sử dụng trong Bước 7 .
Với một lệnh, xây dựng, triển khai và khởi động lại ứng dụng trên server production .
- mix edeliver upgrade production
, kết quả sẽ đưa ta qua từng bước của quy trình trong thời gian thực và nếu thành công, kết thúc bằng UPGRADE DONE!
.
OutputEDELIVER MYPROJECT WITH UPGRADE COMMAND -----> Upgrading to revision 2fc28b6 from branch master -----> Detecting release versions on production hosts -----> Deploying upgrades to 1 online hosts -----> Checking whether installed version 0.0.1 is in release store -----> Building the upgrade from version 0.0.1 -----> Authorizing hosts -----> Validating * version 0.0.1 is in local release store -----> Ensuring hosts are ready to accept git pushes -----> Pushing new commits with git to: sammy@example.com -----> Resetting remote hosts to 2fc28b6... -----> Cleaning generated files from last build -----> Checking out 2fc28b6... -----> Fetching / Updating dependencies -----> Compiling sources -----> Checking version of new release -----> Uploading archive of release 0.0.1 from local release store -----> Extracting archive myproject_0.0.1.tar.gz -----> Generating release -----> Removing built release 0.0.1 from remote release directory -----> Copying release 0.0.2 to local release store -----> Copying myproject.tar.gz to release store -----> Upgrading production hosts to version 0.0.2 -----> Authorizing hosts -----> Uploading archive of release 0.0.2 from local release store -----> Upgrading release to 0.0.2 UPGRADE DONE!
Để xác minh mọi thứ đã hoạt động, hãy reload http:// example.com :4000
trong trình duyệt của bạn. Bạn sẽ thấy tin nhắn mới. Nếu không, hãy theo dõi lại các bước trước đó và kiểm tra terminal của bạn để biết thêm các thông báo lỗi và cảnh báo.
Quá trình triển khai hiện đã được giảm xuống chỉ còn một lệnh duy nhất và ta cũng đang sử dụng một trong những tính năng nổi tiếng nhất của Erlang - swap nóng mã. Cuối cùng, hãy củng cố ứng dụng của ta trong quá trình production bằng cách đặt nó sau proxy Nginx.
Bước 9 - Cài đặt Reverse Proxy trên Server Sản xuất
Mặc dù ta có thể trực tiếp đưa ứng dụng của bạn lên Internet, nhưng Reverse Proxy sẽ cung cấp bảo mật tốt hơn. Để dễ cấu hình, hỗ trợ SSL và khả năng đặt tiêu đề phản hồi HTTP tùy chỉnh, ta sẽ sử dụng Nginx cho proxy của bạn .
Nếu bạn đã làm theo hướng dẫn cài đặt Let's Encrypt with Nginx server trên Ubuntu 16.04 trong phần yêu cầu , thì bạn hẳn đã tạo một khối server Nginx riêng biệt trên server production chỉ cho dự án của ta .
Mở file cấu hình của khối server đó để chỉnh sửa.
- sudo nano /etc/nginx/sites-available/example.com
Đầu tiên, ta cần cho Nginx biết nơi dự án Phoenix của ta nằm và cổng nào nó lắng nghe. Vì ta đang phục vụ dự án của bạn trên cổng 4000
local , ta đang nói với Nginx rằng điểm cuối proxy của ta ở 127.0.0.1:4000
.
Sao chép mã sau vào file cấu hình phía trên đoạn cấu hình server mặc định.
upstream phoenix { server 127.0.0.1:4000; }
Bây giờ, trong cùng một file , hãy tìm khối mã sau:
... location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } ...
Để proxy hoạt động, ta cần yêu cầu Nginx chuyển hướng tất cả các kết nối đến web server đến dự án Phoenix của ta , bao gồm tiêu đề yêu cầu, địa chỉ IP của server mà client đã được ủy quyền và địa chỉ IP của client chinh no.
Ta cũng sẽ cấu hình Nginx để chuyển tiếp các yêu cầu đến bằng cách WebSockets , một giao thức để nhắn tin giữa web server và client giúp nâng cấp kết nối HTTP không trạng thái tiêu chuẩn thành kết nối liên tục.
Phoenix có một tính năng gọi là Kênh mà ta chưa khám phá trong hướng dẫn này, nhưng Kênh yêu cầu hỗ trợ cho WebSockets. Nếu không có cấu hình này, các Kênh sẽ không hoạt động vì các yêu cầu WebSocket sẽ không đến server .
Thay thế khối location
trước đó bằng khối sau:
location / { allow all; # Proxy Headers proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Cluster-Client-Ip $remote_addr; # WebSockets proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://phoenix; }
Lưu file để tiếp tục.
Bây giờ, hãy xác minh cấu hình Nginx mới.
- sudo nginx -t
Nginx sẽ thông báo rằng cú pháp ổn và quá trình kiểm tra đã thành công. Nếu không, hãy làm theo các thông báo trên màn hình để giải quyết sự cố.
Khởi động lại Nginx để phổ biến các thay đổi.
- sudo systemctl restart nginx
Cuối cùng, vì mục đích bảo mật, không cho phép truy cập vào ứng dụng của bạn qua HTTP trên cổng 4000
.
- sudo ufw delete allow 4000
Sau đó, kiểm tra trạng thái của UFW.
- sudo ufw status
Tường lửa sẽ chỉ cho phép truy cập SSH và Nginx tại thời điểm này.
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
Cuối cùng, hãy kiểm tra xem mọi thứ có hoạt động không bằng cách trỏ trình duyệt của bạn đến https:// example.com
.
Như vậy, bạn có một quy trình xây dựng và triển khai hoàn toàn tự động và một server production được bảo mật bằng Reverse Proxy và certificate SSL.
Kết luận
Mặc dù ta đã cài đặt edeliver để xây dựng và triển khai dự án Phoenix của bạn tới một server production bằng một lệnh duy nhất, bạn vẫn có thể làm được nhiều việc hơn thế.
Hầu hết các ứng dụng Phoenix production đều sử dụng database . Trong Cách triển khai ứng dụng Elixir-Phoenix với MySQL trên Ubuntu 16.04 , bạn sẽ tiếp tục làm việc với ứng dụng này khi thêm database MySQL và triển khai các tính năng mới vào production .
Nếu cơ sở hạ tầng production của bạn bao gồm một cụm các node Phoenix, bạn có thể sử dụng edeliver để triển khai và thực hiện swap nóng trên tất cả các node cùng một lúc.
Hoặc, nếu bạn muốn cài đặt với độ tin cậy cao hơn, bạn có thể tạo cơ sở hạ tầng dàn dựng hoàn chỉnh và sử dụng edeliver để quản lý quá trình dàn dựng và triển khai.
Để tìm hiểu thêm về một trong hai chủ đề này hoặc để tìm hiểu thêm về cách mở rộng cài đặt edeliver hiện tại của bạn nói chung, hãy truy cập trang chủ chính thức của dự án trên GitHub .
Các tin liên quan
Cách thiết lập khóa SSH trên Ubuntu 18.042018-04-27
Cách nâng cấp lên Ubuntu 18.04 Bionic Beaver
2018-04-26
Có gì mới trong Ubuntu 18.04 Bionic Beaver
2018-04-26
Cách cài đặt và cấu hình Ghost trên Ubuntu 16.04
2018-04-13
Cách lưu trữ một trang web với Caddy trên Ubuntu 16.04
2018-04-12
Cách thiết lập khóa SSH trên Ubuntu 16.04
2018-04-12
Cách đồng bộ hóa dữ liệu đã chuyển đổi từ MongoDB sang Elasticsearch với Transporter trên Ubuntu 16.04
2018-04-05
Cách triển khai trang web Jekyll bằng Git Hooks trên Ubuntu 16.04
2018-03-29
Cách chặn nỗ lực đăng nhập SSH không mong muốn với PyFilter trên Ubuntu 16.04
2018-03-27
Cách tự động triển khai ứng dụng Laravel với Trình triển khai trên Ubuntu 16.04
2018-03-23