centos7で、dockerを使って、nginxのリバースプロキシからverdaccioを使う

# はじめに
2017年1月くらいの時は、verdaccioに関する記事も少なくて、導入にとても苦労したんですよ。
でも、今となってはdockerもあるし、便利になりましたね。
**でも苦労したんだけどね！**

# やりたいこと
* dockerでverdaccioを立ち上げる
* nginxのリバースプロキシでアクセスする
    * たとえば「`http://your-ip-addr:4873/`ではなく、`http://your-ip-addr/verdaccio`でアクセスする」ということ。

# 環境
CentOS Linux release 7.5.1804
verdaccio dockerのimageで`verdaccio/verdaccio:latest`を指定（2018/6の執筆時点では3.2.0）
Nginx dockerのimageで`nginx`を指定（2018/6の執筆時点では1.15.0）

# dockerとverdaccioの組み合わせについて
[本家のexample](https://github.com/verdaccio/docker-examples/tree/master/nginx-verdaccio)に例が準備されています。

これを参考にします。

# 本家の例をそのまま起動してみる

まずは何も考えずに起動してみます。

`git clone`とかしてローカルに持ってきた本家のexampleのディレクトリに移動して、`docker-compose up -d`をします。

そして、ブラウザから`localhost:4873/`にアクセスすると、verdaccioが起動しています。
※必要に応じて、localhostはipとかurlとかに書き換えてください。

この時、後々のためにverdaccioコンテナのファイルをコピーしてきます。

```sh
$ docker cp <ImageId>:/verdaccio/ ./verdaccio
```

終わったら落とします。

```sh
$ docker-compose down
```

# 本家の例を書き換える

## docker-compose.yamlファイルを書き換える

exampleに入っていたyamlファイルを書き換えます。

```yml:docker-compose.yaml
version: '2'

services:
  verdaccio:
    image: verdaccio/verdaccio:latest
    container_name: verdaccio
    ports:
      - "4873:4873"
    volumes:
      - ./volumes:/verdaccio

  nginx:
    restart: always
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./data/conf.d:/etc/nginx/conf.d
```

変更点は以下の通り。

* verdaccioのvolumesを、docker-composeと同改装のディレクトリにマウント。
  * このために先ほどコンテナからデータをコピーしてきました。
* nginxのimageは`tutum/nginx`ではなく`nginx`を利用する。
  * 後々nginxはリバースプロキシ用に別docker-composeにする構想があったので、どうせなら更新されている新しいものを使おうという理由です。（tutum/nginxは最後にpushされたのが2年前）
* nginxのvolumesもdocker-composeのディレクトリにマウント。


## verdaccioのconfig.yamlに追記する
先ほどコピーしたvolumesフォルダの中の、`conf/config.yaml`に一文を追加します。

```
url_prefix: http://your-ip-addr/verdaccio/
```

この一文の意味は、[verdaccioのgitのfull.yaml](https://github.com/verdaccio/verdaccio/blob/master/conf/full.yaml)というファイルの中に説明が載っています。

> \# if you use nginx with custom path, use this to override links
> \#url_prefix: https://dev.company.local/verdaccio/


## nginxのconf.dに追記する

docker-compose.yamlがあるディレクトリの中に以下のファイルを追加します。

```conf:./data/conf.d
server {
  listen 80 default_server;
  access_log /var/log/nginx/verdaccio.log;
  charset utf-8;
  location /verdaccio {
	rewrite ^/verdaccio/(.+) $1 break;
    proxy_pass  http://your-ip-addr:4873/$1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_ssl_session_reuse off;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }
}
```

必要だったら`server_name`を指定するのもお忘れなく。

# 起動！

以上の変更を行った後は以下のコマンドで起動。

```sh
$ docker-compose up -d
```

そして、`http://your-ip-addr/verdaccio`でアクセスできることを確認する。


# 備忘録
## ファイアウォールの設定


`http://your-ip-addr:4873`でやった時はつながったのに、
`http://your-ip-addr/verdaccio`ではつながらなくて以下のログが出ている。
※ipとか、適宜変えてます。

```
$ docker-compose logs
proxy    | 2018/06/21 06:37:56 [error] 7#7: *3 connect() failed (113: No route to host) while connecting to upstream, client: from-ip-addr, server: hoge.jp, request: "GET /verdaccio/ HTTP/1.1", upstream: "http://your-ip-addr:4873/", host: "your-ip-addr"
proxy    | from-ip-addr - - [21/Jun/2018:06:37:56 +0000] "GET /verdaccio/ HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" "-"
```

色々調べたらファイアウォールの設定を見直した方が良いらしい。
そこで見直してみる。


firewalldを解除して、iptablesを使う。

色々やるが、つながらない。

`iptables -nL`コマンドとかを打って、よくよく確認してみたら、INPUTに4873へのACCEPTが存在しなかったので、以下のコマンドで追加する。
でも、そもそもこのコマンドを打たないといけない事態っていったい…
dockerさんが勝手に追加してくれると思っていたのに…

```
iptables -I INPUT 5 -p tcp --dport 4873 -j ACCEPT
```