ubuntu 24.04 にnetboxを構築した際のメモ

# はじめに
proxmoxを利用してVMを立て始めて早数年。そろそろIPアドレスの管理をスプレッドシートからちょっとカッコイイなにかに変えてみたいと思い始めました。  
netboxというOSSを発見したので、導入した際のメモをここに残しておきます。
公式のインストールガイドをなぞっていけば問題なくインストールできると思います。

記事を最後まで書いた後、qiitaに同様の記事がないか再確認したところ、先駆者様がいらっしゃいました。
記事のレベルもこちらのほうが高いと思います。

https://qiita.com/strawberryjam/items/3ff4436036c7f1cd0916

せっかく書いたのでこの記事はこのまま公開します。
今後は記事を書き始める前に確認します・・・。


# 環境
構築時の環境を下記に記します。
個人的な好みでdiskを3つ用意しています。
万が一アプリケーションやDBがディスクを使い切ったときに、OSの起動やSSHでの接続ができるようにするためです。
後述しますが、お家ラボ程度あればdisk2,3は2Gでも十分でした。

| 項目 | 内容|
| :- | :-- |
| OS | Ubuntu 24.04 |
| ram | 8G (もっと少なくても行けたと思います）|
| disk1 | 16G (bootなどに使用) |
| disk2 | 16G (/opt netboxのアプリケーション本体用) |
| disk3 | 32G (/var/lib postgresqlのデータ用 | 
| その他 | proxmos上にVMを構築 <br> qemu-gaを導入しています |

アプリケーションの情報
| 項目 | 内容|
| :- | :-- |
| netbox | NetBox Community v4.1.6 |
| python | Python 3.12.3 |
| postgresql | psql (PostgreSQL) 16.4 |
| Redis | v=7.0.15 |
| nginx | nginx/1.24.0 | 


# 構築手順

## 0. 初期設定
いつものおまじない
```
sudo apt update && sudo apt upgrade -y
sudo apt install qemu-guest-agent 
```

## 1. PostgreSQLのインストール
:::note info
PosetgreSQL 12以降が必要になります。
MySQLやその他のDBはサポート外のようです。
:::

インストールとDBのバージョンの表示。

```
sudo apt install -y postgresql && psql -V
```

最終行に下記のような表示が出ればOK
バージョンが12以上であることを確認すること。
> psql (PostgreSQL) 16.4 (Ubuntu 16.4-0ubuntu0.24.04.2)

このままDBにnetbox用のユーザーとテーブルを作成します。
下記のコマンドでpostgresのシェルに入ります。
```
 sudo -u postgres psql
```

下記のコマンドを実行し、最後に`\q` で抜けます。
DB用のパスワードは各自で決定、書き換えてください。
```
CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD 'DB用のパスワードを記載';
ALTER DATABASE netbox OWNER TO netbox;
\connect netbox;
GRANT CREATE ON SCHEMA public TO netbox;
\q
```

最後にDBの状態を確認します。
下記のコマンドでpostgresのシェルに入ります。
パスワードを求められますので、先ほど設定したパスワードを入力してください。
```
psql --username netbox --password --host localhost netbox
```

問題がなければ下記のように表示されます。
> 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.
>
>netbox=>  

このままインフォメーションを表示します。
```
 \conninfo
 ```
>You are connected to database "netbox" as user "netbox" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)

確認ができたら`\q` で抜けてください。


## 02.Redisのインストール
:::note info
 Redis 4.0以降が必要になります。
:::
インストールとバージョンの表示
```
sudo apt install -y redis-serve && redis-server -v
```
最終行にバージョンが表示されればOK
> Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=d81b8ff71cfb150e

最後にサービスの状態を確認します。
```
 redis-cli ping
```
> PONG


## 03. NetBoxのインストール
### NetBoxのダウンロード
リリースアーカイブから取得する方法とgitでcloneする方法の２つが用意されています。
今回はgitを採用します。

```
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
sudo apt install -y git
```

pythonのバージョンが3.10以上であることを確認しておきましょう。
```
python3 -V
```
>Python 3.12.3

netbox用のディレクトリを作成し、そこにcloneをダウンロードします。

```
sudo mkdir -p /opt/netbox/ && cd /opt/netbox/ && sudo git clone -b master --depth 1 https://github.com/netbox-community/netbox.git .
```
:::note info
NetBoxではmasterブランチのdepth=1のところに最新の安定版のリリースがあるとのこと。
:::

### ユーザーの作成
システムユーザーを作成します。ここで作成したユーザーがWSGIとHTTPのサービスを管理します。

```
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/
```

### コンフィグの設定
```
cd /opt/netbox/netbox/netbox/ && sudo cp configuration_example.py configuration.py
```

作成した`configuration.py`を編集します。
公式によると最低限、下記の４つを設定する必要があるみたいです。

- ALLOWED_HOSTS
- DATABASE
- REDIS
- SECRET_KEY

#### ALLOWED_HOSTS
`ALLOWED_HOSTS`は少なくとも１つのIPアドレス、もしくはFQDNが必要です。
これはnetboxのサーバー本体のIPアドレスかFQDNを指定する必要があります。
設定漏れを回避するためか、exampleからコピーしただけでは空欄となっています。
`*` によるワイルドカードも指定可能です。
お家サーバーや検証環境レベルなら`*`でもいいのかもしれません。
その場合は以下のような表記になります。
> ALLOWED_HOSTS = ['*']

#### DATABASE
`DATABASE`は`USER`と`PASSWORD`が空欄になっています。
01で作成したDB用のユーザー名とパスワードを記載してください。

#### REDIS
`REDIS`はデフォルトのままで大丈夫だと思います。

#### SECRET_KEY
`SECRET_KEY`はハッシュやソルトに使用する50文字以上のユニークな値が必要になります。
`generate_secret_key.py`が用意されているため、特にこだわりがない場合はこちらを使うのがお手軽だと思います。

```
python3 ../generate_secret_key.py
```
生成された値を`configuration.py`の`SECRET_KEY`に記載します。

#### その他
他にも設定ができますが、詳しくは公式のインストールガイドを参照してください。
リモートのファイルストレージが使えたりするみたいです。

### インストール
`configuration.py`の設定が終わったらインストールに進みます。
`upgrade.sh`が用意されており、実行することでインストールが開始されます。

```
sudo /opt/netbox/upgrade.sh
```
> (前略)
Completed.
Removing expired user sessions (python3 netbox/manage.py clearsessions)...
Upgrade complete! Don't forget to restart the NetBox services:
\> sudo systemctl restart netbox netbox-rq

### アプリケーション用のユーザーの作成
upgrade.shは必要なパッケージやDBのマイグレーションのみを実行しており、アプリケーションの管理ユーザーは作成されていません。ログインをするためにも管理ユーザーの作成が必要になります。

下記のコマンドでPythonのvirtual environmentに入ります。
```
source /opt/netbox/venv/bin/activate
```

プロンプトの前に`(venv)`が付いていることを確認して、下記のコマンドを実行します。
実行すると管理ユーザーのユーザー名やパスワードの入力を求められます。

```
cd /opt/netbox/netbox
python3 manage.py createsuperuser
```

>Username: 
Email address: 
Password: 
Password (again): 
Superuser created successfully.

この後もPythonのvirtual environmentは維持したまま設定をしていきます。

### netbox-housekeeping.sh の登録
古くなったセッションなどをクリーニングするためのシェルが用意されています。
手動で実行することもできますが、公式のインストールガイドではcronによるデイリーベースのシェルの実行を推奨しています。

```
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
```

### お試しでアプリケーションを起動

下記のコマンドでアプリケーションを実行します。
```
python3 manage.py runserver 0.0.0.0:8000 --insecure
```
>Performing system checks...
>
>System check identified no issues (0 silenced).
November 02, 2024 - 14:00:42
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.

起動が確認できたら、ブラウザからIPアドレスかFQDNにポート8000を指定してアクセスしてみます。
ログイン画面で管理ユーザーのユーザー名とパスワードを指定してログインができるか確認します。

> http://127.0.0.1:8000 など
> * httpであることに注意　(httpsではない)

アクセスできない場合、サーバー側のファイアーウォールを確認してみてください。

ログインが確認できたらコンソールに戻り、`ctrl+c`でアプリケーションを停止します。

## Gunicornの設定
WSGIとして公式のインストールガイドではGunicornとuWSGIの2つが候補にあげられています。
今回はGunicornを採用しました。

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

下記のコマンドで起動状態を確認します。
```
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-11-02 14:17:57 UTC; 6s ago
       Docs: https://docs.netbox.dev/
   Main PID: 5075 (gunicorn)
      Tasks: 6 (limit: 9444)
     Memory: 525.7M (peak: 526.2M)
        CPU: 4.139s
     CGroup: /system.slice/netbox.service
             ├─5075 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
             ├─5077 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
             ├─5078 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
             ├─5079 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
             ├─5080 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
             └─5081 /opt/netbox/venv/bin/python3 /opt/netbox/venv/bin/gunicorn --pid /var/tmp/netbox.pid --pythonpath /opt/netbox/netbox --config /opt/netb>
>
>Nov 02 14:17:57 net-box systemd[1]: Started netbox.service - NetBox WSGI Service.
Nov 02 14:17:57 net-box gunicorn[5075]: [2024-11-02 14:17:57 +0000] [5075] [INFO] Starting gunicorn 23.0.0


## HTTPサーバーの設定
HTTPサーバーもnginxとapacheの2つの選択肢が用意されています。
今回はnginxを採用します。

#### 証明書

自宅のVM用のIPAMのため、証明書は自己証明書とします。
ちゃんとした(?)証明書が必要な方は公式のインストールガイドを参照してください。
`let's encrypt`などが候補にあげられています。
https://netbox.readthedocs.io/en/stable/installation/5-http-server/
```
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/netbox.key -out /etc/ssl/certs/netbox.crt
```

#### nginxの設定

```
sudo apt install -y nginx
```

事前に用意されたnginx用のコンフィグファイル`/opt/netbox/contrib/nginx.conf`を編集します。
`netbox.example.com`を`configuration.py`で設定した`ALLOWED_HOSTS`と同じ値に書き換えてください。
その後、nginxのディレクトリにコピーします。

```
sudo cp /opt/netbox/contrib/nginx.conf /etc/nginx/sites-available/netbox
```

またnginxにあるデフォルトのsite-enabledのファイルを削除し、netbox用のファイルをリンクで配置します。

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

また、nginxの起動前にこちらのファイルも書き換えが必要になります。
`server_name`の値を`configuration.py`で設定した`ALLOWED_HOSTS`と同じ値に書き換えてください。

:::note info
`ALLOWED_HOSTS`を`'*'`で設定している場合、下記の設定にしないとnginxがエラーで立ち上がりません。
```
server_name '_';
```
:::

最後にnginxを再起動し、ブラウザからアクセスできることを確認してください。
```
sudo systemctl restart nginx
```
> https://127.0.0.1 など
> * httpsであることに注意

# おわりに
公式ドキュメントがしっかりしているため、特に詰まることなく構築することができました。
構築の難易度はかなり低めなのかなと思います。
（外部DBやLDAPなど、今回は使わなかったオプションを使うとまた違うとは思いますが・・・）

いずれお家DNSで使っているBINDのZONEファイルへの連携ができればいいなと思いつつ、まずはこのあたりで満足しようと思います。


また、初期構築完了時のディスクの使用率は以下のとおりでした。
disk 2,3は2Gくらいでも十分だったかもしれません。

| Filesystem                         |Size | Used | Avail | Use% | Mounted on |
| :-- | --: | --: | --: | --: | :-- |
| tmpfs                              |795M | 1.1M |  794M |   1% | /run |
| /dev/mapper/ubuntu--vg-ubuntu--lv  |9.8G | 3.2G |  6.1G |  35% | / |
| tmpfs                              |3.9G | 1.1M |  3.9G |   1% | /dev/shm |
| tmpfs                              |5.0M |    0 |  5.0M |   0% | /run/lock |
| /dev/sdb                           | 16G | 467M |   15G |   4% | /opt | 
| /dev/sdc                           | 32G | 267M |   30G |   1% | /var/lib |
| /dev/sda2                          |1.7G |  95M |  1.5G |   6% | /boot |
| tmpfs                              |795M |  12K |  795M |   1% |  /run/user/1000 |