netbox 在 Ubuntu20 系统上的安装记录
NetBox 安装
系统环境:Ubuntu20.04 LTS
安装 PGSQL
- 安装
1 | sudo apt install -y postgresql |
- 查看版本信息:
1 | xdai@xdai-vm:~$ psql -V |
- 启动数据库并设置为开机自启
1 | sudo systemctl start postgresql |
- 创建数据库
1 | # 进入数据库 |
- 验证数据库状态
1 | xdai@xdai-vm:~$ psql --username netbox --password --host localhost netbox |
可以看到数据库已经可以连接,信息为:host "localhost" (address "127.0.0.1") at port "5432"
安装 Redis
- 安装
1 | sudo apt install -y redis-server |
- 查看版本信息
1 | xdai@xdai-vm:~$ redis-server -v |
- 验证服务状态
使用 redis-cli ping
来验证,返回 PONG
表示正常。
1 | xdai@xdai-vm:~$ redis-cli ping |
安装 Netbox
安装 Python
NetBox v3.0 开始最低支持 Python3.7,从 NetBox v3.2 开始将最低支持 Python3.8。
最新的 Ubuntu20.04 默认的 Python 版本为 3.8.10,但是仍缺少一些相关的依赖包。
1 | 安装 Python 相关依赖包 |
下载 NetBox
可以通过 wget 或者 git 来下载。
1 | sudo mkdir -p /opt/netbox/ |
为 NetBox 创建系统用户
创建系统用户的目的是为了将 WSGI 和 HTTP 服务配置为在这个帐户下运行。
1 | # 创建系统用户 |
修改 NetBox 配置文件
复制一份默认的配置文件:
1 | cd /opt/netbox/netbox/netbox/ |
先生成一个密钥,用来维护 HTTP 用户会话状态,配置文件里面要用到:
1 | xdai@xdai-vm:/opt/netbox/netbox/netbox$ python3 ../generate_secret_key.py |
第一次使用的话,最小话的配置文件需要下面几个参数就可以运行:
1 | xdai@xdai-vm:/opt/netbox/netbox/netbox$ sudo vim configuration.py |
- 第 11 行:允许谁可以访问前端页面
1 | ALLOWED_HOSTS = ['*'] |
- 第 15~22 行:数据库,修改用户名和密码为之前设置的信息
1 | DATABASE = { |
redis 使用默认配置即可
第 60 行:SECRET_KEY
1 | SECRET_KEY = 'lKCyYG-q5qW0&3zK=*U9%Ga@yOzZOwEIz9JhrlIIdd*CXE0b#z' |
- (可选配置)第 203 行:修改时区,默认是 UTC,需要改为中国标准时间
1 | TIME_ZONE = 'Asia/Shanghai' |
修改完配置文件之后,保存退出。
安装其他可选的组件
NetBox 还支持一些可选的软件包。如果需要,第一次安装的时候这些包必须在 NetBox 根目录的 local_requirements.txt 中写上,这样 NetBox 会自动进行安装;或者也可以后期按需手动安装。
官方提供了两个组件:
- napalm 用于从网络设备获取实时数据
- django-storages 用于连接远程文件存储(默认是使用本地存储)
这里我只需要 napalm 来对接华三的网络设备,所以需要安装两个包:
1 | sudo sh -c "echo 'napalm' >> /opt/netbox/local_requirements.txt" |
运行升级脚本
运行自带的 upgrade.sh
来完成以下操作:
创建 Python 虚拟环境
安装所有必需的 Python 包(根目录下 requirements.txt 和 local_requirements.txt 包含的软件)
运行 Django 的数据库迁移
在本地生成离线文档
在磁盘上聚合静态资源文件
默认 pip 安装会很慢,参考pip 下载加速来设置。
1 | sudo /opt/netbox/upgrade.sh |
安装完成之后会有如下提示:
1 | Upgrade complete! Don't forget to restart the NetBox services: |
如果是升级 NetBox,需要重启一下服务,因为本次是新安装,所以不用关注,继续往下进行。
创建 django 管理员用户
NetBox 没有默认用户,所以需要创建一个超级用户(管理帐户)才能登录 NetBox。
进入到升级脚本创建的 Python 虚拟环境,之后命令行前面都会有个 (venv)
的提示符,表示当前在虚拟环境中:
1 | source /opt/netbox/venv/bin/activate |
创建用户,邮箱可以留空不填。
1 | (venv) xdai@xdai-vm:/opt/netbox/netbox/netbox$ cd /opt/netbox/netbox |
设置自动清理任务
NetBox 包含了 housekeeping
管理命令用来处理一些定期清理任务,例如清除旧会话和过期的更改记录。
尽管可以手动运行此命令来进行清理操作,不过还是建议使用系统的 cron 守护程序或类似其他的定时任务来运行清理任务。
使用以下命令来为脚本创建一个 cron 任务,注意脚本的路径,如果 NetBox 安装在其他路径,需要使用正确的绝对路径。
1 | sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping |
测试运行
到这里 NetBox 已经安装的差不多了,可以使用 django 的命令来测试运行一下,没有问题后再使用 WSGI 来启动服务。
1 | python3 manage.py runserver 0.0.0.0:8000 --insecure |
然后使用浏览器访问这个服务器的 8000
端口测试一下!
如果服务已经正常启动,但是无法访问的话,请自行检查系统的防火墙或者 iptables 设置,放行 8000 端口。
可以正常登录~
一般开发的时候使用这种方式来测试服务的运行情况,实际部署时,需要结合 WSGI 来运行服务,必要时还需要配置 nginx 来使用。
先 crtl + C 停止服务,进行下一步操作。
使用 Gunicorn 运行 Django 服务
NetBox 作为 HTTP 服务器后面的 WSGI 应用程序运行。 NetBox 默认使用的是 gunicorn,但是它不能处理静态文件,还要结合 nginx 才能正常使用,而 uwsgi 支持静态文件的映射。这里先使用官方提供的 gunicorn 来启动服务。
复制一份默认的配置文件:
1 | sudo cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py |
使用默认的配置文件即可,如果修改配置的话,后面 nginx 的配置需要同步修改。
启动 NetBox 服务
NetBox 默认为我们写好了 systemd 的服务文件,复制到系统目录下
1 | sudo cp -v /opt/netbox/contrib/*.service /etc/systemd/system/ |
这里还要注意:如果 NetBox 安装在其他路径,需要在 service 文件中将几个服务修改为你安装的绝对路径,或者也可以使用软连接,将你的安装路径链接到/opt/netbox/
目录下,参考以下命令。
1 | ln -s Your/NetBox/Root/Path /opt/netbox |
复制完 service 文件之后,启动服务并设置为开机自启动。
1 | sudo systemctl start netbox netbox-rq |
查看服务状态
1 | systemctl status netbox.service |
使用 nginx 来处理静态文件
上一步已经启动了 web 服务,但是访问时会出现 Static Media Failure
的错误信息,就是因为 gunicorn 不能处理静态文件的映射,需要借助其他方式来实现(uwsgi 支持)。
安装 nginx
1 | sudo apt install -y nginx |
编写配置文件
1 | sudo cp /opt/netbox/contrib/nginx.conf /etc/nginx/sites-available/netbox |
不想使用 https 的话,可以修改 NetBox 提供的默认 nginx 配置文件:
1 | # sudo vim /etc/nginx/sites-available/netbox |
重启 nginx 服务:
1 | sudo systemctl restart nginx |
使用 80 端口来访问:
至此,NetBox 搭建完成!
使用 uwsgi 来启动 NetBox 服务
NetBox 默认使用 gunicorn 作为 WSGI 来提供服务,但是它不能处理静态文件,还要结合 nginx 才能正常使用,而 uwsgi 支持静态文件的映射。这里给出使用方法。
安装 uwsgi
进入到升级脚本创建的 Python 虚拟环境,之后命令行前面都会有个 (venv)
的提示符,表示当前在虚拟环境中:
1 | source /opt/netbox/venv/bin/activate |
编辑配置文件
仅供参考,勿用于生产。
1 | # sudo vim /opt/netbox/uwsgi.ini |
启动服务
1 | sudo /opt/netbox/venv/bin/uwsgi --ini /opt/netbox/uwsgi.ini |
然后就可以通过 8080 端口来访问服务,而且不会报无法找到静态文件的错误。
但是生产环境中还是建议使用专门的 webserver 例如 nginx、apache 来和 WSGI 进行对接。
使用了Gunicorn或者uWSGI,为什么还需要Nginx?
编辑 service 文件
如果想要使用 systemd 来启动 uwsgi 服务,需要编辑一个 service 文件,可以参考官方文档。