傘のおかげでElixirで複数のWebアプリを構築する方法—パート2:プロジェクトをセットアップする

Elixir 1.9、Phoenix 1.4、Docker(開発用)、Git(サブモジュールを含む)を使用してWebアプリを作成し、各アプリをバージョンアップする方法、PostgresQL、Redis、API呼び出し、およびデプロイを学ぶための(希望する)ガイド。

このガイドは、背後にいくつかのプロジェクトがあり、Elixirを試してみたい開発者を対象としています。この第2部では、プロジェクトのセットアップ方法を説明します。

概要

  • なぜエリクサーなのか?
  • プロジェクトをセットアップする
  • 管理Webサイトパート1のユーザーを作成する:ブートストラップ、エンティティ、およびテスト
  • 管理Webサイトパート2のユーザーを作成する:セキュリティとパスワード
  • Umbrellaアプリを展開する
  • APIを作成する
  • 集約サービスを作成する
  • リアルタイムアプリケーションのチャネルを処理する

新しい!ここでガイドのソースを見つけることができます:https://github.com/aridjar-umbrella-guide/medium_umbrella!ガイドをアップグレードすると同時にアップグレードします!

この章では、アンブレラアプリとその子アプリ、dockerをインストール、作成、構成して、各プロジェクトをgitリポジトリに保存する方法について説明します。

このガイドでは、関連する部分のgitのサブモジュール部分を調べるだけなので、gitリポジトリを作成する方法を知っておくことをお勧めします。ドッカーに関する知識は必要ありません。

Elixir、Docker、およびNodeをインストールする

Dockerを知らない人のために、Dockerfileを作成し、それを使用して、制御された仮想環境から言語にリンクされたすべてのインストールとコマンドを実行できます。しかし、だれもが強制的にdockerを使用することになり、一部のユーザーはそれを避けたいかもしれません。

それでは、まず、次のガイドに従ってElixirをインストールしましょう:Elixirのインストール。完了したら、ターミナルを開いて入力します

$> mix -v

同様の出力があるはずです:

注:dockerでErland / OTPバージョンをチェックアウトして、一致するバージョンがあることを確認することもできます(そうしないと、問題が発生する可能性があります)。そのためには、docker-elixirリポジトリに移動し、最新バージョン(実際には1.9)を選択して、Dockerfileという名前のファイルを開きます。最初の行には、使用されているバージョンが表示されます。バージョンが異なる場合は、Erlangをインストールしてください。

エリクサーをインストールしたら、フェニックスの世話をしましょう。 Elixirのメインフレームワークであるため、これを使用してWebアプリを作成します。

$> mix archive.install hex phx_new 1.4.2

これが機能しない場合、古いコマンドを使用してGithubからインストールできるはずです。

$> mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez

次に、Dockerをインストールしましょう。

注:必須ではありませんが、このガイドでは、データベースなど、さまざまなものを構成および処理する他の方法を提供しません。

Dockerをインストールしたら、シェルを再起動して次のように入力します。

docker -v

バージョンが表示されるはずです。そうでない場合は、Dockerフォルダーを$ pathに追加します。

最後に、コンピューターにNodeがまだインストールされていない場合は、node.jsをインストールするガイドに従ってください。ただし、Dockerコンテナ内のノードとアセットをコンパイルして実行するため、必須ではありません。

アンブレラアプリを作成する

必要なものをすべてインストールしたので、アンブレラアプリケーションについて少し話しましょう。

Elixir Umbrellaアプリケーションは、一連の子アプリケーションを格納および管理する1つの親アプリケーションを定義します。

これは、互いに分離された複数のアプリを作成する代わりに、各アプリが傘を介して他のアプリにリンクされるため、マイクロサービスとモノリスアプリケーションの両方の利点が得られることを意味します。

しかし、十分な話!アンブレラアプリを作成するには、次を入力する必要があります。

$> mix phx.new [destination_folder] --umbrella

各単語を詳しく見てみましょう。

  • mixはエリクサーのパッケージマネージャーです。NPMはJavaScript用です。
  • phxは、Phoenixフレームワークにリンクされたキーワードです。
  • new新しいアプリを作成します。詳細を知りたい場合は、コマンドシェルでmix phx.newを記述するだけです。ドキュメントが表示されます。 phxなしの新機能。後で見るように、前に簡単なElixirアプリを作成します。
  • [destination_folder]は、アプリケーションを配置する場所です。
