Verdaccio+Docker+EC2　その１

今回仕事で任されたタスクをもう一度最初から作っていきます。

##Project
同僚がFrontendチームで使うというVerdaccioを何の前知識もなくDockerizeして使えるようにしていく。元々同僚の頭の中では形があったようだが詳細は全く説明されず、最後あたりで説明された。。。

**最終的に設定するもの**
- docker-compose (Verdaccio, Verdaccio s3 plugin, https-portal)
- Bitbucket pipeline
- git hooks - post-receive

**Usage**
Verdaccioアクセスはhttps://<サイト>

A. Publish a package
1. チームの誰かがパッケージをパブリッシュする。
2. このパッケージはS3 bucketへ。
3. BitBucket Pipelineを通してプロダクションにデプロイ。

B. Add a new user
1. 新規ユーザーを追加＞conf/htpasswdに追加される。
2. BitBucket Pipelineを通してプロダクションにデプロイ。



***
**今回はその１の設定**

- Verdaccio (Dockerfile, config.yaml)
- EC2 (docker, docker-compose, npm)

***
###Spec and Software
- Amazon Ubuntu Server 18.04
- Verdaccio 
- Docker

###Path
```
/home/ubuntu
└── verdaccio
    ├── Dockerfile
    ├── conf
    │   ├── config.yaml
    │   └── htpasswd <- adduserで作られる
    ├── docker-compose.yaml
    ├── package.json <- publishで必要
    ├── plugins
    └── storage
        └── @mypackage <- publishで追加される
```

###verdaccio/conf/config.yaml
```
storage: /verdaccio/storage
auth:
  htpasswd:
    file: /verdaccio/conf/htpasswd
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
packages:
  '@mypackage/*': <- ポイント
    access: $all
    publish: $authenticated
  '@*/*':
    access: $authenticated
    publish: $authenticated
    proxy: npmjs
  '**':
    proxy: npmjs
logs:
  - {type: stdout, format: pretty, level: http}
 ```
###verdaccio/package.json
適当に作る。
```npm init```
名前は上のポイントに合わせる
```  "name": "@mypackage/verdaccio",```

###References
- https://verdaccio.org/docs/en/docker
- https://verdaccio.org/docs/en/configuration

###Tips for EC2
1) これはちゃんとReferencesのリンクでドキュメントされてます。
```sudo chown -R 100:101 verdaccio/```

2) 777でないとconf/htpasswdやstorage/@mypackageに書き込めない。他に方法があれば教えてください。
```sudo chmod -R 777 verdaccio/conf/```
```sudo chmod -R 777 verdaccio/storage/```

docker内ではこうなってる必要があります。

```
/ # ls -ltr /verdaccio/
drwxr-xr-x    2 100      101           4096 Jul 27 16:59 plugins
drwxrwxrwx    2 100      101           4096 Jul 27 21:10 conf
drwxrwxrwx    3 100      101           4096 Jul 27 21:11 storage
/ # ls -ltr /verdaccio/conf/
-rwxrwxrwx    1 100      101            372 Jul 27 21:03 config.yaml
-rw-r--r--    1 verdacci nogroup         55 Jul 27 21:10 htpasswd
/ # ls -ltr /verdaccio/storage/@mypackage/
drwxr-xr-x    2 verdacci nogroup       4096 Jul 27 21:28 verdaccio
```

3) これは見つけるのになかなか時間がかかった。conf/config.yamlのパスをAbsolute Pathにする必要あり。
From
```storage: ./storage```
TO
```storage: /verdaccio/storage```

###Error Messages
上１＆２を設定しないと出るエラー。issues/1136とかで質問されてます。

```EACCES: permission denied, open '/verdaccio/conf/htpasswd'```
```qqq is not allowed to publish package verdaccio : verdaccio```

###Useful commands
```docker-compose up --force-recreate```
```docker exec -it --user=root verdaccio  /bin/sh```

###Testing
**1. docker起動**
```docker-compose up```
**expected logging**

```
verdaccio    |  warn --- config file  - /verdaccio/conf/config.yaml
verdaccio    |  warn --- Plugin successfully loaded: verdaccio-htpasswd
verdaccio    |  warn --- http address - http://0.0.0.0:4873/ - verdaccio/4.0.4
```

**2. URLにアクセス**

**3. Add a user 'qqq'**
```npm adduser --registry http://<IP>:4873```
**expected logging**
```req: 'PUT /-/user/org.couchdb.user:qqq'```

**4. Login on URL as 'qqq'**
**expected logging**
```req: 'POST /-/verdaccio/login'```
```req: 'GET /-/verdaccio/packages'```

**5. Publish**
```npm publish --registry http://<IP>:4873```
**expected logging**
```req: 'PUT /@mypackage%2fverdaccio'```

**6. Refresh URL**
**expected logging**
```req: 'GET /-/verdaccio/packages'```