🥾

Elixir + Phonenix でWebアプリ作る時の基本まとめ:データベースの準備とWebアプリの起動

2021/06/22に公開

環境構築はこちらを。今回はこの続き。
Elixir + Phonenix でWebアプリ作る時の基本まとめ:環境構

PostgreSQLデータベースの認証方式を設定

PhoenixはデフォルトのデータベースとしてPostgreSQLを使う。まずはこいつをパスワード認証でログインできるようにしよう。

/etc/postgresql/10/main/pg_hba.conf
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

前回の環境構築でPostgreSQLをインストールし、既に起動しているものとすると、 /etc/postgresql/10/main/pg_hba.confの中身は上記のようになっているものと思う。
この時点では postgresユーザーのpeer認証しか成功しない。しかしながらpostgreユーザーのOSパスワードも設定されていないので、まずはそれを設定してログインできるようにしなければならない。

$ sudo passwd postgres

新しい UNIX パスワードを入力してください:(新しいパスワードを入力) 
新しい UNIX パスワードを再入力してください: (新しいパスワードを入力)
passwd: パスワードは正しく更新されました

無事パスワードを更新できたら、postgresユーザーになる。

$ su postgres

ログインできたら、postgresqlに接続。

$ psql -U postgres template1

psql (10.17 (Ubuntu 10.17-0ubuntu0.18.04.1))
Type "help" for help.

template1=#

PostgreSQLに接続できたら、postgresユーザーのパスワードを設定する。
ここではパスワード kuroneko123 を設定するものとしよう。

alter user postgres with encrypted password 'kuroneko123';

設定したら \q と入力してデータベースとの接続を終了し、さらに exit してpostgresユーザーから自分の元のユーザーに戻る。
そして設定したパスワードで接続を試みる。

$ psql -U postgres -h localhost template1
Password for user postgres:

パスワードの入力を求められるので、先程設定した kuroneko123 と入力すればログインできる。

はじめてのWebアプリを作成する

アプリの新規作成。ここではアプリ名をkuronekoとする。

$ mix phx.new kuroneko

途中で依存関係にあるライブラリをインストールするか質問してくるのでYと答える。

作成されたアプリのディレクトリへ移動

$ cd kuroneko

好きなエディタでconfig/dev.exsの中のデータベースへの接続パラメータを編集する。

config/dev.exs
use Mix.Config

# Configure your database
config :kuroneko, Kuroneko.Repo,
  username: "postgres",
  password: "kuroneko123",
  database: "kuroneko_dev",
  hostname: "localhost",
  show_sensitive_data_on_connection_error: true,
  pool_size: 10

パスワードを先程設定したパスワードに書き換える。
なお、データベースはこの後の工程で作られるので、この時点でデータベースが存在する必要はない。

続いてデータベースのセットアップを行う。

$ mix ecto.create

これで準備完了。

Webアプリを起動する。

アプリの起動

$ mix phx.server

エラーが出て無ければ既にアプリは起動している。ブラウザでいかにアクセス。
http://localhost:4000

こんな感じの画面が表示されていれば成功。

アプリのディレクトリ構造

アプリのルート直下はこんな感じになっている。

ls
README.md  _build  assets  config  deps  lib  mix.exs  mix.lock  priv  test

このうち、depsなんかは依存関係にあるライブラリがあってデカイので、ここでは無視して、config, lib, priv, test を見てみる。

tree config lib priv test
config
├── config.exs
├── dev.exs
├── prod.exs
├── prod.secret.exs
└── test.exs
lib
├── kuroneko
│   ├── application.ex
│   └── repo.ex
├── kuroneko.ex
├── kuroneko_web
│   ├── channels
│   │   └── user_socket.ex
│   ├── controllers
│   │   └── page_controller.ex
│   ├── endpoint.ex
│   ├── gettext.ex
│   ├── router.ex
│   ├── telemetry.ex
│   ├── templates
│   │   ├── layout
│   │   │   └── app.html.eex
│   │   └── page
│   │       └── index.html.eex
│   └── views
│       ├── error_helpers.ex
│       ├── error_view.ex
│       ├── layout_view.ex
│       └── page_view.ex
└── kuroneko_web.ex
priv
├── gettext
│   ├── en
│   │   └── LC_MESSAGES
│   │       └── errors.po
│   └── errors.pot
├── repo
│   ├── migrations
│   └── seeds.exs
└── static
    ├── css
    │   └── app.css
    ├── favicon.ico
    ├── images
    │   └── phoenix.png
    ├── js
    │   └── app.js
    └── robots.txt
test
├── kuroneko_web
│   ├── channels
│   ├── controllers
│   │   └── page_controller_test.exs
│   └── views
│       ├── error_view_test.exs
│       ├── layout_view_test.exs
│       └── page_view_test.exs
├── support
│   ├── channel_case.ex
│   ├── conn_case.ex
│   └── data_case.ex
└── test_helper.exs

今回はここまで。お疲れ様でした。

Discussion