vaultwardenをセルフホストする for Docker

# はじめに
「[dockerでbitwarden_rsを構築する](https://qiita.com/iona-emeria/items/7e55ead4a0c5ab7c1036)」でbitwarden_rsを構築したが
いつの間にか vaultwarden というものに変わっていた。変更理由はサービス名が似ているからだとか。
構築に若干躓いたところがあるので記載していく。

新規構築と前回の記事から更新する方法を記載する。

# 前提
dokcer-composeがインストールされていること。

# 新規構築
## git clone
基本的にはgitで公開されているリポジトリをベースに構築する。
なお名称がBitwarden_Self_Hostとなっているが、docker-compose.ymlファイル内で記述しているイメージは「vaultwarden/server:latest」となっているので問題ない。

```
git clone https://github.com/JulianRunnels/Bitwarden_Self_Host.git
cd Bitwarden_Self_Host
```

## 証明書作成
リポジトリ内に「create_ssl.sh」という証明書作成スクリプトが用意されているが
何故かエラーが発生しうまくいかなかったので手動で作成する。

### ディレクトリ作成
nginx.conf内の証明書のパスに合わせてディレクトリを構成する。
ちなみにコマンドは「create_ssl.sh」に記載されているものと同じ。

```
mkdir -p data/ssl/certs
mkdir -p data/ssl/csr
mkdir -p data/ssl/private
mkdir -p data/ssl/newcerts
```

### 独自のルート認証局キー作成 
ここから先は「[dockerでbitwarden_rsを構築する](https://qiita.com/iona-emeria/items/7e55ead4a0c5ab7c1036)」に記載している内容と同じなのでコマンドだけ残す。
異なる点は証明書の出力先。

```
openssl genrsa -aes256 -out data/ssl/private/myCA.key 4096
chmod 500 data/ssl/private/myCA.key
```

### ルートCA証明書作成 
```
openssl req -x509 -new -nodes -sha256 -days 3650 -key data/ssl/private/myCA.key -out data/ssl/certs/myCA.crt
```

### bitwardenサーバキー作成
```
openssl genpkey -algorithm RSA -out data/ssl/private/bitwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048
```

### 証明書要求ファイル作成 
```
openssl req -new -key data/ssl/private/bitwarden.key -out data/ssl/csr/bitwarden.csr
```

### bitwarden.ext作成 
git cloneで既に存在すため再作成する。

```
rm data/ssl/bitwarden.ext
```

IP.1をサーバのIPアドレスに変更する。

```
cat << EOF > data/ssl/bitwarden.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = 192.168.1.100 # サーバのIPアドレスに変更する。
EOF
```

### bitwarden証明書に署名

```
openssl x509 -req -in data/ssl/csr/bitwarden.csr -CA data/ssl/certs/myCA.crt -CAkey data/ssl/private/myCA.key -CAcreateserial -out data/ssl/certs/bitwarden.crt -days 365 -sha256 -extfile data/ssl/bitwarden.ext
```

### 証明書の確認
以下のフォルダにbitwarden.crtとbitwarden.csrがあればOK。

```
ls data/ssl/certs/
ls data/ssl/csr/
```

## docker-compose.yml編集
バックアップ用のジョブ？があるが自分の環境ではjenkinsでバックアップしているので削除した。

```
nano docker-compose.yml
```
bw_backupを削除

## 起動
デタッチせずに起動し、エラーがないことを確認する。

```
docker-compose pull && docker-compose up
```

# bitwardenから更新
基本的には新規構築と同じ。
違う点は以下2点
・すでに証明書がある
・証明書の格納先が違う

## docker-composeバックアップ
必要であれば実施する。

```
cp docker-compose.yml docker-compose.yml.bk
```

## 証明書格納先作成＆証明書格納
証明書をnginx.conf参照先にコピーする。
nginx.confの参照先を変えてもOK。

```
mkdir data && mkdir data/nginx && mkdir data/ssl && mkdir data/ssl/certs && mkdir data/ssl/private
sudo cp /etc/ssl/certs/bitwarden.crt data/ssl/certs/bitwarden.crt
sudo cp /etc/ssl/certs/bitwarden.key data/ssl/private/bitwarden.key
```

## nginx.conf作成
中身は新規構築で使用したものと同じ。

```
nano data/nginx/nginx.conf
events {}

http{
  server {
    listen 80;
    return 301 https://$host$request_uri;   
  }
  
  server {
    listen 443 ssl;

    ssl_certificate /etc/ssl/certs/bitwarden.crt;
    ssl_certificate_key /etc/ssl/private/bitwarden.key;

    location / {
        proxy_pass http://bitwarden;
	proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
    }

  location /notifications/hub {
    proxy_pass http://bitwarden:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
  
  location /notifications/hub/negotiate {
    proxy_pass http://bitwarden:80;
  }
}
}
```

## docker-compose.yml作成
変更ポイントはvaultwardenで参照するvolumeをbitwardenと同じにする。

```
cat << EOF > docker-compose.yml
version: '3'

services:
  bitwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    expose:
      - "80"
      - "3012"
    volumes:
      - /bw-data:/data
    restart: unless-stopped
    environment:
      WEBSOCKET_ENABLED: 'true'

  nginx:
    image: nginx:1.15-alpine
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./data/nginx:/etc/nginx
      - ./data/ssl:/etc/ssl
EOF
```

## コンテナ停止＆削除
```
docker stop bitwarden
docker rm bitwarden
```

## 起動
エラーが発生しない＆Webブラウザからアクセスできることを確認する。
ちなみにWeb保管庫へのアクセスはポートが8080から443になっているので `https://IPアドレス` でアクセスする。

```
docker-compose up
```