NetBoxを使ってみよう 2回: 構築をしてみる

# 概要
NetBoxを使ってみようの第2回で、今回は構築を行っていきます。
ドキュメントにてインストール手順はしっかり記載されているため、基本はそちらをもとにした内容となります。

https://netboxlabs.com/docs/netbox/en/stable/installation/

## 全記事
- [1回: Netboxとは](https://qiita.com/strawberryjam/items/671e006d427aac8bfe79)
- 2回: 構築をしてみる ← 今ココ
- [3回: organizationとDeviceの登録](https://qiita.com/strawberryjam/items/461b6ab82136262de288)
- [4回: 仮想マシンの登録](https://qiita.com/strawberryjam/items/41a8b47b423e9e2d10bc)
- [5回: IPAM (IPアドレス管理)](https://qiita.com/strawberryjam/items/79432a2d4cc566e25b0e)
- [6回: プラグイン導入](https://qiita.com/strawberryjam/items/1af613105ff4a1d9517f)


## 構築方法

NetBoxの構築方法として、マシンに必要なソフトウェアを展開していくパターンと、コンテナを用いるパターンの2種類があります。
今回はマシンにソフトウェアを展開していく方向で進めます。

コンテナ版に関しては、コミュニティのgithubで展開方法が案内されているため、こちらをご参照ください。
https://github.com/netbox-community/netbox-docker


## 展開するもの

NetBoxはHTTP ServerとApplication Server、DB、Cashサーバーを用意する必要があります。
今回はドキュメント上にも案内がある以下図の構成になるように構築を進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/e26e05b3-fc0e-9a36-56e0-7170ab17029c.png)

実際に用意するものは以下となり、それぞれ上から順番に進めていきます。

| 項目            | 備考                                                  |
| ------------- | --------------------------------------------------- |
| Ubuntu Server | v24.04, 2CPU, Mem 8GB, Disc 200GB<br>※リソース要件は特段明記無し |
| PosrgreSQL    | v12.0以上が必要                                          |
| Redis         | v4.0以上が必要                                           |
| Python        | v3.10以上が必要                                          |
| NetBoxコンポーネント | -                                                   |
| Gunicorn      | インストールはNetBoxと一緒にされる                                |
| Nginx         | 証明書が必要 (今回は自己証明書で進める)                               |


# 構築

## Ubuntu Serverの準備

仮想マシンとして以下リソースでUbuntu Server 24.04を今回は展開しています。
なお、私が見渡した限りですが、リソース要件等は厳密には書かれていなかったため、想定で構成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/8f6f1942-6a19-692e-0e9d-ddbbc8524858.png)

Ubuntu自体はセットアップを進めておき、このあとの操作用にSSHで操作できるようにしておきます。
また、IPアドレス設定後はDNS Serverへ登録を行っておきます。
私の構成では以下紐づけとしてこのあとは進めていきます。

- IPアドレス: 192.168.0.113
- DNS: ubuntu-netbox.stjam.home


PostgreSQLのセットアップ

NetBoxのデータ格納用にPostgreSQLのセットアップを行います。

以下コマンドでインストールします。

```bash
sudo apt install -y postgresql
```

インストール後は以下コマンドでバージョンが12.0以上であることを確認しておきます。

```bash
psql -V
    
## 出力
psql (PostgreSQL) 16.4 (Ubuntu 16.4-0ubuntu0.24.04.2)
```

基本的にはそのままインストールすれば満たせるとは思いますが、バージョンを指定する場合は”apt-cache”でリポジトリに登録されているバージョンを確認でき、指定してインストールすることも可能です。

**例)インストール可能なバージョン確認コマンド**

```bash
sudo apt-cache show postgresql | grep Version
    
## 出力
Version: 16+257build1.1
Version: 16+257build1
```

**例)バージョン指定でインストールするコマンド**
```bash
sudo apt install -y postgresql=16+257build1.1
```


インストール完了後NetBox用にデータベースの作成と認証用ユーザーの作成や権限割り当てを行っておきます。

PostgreSQLのシェルを起動
```bash
sudo -u postgres psql
```
データベースとユーザー作成と所有者変更
```sql
CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD '<任意のパスワード>';
ALTER DATABASE netbox OWNER TO netbox;
```
作成したnetboxのDBへ接続

```
\connect netbox;
```

作成権限割り当て
```sql
GRANT CREATE ON SCHEMA public TO netbox;
```

ここまで完了したら、”CTRL + D”でシェルを抜けておきます。
一応、作成したユーザーでログインを試す場合は以下コマンドで実施できます。
```bash
psql --username netbox --password --host localhost netbox
    
Password: 
    
## 出力
psql (16.4 (Ubuntu 16.4-0ubuntu0.24.04.2))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
```


## Redisのセットアップ

キャッシュとキューイング用にRedisのセットアップを行います。

以下コマンドでインストールします。

```bash
sudo apt install -y redis-server
```

インストール後は以下コマンドでバージョンが4.0以上であることを確認しておきます。

```bash
redis-server -v

## 出力
Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=d81b8ff71cfb150e
```

以下コマンドで”PONG”と出力され、無事に動作することを確認しておきます。

```bash
redis-cli ping
    
## 出力
PONG
```

## Pythonのセットアップ

NetBoxはPythonで動作するアプリケーションのため、Pythonのインストールを行います。

いくつか必要な関連ソフトウェアがあるため、以下コマンドでPythonと合わせてインストールを行います。

```bash
sudo apt install -y python3 python3-pip python3-venv python3-dev \
build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
```

インストール後は以下コマンドでPythonのバージョンが3.10以上であることを確認しておきます。

```bash
python3 -V
    
## 出力
Python 3.12.3
```

## Netboxのセットアップ

NetBoxのセットアップを行っていきます。

初めにNetBoxのコンポーネントをgithubから取得を行う必要があり、方法として今回はwgetで進めます。
また、バージョンに関しては今回は記事執筆時点で最新のv4.1.1を用います。

リリース情報は以下を参考

https://github.com/netbox-community/netbox/releases

以下コマンドでコンポーネントの取得と解凍、シンボリックリンクの紐づけを行います。
シンボリックリンクにしておくことで、新しいバージョンに移行する際にシンボリックリンクの向き先を変える形で対応できます。

```bash
sudo wget https://github.com/netbox-community/netbox/archive/refs/tags/v4.1.1.tar.gz
sudo tar -xzf v4.1.1.tar.gz -C /opt
sudo ln -s /opt/netbox-4.1.1/ /opt/netbox
```

NetBox用のシステムユーザーを作成し、NetBoxのコンポーネントの所有権を割り当てておきます。

```bash
sudo adduser --system --group netbox
sudo chown --recursive netbox /opt/netbox/netbox/media/
sudo chown --recursive netbox /opt/netbox/netbox/reports/
sudo chown --recursive netbox /opt/netbox/netbox/scripts/
```

続いて設定ファイルの準備を行います。
設定ファイルに関してはサンプルがあらかじめ準備されているため、コピーして編集していきます。
なお、今回は必要最低限の設定で進めていきます。
他のパラメータに関してはドキュメントにて詳細があるため、必要に応じて確認して触ってみてください。
https://netboxlabs.com/docs/netbox/en/stable/configuration/required-parameters/

```bash
sudo cp /opt/netbox/netbox/netbox/configuration_example.py \
/opt/netbox/netbox/netbox/configuration.py
    
sudo vi /opt/netbox/netbox/netbox/configuration.py
```


まずNetBoxのアプリケーションへ接続する際に、HTTPリクエストの許可するホスト名とIPアドレスを指定しておきます。
これは偽のホストパラメータを防ぐ(クロスサイトスクリプティングとかの対策)目的として用いられます。
一応アスタリスクで全許可で進めることも可能ですが、今回はすでにFQDNとIPアドレスが決まっているため入力しておきます。

```configuration.py
ALLOWED_HOSTS = ['ubuntu-netbox.stjam.home', '192.168.0.113']
```

続いてDBの情報を入力します。
“USER”と”PASSWORD”以外はサンプルにて入力されているため、そこだけ入力しておきます。
```configuration.py
DATABASE = {
    'ENGINE': 'django.db.backends.postgresql',  # Database engine
    'NAME': 'netbox',         # Database name
    'USER': 'netbox',               # PostgreSQL username
    'PASSWORD': '{設定したpostgresのパスワード}',           # PostgreSQL password
    'HOST': 'localhost',      # Database server
    'PORT': '',               # Database port (leave blank for default)
    'CONN_MAX_AGE': 300,      # Max database connection age
}
```

続いて”SERCRET KEY”を入力しておきます。
このパラメータで指定したものはNetBoxでのハッシュ化や暗号化の機能で用いられます。

```configuration.py
SECRET_KEY = '{ランダムに生成したキー}'
```

入力値に悩む場合は、ランダムな文字列の生成を行うスクリプトがNetBoxのコンポーネントにあるため、このスクリプトで生成されたものを入れておいても大丈夫です。

```bash
python3 /opt/netbox/netbox/generate_secret_key.py 
```

最後にTime Zoneを設定します。
デフォルトはUTCのため、必要に応じて変更を行ってください。
今回はTokyoにしておきます。
```configuration.py
TIME_ZONE = 'Asia/Tokyo'
```

設定ファイルの準備が完了したため、インストールを行っていきます。
以下コマンドの実行で必要なモジュールのインストール (python仮想環境にpip) などの準備が行われます。
```bash
sudo /opt/netbox/upgrade.sh
```
インストール処理が完了したら、NetBoxに作成されたPythonの仮想環境に遷移します。
```bash
source /opt/netbox/venv/bin/activate
```
NetBoxにデフォルトではユーザーがいない状態のため、管理者を以下コマンドで作成していきます。
実行すると、ユーザー名やパスワードを聞かれるため入力しておきます。
※Emailは空白可能。ここで作成したユーザーでNetBoxに最初はログインする。
```bash
python3 /opt/netbox/netbox/manage.py createsuperuser
```

最後にHousekeepingをCronのタスクとして登録します。
これには古いセッションの削除等のクリーンアップ処理が含まれています。
以下コマンドでCrontの実行対象のディレクトリにシンボリックリンクとして登録を行っておきます。
```bash
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
```

ここまででとりあえずのNetBoxの実行は確認できる状態になったため、一度以下コマンドでアプリケーションを起動してみます。

```python
python3 /opt/netbox/netbox/manage.py runserver 0.0.0.0:8000 --insecure
    
Performing system checks...
    
System check identified no issues (0 silenced).
September 21, 2024 - 15:37:54
Django version 5.0.9, using settings 'netbox.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
```

起動後、FQDN (or IPアドレス):8000にアクセスするとログイン画面が表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/0590cf24-98df-87b0-d202-ba7540223856.png)


