Phoenixサイト作成アラカルト

# はじめに

naritomoと申します。

本記事ではPhoenixサイトにおける以下の作業について
提示したいと思います。

* githubサイトからのソース入手方法
* github初期登録方法
* github複数アカウントでのssh鍵切り替え方法
* DB切り替え機能実装
* gigalixirデプロイ
* gifalixirサイト削除

## 前提作業

以下のサイトを参照し、サイト完成してること。

[Elixir/Phoenixをdocker環境で立ち上げてみる。](https://qiita.com/naritomo08/items/fecf4ace7b9ca9078102)

## githubサイトからのソース入手方法

githubからとあるソースをcloneではなくDLで取得したい場合、
以下のコマンドを入力する。

```bash
curl -L -o temp.zip <githubでのソース圧縮ファイルDL URL>
unzip temp.zip
rm temp.zip
mv <解凍フォルダ名> testsite
cd testsite
```

## github初期登録

### 新しいターミナルを立ち上げ、作成したフォルダに移動

```bash
cd elixir-docker-db/apps/testsite
```

### gitローカルリポジトリ作成

＊初期サイト作成した場合でも、以下の作業までは行っておくとよい。
　作業の途中でコミットかけておけば、いざという時に
　コミット時点に戻すことが可能。

＊特定のコミットポイントへの戻し方や、ブランチの建て方/結合などの
　手順はここでは割愛。
　
初回時:
```bash
git init
git config --local user.name [name]
git config --local user.email [email]
git add .
git commit -m "first commit"
git branch -M main

[name]は自身のユーザ名,[email]は自身のメールアドレスを入れる。
```

2回目以降:
```bash
git add .
git commit -m "コミットコメント"
```

### github管理画面にて、リモートリポジトリ作成

作成手順は割愛
httpsの場合はトークン作成,sshの場合はssh鍵の登録を実施すること。

### github初期登録

以下はsshの場合。

```bash
git remote add origin git@github.com:"githubユーザ名"/"リポジトリ名".git
git push -u origin main
```

### .gitignoreファイル(git対象外登録)更新後の操作について

一旦登録したモジュールについて、.gitignoreを更新しても
git内の登録情報に残るため、以下のコマンドでキャッシュの削除を実施すること。

```bash
git rm -r --cached .
```

この後、リモートリポジトリのモジュールを削除すること。

## github複数アカウントでのssh鍵切り替え方法

githubアカウント毎にssh鍵をそれぞれ作成し、
公開鍵をgithubに登録していること。
sshファイルについてユーザ名を入れて別ファイルにすること。

### ssh鍵作成方法

```bash
cd ~/.ssh
ssh-keygen -t rsa
過去にSSH鍵を作成している場合、既存のSSH鍵をリネームするか、
退避させること。

ただし、1回目のエンターキーを押す前に名前を指定することで、
別名の鍵ができます。

何か聞かれたときに何もせず3回エンターを押せば、
id_rsa(秘密鍵)とid_rsa.pub(公開鍵)の2つの鍵が生成されます。
すでにある場合は上書きされるため、注意すること。
```

### ssh設定の実施

```bash
vi ~/.ssh/config

Host github.<sshアカウント名>.work #接続先ホスト名
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_<ssh鍵作成指定名> #対象アカウントのssh秘密鍵
  TCPKeepAlive yes
  IdentitiesOnly yes
```

### push先の変更

初回の登録の場合、push先のURLを以下のように変更する。

```bash
git remote add origin git@github.<sshアカウント名>.work:<githubアカウント名>/<リポジトリ名>.git
```

## DB切り替え機能実装

### コンテナ立ち上げ・ログイン

```bash
cd elixir-docker-db
sudo bin/start.sh
sudo bin/login.sh
cd testsite
```

### DB切り替えシェル作成

mysql→postgresql切り替えシェル作成

その後本ファイル名のシェルを動かすと切り替えられる。

```bash
vi priv/use_postgresql.sh

sed -i -e 's/:myxql/:postgrex/' mix.exs
sed -i -e 's/MyXQL/Postgres/' lib/testsite/repo.ex
sed -i -e 's/username: "root"/username: "postgres"/' config/dev.exs
sed -i -e 's/password: "root"/password: "postgres"/' config/dev.exs
sed -i -e 's/hostname: "mariadb"/hostname: "postgres"/' config/dev.exs
sed -i -e 's/username: "root"/username: "postgres"/' config/test.exs
sed -i -e 's/password: "root"/password: "postgres"/' config/test.exs
sed -i -e 's/hostname: "mariadb"/hostname: "postgres"/' config/test.exs
mix deps.get
```

postgresql→mysql切り替えシェル

```bash
vi priv/use_mariadb.sh

sed -i -e 's/:postgrex/:myxql/' mix.exs
sed -i -e 's/Postgres/MyXQL/' lib/testsite/repo.ex
sed -i -e 's/username: "postgres"/username: "root"/' config/dev.exs
sed -i -e 's/password: "postgres"/password: "root"/' config/dev.exs
sed -i -e 's/hostname: "postgres"/hostname: "mariadb"/' config/dev.exs
sed -i -e 's/username: "postgres"/username: "root"/' config/test.exs
sed -i -e 's/password: "postgres"/password: "root"/' config/test.exs
sed -i -e 's/hostname: "postgres"/hostname: "mariadb"/' config/test.exs
mix deps.get
```

### シェル実行

```bash
sh priv/use_postgresql.sh
sh priv/use_mariadb.sh
```

### シェル稼働後のDB反映操作

```bash
mix ecto.reset
*初回のみ実施。データが消えてしまうことに注意。
```

### サービス立ち上げ

以下のコマンドを入力し正常に立ち上がること。

```bash
mix phx.server
```

### DB切り替え後にWEB立ち上げ時動かないとき

*could not find Ecto.Adapters.Postgres.Connectionが発生したとき、
 以下のコマンドを実施する。

```bash
$ mix deps.clean --all
$ mix do deps.get, compile
```

## gigalixirデプロイ
*DBはpostgresqlで作っていること。
*作業対象フォルダに対し、git commitしていること。
*作業前にbranchからmainにマージすること。(別ブランチで作成している場合)
*mainに切り替えておくこと。(別ブランチで作成している場合)
*gigalixirサイトで登録を実施しておくこと。
https://www.gigalixir.com/
*無料プランの場合、appが1つしか立ち上げられない。
*デプロイするたびにソース自体更新しておく必要がある。

2回目以降のデプロイは,1→7(9)→10の作業でデプロイ可能
コンテナ自体再立ち上げした際は全項目実施。

本作業はホスト側で実施すること。

### 1 gigalixirCLIインストール(gigalixirコマンド使えない場合)

```bash
sudo apt-get update
sudo apt-get install -y python3 python3-pip git-core curl

pip3 install gigalixir --user

*失敗した場合
--------------------------------------------
pip3 show cryptography

Location:を確認し、その中に入る該当名フォルダを削除

pip3 install --upgrade pip

pip3 install gigalixir --user
--------------------------------------------

echo 'export PATH=~/.local/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile

gigalixir
→コマンドが使えることを確認する。
```

### 2 gigalixirログイン設定(すでに設定済みの場合不要)

*下記コマンドはtestsiteフォルダ内でおこなうこと。

```bash
gigalixir login
→gigalixirユーザ・パスワードを入力する。
→yを選択する。
gigalixir account
```

### 3 gigalixirアプリ作成

```bash
gigalixir create -n {unique_name}

gigalixir apps
→unique_nameを控える。
```

### 4 DB作成(必要に応じ)

```bash
gigalixir pg:create --free -a {unique_name}
→yを選択する。
```

### 5 デプロイソース準備(初回のみ)

コンテナログインして、アプリフォルダに入り作業する。

```bash
elixir -v
node -v
→バージョン情報を控える。

echo "elixir_version=1.12.3" > elixir_buildpack.config
echo "erlang_version=24.0" >> elixir_buildpack.config
echo "node_version=14.17.6" > phoenix_static_buildpack.config

vi config/prod.exs

12行目あたり。

config :piyopiyoex3_sample_portfolio, Piyopiyoex3SamplePortfolioWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json"
　↓ 書き換える
config :sample_portfolio, SamplePortfolioWeb.Endpoint,
  url: [host: "{アプリのunique_name}.gigalixirapp.com"],
  check_origin: ["//{アプリのunique_name}.gigalixirapp.com"],
  cache_static_manifest: "priv/static/cache_manifest.json"

Phoenix1.6以降の場合

以下のファイルを作成する。
assets/package.json

{
  "scripts": {
    "deploy": "cd .. && mix assets.deploy && rm -f _build/esbuild"
  }
}
```
作業実施後、コンテナから抜けること。

### 6 git準備

対象フォルダのgitを作成していない場合:
```bash
git init
git add .
git commit -m "first commit"
git branch -M main
```

対象フォルダのgitを作成していた場合:
```bash
git add .
git commit -m "gigalixir commit"
```

リモートリポジトリ登録:
```bash
gigalixir git:remote {unique_name}

git remote -v
→gigalixir登録がされていること。
```

### 7 appデプロイ

```bash
git push -f gigalixir main
→エラーなく動くこと。
```

### 8 ssh公開鍵設定(DBを使う場合、初回(コンテナ立ち上げ時)のみ)

```bash
ssh-keygen -t rsa
→すべての問いに対し[Enter]をする。
→別の作業などですでにssh鍵を作成している場合必要ない。
 (cat ~/.ssh/id_rsa.pubで参照できる場合。)

cat ~/.ssh/id_rsa.pub
→表示されるssh公開鍵文字列を控える。
→ファイルがない場合、前の手順に戻って作成すること。

gigalixir account:ssh_keys:add "【ssh公開鍵文字列】"

gigalixir account:ssh_keys
→公開鍵が表示されることを確認する。
→前使用したキーもある場合、管理画面から削除すること。
```

### 9 DBマイグレート(必要に応じ)

```bash
初回:
gigalixir run mix ecto.migrate
gigalixir run mix run priv/repo/seeds.exs

2回目以降：
gigalixir run mix ecto.reset

gigalixir logs
→DBの状況を確認する。
```

### 10 サイト確認

```bash
gigalixir ps
→アプリのステータスがHealthyになること。

gigalixir open
→出てきたURLのサイトを参照できること。
　gigalixirサイトからURL参照可能。
 場合によっては自動的にブラウザが立ち上がり参照できる。
```

## gigalixirサイト削除

＊予めgigalixirコマンドを使用できるようにすること。
(1 gigalixirCLIインストール参照)

### 1 appステータス確認

gigalixirサイトでapp,DB状態を確認する。
https://www.gigalixir.com/

アプリ名(unique_name)を控える。

### 2 DB削除(DB利用の場合)

```bash

gigalixir ps:scale --replicas=0 -a {unique_name}

gigalixir管理画面からDBを削除する。

コマンドから消す場合:

gigalixir pg -a {unique_name}
→idを控える

gigalixir pg:destroy -d {id} -a {unique_name}
→yを選択する。

gigalixir管理画面にてDB削除されていることを確認する。
```

### 3 app削除

```bash
gigalixir ps:scale --replicas=0 -a {unique_name}
→2の作業をしていない場合、上記のコマンドを入力。

gigalixir管理画面からappを削除する。

コマンドから消す場合:

gigalixir apps:destroy -a {unique_name}
→yを選択する。

gigalixir管理画面にてapp削除されていることを確認する。
```

### 4 gitリポジトリ設定削除

```bash
git remote remove gigalixir

git remote -v
→gitのgigalixir登録が消えていること。
```

# おわりに

現在把握しているPhoenixサイト作成ノウハウについて
取りまとめました。
必要と感じたものがあれば、適宜更新したいと思います。