Nexus Repository Manager Install

あるプロジェクトでNexusの構築を行ったので、
Nexus Repository Manager 3のインストール手順を
忘れないようにメモ書きしようと思います。

## Nexus Repository Manager とは

Nexusとは、リポジトリを扱うミドルウェアサービス。
Docker や Maven、Npmなどの各リポジトリをNexusの中に作成し、
docker images, mavenライブラリ, npmパッケージを各リポジトリにキャッシュとし
保存して、プライベートに使ったりする事が出来るサービス。

大型案件などで、セキュリティ面でネット環境にアクセスがさせたくない
アプリケーション開発環境などを作成する際、よく使われたりするもの。

<br>

## Nexus Repository Manager install 手順

### 1. JRE（OpenJDK 8）
- 1.1 JREインストール
NexusはJavaで動いているので、Javaのインストールが必要

```　
$ sudo yum install -y java-1.8.0-openjdk
```

- 1.2 java version確認
```
$ java -version 
#下記のようにレスポンスが返ってくればインストール成功
→ openjdk version "1.8.0_362"
```

- 1.3 現在使用中のJava確認

```
# どちらのコマンドでも可
$ sudo alternatives --config java
$ sudo update-alternatives --config 'java'

→ There is 1 program that provides 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b09-2.el9_1.x86_64/jre/bin/java)
```

<br>

### 2 . Nexus Repository Manager 3

- 2.1 Nexus Repository Manager 3 Install
```
# Nexus install
$ curl -LO https://download.sonatype.com/nexus/3/latest-unix.tar.gz

#「latest-unix.tar.gz」があるかを確認
# curlコマンドを実行すると上記のgz圧縮ファイルがインストールされるのであるか確認
$ ls
→ latest-unix.tar.gz

# gz file解凍
$ tar xzvf latest-unix.tar.gz
```

- 2.2 「nexus-*」と「sonatype-work」を /opt/をディレクトリに移動
tarファイルを解凍した際に出来たファイル「nexus-*」と「sonatype-work」を 
/opt/をディレクトリ以下に移動する
```
#「nexus-*」と「sonatype-work」があるかを確認
# nexusのバージョンはインストールした時期で異なる
$ ls
→ nexus-3.51.0-01  sonatype-work

# 「nexus-*」を移動
$ sudo mv nexus-* /opt/

# 「sonatype-work」を移動
$ sudo mv sonatype-work /opt/

# 移動したかを確認
$ cd /opt/
$ ls
→ nexus-3.51.0-01  sonatype-work
```

<br>

### 3. Installしたfileを削除

```
# 「latest-unix.tar.gz」があるかを確認
$ ls
→ latest-unix.tar.gz

# fileを削除
$ sudo rm latest-unix.tar.gz

# 削除された事を確認
$ ls -la
```

<br>

### 4. nexusユーザ作成

```
# ユーザー作成
$ sudo useradd nexus

# ユーザーが作成されたか確認
$ grep nexus /etc/passwd
→ nexus:x:1002:1002::/home/nexus:/bin/bash
```

<br>

### 5. 所有権変更

```
# ディレクトリに移動
$ cd /opt/
$ ls -la
→ 各fileの権限が「root root」である事を確認 
drwx--x--x. 10 root root 181 Apr 13 06:51 nexus-3.51.0-01
drwx--x--x.  3 root root  20 Apr 13 06:51 sonatype-work

# 「nexus-3.51.0-01」権限変更
$ sudo chown -R nexus:nexus /opt/nexus-*
$ sudo chmod -R go-rw /opt/nexus-*
→ 「nexus-*」が「nexus nexus」に変更された事を確認
drwx--x--x.  3 nexus nexus  20 Apr 13 06:51 nexus-3.51.0-01

# 「sonatype-work」権限変更
$ sudo chown -R nexus:nexus /opt/sonatype-work
$ sudo chmod -R go-rw /opt/sonatype-work
→ 「sonatype-work」が「nexus nexus」に変更された事を確認
drwx--x--x.  3 nexus nexus  20 Apr 13 06:51 sonatype-work
```

<br>

### 6. シンボリックリンク作成

