Nanoboxとか言うPaaSが意外と便利だった件

# Nanoboxとか言うPaaSが意外と便利だった件

どこで知ったか覚えていないがNanoboxと言うPaaSを知った。

今回はそのNanoboxについて軽く書こうと思う。

~~**2019/01/31 -> 確認してみたところパッケージのリポジトリが2017年から更新されてないなど、ほぼ死んだプロジェクトと化してるので使わない方が良いかも http://packages.nanobox.io/**~~

**2019/06/20 -> なんか更新されてるっぽい http://packages.nanobox.io/**


## Nanoboxって？

簡単に説明するとコーディング専用のVagrantのみたいな感じ。
boxfile.ymlに環境を書いてそれを元にDockerコンテナを取ってきて実行みたいな感じ。

boxfileと同じ場所が`/app`にマウントされる。

また、DBなども2行で追加できるため非常に楽である。

ただ、少々曲者でnode_modulesなどのディレクトリをcache_dirsに記載しないとエラーになるなど知らないとハマることが多い。

## 使ってみる

今回はWindows10 + VirtualBox + Nanoboxで行きます。
インストールは適当にやってください。
たぶん最初にいろいろ設定させられると思います。

```boxfile.yml
run.config:
  # elixir runtime
  engine: elixir

  # we need nodejs in development
  # ensure inotify exists for hot-code reloading
  dev_packages:
    - nodejs
    - inotify-tools
    - mysql-client

  # cache node_modules
  cache_dirs:
    - assets/node_modules

  # add node_module bins to the $PATH
  extra_path_dirs:
    - assets/node_modules/.bin

  # enable the filesystem watcher
  fs_watch: true

# add postgres as a data component
data.db:
  image: nanobox/mysql
```

こんな感じのboxfileを用意します。

Postgresがよければ`dev_packages`の`mysql-client`を消して`data.db`の`image`をnanobox/postgresqlにしましょう。

Windowsの人のみですがWindowsだとデフォルトのマウントタイプがnetfsになっています。~~このnetfsはWindowsのファイル共有機能を使っていて不具合満載なので~~`nanobox config set mount-type native`でネイティブに変えておくことをおすすめします。

そしたらターミナルを開いて`nanobox run`と実行してみましょう。(コマンドプロンプトかPowerShellで実行してください。)
また、日本語環境ではバックスラッシュが円マークになると思いますがその場合はVSCodeで実行すればバックスラッシュになります。



こんな感じに表示されたら起動完了です。

```
Preparing environment :
  √ Mounting codebase

--------------------------------------------------------------------------------
+ HEADS UP:
+ This is the first build for this project and will take longer than usual.
+ Future builds will pull from the cache and will be much faster.
--------------------------------------------------------------------------------


Building runtime :
  √ Starting docker container
  √ Preparing environment for build
  √ Gathering requirements
  √ Mounting cache_dirs
  √ Installing binaries and runtimes
  √ Packaging build

phx_test (local) :
  √ Reserving IPs

Syncing data components :
  Removing old :
    √ Skipping (up-to-date)
  Launching new :
    data.db :
      √ Reserve IP
      √ Starting docker container
      √ Gathering requirements
      √ Configuring services

Building dev environment :
  √ Starting docker container
  √ Configuring


                                   **
                                ********
                             ***************
                          *********************
                            *****************
                          ::    *********    ::
                             ::    ***    ::
                           ++   :::   :::   ++
                              ++   :::   ++
                                 ++   ++
                                    +
                    _  _ ____ _  _ ____ ___  ____ _  _
                    |\ | |__| |\ | |  | |__) |  |  \/
                    | \| |  | | \| |__| |__) |__| _/\_

--------------------------------------------------------------------------------
+ You are in a Linux container
+ Your local source code has been mounted into the container
+ Changes to your code in either the container or desktop will be mirrored
+ If you run a server, access it at >> 172.21.0.20
--------------------------------------------------------------------------------

/app $
```

早速PhoenixFrameworkを入れていきましょう。

今回はPhoenix 1.3を使うのでNanobox上で`mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez`と実行しましょう。
質問は全てyesでおｋです。

入れられたらプロジェクトを作りましょう。

PCとコンテナ間で共有されているディレクトリは`/app`ですので`/`に移動して
`/ $ mix phx.new app --app phoenix_test --database mysql`と実行しましょう。
質問は全てyesで行きましょう。

このコマンドを軽く解説するとphx.newでプロジェクト作成、appはディレクトリ--appはプロジェクトの名前--databaseはDBの指定です。
--databaseに関してはpostgresを選んだ人はつけなくていいです。

次にDBの設定をしましょう。
Nanoboxでは環境変数にDBの情報が入っています。
ユーザーが`DATA_DB_USER`パスワードが`DATA_DB_PASS`ホストが`DATA_DB_HOST`です。

先ほど作ったプロジェクトの`config/dev.exs`を開いてください。

下にConfigure your databaseと書いてあるところがあると思います。
そこを書き換えて行きます。

```elixir
config :phoenix_test, PhoenixTest.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: System.get_env("DATA_DB_USER"),
  password: System.get_env("DATA_DB_PASS"),
  database: "phoenix_test_dev",
  hostname: System.get_env("DATA_DB_HOST"),
  pool_size: 10
```

こんな感じになっていればおｋです。

`mix ecto.create`でデータベースが作成できることを確認しましょう。

最後にアクセスできるか確認して終わりにしましょう。
最初のAAがあったところの下にIPアドレスが書いてあります。

`mix phx.server`を実行した状態でhttp://172.21.0.x:4000 にアクセスすると繋がると思うので繋いでみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96621/96f8fa3f-e620-78a0-f680-17631e0ffa74.png)

無事表示されましたか？

たまに繋がらないみたいな時があるのでそしたらNanoboxを疑ってください。

最後にコンテナを破壊して終わりにしましょう。
exitでpowershellまで抜けてきてください。

そしたら`nanobox destroy`で破壊しましょう👋

# さいごに

なんか見つけたので使ってるNanoboxくんですが、恐らく別の物でもいいです。
同じようなのあると思います。

~~使ったこと無いですがNanobox有料プラン契約すればデプロイやらなにやらやってくれるみたいです。~~
→ 無料になったらしいです

バグというか動かないことが多いので、使ってる時に突然死んで原因を突き止めるのが好きな人とかはぜひNanobox使ってみてください。

https://nanobox.io/