作成した管理ユーザーにてログインを実施して、問題なくアクセスが出来ていることを見ておきます。
確認が出来たら、”CTRL + C”でアプリケーションを終了しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/d1bd34d8-3a8f-4775-d878-60d13fa93f59.png)


## gunicornのセットアップ

NetBoxはWSGIアプリケーションとして動作するため、WSGIサーバーとしてgunicornのインストールを行っていきます。
インストールといいつつ、実は先ほどのNetBoxのセットアップ時に環境にインストール自体はされているため、基本は設定ファイルを用いて、起動するように設定する形になります。

まず設定ファイルをサンプルからコピーします。
今回はサンプルそのままで利用可能でしたので、そのまま使っていきます。
```bash
sudo cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
```

続いて、Ubuntuのsystemdで制御できるように、serviceコンポーネントをsystemd配下にコピーして、daemonの再起動とサービスの有効化を行います。

```bash
sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now netbox netbox-rq
```

statusを確認して、Activeになっていれば問題なしです。

```bash
systemctl status netbox.service

## 出力
● netbox.service - NetBox WSGI Service
     Loaded: loaded (/etc/systemd/system/netbox.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-09-21 17:03:52 UTC; 6s ago
       Docs: https://docs.netbox.dev/
   Main PID: 9881 (gunicorn)
      Tasks: 6 (limit: 9444)
     Memory: 524.8M (peak: 525.0M)
        CPU: 4.167s
     CGroup: /system.slice/netbox.service
             ├─9881 /opt/netbox-4.1.1/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath >
             ├─9883 /opt/netbox-4.1.1/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath >
             ├─9884 /opt/netbox-4.1.1/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath >
             ├─9885 /opt/netbox-4.1.1/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath >
             ├─9886 /opt/netbox-4.1.1/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath >
             └─9887 /opt/netbox-4.1.1/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath >
```

