Cách triển khai ứng dụng Elixir-Phoenix với MySQL trên Ubuntu 16.04
Trong hướng dẫn Cách tự động hóa việc triển khai Elixir Phoenix với Distillery và edeliver , bạn đã tạo một ứng dụng Phoenix mà không có database và triển khai nó đến một server production với edeliver . Hầu hết các ứng dụng trong thế giới thực đều yêu cầu database yêu cầu một số sửa đổi đối với quá trình triển khai.Bạn có thể sử dụng edeliver để đẩy các thay đổi ứng dụng và database đến server production của bạn cùng lúc để bạn có thể quản lý các thay đổi database trong quá trình triển khai.
Trong hướng dẫn này, bạn sẽ cấu hình ứng dụng Phoenix hiện có của bạn để kết nối với database MySQL bằng Phoenix- Ecto và Mariaex . Ecto là một shell bọc database được sử dụng rộng rãi cho các ứng dụng Phoenix. Mariaex là một trình điều khiển database tích hợp với Ecto và nói chuyện với database MySQL và MariaDB.
Bạn cũng cần tạo một sổ địa chỉ đơn giản trên máy phát triển của bạn để sử dụng database và sử dụng edeliver để áp dụng các thay đổi cho server production của bạn. User trang web của bạn có thể tạo, đọc, cập nhật và xóa các mục nhập trong sổ địa chỉ này.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Ứng dụng Phoenix đã hoàn thành từ hướng dẫn Cách tự động hóa việc triển khai Elixir Phoenix với Distillery và edeliver . Ứng dụng này phải chạy sau Nginx bằng certificate Let's Encrypt và được triển khai với edeliver.
- MySQL được cài đặt trên server của bạn theo Cách cài đặt MySQL trên Ubuntu 16.04 .
- MySQL được cài đặt trên máy phát triển local của bạn để kiểm tra database trước khi bạn triển khai.
Bước 1 - Thêm Mariaex và Ecto vào ứng dụng của bạn
Thông thường, các ứng dụng Phoenix không trực tiếp cài đặt kết nối với database và thực thi các truy vấn SQL. Thay vào đó, trình điều khiển database được sử dụng để kết nối với database mong muốn và shell bọc database sau đó được sử dụng để truy vấn database .
Trình điều khiển database là một ứng dụng Elixir đảm nhiệm các việc thông thường của việc sử dụng database như cài đặt kết nối, đóng kết nối và thực thi truy vấn. Shell bọc database là một lớp trên đầu trình điều khiển database cho phép các lập trình viên Elixir tạo các truy vấn database với mã Elixir và cung cấp các tính năng bổ sung như thành phần truy vấn (chuỗi các truy vấn).
Sự tách biệt này tạo nên một ứng dụng module . Shell bọc database , và do đó mã ứng dụng để tương tác với database , phần lớn là giống nhau dù database được sử dụng. Chỉ cần thay đổi trình điều khiển database , các ứng dụng Phoenix có thể sử dụng một phần mềm database khác.
Vì bạn đã cung cấp cờ --no-ecto
khi tạo ứng dụng của bạn trong hướng dẫn trước , nên ứng dụng chưa được cài đặt Ecto và Mariaex. Đến đây bạn sẽ thêm Ecto và Mariaex làm phụ thuộc vào dự án của bạn .
Lưu ý: Các ứng dụng Phoenix sử dụng PostgreSQL theo mặc định. Để tạo một ứng dụng mới với database MySQL, hãy sử dụng lệnh mix phx.new --database mysql myproject
.
Đầu tiên, chuyển sang folder chứa dự án Phoenix của bạn.
- cd ~/myproject
Sau đó, mở file mix.exs
, file này chứa danh sách các phụ thuộc cho ứng dụng của bạn.
- nano mix.exs
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"}, {:edeliver, "~> 1.4.3"}, {:distillery, "~> 1.4"} ] end
Thêm Mariaex và Phoenix-Ecto làm 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"}, {:phoenix_ecto, "~> 3.2"}, {:mariaex, "~> 0.8.2"} ] end
Cảnh báo: Để tránh các vấn đề tiềm ẩn về cấu hình, hãy kiểm tra kỹ xem bạn đã thêm dấu phẩy (,) vào cuối dòng trước mục nhập phoenix_ecto
mới chưa.
Lưu và đóng mix.exs
. Sau đó, chạy lệnh sau để download các phụ thuộc bạn vừa thêm vào dự án.
- mix deps.get
Bạn sẽ thấy kết quả này khi các phần phụ thuộc của bạn được cài đặt:
OutputRunning dependency resolution... ... * Getting phoenix_ecto (Hex package) Checking package (https://repo.hex.pm/tarballs/phoenix_ecto-3.3.0.tar) Fetched package * Getting mariaex (Hex package) Checking package (https://repo.hex.pm/tarballs/mariaex-0.8.3.tar) Fetched package ...
Kết quả cho thấy Mix đã kiểm tra tính tương thích giữa các gói và nhận các gói cùng với các phụ thuộc của chúng từ repository Hex. Nếu lệnh này không thành công, hãy đảm bảo bạn đã cài đặt Hex và đã sửa đổi mix.exs
một cách chính xác.
Với Ecto và Mariaex tại chỗ, bạn có thể cài đặt repository Ecto.
Bước 2 - Cài đặt repository Ecto trong ứng dụng của bạn
Các ứng dụng Phoenix truy cập database thông qua một shell bọc database có tên là Ecto. Shell bọc database được triển khai dưới dạng module Elixir trong dự án của bạn. Bạn có thể nhập module này khi nào bạn cần tương tác với database và sử dụng các chức năng mà module cung cấp. Database được bao bọc được gọi là kho lưu trữ .
Mô-đun repository này phải bao gồm macro Ecto.Repo
để cấp quyền truy cập vào các chức năng truy vấn do Ecto xác định. Ngoài ra, nó phải chứa mã để khởi tạo các tùy chọn được chuyển đến bộ điều hợp database trong một hàm có tên init
.
Nếu bạn chưa sử dụng cờ --no-ecto
khi tạo dự án Phoenix của bạn , Phoenix sẽ tự động tạo module này cho bạn. Nhưng vì bạn đã làm vậy, bạn sẽ phải tự tạo ra nó.
Hãy tạo module trong một file có tên repo.ex
trong folder lib/ myproject
. Đầu tiên hãy tạo file :
- nano lib/myproject/repo.ex
Thêm mã sau vào file để xác định repository :
defmodule Myproject.Repo do use Ecto.Repo, otp_app: :myproject @doc """ Dynamically loads the repository url from the DATABASE_URL environment variable. """ def init(_, opts) do {:ok, Keyword.put(opts, :url, System.get_env("DATABASE_URL"))} end end
Theo mặc định, các dự án Phoenix xác định hàm init
sao cho nếu biến môi trường DATABASE_URL
tồn tại, thì Ecto sẽ sử dụng cấu hình trong biến môi trường để kết nối với database thay vì sử dụng thông tin đăng nhập trong file cấu hình Phoenix (như ta làm trong hướng dẫn này một lát sau).
Lưu và đóng repo.ex
Các dự án Phoenix sử dụng các quy trình Elixir nhẹ để đồng thời và khả năng chịu lỗi. Người giám sát quản lý các quy trình này và khởi động lại chúng, nếu chúng gặp sự cố. Người giám sát cũng có thể giám sát những người giám sát khác, và cấu trúc này được gọi là cây giám sát .
Mô-đun Myproject.Repo
mà bạn vừa thêm triển khai một trình giám sát quản lý các quy trình kết nối với database . Để bắt đầu trình giám sát này, bạn phải thêm nó vào cây giám sát của dự án.
Mở file application.ex
trong folder lib/ myproject
.
- nano lib/myproject/application.ex
Tìm khối mã sau để xác định cây giám sát:
... children = [ # Start the endpoint when the application starts supervisor(MyprojectWeb.Endpoint, []), ... ] ...
Bạn có thể thấy rằng điểm cuối ứng dụng, MyprojectWeb.Endpoint
, đang được khởi động như một người giám sát. Thêm Myproject.Repo
vào danh sách này:
children = [ # Start the Ecto repository supervisor(Myproject.Repo, []), # Start the endpoint when the application starts supervisor(MyprojectWeb.Endpoint, []), ... ]
Nếu bạn bỏ qua bước này, Ecto sẽ không tạo các quy trình để tương tác với database và bất kỳ nỗ lực nào để tương tác với database sẽ khiến ứng dụng bị sập.
Lưu và đóng application.ex
trước khi tiếp tục.
Cuối cùng, chỉ định repository Ecto trong cấu hình ứng dụng để bạn có thể sử dụng các việc Mix như ecto.create
và ecto.migrate
để tạo và quản lý database của bạn .
Mở file cấu hình tại config/config.exs
.
- nano config/config.exs
Tìm dòng sau ở cuối file :
import_config "#{Mix.env}.exs"
Dòng này cho phép các file cấu hình dành riêng cho môi trường, chẳng hạn như prod.exs
và test.exs
, overrides cài đặt trong config.exs
nếu cần. Thêm mã sau vào trên dòng đó để cấu hình repository Ecto:
... config :myproject, ecto_repos: [Myproject.Repo] ...
Lưu các thay đổi và đóng file.
Đến đây bạn đã cấu hình Ecto, hãy chuyển sang thêm thông tin đăng nhập database của bạn vào ứng dụng.
Bước 3 - Cấu hình ứng dụng của bạn với MySQL Credentials
Có ba tình huống mà ứng dụng của bạn sẽ kết nối với database : trong quá trình phát triển, trong quá trình thử nghiệm và trong quá trình production .
Tương ứng, Phoenix cung cấp ba file cấu hình dành riêng cho môi trường chứa thông tin đăng nhập có liên quan đến môi trường ứng dụng đang chạy. Các file này nằm trong folder config
trong folder root của dự án. Bạn sẽ sửa đổi ba file này trong bước này.
Đầu tiên, hãy cấu hình môi trường phát triển. Mở dev.exs
.
- nano config/dev.exs
Thêm các dòng sau để cấu hình bộ điều hợp database thành Ecto.Adapters.MySQL
vì ta đang sử dụng MySQL.
config :myproject, Myproject.Repo, adapter: Ecto.Adapters.MySQL
Tiếp theo, chỉ định tên mong muốn của database trong cùng một khối mã.
config :myproject, Myproject.Repo, adapter: Ecto.Adapters.MySQL, database: "myproject_dev"
Ở đây, ta xác định tên database phát triển là myproject _dev
. Đây là quy ước đặt tên mà ứng dụng Phoenix sử dụng cho database . Theo quy ước này, database production sẽ được gọi là myproject _prod
và database thử nghiệm myproject _test
. Thay vào đó, bạn có thể sử dụng schemas đặt tên của riêng mình.
Bây giờ, hãy cung cấp tên server , tên user và password cho server database phát triển của bạn.
config :myproject, Myproject.Repo, adapter: Ecto.Adapters.MySQL, database: "myproject_dev", username: "root", password: "password", hostname: "localhost"
Cuối cùng, đặt kích thước hồ bơi thành một số thích hợp. Kích thước group là số lượng kết nối tối đa đến database mà ứng dụng có thể có. Các kết nối này sẽ được chia sẻ trên các yêu cầu. Kích thước tối ưu phụ thuộc vào phần cứng của bạn nhưng bạn có thể sử dụng 10
để bắt đầu.
config :myproject, Myproject.Repo, adapter: Ecto.Adapters.MySQL, username: "root", password: "password", database: "myproject_dev", hostname: "localhost", pool_size: 10
Lưu và đóng dev.exs
.
Tiếp theo, cấu hình môi trường thử nghiệm của bạn. Mở file cấu hình môi trường thử nghiệm test.exs
.
- nano config/test.exs
Trong hướng dẫn này, ta sẽ lưu trữ database thử nghiệm trên server database local cùng với database phát triển. Như vậy, các cấu hình cho database thử nghiệm gần như giống nhau.
Tuy nhiên, thay vì kích thước group , ta chỉ định Ecto.Adapters.SQL.Sandbox
cho giá trị group . Điều này sẽ chạy thử nghiệm trong chế độ sandbox . Nghĩa là, bất kỳ giao dịch nào được thực hiện với database thử nghiệm trong quá trình thử nghiệm sẽ được khôi phục. Và điều này nghĩa là các bài kiểm tra đơn vị có thể được chạy theo thứ tự ngẫu nhiên khi database được đặt lại về trạng thái ban đầu sau mỗi lần kiểm tra.
Và ta sẽ sử dụng myproject_test
làm tên database .
Thêm cấu hình sau vào file test.exs
:
config :myproject, Myproject.Repo, adapter: Ecto.Adapters.MySQL, username: "root", password: "password", database: "myproject_test", hostname: "localhost", pool: Ecto.Adapters.SQL.Sandbox
Lưu và đóng test.exs
.
Cuối cùng, để cấu hình thông tin đăng nhập cho ứng dụng của bạn trong production , hãy mở file bí mật production của bạn, prod.secret.exs
.
- nano config/prod.secret.exs
Thêm mã này vào file prod.secret.exs
. Lưu ý ta đang sử dụng tên user myproject ở đây với mật password
. . Ta sẽ sớm tạo user này trên server database production , sử dụng password được chỉ định tại đây. Bạn cần sử dụng một password an toàn hơn tại đây.
config :myproject, Myproject.Repo, adapter: Ecto.Adapters.MySQL, username: "myapp", password: "password", database: "myproject_prod", hostname: "localhost", pool_size: 10
Lưu các thay đổi và đóng file.
Tệp này không được Git theo dõi vì lý do bảo mật, vì vậy bạn phải chuyển nó đến server theo cách thủ công. Để biết thêm thông tin về quy trình này, hãy tham khảo bước 3 của hướng dẫn tiên quyết về triển khai ứng dụng Phoenix .
- scp ~/myproject/config/prod.secret.exs sammy@your_server_ip:/home/sammy/app_config/prod.secret.exs
Sau đó gọi tác vụ ecto.create
Mix để tạo database phát triển. Lưu ý bạn không phải tạo database thử nghiệm vì Phoenix sẽ làm điều đó cho bạn khi bạn chạy thử nghiệm của bạn .
- mix ecto.create
Bạn sẽ thấy kết quả sau cho thấy rằng Ecto đã tạo thành công database :
Output... The database for Myproject.Repo has been created
Nếu bạn không thấy kết quả này, hãy đảm bảo chi tiết cấu hình của bạn là chính xác và MySQL đang chạy. Ecto cũng sẽ từ chối tạo database nếu ứng dụng của bạn không biên dịch được do bất kỳ lỗi nào.
Đến đây bạn đã cài đặt dự án để kết nối với database và thậm chí đã sử dụng Ecto để tạo database trong máy phát triển, bạn có thể tiến hành sửa đổi database trên server .
Bước 4 - Cài đặt database production
Với tác vụ ecto.create
Mix, bạn đã tạo một database trống trên máy phát triển của bạn . Bây giờ, bạn sẽ làm tương tự cho server production của bạn . Thật không may, không có bất kỳ tác vụ Kết hợp hoặc lệnh biên tập nào để giúp ta đạt được điều này, vì vậy bạn sẽ đăng nhập thủ công vào server và tạo database trống bằng các lệnh SQL bằng console MySQL.
Kết nối với server qua SSH.
- ssh sammy@your_server_ip
Bây giờ truy cập console MySQL bằng user gốc và password bạn đã cấu hình .
- mysql -u root -p
Sau khi đăng nhập, hãy tạo database production :
- CREATE DATABASE myproject_prod;
Bạn sẽ thấy kết quả sau, cho bạn biết database đã được tạo:
OutputQuery OK, 1 row affected (0.00 sec)
Tiếp theo, tạo user cho ứng dụng, sử dụng tên user myproject và password bạn đã chỉ định ở bước trước:
- CREATE USER 'myproject'@'localhost' IDENTIFIED BY 'password';
Sau đó, cấp cho user myproject quyền truy cập vào database bạn đã tạo:
- GRANT ALL PRIVILEGES ON myproject_prod.* to 'myproject'@'localhost';
Cuối cùng, hãy áp dụng các thay đổi về quyền:
- FLUSH PRIVILEGES;
Thoát khỏi console MySQL bằng lệnh exit
. Ngắt kết nối SSH bằng lệnh lại exit
.
Từ bây giờ, bạn sẽ hiếm khi phải chạm vào database production , vì bạn sẽ thực hiện hầu hết các thao tác như tạo và thay đổi bảng từ máy local của bạn .
Với database production hiện đã sẵn sàng, bạn có thể triển khai lại ứng dụng của bạn lên server .
Bước 5 - Triển khai Dự án lên Server
Trong bước này, bạn sẽ thay thế ứng dụng đang chạy không có kết nối với database bằng ứng dụng mới được cấu hình của bạn và repository Ecto mới của nó. Bước này sẽ cho phép bạn đảm bảo ứng dụng được cấu hình chính xác và nó vẫn chạy như mong đợi.
Mở mix.exs
và tăng version ứng dụng. Số version giúp dễ dàng theo dõi các bản phát hành và quay trở lại các version trước nếu cần. Nó cũng được sử dụng bởi edeliver để nâng cấp ứng dụng của bạn mà không cần thời gian chết.
- nano mix.exs
Tăng trường version lên một giá trị thích hợp.
def project do [ app: :myproject, version: "0.0.3", elixir: "~> 1.4", elixirc_paths: elixirc_paths(Mix.env), compilers: [:phoenix, :gettext] ++ Mix.compilers, start_permanent: Mix.env == :prod, deps: deps() ] end
Để sử dụng edeliver thực hiện di chuyển database , edeliver phải là ứng dụng cuối cùng bắt đầu trong dự án của bạn. Tìm khối mã sau:
def application do [ mod: {Myproject.Application, []}, extra_applications: [:logger, :runtime_tools] ] end
Thêm edeliver
vào cuối danh sách extra_applications
:
def application do [ mod: {Myproject.Application, []}, extra_applications: [:logger, :runtime_tools, :edeliver] ] end
Lưu và đóng mix.exs
.
Chạy ứng dụng đảm bảo mọi thứ hoạt động và không có lỗi biên dịch:
- mix phx.server
Truy cập địa chỉ http: // localhost: 4000 / đảm bảo ứng dụng vẫn hoạt động. Nếu nó không bắt đầu hoặc bạn thấy lỗi biên dịch, hãy xem lại các bước trong hướng dẫn này và giải quyết chúng trước khi tiếp tục.
Nếu mọi thứ đang hoạt động như mong đợi, hãy nhấn CTRL+C
hai lần trong terminal của bạn để dừng server .
Sau đó, commit các thay đổi với Git. Bạn phải làm điều này mỗi khi bạn thực hiện thay đổi đối với dự án của bạn vì edeliver sử dụng Git để đẩy mã từ commit mới nhất đến server xây dựng để thực hiện thêm hành động.
- git add .
- git commit -m "Configured application with database"
Cuối cùng, sử dụng edeliver để cập nhật ứng dụng trên server production . Lệnh sau sẽ xây dựng và triển khai version mới nhất của dự án của bạn trước khi nâng cấp ứng dụng đang chạy trên máy production mà không có thời gian chết.
- mix edeliver upgrade production
Bạn sẽ thấy kết quả sau:
OutputEDELIVER MYPROJECT WITH UPGRADE COMMAND -----> Upgrading to revision 2512398 from branch master -----> Detecting release versions on production hosts -----> Deploying upgrades to 1 online hosts -----> Checking whether installed version 0.0.2 is in release store -----> Building the upgrade from version 0.0.2 -----> Authorizing hosts -----> Validating * version 0.0.2 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 2512398838c2dcc43de3ccd869779dded4fd5b6b -----> Cleaning generated files from last build -----> Checking out 2512398838c2dcc43de3ccd869779dded4fd5b6b -----> Fetching / Updating dependencies -----> Compiling sources -----> Checking version of new release -----> Uploading archive of release 0.0.2 from local release store -----> Extracting archive myproject_0.0.2.tar.gz -----> Removing old releases which were included in upgrade package -----> Generating release -----> Removing built release 0.0.2 from remote release directory -----> Copying release 0.0.3 to local release store -----> Copying myproject.tar.gz to release store -----> Upgrading production hosts to version 0.0.3 -----> Authorizing hosts -----> Uploading archive of release 0.0.3 from local release store -----> Upgrading release to 0.0.3 UPGRADE DONE!
Mặc dù nâng cấp đã hoàn tất thành công, bạn sẽ không thể chạy các việc biên tập liên quan đến database cho đến khi khởi động lại ứng dụng.
Cảnh báo: Lệnh sau sẽ khiến ứng dụng của bạn offline trong một thời gian ngắn.
- mix edeliver restart production
Bạn sẽ thấy kết quả này:
OutputEDELIVER MYPROJECT WITH RESTART COMMAND -----> restarting production servers production node: user : sammy host : example.com path : /home/sammy/app_release response: ok RESTART DONE!
edeliver cho ta biết rằng nó đã khởi động lại thành công server production .
Để đảm bảo ứng dụng của bạn đã được nâng cấp, hãy chạy lệnh edeliver sau để truy xuất version của ứng dụng hiện đang chạy trên version production .
- mix edeliver version production
OutputEDELIVER MYPROJECT WITH VERSION COMMAND -----> getting release versions from production servers production node: user : sammy host : example.com path : /home/sammy/app_release response: 0.0.3 VERSION DONE!
Đầu ra cho ta biết rằng server production đang chạy version ứng dụng 0.0.3
.
Bạn cũng có thể truy cập ứng dụng của bạn tại https:// example.com
đảm bảo rằng ứng dụng đang chạy. Sẽ không có bất kỳ thay đổi nào có thể quan sát được đối với ứng dụng vì ta không chạm vào mã ứng dụng.
Nếu nâng cấp thành công nhưng không cập nhật được ứng dụng, hãy đảm bảo bạn đã commit mã của bạn và đã cập nhật version ứng dụng của bạn . Nếu lệnh nâng cấp không thành công, edeliver sẽ xuất ra mã cơ sở mà nó đang thực thi trên server khi lỗi xảy ra và chính thông báo lỗi. Bạn có thể sử dụng những manh mối này để khắc phục sự cố của bạn .
Đến đây bạn đã thêm hỗ trợ database vào ứng dụng của bạn và triển khai nó vào production , bây giờ bạn đã sẵn sàng để thêm một số tính năng sử dụng MySQL.
Bước 6 - Tạo sổ địa chỉ
Để chứng minh cách áp dụng các thay đổi database , hãy xây dựng một sổ địa chỉ đơn giản vào ứng dụng của ta và triển khai nó vào production .
Cảnh báo: Sổ địa chỉ này sẽ có thể truy cập và bất kỳ ai cũng có thể truy cập và chỉnh sửa nó. Hãy gỡ tính năng xuống sau khi hoàn thành hướng dẫn này hoặc thêm hệ thống xác thực như Guardian để giới hạn quyền truy cập.
Thay vì viết mã cho sổ địa chỉ từ đầu, ta sẽ sử dụng trình tạo Phoenix để tạo sổ địa chỉ. Trình tạo Phoenix là tiện ích tạo mã cho một tính năng CRUD (Tạo, Đọc, Cập nhật, Xóa) đơn giản. Điều này cung cấp một điểm khởi đầu tốt cho nhiều tính năng ứng dụng mà bạn có thể cần xây dựng.
Sổ địa chỉ cũng sẽ yêu cầu một bảng trong database để lưu trữ các mục nhập. Để thêm bảng này vào database , bạn có thể tạo và thực thi truy vấn SQL, nhưng thay vào đó ta sẽ sử dụng tính năng di chuyển của Ecto để sửa đổi database . Cách tiếp cận này có một vài lợi thế. Thứ nhất, nó độc lập với database ; các lệnh giống nhau cho dù bạn đang sử dụng PostgreSQL, MySQL hoặc một số database khác. Tiếp theo, các file di chuyển cung cấp một cách thuận tiện để theo dõi schemas database của bạn đã thay đổi như thế nào theo thời gian. Cuối cùng, bạn cũng có thể khôi phục các lần di chuyển mới nhất trên máy phát triển của bạn nếu cần.
Rất may, bạn không phải viết file di chuyển từ đầu vì trình tạo Phoenix sẽ tạo một file cho bạn trừ khi được chỉ định khác.
Để sử dụng trình tạo, hãy chỉ định ngữ cảnh, tên số ít của thực thể, tên số nhiều của thực thể và tất cả các trường khác với các kiểu tương ứng của chúng.
Bối cảnh là một module sẽ chứa các chức năng cho các tài nguyên liên quan. Ví dụ: nếu bạn đang có kế hoạch duy trì danh sách những user đã đăng ký trên trang web của bạn và log các phiên khi user đăng nhập, bạn nên đặt user và phiên trong một module ngữ cảnh duy nhất có tên là “Tài khoản”.
Lưu ý theo quy ước, Phoenix giả định tên số nhiều của thực thể là tên của bảng database cho tài nguyên đó.
Hãy tạo sổ địa chỉ với trình tạo. Để giữ cho sổ địa chỉ đơn giản, ta sẽ chỉ bao gồm ba trường cho mỗi bản ghi - tên, email và mã ZIP. Ta sẽ gọi mỗi mục nhập là một Address
, nhiều mục nhập là addresses
và ngữ cảnh trong đó sổ địa chỉ sẽ nằm dưới dạng AddressBook
.
Chạy lệnh này để tạo sổ địa chỉ:
- mix phx.gen.html AddressBook Address addresses name:string email:string zip_code:integer
Output* creating lib/myproject_web/controllers/address_controller.ex ... * creating priv/repo/migrations/20180318032834_create_address.exs Add the resource to your browser scope in web/router.ex: resources "/addresses", AddressController Remember to update your repository by running migrations: $ mix ecto.migrate
Phoenix cho ta biết rằng nó tự động tạo file mẫu, file thử nghiệm, mô hình, bộ điều khiển và file di chuyển. Nó cũng hướng dẫn ta thêm tài nguyên vào file bộ định tuyến và cập nhật repository .
Bạn có thể làm theo các hướng dẫn bạn thấy trong kết quả , nhưng bằng cách làm như vậy, bạn sẽ kết hợp nâng cấp mã ứng dụng và di chuyển database trong một bản phát hành duy nhất. Điều này có thể khiến các phần nhất định của ứng dụng bị lỗi trong quá trình production từ thời điểm ứng dụng được triển khai tới server production đến khi database production được di chuyển. Trong khoảng thời gian này, mã ứng dụng có thể tham chiếu đến các bảng hoặc cột không tồn tại trong database .
Để tránh thời gian chết và lỗi, hãy áp dụng các thay đổi theo hai bước:
- Thêm file di chuyển database với những thay đổi cần thiết cho database mà không thực hiện thay đổi đối với mã ứng dụng. Tạo bản phát hành, nâng cấp server production và di chuyển database production .
- áp dụng các thay đổi đối với mã ứng dụng, sau đó tạo và triển khai một bản phát hành khác.
Nếu ta không thực hiện phương pháp này, mã cho sổ địa chỉ sẽ cố gắng tham chiếu đến bảng địa chỉ mà ta chưa tạo và ứng dụng của ta sẽ gặp sự cố.
Trước khi ta di chuyển database production , hãy xem file di chuyển. Nó nằm ở priv/repo/migrations/ 20180501040548 _create_addresses.exs
, mặc dù tên file sẽ có một dấu dữ liệu khác dựa trên thời điểm bạn tạo. Mở file trong editor :
- nano priv/repo/migrations/*_create_addresses.exs
Tệp di chuyển do Phoenix tạo ra là một module Elixir với một chức năng duy nhất được gọi là change
. Khi bạn thực hiện quá trình di chuyển sau đó, hàm này sẽ được gọi.
defmodule Myproject.Repo.Migrations.CreateAddresses do use Ecto.Migration def change do create table(:addresses) do add :name, :string add :email, :string add :zip_code, :integer timestamps() end end end
Trong chức năng này, trình tạo Phoenix đã viết mã để tạo bảng addresses
cùng với các trường bạn đã cung cấp. Thêm vào đó, các máy phát điện cũng đã bao gồm các timestamps()
chức năng có thêm nhiều hai lĩnh vực dành cho bạn: inserted_at
và updated_at
. Các giá trị được lưu trữ trong các trường này được cập nhật tự động khi bạn chèn hoặc cập nhật dữ liệu.
Đóng file mà không thực hiện bất kỳ thay đổi nào; mã được tạo là tất cả những gì bạn cần.
Để chỉ triển khai file di chuyển mà không bao gồm mã ứng dụng, ta sẽ sử dụng thực tế là edeliver sử dụng Git để chuyển dự án của ta sang server xây dựng. Cụ thể, ta sẽ chỉ phân đoạn và xác nhận file di chuyển trong khi vẫn để phần còn lại của các file đã tạo không được theo dõi.
Nhưng trước khi bạn có thể làm điều đó, hãy tăng version ứng dụng trong mix.exs
. Edeliver sử dụng số version để chuẩn bị cho các bản nâng cấp nóng, vì vậy bạn cần tăng số version cho mỗi bản cập nhật.
Mở mix.exs
.
- nano mix.exs
Tăng version ứng dụng của bạn lên một giá trị thích hợp.
def project do [ app: :myproject, version: "0.0.4", ...
Lưu và đóng file .
Bây giờ, sử dụng Git để tạo cả file mix.exs
và file di chuyển.
- git add mix.exs priv/repo/migrations/*_create_addresses.exs
Tiếp theo, commit các file theo giai đoạn.
- git commit -m "Adding addresses table to the database"
Cùng với đó, hãy nâng cấp ứng dụng production của bạn với edeliver.
- mix edeliver upgrade production
Khi quá trình nâng cấp hoàn tất, hãy thực hiện lệnh edeliver sau để di chuyển database production .
mix edeliver migrate production
Kết quả kết quả cho thấy rằng quá trình di chuyển đã được chạy thành công và hiển thị dấu thời gian của file di chuyển:
OutputEDELIVER MYPROJECT WITH MIGRATE COMMAND -----> migrateing production servers production node: user : sammy host : example.com path : /home/sammy/app_release response: [20180501040548] MIGRATE DONE!
Database production hiện có một bảng trống có tên addresses
.
Trường response
sẽ hiển thị []
nếu không có quá trình di chuyển nào được chạy. Nếu đúng như vậy, hãy đảm bảo bạn đã commit mã của bạn bằng Git trước khi nâng cấp lại. Nếu sự cố vẫn tiếp diễn, hãy khởi động lại ứng dụng production bằng lệnh mix edeliver restart production
và chạy lại tác vụ di chuyển database .
Với bảng addresses
tại chỗ, ta có thể tiếp tục làm theo hướng dẫn do Phoenix đưa ra khi ta tạo sổ địa chỉ và tạo bản phát hành mới.
Đầu tiên, hãy mở file lib/myproject_web/router.ex
file :
nano lib/myproject_web/router.ex
Tìm khối mã sau:
scope "/", MyprojectWeb do pipe_through :browser get "/", PageController, :index end
Chèn tuyến đường cho tài nguyên addresses
:
scope "/", MyprojectWeb do pipe_through :browser get "/", PageController, :index resources "/addresses", AddressController end
Lưu và đóng router.ex
.
Tiếp theo, yêu cầu Ecto áp dụng các thay đổi đối với database local .
mix ecto.migrate
Kết quả kết quả cho thấy rằng hàm trong file di chuyển đã được gọi, đã tạo thành công addresses
bảng.
Output... [info] == Running Myproject.Repo.Migrations.CreateAddresses.change/0 forward [info] create table addresses [info] == Migrated in 0.0s
Bây giờ hãy khởi động server phát triển local để kiểm tra tính năng mới của bạn:
- mix phx.server
Trỏ trình duyệt của bạn vào địa chỉ http: // localhost: 4000 / để xem tính năng mới đang hoạt động.
Khi thấy ổn rằng mọi thứ đang hoạt động local , hãy quay lại terminal của bạn và nhấn CTRL+C
hai lần để kết thúc server .
Bây giờ mọi thứ đang hoạt động, bạn có thể áp dụng các thay đổi cho production . Mở mix.exs
để cập nhật version ứng dụng.
- nano mix.exs
Tăng trường version lên một giá trị thích hợp.
def project do [ app: :myproject, version: "0.0.5", elixir: "~> 1.4", elixirc_paths: elixirc_paths(Mix.env), compilers: [:phoenix, :gettext] ++ Mix.compilers, start_permanent: Mix.env == :prod, deps: deps() ] end
Lưu và đóng mix.exs
.
Commit các thay đổi với Git. Lần này, giai đoạn tất cả các file .
git add . git commit -m "Added application code for address book"
Nâng cấp ứng dụng production với edeliver.
mix edeliver upgrade production
Khi quá trình cập nhật hoàn tất, bạn có thể truy cập tính năng mới tại https:// example.com /addresses
.
Như vậy, bạn đã nâng cấp thành công ứng dụng production và database .
Kết luận
Trong bài viết này, bạn đã cấu hình ứng dụng Phoenix của bạn để sử dụng database MySQL và sử dụng di chuyển edeliver và Ecto để áp dụng các thay đổi đối với database production . Với phương pháp này, bạn không phải chạm vào database production và bất kỳ thay đổi nào bạn muốn thực hiện đối với database production đều được thực hiện thông qua các file di chuyển Ecto. Điều này giúp bạn dễ dàng quay lại các thay đổi và theo dõi các thay đổi đối với database theo thời gian.
Để tìm hiểu thêm về di chuyển Ecto và cách thực hiện các thao tác database phức tạp, hãy tham khảo tài liệu di chuyển Ecto chính thức .
Các tin liên quan
Cách sử dụng ProxySQL làm Bộ cân bằng tải cho MySQL trên Ubuntu 16.042018-01-08
Cách backup database MySQL vào lưu trữ đối tượng với Percona trên Ubuntu 16.04
2017-10-19
Cách cài đặt Lighttpd với MySQL và PHP trên FreeBSD 11.0
2017-09-18
Cách cấu hình backup MySQL với Percona XtraBackup trên Ubuntu 16.04
2017-08-30
Cách cấu hình sao chép nhóm MySQL trên Ubuntu 16.04
2017-04-13
Cách cài đặt MySQL mới nhất trên Ubuntu 16.04
2017-04-06
Cách cấu hình SSL / TLS cho MySQL trên Ubuntu 16.04
2017-03-20
Cách Import, Export database trong MySQL hoặc MariaDB
2016-12-21
Cách thay đổi thư mục dữ liệu MySQL sang vị trí mới trên CentOS 7
2016-12-19
Cách thay đổi thư mục dữ liệu MySQL sang vị trí mới bằng cách sử dụng liên kết biểu tượng
2016-12-02