注:アンブレラアプリの場合、フォルダーを作成し、名前の後に_umbrellaを追加します。
  • --umbrellaはmixに傘のアプリを作成するよう指示します。

ある時点で、このコマンドは依存関係を取得してインストールするかどうかを尋ねます。 Dockerを使用する場合、必須ではありません。それ以外の場合は、Yと入力してEnterキーを押します。

このコマンドは、2つのフォルダー(appsおよびconfig)と、複数の環境の構成ファイルを含むいくつかのファイルを持つアプリケーションを作成します。それらのほとんどはコモンです(.gitignore、README.md…)。

知らないかもしれない2つのファイルは、.formatter.exsとmix.exsです。それぞれがElixirスクリプトファイル(.exs)です。 mix.exsは、このプロジェクトのミックス構成を処理し、説明、依存関係、およびその他のものを含めます。 .formatter.exsについては、いくつかの段落で説明します。

コマンドがやらなければならないことをすべて行ったら、エリクサーがあなたに行うようにアドバイスしていることに従わない。代わりに:

$> cd [destination_folder] _umbrella && rm -rf ./apps/*

そうすると、アンブレラアプリの作成時にPhoenixが生成した2つのアプリが消去されます。あなたが望むものに応じて、それらを保持することができます。ただし、このガイドに関しては、それらを使用しません。公開アプリケーションの場合は「ウェブ」です。 NodeサーバーでAngularを使用していますが、おそらくReactやVueJSなど、フロントエンド用に構築されたものも好むでしょう。

また、アプリケーションの名前を変更したいので、バックエンドも削除しました。

注:JSフロントエンドプロジェクトを傘アプリでホストおよびコンパイルできると主張する方もいらっしゃるかもしれません。おそらく正しいでしょうが、少なくとも今のところは、その方法を理解するために時間を費やしたくありません。しかし、あなたがそれを行う方法を知っているなら、中程度の記事を書いて、私にそれへのリンクを送ってください、そして、私はそれをここに投稿します! :)

最後に、.formatter.exsは、mix formatコマンドを使用できるファイルです。目的は、エリクシルコードを含む各ファイルをフォーマットすることです。そのため、同じ書き込み規則に従い、誰でも読みやすくなります。

IIは、関数型言語は反復型言語やオブジェクト言語ほど寛容ではないため、特に関数型パラダイム(多くの短く純粋な関数)の主な考え方に従う場合、コードに大きな影響を与えるべきではありませんが、状況の。

次に、内部に5つのプロジェクトを作成します。

そのためには、appsフォルダーに移動しましょう。

$> cdアプリ
警告!!注意:作成する各フォルダの名前は、gitリポジトリの名前と同じにする必要があります。これは、複雑化や過度の無駄な構成を避けるためです。

このフォルダーは、作成する各アプリを含むように設計されています。最初のものは管理Webサイトになります。そのためには、次のコマンドを実行します。

$> mix phx.new admin --app admin --no-ecto

--app [name]オプションを使用すると、ErlangランタイムシステムであるOTPアプリケーションの名前を定義できます(定義を単純化します:独立したアプリであり、同時に完全なライブラリです)。

--no-ectoオプションは、Ectoファイルを作成する手順を削除します。これは、PostgreSQLデータベースと対話する方法です。

メインモジュールに特定の名前が必要な場合は、-moduleオプションを使用できます。使用しないため、モジュールはフォルダーの名前(ここではadmin)を使用します。

注:モジュールは常に大文字で始まります。

次のガイドのために、作成したアプリの探索を続けます。この部分で行う唯一の変更は、Dockerのセットアップ後の各構成ファイルになります。

--no-ectoオプションを設定する際、データベースと対話するアプリを作成する必要があります。

$>新しいデータベースを混合--appデータベース--sup

ここではPhoenixアプリを作成しませんが、-supオプションのおかげで監視ツリーを備えた通常のElixirアプリのみを作成します。このオプションは、Phoenixアプリの実行に必須であるため、Phoenixアプリで自動的に行われます。

APIアプリをビルドするコマンドは次のとおりです。

$> mix phx.new api --app api --no-webpack --no-html --no-ecto

--no-webpackオプションは、CSSおよびJavaScriptベースを作成する手順を削除します。 APIを実行する際、それらは必要ありません。

--no-htmlオプションは、テンプレートを作成するステップをキャンセルします。

注:次のガイドでデータベースと管理者を比較し、「APIの作成」部分で管理者とAPIを比較します。

最後の2つのアプリを作成しましょう。

$>新しいアグリゲーターの組み合わせ--appアグリゲーター--sup
$> mix phx.new webhook --app webhook --no-webpack --no-html --no-ecto

API、アグリゲーター、webhookアプリを別々に動作させたいので、それらを分離します。各アプリは独立している可能性があるため、APIを停止することをお勧めしますが、たとえばセキュリティ違反が発生した場合は、アグリゲーターやwebhookを停止することはできません。

アグリゲーターの目的は、Twitterニュースフィードから投稿を取得することです。Webhookは、アプリケーションに接続しているユーザーにデータを送信するためにあります。 Aggregatorを呼び出すべきではありません(ただし呼び出す必要があります)ので、ここではPhoenixは必要ありません。 Poisonを使用してHTTP呼び出しを処理しますが、適切な部分でこれを確認します。

これで完了です!しかし、Dockerに進む前に、1つのファイルに1行追加する必要があります。

  • apps / admin / assets / package.json addで、スクリプト部分の「build」:「webpack --mode development」を追加します。そうすることで、後でいくつかの問題を回避できます。

Dockerを今すぐ処理しましょう

アンブレラプロジェクトとサブプロジェクトが作成されると、Dockerに集中できます。そのためには、3つのファイルを作成する必要があります。

  • Dockerfile
  • docker-compose.yml
  • .env

Dockerfileは、コンテナーで使用されるドッカーイメージを作成します。

実行に必要なすべてのもの(コード、ランタイム、システムツール、システムライブラリ、設定)を含むソフトウェアの軽量でスタンドアロンの実行可能パッケージ。

Dockerfileを作成するには、IDEをアンブレラアプリのルートに開き、Dockerfileというファイルを追加します。コマンドのリストが含まれます。このリストは、完全に1回実行され、各コマンドは個別の一時コンテナーに入れられます。そして、実行するフルイメージを作成します。

次に、Docker-composeで作業します。

Docker-composeは、マルチコンテナDockerアプリケーションを定義および実行するためのツールです。

docker-composeファイルは、使用するコンテナを定義します。また、いくつかの構成とenv変数を定義します。 docker-composeファイルはルートで作成され、docker-compose.ymlと呼ばれる必要があります。作成したら、次のコードを内部に配置します。

環境変数が含まれているため、.envを構築する必要があります。

.envを.gitignoreに追加し、.env.distを作成して、入力したデータを共有せずに構造を共有することをお勧めします(パスワード、APIキーなどを保護します)。

docker-compose.ymlと.envファイルが作成されたら、dockerイメージをビルドする必要があります。

$> docker-composeビルド

ビルドが完了したら、docker-composeを試してみましょう。

$> docker-compose up

ローカルストレージを共有するか、dockerの特定の構成を行う必要がある場合があります。また、エリクサーサーバーのシャットダウンが発生する可能性があり、そうでない場合は、おそらくエラーメッセージが表示されます。何も設定しなかったため、これは正常です。動作していても、まだ準備ができていません。

ctlr + cでプロセスを強制終了し、次のコマンドを使用してサイレントモードでPostgresとRedisを起動します。

$> docker-compose up -d postgres redis

それらはバックグラウンドタスクとして実行されるので、それらを気にする必要はなく、ログに邪魔されることもありません。

次に、PostgresコンテナーのIPを取得して、構成ファイルで使用できるようにします。そのためには、次を入力します。

$>ドッカーps
$> docker inspect -f '{{range.NetworkSettings.Networks}} {{。IPAddress}} {{end}}' [postgres_container_id]

docker psは、実行中のコンテナーのリストを表示します。 PostgresコンテナのIDで、2番目のコマンドを使用してIPを抽出し、後で使用するために保存します。

docker inspectを使用すると、特定のコンテナーに関するデータを取得できます。渡されたオプションにより、コンテナのIPのみを取得できます。これは、.envファイルで使用します。これを行うには、PSQL_HOST値をこの最後のコマンドから取得した結果に置き換えます。

注:IPは起動順序によって決定されるため、常にpostgresを最初に起動し、次に再起動します。

生活を簡素化するために、重要なコマンドdocker-compose execを使用して、データベースを手動で作成します。そのためには、次を入力します。

$> docker-compose exec postgres psqlユーザーuser

docker-compose execは、特定のコンテナ(ここではpostgrescontainerにあります)でコマンドを実行します。

コマンドであるpsqlはPostgresのシェルであり、接続するにはデータベースとロール(ここではユーザーとユーザー)が必要です。 devおよびテストデータベースを作成するには、次のコマンドを入力します。

CREATE DATABASE test_dev;
CREATE DATABASE test_test;

データベースが作成されたかどうかを確認するには、\ lと入力してEnterキーを押します。リストの最後に、2つのデータベースが表示されます。

PSQLを終了するには、単に\ qと入力してEnterキーを押します。最後に、すべてのコンテナを停止するには、次を使用できます。

$> docker-compose stop

構成アプリ

5つのアプリが作成され、Dockerが動作するようになったので、4つのフェニックスアプリで最初に少し構成を行います。

  • データベースが作成された各アプリで、config / devs.exsおよびconfig / test.exsファイルを開きます
  • dev.exsで、ポートを4001、4002、4003、および4004に変更します(アプリごとに1ポート)
  • test.exsで、ポートを4101、4102、4103、4104に変更します(アプリごとに1つのポート)

フェニックスアプリについては以上です。ただし、データベースアプリも構成する必要があります。ここでのすべての変更は、アプリ/データベースで行われます。

  • configフォルダーを作成します。内部で、config.exs、dev.exs、prod.exs、prod.secret.exs、test.exsの5つのファイルを作成します
  • 各ファイルで、最初にuse.Mix.Configを追加します
  • config.exsで、次の行を追加します。
config:database、
  ecto_repos:[Database.Repo]
import_config "#{Mix.env()}。exs"
  • prod.exsで、次の行を追加します。import_config“ prod.secret.exs”
  • 他の各ファイルに追加します(最後の2行に注意してください)。
config:database、Database.Repo、
  ユーザー名:System.get_env( "POSTGRES_USER")、
  パスワード:System.get_env( "POSTGRES_PASSWORD")、
  データベース:System.get_env( "POSTGRES_DB_EN​​V")、#envをdevに置き換え、ファイルに応じてテストまたは削除します
  ホスト名:System.get_env( "POSTGRES_HOST")、
  pool_size:10#in dev.exs et prod.secret.exs
  プール:test.exsのEcto.Adapters.SQL.Sandbox#

最後に、データベースアプリにEctoを追加しましょう。

  • database / mix.exsを開き、プロジェクトリストでエイリアスを追加します:aliases()。
  • データベース/mix.exsのdepsリストに、{:ecto_sql、 "〜> 3.0"}および{:postgrex、 "> = 0.0.0"}を追加します。
  • もう一度、database / mix.exsで、次のようなエイリアス関数を追加します。
defpエイリアスは
  [
    「ecto.setup」:[「ecto.create」、「ecto.migrate」、「run priv / repo / seeds.exs」]、
    「ecto.reset」:[「ecto.drop」、「ecto.setup」]、
    テスト:[「ecto.create — quiet」、「ecto.migrate」、「test」]
  ]
終わり
  • ここで、lib / database / application.exを開き、子リストにDatabase.Repoを追加します
  • 最後に、lib / database / repo.exを作成し、次の内部に配置します。
defmodule Database.Repo do
  Ecto.Repoを使用して、
    otp_app::database、
    アダプター:Ecto.Adapters.Postgres
終わり

これで呼吸ができ、設定とセットアップは終了しました。

設定が完了したら、Elixirコンテナを再試行します。

$> docker-compose up -d postgres
$> docker-compose up elixir

ブラウザーに移動して、localhost:4001と入力します。次の図のようなものが表示されるはずです。つまり、PhoenixとDockerは適切に構成されています。

gitサブモジュールを少し追加してみましょう

プロジェクトの準備ができたので、アンブレラアプリのgitリポジトリを作成しましょう。

重要:傘には他のプロジェクトが含まれているため、現時点では追加、コミット、プッシュを行わないでください。プロジェクトをgitリポジトリにリンクするだけです(git initおよびgit remote add origin)。

このガイドはgitの経験がある人を対象としているため、その方法を知っていることを期待しています。そうでない場合は、次のガイドに従ってください。

  • オープンソースプロジェクトを作成する場合:Github
  • プライベートリポジトリが必要な場合:Gitlab

オープンソースのGithubプロジェクトを作成する場合、gitプロジェクトの作成中に.gitignoreを追加しないでください。引き続きLICENSEファイルを作成できます。その場合、プッシュする前に、次のことを行う必要があります。

$> git pull#失敗するはずですが、マスターにアクセスできます
$> git --set-upstream-to = origin / master master
$> git pull --allow-unrelated-histories

プロジェクトを作成してリポジトリに追加したら、appsフォルダーに移動します。

$> cd ./apps

Gitサブモジュール

アプリフォルダーと同じ名前で、各アプリのgitに新しいプロジェクトを作成します。繰り返しますが、これは必要以上に多くの設定を行う必要がないようにするために非常に重要です。

各アプリを関連するgitリポジトリにリンクしてプッシュします。完了したら、appsフォルダーに戻ります。ここから、同じコマンドを5回入力するだけです。

$> git submodules add [repository_url]

最初のコマンドが完了すると、新しいファイル.gitmoduleが作成されます。使用される各サブモジュールのリストが含まれています。

サブモジュールについての言葉:単純なgit pullを使用して、プロジェクトのルートでサブモジュールを更新できるはずです。しかし、私のように、各アプリを取り込む必要もあります。私はおそらくあなたと一緒にいるほど良くはないでしょう。

サブモジュールを使用するという考え方は、他の人がアクセスしたい選択したアプリのみにアクセスできるようにするだけでなく、他のアプリが動作する必要がないため、アプリを差別化することです。これにより、進化の分離した追跡を維持することもできます(すべてのブランチなし)。

重要:すべてをアンブレラアプリのgitリポジトリに追加し、コミットしてプッシュできるようになりました。

このガイドを終了するために、2つの必須ではないコマンドを実行できます。

$> mix deps.get

必要なElixirの依存関係をダウンロードします。

$> cd apps / admin / assets
$> npmインストール
$> npm run build

これにより、JS依存関係がダウンロードされ、/ priv / staticにそれら(およびCSS)がコンパイルされます。警告:このようにすると、このフォルダーのパスをdocker-composeに入れなかったため、dockerコンテナーのstaticを上書きできます。

それが今日のすべてです!この2番目のチュートリアルがあなたを満足させ、アンブレラElixirプロジェクトのセットアップに役立つことを願っています。

次のガイドでは、管理Webサイトのユーザー部分を作成し、ブートストラップを追加します。

次回まで、ハッピーコーディング!

2019年3月18日編集:

  • すべてのdockerファイルを変更します(env設定に関するEduard Liberumedからのアドバイスを含む)
  • 5番目のアプリを追加して、データベースとのすべてのやり取りを処理します。APIからのセキュリティ侵害の考えに沿って(最初のアイデアでは、APIを停止すると他のアプリでエラーが発生します。
  • 最初の4つのアプリからEctoを削除します
  • 5番目のアプリはフェニックスアプリではないため、Ectoセットアップを追加します

執筆に戻るには時間がかかりましたが、このガイドを通じてアンブレラプロジェクトについて詳しく知りたいと思っている人には謝罪します。人生はちょうど起こった。

19/03/2019の編集:git部分にいくつかの詳細を追加します

編集20/03/2019:Dockerfile RUN apt-get install -y inotify-toolsに行を追加します

編集03/08/2019:Elixir 1.9への更新

編集17/09/2019:アグリゲーターをPhoenixアプリケーションから通常のアプリケーションに変更します。