```
# Nexusのversionはinstallしたものに合わせる
$ sudo ln -s /opt/nexus-3.51.0-01 /opt/nexus
$ ls /opt/
→ 「nexus」が作られている事を確認
nexus  nexus-3.51.0-01  sonatype-work
```

<br>

### 7. nexus service登録

```
# viコマンドで「nexus.service」fileの編集
$ sudo vi /etc/systemd/system/nexus.service

# fileの中に下記の内容を張り付ける
# シンボリックリンクを作成していない場合はExecStartとExecStopの箇所のディレクトリが変わるので注意

[Unit]
Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
Restart=on-abort

[Install]
WantedBy=multi-user.target

```

<br>

### 8. systemdファイルリロード

```
# どっちのコマンドでもよい
$ sudo systemctl daemon-reload
$ sudo systemctl restart nexus
```

<br>

### 9. 自動起動設定

```
$ sudo systemctl enable nexus.service
```

<br>

### 10. プロセス起動

```
$ sudo systemctl start nexus.service
```

<br>

### 11. プロセスのステータス確認
EC2で試している場合は、インスタンスタイプが
t2.medium以上じゃあないとメモリ不足でエラーになるので要注意


```
$ sudo systemctl status nexus.service

→ active (running) である事を確認
nexus.service - nexus service
     Loaded: loaded (/etc/systemd/system/nexus.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2023-05-01 05:14:27 UTC; 1h 11min ago
    Process: 698 ExecStart=/opt/nexus/bin/nexus start (code=exited, status=0/SUCCESS)
   Main PID: 976 (java)
      Tasks: 91 (limit: 24517)
     Memory: 2.4G
        CPU: 1min 46.863s     CGroup: /system.slice/nexus.service
```

<br>

### ※ SELinuxを無効化
Red Hat系でプロセスがうまく動かなかった場合はSELinuxを無効化を行って
みてください。

※検証で試したAWS上のEC2では必要な設定だったが、
物理サーバーのRockyでは設定をいれなくてもNexusのプロセスが起動したりと
各環境によって必要な設定は変わるようです。

```
# SELinuxの確認
$ ls -dZ /opt/nexus/bin/nexus
→ _tで終わるがプロセスが「admin_t」になっている事を確認
system_u:object_r:admin_home_t:s0 /opt/nexus//bin/nexus

# ディレクトリのSELinuxを永続的に無効化
$ restorecon -R /opt/nexus-3.51.0-01/bin/
→ _tで終わるがプロセスが「bin_t」になった事を確認
system_u:object_r:bin_t:s0 /opt/nexus-3.51.0-01/bin/nexus

# ディレクトリのSELinuxを永続的に無効化
$ restorecon -R /opt/nexus-3.51.0-01/bin/nexus
→ _tで終わるがプロセスが「bin_t」になった事を確認
system_u:object_r:bin_t:s0 /opt/nexus-3.51.0-01/bin/
```

<br>

### 12. Fire Wallの設定

Nexusはデフォルトのポートが「8081」なので、
こちらのポート解放の設定が必要です。

AWS上のEC2では、セキュリティグループで設定が必要。

物理サーバーのRockyでは、下記のfirewall-cmdで設定が必要。

```
・ポート追加(解放したいポートを設定)
sudo firewall-cmd --permanent --add-port=8081/tcp

・リロード(しないと追加のコマンドが反映されない)
sudo firewall-cmd --reload

・設定されたか確認
sudo firewall-cmd --list-all

```


<br>


後はブラウザ上で、「http://IPアドレス:8081」
でアクセスできることを確認する。

※企業のネットワークだと、セキュリティ面でネットワークACLの設定が
ポートの80と443しか解放されていない事があるので、もしかしたら、
GUIの画面が表示されないかもしれません。

その場合は、クラウド上ならALBを作成してかましてあげればなんとでもなりますが、
そうでない場合は、自己証明書を発行して443のポートでアクセスできるように
してあげないといけません。
OpenJDKは、デフォルトでkeytoolコマンドが使用できるので
これを使って自己証明書を発行するのが一番簡単だと思います。

自己証明書の発行の仕方は下記を参照ください。
https://qiita.com/k-yasuhiro/items/c501a12b8bad14d10588