LoginSignup
6
2

More than 1 year has passed since last update.

Hacobuneにデータベースを使うPhoenix Chatアプリをデプロイする(Elixir)

Last updated at Posted at 2021-08-22

はじめに

  • Elixirを楽しんでいますか:bangbang::bangbang::bangbang:
  • さくらインターネット株式会社さんが提供している、PaaS型クラウドサービス「Hacobune(はこぶね)」に、Phoenixを利用してつくったChatアプリをデプロイしてみます
  • デプロイ方法は次の3種類があります
    • ① パブリックのDockerイメージを使用
    • ② プライベートのDockerイメージを使用
    • ③ GitHubレポジトリをHacobuneに接続して使用(Dockerfileが必須)
  • この記事では自分でビルドしたDockerイメージをDocker HubにPushして、そのイメージを使うことで、① パブリックのDockerイメージを使用 にてデプロイをします
  • データベースはHacobuneの中にある「アドオン」機能の中からMySQLを使ってみます1
  • この記事は、Hacobuneへのデプロイを主題としています

できたもの

  • https://phx-chat.c1.hacobuneapp.com/rooms
    • テスト用のユーザは、awesome@awesome.comtest@awesome.com を登録しています
      • パスワードは123456789012です
    • ご自由にお使いください
  • Registerからユーザ登録することもできます

output.gif

  • それぞれ別のユーザでログインしています
  • ある人の投稿操作が他の人に即座に反映されている様子を示しています
  • 見た目がそっけないのはご容赦ください :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

ソースコード

参考にした資料 |> ありがとうございます!!!

アプリケーションの仮登録

config/prod.exs
config :hacobune_phx, HacobunePhxWeb.Endpoint,
  url: [host: "phx-chat.c1.hacobuneapp.com", port: 443],
  cache_static_manifest: "priv/static/cache_manifest.json"

Dockerイメージの作成

  • ソースコードはあのレベルまで持っていくにもいろいろとあるにはあるのですが、参考資料によりなんとかかんとかつくりました
    • mix phx.newするときに、--database mysqlを指定しました
  • プロジェクトのルートに以下のようなDockerfileをつくりました2
Dockerfile
FROM elixir:1.12.2-alpine AS build

# install build dependencies
RUN apk add --no-cache build-base npm git

# prepare build dir
WORKDIR /app

# install hex + rebar
RUN mix local.hex --force && \
    mix local.rebar --force

# set build ENV
ENV MIX_ENV=prod

# install mix dependencies
COPY mix.exs mix.lock ./
COPY config config
RUN mix do deps.get, deps.compile

# build assets
COPY assets/package.json assets/package-lock.json ./assets/
RUN npm --prefix ./assets ci --progress=false --no-audit --loglevel=error

COPY priv priv
COPY assets assets
RUN npm run --prefix ./assets deploy
RUN mix phx.digest

# compile and build release
COPY lib lib
# uncomment COPY if rel/ exists
# COPY rel rel
RUN mix do compile, release

# prepare release image
FROM alpine:3.9 AS app
RUN apk add --no-cache openssl ncurses-libs bash libstdc++

WORKDIR /app

RUN chown nobody:nobody /app

USER nobody:nobody

COPY --from=build --chown=nobody:nobody /app/_build/prod/rel/hacobune_phx ./
COPY entrypoint.sh .

ENV HOME=/app

CMD ["bash", "/app/entrypoint.sh"]
entrypoint.sh
bin="/app/bin/hacobune_phx"
# start the elixir application
eval "$bin eval \"HacobunePhx.Release.migrate\""
exec "$bin" "start"
  • 以下のようにしてDockerイメージをDocker HubにPushしました
  • Docker Hubにアカウントを登録しておいてください
$ docker build -t hacobune_phx .
$ docker tag hacobune_phx torifukukaiou/hacobune_phx:0.2.0
$ docker login
$ docker push torifukukaiou/hacobune_phx:0.2.0

アドオン(MySQL)の作成

スクリーンショット 2021-08-22 21.32.47.png

  • こんな感じでMySQLを選びます
  • (ディスクサイズは1GBを選んでいたような気がしますがβ版だからなのか表示上は0GBになっています)

データベースの作成

$ mysql -uroot -h <IPアドレス> -P <ポート番号> -p

mysql> CREATE DATABASE hacobune_phx DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> quit

アプリケーションの登録

スクリーンショット 2021-08-22 21.40.00.png

  • Dockerイメージ名には、torifukukaiou/hacobune_phx:0.2.0のような感じで指定します
  • ポートは4000番にしておきます
  • 環境変数は以下の2つを設定しておきます
    • DATABASE_URL
      • ecto://root:<password>@mysql:3306/hacobune_phx
        • ecto://<user>:<password>@HOST:PORT/database_name
        • アドオン名をmysqlとつけたのでHOSTは、mysqlとなっています
        • <password>はMySQLのアドオンを作成するときに指定したパスワードです
    • SECRET_KEY_BASE
      • 開発マシンでプロジェクトのルートにてmix phx.gen.secretをして出力された長い文字列を指定します

Run :rocket::rocket::rocket:

  • 以上でChatアプリがイゴくようになりました3 :tada::tada::tada:
  • もう一度、WebアプリのURLを書いておきます
  • https://phx-chat.c1.hacobuneapp.com/rooms
    • テスト用のユーザは、awesome@awesome.comtest@awesome.com を登録しています
      • パスワードは123456789012です
    • ご自由にお使いください

Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:

  • Hacobune(はこぶね)に、Phoenixアプリを簡単にデプロイすることができました
  • PhoenixにてChatアプリを作るのはとてもいい勉強になりました
    • Chatアプリの作り方については、Phoenix 1.6.0の正式リリース後に改めて書きたいとおもっています4
  • Enjoy Elixir :bangbang::bangbang::bangbang:

  1. PhoenixといえばPostgreSQLですが、2021/08/22現在のHacobune β版では、MySQLとRedisの2つが提供されています 

  2. 前の節でホスト名を直打ちして固定しているのでこのDockerイメージは私以外に使いみちがありません 

  3. 記事では一本道でできるように書きましたが、実際には一歩進んで二歩下がるみたいなことを繰り返しました :sweat_smile: 

  4. おもっています5 

  5. あくまでもおもっています 

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2