## Nginxセットアップ

最後にNginxのセットアップを行っていきます。

まず以下コマンドにてインストールします。
```bash
sudo apt install -y nginx
```

続いて、NetBoxのコンポーネントのnginxの設定ファイルをnginx側にコピーします。
```bash
sudo cp /opt/netbox/contrib/nginx.conf /etc/nginx/sites-available/netbox
```

コピー後、server_nameだけ編集を行っておきます。

```bash
sudo vi /etc/nginx/sites-available/netbox
    
server_name ubuntu-netbox.stjam.home;
```

続いて、デフォルトではHTTPSでの接続が要求されるため、以下コマンドにて自己証明書を作成して配置しておきます。
証明書を格納するべき場所は一つ前のnginxの設定ファイルに記載があります。

```bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt
```

nginxのデフォルトで用意されているシンボリックリンクを削除して、先ほど設定ファイルをおいたディレクトリのシンボリックリンクを作成しておきます。

```bash
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/netbox /etc/nginx/sites-enabled/netbox
```

最後にnginxを再起動して完了になります。

```bash
sudo systemctl restart nginx
```

起動後HTTPSで接続してログイン画面が表示されたら完了です。
※以下キャプチャは証明書を接続元PCのストアに登録していないため、保護されていない通信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/f81bff09-051d-f57e-66e6-79f584ed4d4a.png)



# まとめ
今回はNetBoxを構築してみました。ドキュメント通りに進めれば問題なく完了できるようになっており構築自体はしやすかったです。
次回から実際にNetBoxを使っての管理等を触っていきます。

**次の記事はこちら**

https://qiita.com/strawberryjam/items/461b6ab82136262de288

## おまけ
NetBoxのアプリケーションにアクセスした際に日本語で表示がされる場合があると思います。
デフォルトではブラウザの設定に応じて自動で言語が選択される”AUTO”になっているためです。
日本語のままでも良いのですが、若干表現や表示が変な箇所やドキュメントと照らしわわせる際のことも考慮して英語を指定する方が良いかもという感想です。
※このあとの記事では英語UIベースで触れていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/aa15c52a-fc67-ba13-1f86-6b55e3db2ca8.png)