Ubuntu 18.04にHarbor 1.10をインストールする

## はじめに

[TKGで作成したKubernetesクラスタ](https://qiita.com/ttani03/items/f7e6a8bb01d14a5c9312)用にプライベートレポジトリを試してみたくなったので、vSphere上にUbuntu 18.04仮想マシンを作成してHarborをインストールしてみました。

## 準備

[Harborの公式ドキュメント](https://goharbor.io/docs/1.10/install-config/installation-prereqs/)では、以下がインストールに必要な最低スペックとして記載されています。このスペックに合わせて、仮想マシンを作成しUbuntu 18.04をインストールします。

- CPU：2 CPU
- メモリ：4 GB
- ストレージ：40GB

ソフトウェア観点では、以下がインストールされている必要があります。

- Docker：17.06.0+
- Docker Compose：1.18.0+
- OpenSSL：できる限り最新のもの

ネットワーク観点では、以下のポートが開放されている必要があります。

- 443(HTTPS)
- 4443(HTTPS)
- 80(HTTP)

なお、今回の環境ではネットワークは以下のような設定になっています。

- ホスト名：`harbor`
- IPアドレス：`192.168.7.103`
- FQDN：`harbor.tta.local`

### DockerとDocker Composeのインストール

DockerとDocker Composeのインストールに関しては、公式ドキュメントだけ記載します。

- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
- [Install Docker Compose](https://docs.docker.com/compose/install/)

### 証明書の作成

Harbor自体は証明書がなくてもインストール可能ですが、HTTPSアクセスができないと使用できない機能があります。今回は全ての機能について有効化するため、[公式ドキュメント](https://goharbor.io/docs/1.10/install-config/configure-https/)の手順に従って、CA証明書とサーバ証明書を作成します。

1. 作業用ディレクトリ`cert`をホームディレクトリ配下に作成します。

    ```
    $ mkdir ~/cert
    $ cd ~/cert
    ```

2. CA用の秘密鍵`ca.key`を生成します。

    ```
    $ openssl genrsa -out ca.key 4096
    ```

3. CA証明書`ca.crt`を生成します。コモンネームには、Harborをインストールする仮想マシンのFQDNを指定します。

    ```
    $ openssl req -x509 -new -nodes -sha512 -days 3650 \
        -subj "/C=JP/ST=Tokyo/L=Tokyo/O=homelab/OU=homelab/CN=harbor.tta.local" \
        -key ca.key \
        -out ca.crt
    ```

4. サーバ証明書用の秘密鍵`harbor.tta.local.key`を生成します。

    ```
    $ openssl genrsa -out harbor.tta.local.key 4096
    ```

5. CSRを生成します。

    ```
    $ touch ~/.rnd
    $ openssl req -sha512 -new \
        -subj "/C=JP/ST=Tokyo/L=Tokyo/O=homelab/OU=homelab/CN=harbor.tta.local" \
        -key harbor.tta.local.key \
        -out harbor.tta.local.csr
    ```

6. X509 v3 extensionファイル`v3.ext`を生成します。`[alt_names]`には、Harbor用仮想マシンのFQDN、ホスト名、IPアドレスを指定します。

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

    [alt_names]
    DNS.1=harbor.tta.local
    DNS.2=harbor
    IP.1=192.168.7.103
    EOF
    ```

7. `v3.ext`を使って、Harbor用のサーバ証明書を生成します。

    ```
    $ openssl x509 -req -sha512 -days 3650 \
        -extfile v3.ext \
        -CA ca.crt -CAkey ca.key -CAcreateserial \
        -in harbor.tta.local.csr \
        -out harbor.tta.local.crt
    ```

### 証明書の配置

1. `/data/cert`ディレクトリを作成して、サーバ証明書をコピーします。

    ```
    $ sudo mkdir -p /data/cert
    $ sudo cp harbor.tta.local.crt /data/cert/
    $ sudo cp harbor.tta.local.key /data/cert/
    ```

2. Docker用に証明書と秘密鍵をコピーします。

    ```
    $ openssl x509 -inform PEM -in harbor.tta.local.crt -out harbor.tta.local.cert
    $ sudo mkdir -p /etc/docker/certs.d/harbor.tta.local
    $ sudo cp harbor.tta.local.cert /etc/docker/certs.d/harbor.tta.local
    $ sudo cp harbor.tta.local.key /etc/docker/certs.d/harbor.tta.local
    $ sudo cp ca.crt /etc/docker/certs.d/harbor.tta.local
    ```

3. Dockerをリスタートします。

   ```
   $ sudo systemctl restart docker
   ```

## Harborのインストール

1. [Harborのリリースページ](https://github.com/goharbor/harbor/releases)からオンラインインストーラーをダウンロードして、展開します。※今回は、1.10.2をインストールします。

    ```
    $ wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-online-installer-v1.10.2.tgz
    $ tar -xzvf harbor-online-installer-v1.10.2.tgz
    ```

2. インストーラーに含まれている`harbor.yml`を以下のように編集します。

    ```
    $ cd ./harbor
    $ grep -v -e '^\s*#' -e '^\s*$' harbor.yml 
    hostname: harbor.tta.local
    http:
      port: 80
    https:
      port: 443
      certificate: /etc/docker/certs.d/harbor.tta.local/harbor.tta.local.cert
      private_key: /etc/docker/certs.d/harbor.tta.local/harbor.tta.local.key
    harbor_admin_password: VMware123!
    database:
      password: VMware123!
      max_idle_conns: 50
      max_open_conns: 100
    data_volume: /data
    clair:
      updaters_interval: 12
    jobservice:
      max_job_workers: 10
    notification:
      webhook_job_max_retry: 10
    chart:
      absolute_url: disabled
    log:
      level: info
      local:
        rotate_count: 50
        rotate_size: 200M
        location: /var/log/harbor
    _version: 1.10.0
    proxy:
      http_proxy:
      https_proxy:
      no_proxy:
      components:
        - core
        - jobservice
        - clair
        - trivy
    ```

3. インストールスクリプトを実行します。

    ```
    $ sudo ./install.sh --with-notary --with-clair --with-chartmuseum
    ```

4. インストール完了後、`https://harbor.tta.local`にアクセスすると以下のようにログイン画面が表示されます。

    <img width="1440" alt="harbor_login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/2aaf596f-14ef-7333-c11a-1b1cc521a293.png">

## HarborにDockerイメージをpushする

macOSから`nginx`イメージをHarborにpushしてみます。

1. CA証明書をMacにインポートします。

    ```
    $ security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain ./ca.crt
    ```

2. Dockerを一度再起動した後、Harborにログインします。

    ```
    $ docker login harbor.tta.local
    Username: admin
    Password: 
    Login Succeeded
    ```

1. `nginx`イメージをpullします。

    ```
    $ docker pull nginx:latest
    ```

2. `nginx`イメージをHarborにpushします。

    ```
    $ docker tag nginx:latest harbor.tta.local/library/nginx:latest
    $ docker push harbor.tta.local/library/nginx:latest
    ```

3. Harborの[Projects]画面から`library`プロジェクトに移動し、[Repositories]タブから一覧に`nginx`イメージがpushされていることを確認します。

    <img width="1440" alt="nginx_pushed.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/21d965bd-58c5-e0fc-a6c9-976266eacd62.png">