Contents
Overview
Podman を使用して NetBox を構築します。
Docker Compose
NetBox Community が NetBox の Docker Compose を Git で公開しています。今回は、これを参考にして Podman で NetBox を構築していきます。私はあまり Docker Compose が好きではないこともあり、積極的に Docker Compose を学ぶことも少ないのですが、これまで見てきた docker-compose.yml よりも複雑な気がしますね。
myadmin@ubuntu:~$ git clone -b release https://github.com/netbox-community/netbox-docker.git myadmin@ubuntu:~$ ls -l netbox-docker 合計 112 -rw-rw-r-- 1 myadmin myadmin 4923 7月 16 20:45 Dockerfile -rw-rw-r-- 1 myadmin myadmin 10175 7月 16 20:45 LICENSE -rw-rw-r-- 1 myadmin myadmin 7369 7月 16 20:45 README.md -rw-rw-r-- 1 myadmin myadmin 6 7月 16 20:45 VERSION drwxrwxr-x 2 myadmin myadmin 4096 7月 16 20:45 build-functions -rwxrwxr-x 1 myadmin myadmin 2665 7月 16 20:45 build-latest.sh -rwxrwxr-x 1 myadmin myadmin 15096 7月 16 20:45 build.sh drwxrwxr-x 3 myadmin myadmin 4096 7月 16 20:45 configuration drwxrwxr-x 2 myadmin myadmin 4096 7月 16 20:45 docker -rw-rw-r-- 1 myadmin myadmin 877 7月 16 20:45 docker-compose.override.yml.example -rw-rw-r-- 1 myadmin myadmin 77 7月 16 20:45 docker-compose.test.override.yml -rw-rw-r-- 1 myadmin myadmin 1800 7月 16 20:45 docker-compose.test.yml -rw-rw-r-- 1 myadmin myadmin 2267 7月 16 20:45 docker-compose.yml drwxrwxr-x 2 myadmin myadmin 4096 7月 16 20:45 env -rw-rw-r-- 1 myadmin myadmin 359 7月 16 20:45 pyproject.toml -rwxrwxr-x 1 myadmin myadmin 4981 7月 16 20:45 release.sh -rw-rw-r-- 1 myadmin myadmin 244 7月 16 20:45 renovate.json -rw-rw-r-- 1 myadmin myadmin 127 7月 16 20:45 requirements-container.txt drwxrwxr-x 2 myadmin myadmin 4096 7月 16 20:45 test-configuration -rwxrwxr-x 1 myadmin myadmin 3222 7月 16 20:45 test.sh
Pod
最初に Pod を作成します。今回は 10002 ポートを nginx ( NetBox の TLS リバースプロキシ) に転送します。
myadmin@ubuntu:~$ sudo podman pod create -n netbox-pod -p 10002:443 myadmin@ubuntu:~$ sudo podman pod ls
共通ディレクトリの作成
ディレクトリを作成します。NetBox としてのトップディレクトリは /opt/container/netbox とします。
myadmin@ubuntu:~$ sudo mkdir -p /opt/container/netbox/env
PostgreSQL
PostgreSQL コンテナを作成します。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-postgresql \ -e 'TZ=Asia/Tokyo' \ -e 'POSTGRES_DB=netbox' \ -e 'POSTGRES_PASSWORD=password' \ -e 'POSTGRES_USER=netbox' \ -v netbox-postgres-data:/var/lib/postgresql/data \ docker.io/postgres:15-alpine myadmin@ubuntu:~$ sudo podman ps myadmin@ubuntu:~$ sudo podman volume ls
Redis
Redis コンテナを作成します。Redis のデフォルトのポート番号は 6379 となりますが、今回、同一 Pod 内で Redis, Redis Cache の 2 つのコンテナを動かすため、ポート番号を分ける必要があります。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-redis \ -e 'TZ=Asia/Tokyo' \ -e 'REDIS_PASSWORD=password' \ -v netbox-redis-data:/data \ docker.io/redis:7-alpine \ redis-server --port 6379 --appendonly yes --requirepass password myadmin@ubuntu:~$ sudo podman ps myadmin@ubuntu:~$ sudo podman volume ls
Redis Cache
Redis Cache コンテナを作成します。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-redis-cache \ -e 'TZ=Asia/Tokyo' \ -e 'REDIS_PASSWORD=password' \ -v netbox-redis-cache-data:/data \ docker.io/redis:7-alpine \ redis-server --port 6380 --requirepass password myadmin@ubuntu:~$ sudo podman ps myadmin@ubuntu:~$ sudo podman volume ls
NetBox
NetBox コンテナを作成します。
ディレクトリの作成とファイルの配置
ファイルを配置します。configuration は netbox コンテナが bind mount します。
myadmin@ubuntu:~$ sudo mkdir -p /opt/container/netbox/netbox myadmin@ubuntu:~$ sudo cp -a netbox-docker/configuration /opt/container/netbox/netbox
CSRF_TRUSTED_ORIGINS
今回は、NetBox の TLS 化のために Nginx のリバースプロキシを使用しますが、NetBox のデフォルトでは CSRF (クロスサイトリクエストフォージェリ)として検知されてしまうため、以下のように CSRF_TRUSTED_ORIGINS を設定します。本当は環境変数から指定したいところですが、バグ?なのか効かないようです。
myadmin@ubuntu:~$ sudo vi /opt/container/netbox/netbox/configuration/configuration.py
# CSRF_TRUSTED_ORIGINS = _environ_get_and_map('CSRF_TRUSTED_ORIGINS', '', _AS_LIST)
CSRF_TRUSTED_ORIGINS = ['https://netbox.si1230.com:10002']
環境変数
netbox コンテナの環境変数は大量にあるため、個別に環境変数ファイルを作成して読み込みます。docker-compose.yml でもこのようになっています。Podman では同じ Pod に所属するコンテナ同士は 127.0.0.1 でアクセス可能となります。Redis, Redis Cache はポート番号を分けているため、明示的にポート番号を指定しています。
myadmin@ubuntu:~$ sudo tee /opt/container/netbox/env/netbox.env <<"EOF"
TZ=Asia/Tokyo
CORS_ORIGIN_ALLOW_ALL=True
DB_HOST=127.0.0.1
DB_NAME=netbox
DB_PASSWORD=password
DB_USER=netbox
EMAIL_FROM=netbox@si1230.com
EMAIL_PASSWORD=
EMAIL_PORT=25
EMAIL_SERVER=mail.si1230.com
EMAIL_SSL_CERTFILE=
EMAIL_SSL_KEYFILE=
EMAIL_TIMEOUT=5
EMAIL_USERNAME=netbox
EMAIL_USE_SSL=false
EMAIL_USE_TLS=false
GRAPHQL_ENABLED=true
HOUSEKEEPING_INTERVAL=86400
MEDIA_ROOT=/opt/netbox/netbox/media
METRICS_ENABLED=false
REDIS_CACHE_DATABASE=1
REDIS_CACHE_HOST=127.0.0.1
REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY=false
REDIS_CACHE_PASSWORD=password
REDIS_CACHE_SSL=false
REDIS_CACHE_PORT=6380
REDIS_DATABASE=0
REDIS_HOST=127.0.0.1
REDIS_INSECURE_SKIP_TLS_VERIFY=false
REDIS_PASSWORD=password
REDIS_SSL=false
REDIS_PORT=6379
RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
SECRET_KEY=r(m)9nLGnz$(_q3N4z1k(EFsMCjjjzx08x9VhNVcfd%6RF#r!6DE@+V5Zk2X
SKIP_SUPERUSER=true
WEBHOOKS_ENABLED=true
EOF
コンテナの実行
コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox \ --env-file /opt/container/netbox/env/netbox.env \ -v /opt/container/netbox/netbox/configuration:/etc/netbox/config:ro \ -v netbox-media-files:/opt/netbox/netbox/media:rw \ -v netbox-reports-files:/opt/netbox/netbox/reports:rw \ -v netbox-scripts-files:/opt/netbox/netbox/scripts:rw \ docker.io/netboxcommunity/netbox:v3.5-2.6.1 myadmin@ubuntu:~$ sudo podman ps myadmin@ubuntu:~$ sudo podman volume ls
NetBox Worker
コンテナを実行します。先述の Redis, Redis Cache のように、同じ netbox イメージから netbox, netbox-worker, netbox-housekeeping のコンテナを起動するため、ポート番号を分ける必要があるのではと思いましたが、問題なく稼働しています。コンテナなので調査も面倒なので、一旦放置しますが、後からきちんと調べて把握しておきたいところです。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-worker \ --env-file /opt/container/netbox/env/netbox.env \ -v /opt/container/netbox/netbox/configuration:/etc/netbox/config:ro \ -v netbox-media-files:/opt/netbox/netbox/media:rw \ -v netbox-reports-files:/opt/netbox/netbox/reports:rw \ -v netbox-scripts-files:/opt/netbox/netbox/scripts:rw \ docker.io/netboxcommunity/netbox:v3.5-2.6.1 \ /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker myadmin@ubuntu:~$ sudo podman ps
NetBox Housekeeping
コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-housekeeping \ --env-file /opt/container/netbox/env/netbox.env \ -v /opt/container/netbox/netbox/configuration:/etc/netbox/config:ro \ -v netbox-media-files:/opt/netbox/netbox/media:rw \ -v netbox-reports-files:/opt/netbox/netbox/reports:rw \ -v netbox-scripts-files:/opt/netbox/netbox/scripts:rw \ docker.io/netboxcommunity/netbox:v3.5-2.6.1 \ /opt/netbox/housekeeping.sh myadmin@ubuntu:~$ sudo podman ps
Nginx
Nginx コンテナを作成します。
ディレクトリの作成とファイルの配置
TLS 証明書を配置( TLS 証明書の作成はこちらを参照)して、Nginx の設定ファイルを作成しています。本稿での Nginx はリバースプロキシとして使用します。http://127.0.0.1:8080 は Netbox コンテナのポート番号です。
myadmin@ubuntu:~$ sudo mkdir -p /opt/container/netbox/nginx/conf.d myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/{issued/si1230.com.crt,private/si1230.com.key} /opt/container/netbox/nginx/conf.d myadmin@ubuntu:~$ sudo tee /opt/container/netbox/nginx/conf.d/proxy.conf <<"EOF" server { listen 443 ssl; server_name netbox.si1230.com; ssl_certificate /etc/nginx/conf.d/si1230.com.crt; ssl_certificate_key /etc/nginx/conf.d/si1230.com.key; location / { proxy_pass http://127.0.0.1:8080; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } EOF
コンテナの実行
コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod netbox-pod --name netbox-nginx \ -e 'TZ=Asia/Tokyo' \ -v /opt/container/netbox/nginx/conf.d:/etc/nginx/conf.d \ docker.io/library/nginx myadmin@ubuntu:~$ sudo podman ps
NetBox へのアクセス
最初にコンソールからユーザーを作成する必要があります。
myadmin@ubuntu:~$ sudo podman exec -it netbox bash root@netbox-pod:/opt/netbox/netbox# python3 manage.py createsuperuser
以下で NetBox にアクセスできます。
https://netbox.si1230.com:10002
systemd
systemd で NetBox を制御します。
systemd ユニットファイル
systemd ユニットファイルを生成します。
myadmin@ubuntu:~$ cd /etc/systemd/system && sudo podman generate systemd -f -n netbox-pod && cd
/etc/systemd/system/container-netbox-nginx.service
/etc/systemd/system/container-netbox-postgresql.service
/etc/systemd/system/container-netbox.service
/etc/systemd/system/container-netbox-redis-cache.service
/etc/systemd/system/container-netbox-worker.service
/etc/systemd/system/pod-netbox-pod.service
/etc/systemd/system/container-netbox-housekeeping.service
/etc/systemd/system/container-netbox-redis.service
systemd ユニットファイルの有効化
systemd を再起動して、追加したユニットファイルを読み込みます。
myadmin@ubuntu:~$ sudo systemctl daemon-reload
systemd を使用した Podman の操作
systemd から netbox-pod を操作してみます。
myadmin@ubuntu:~$ sudo systemctl status pod-netbox-pod.service myadmin@ubuntu:~$ sudo systemctl start pod-netbox-pod.service myadmin@ubuntu:~$ sudo systemctl stop pod-netbox-pod.service myadmin@ubuntu:~$ sudo systemctl restart pod-netbox-pod.service
systemd の自動起動設定
システム起動時に netbox-pod が起動するように systemd を設定します。
myadmin@ubuntu:~$ sudo systemctl enable pod-netbox-pod.service myadmin@ubuntu:~$ sudo systemctl is-enabled pod-netbox-pod.service enabled
クリーンアップ
何度か作り直すことを想定し、これまでに構築した内容を初期化するコマンドです。
myadmin@ubuntu:~$
sudo rm /etc/systemd/system/pod-netbox-*
sudo rm /etc/systemd/system/container-netbox-*
sudo systemctl daemon-reload
sudo podman rm -f netbox-nginx netbox-housekeeping netbox-worker netbox netbox-redis-cache netbox-redis netbox-postgresql
sudo podman volume rm netbox-scripts-files netbox-reports-files netbox-media-files netbox-redis-cache-data netbox-redis-data netbox-postgres-data
sudo podman pod rm netbox-pod
sudo rm -r /opt/container/netbox