ARTICLE · 1152900
NetBox 部署文档(Ubuntu 22.04)
NetBox 部署文档(Ubuntu 22.04)主机:ggbond-virtual-machine 部署方式:源码安装 + gunicorn + nginx 反向代理


1. 环境信息
端口规划
2. 部署步骤
2.1 系统依赖
sudo apt update
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 postgresql redis nginx
2.2 数据库准备(PostgreSQL)
sudo -u postgres psql
CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD '强密码';
GRANT ALL PRIVILEGES ON DATABASE netbox TO netbox;
\c netbox
GRANT ALL ON SCHEMA public TO netbox; -- PG 15+ 必需
\q
2.3 下载源码与虚拟环境
sudo mkdir -p /opt/netbox/
cd /opt/netbox
sudo git clone -b master --depth 1 https://github.com/netbox-community/netbox.git
sudo cp netbox/netbox/configuration.example.py netbox/netbox/configuration.py
sudo python3 -m venv /opt/netbox/venv
2.4 安装 Python 依赖
source /opt/netbox/venv/bin/activate
pip install -r /opt/netbox/requirements.txt
注意:psycopg-c 需本地编译 C 扩展,耗时较长且必须有 build-essential、libpq-dev。 若编译失败可先装 psycopg[binary],但 C 版性能更优。
2.5 核心配置文件
编辑 /opt/netbox/netbox/netbox/configuration.py:
ALLOWED_HOSTS = ['192.168.1.100', 'localhost'] # 实际IP,不带端口
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'netbox',
'USER': 'netbox',
'PASSWORD': '强密码',
'HOST': 'localhost',
'PORT': '',
'CONN_MAX_AGE': 300,
}
}
REDIS = {
'tasks': {'HOST': 'localhost', 'PORT': 6379, 'PASSWORD': '', 'DATABASE': 0, 'SSL': False},
'caching': {'HOST': 'localhost', 'PORT': 6379, 'PASSWORD': '', 'DATABASE': 1, 'SSL': False},
}
SECRET_KEY = '生成的50位随机串'
# 生成方法: python3 -c "import secrets; print(secrets.token_urlsafe(50))"
CSRF_TRUSTED_ORIGINS = ['http://192.168.1.100:8080']
# 非标准端口必须配置,带协议带端口,否则登录报 403
2.6 初始化与升级
sudo PYTHON=/usr/bin/python3.12 /opt/netbox/upgrade.sh
该脚本自动完成:虚拟环境依赖安装、数据库迁移 migrate、静态文件收集 collectstatic。
2.7 创建超级用户
source /opt/netbox/venv/bin/activate
python3 /opt/netbox/netbox/manage.py createsuperuser
deactivate
2.8 systemd 服务
sudo cp /opt/netbox/contrib/gunicorn.service /etc/systemd/system/netbox.service
sudo cp /opt/netbox/contrib/netbox-housekeeping.service /etc/systemd/system/
sudo cp /opt/netbox/contrib/netbox-housekeeping.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now netbox netbox-housekeeping.timer
2.9 nginx 反向代理(8080 端口)
sudo tee /etc/nginx/sites-available/netbox > /dev/null <<'EOF'
server {
listen 8080;
server_name 192.168.1.100; # 改为实际IP
client_max_body_size 25m;
location /static/ {
alias /opt/netbox/netbox/static/;
}
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
}
}
EOF
sudo ln -sf /etc/nginx/sites-available/netbox /etc/nginx/sites-enabled/netbox
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl restart nginx


3. 踩坑记录(本次部署实际问题)
坑 1:HTTPS 证书缺失导致 nginx 无法启动
现象:nginx -t 报 cannot load certificate “/etc/ssl/certs/netbox.crt”: No such file or directory
原因:官方模板 contrib/nginx.conf 默认含 443 HTTPS 段,引用未生成的证书
解决:改用纯 HTTP 配置(本文 2.9 节),或自签证书:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/ssl/private/netbox.key -out /etc/ssl/certs/netbox.crt \
-subj "/CN=192.168.1.100"
坑 2:80 端口被 apache2 占用
现象:nginx -t 语法通过,但 systemctl restart nginx 失败 日志:bind() to 0.0.0.0:80 failed (98: Address already in use) 关键区别:nginx -t 只查语法和文件引用,不检测端口占用 定位:sudo ss -tlnp | grep ':80 ’ → 显示 7 个 apache2 进程 解决:保留 apache2 共存,nginx 改监听 8080
坑 3:sed 修改 listen 未生效
现象:已执行 sed -i ‘s/listen 80;/listen 8080;/’,重启仍报绑 80 失败 原因:模板实际写的是 listen 80 default_server;(80 后非分号),sed 模式未匹配 解决:直接 tee 重写整个配置文件(本文 2.9 节),不依赖 sed 替换 教训:修改后务必复核 grep -rn “listen” /etc/nginx/sites-enabled/ /etc/nginx/conf.d/
坑 4:Ubuntu 与 CentOS 的 nginx 配置路径差异
教程写 /etc/nginx/conf.d/netbox.conf(CentOS 风格) Ubuntu 正确位置:/etc/nginx/sites-available/ + 软链到 sites-enabled/ 若按教程建过 conf.d 文件,注意删除避免双份配置同时加载
坑 5:非标准端口的 CSRF 403
现象:登录页能打开,提交登录时报 403 CSRF verification failed 原因:Django 4.0+ 校验 Origin 头需含端口,非 80/443 端口必须显式声明 解决:configuration.py 中 CSRF_TRUSTED_ORIGINS = [‘http://192.168.1.100:8080’] 注意:修改后需 sudo systemctl restart netbox(重启的是 netbox 不是 nginx)
4. 部署验证清单
# ① 配置自检
/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py check # 无 issues
/opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py migrate # No migrations to apply
# ② 服务状态
systemctl status netbox # active (running)
systemctl status nginx # active (running)
# ③ 端口监听
ss -tlnp | grep -E ':80 |:8080 |:8001 '
# 80=apache2 8080=nginx 8001=gunicorn
# ④ HTTP 响应
curl -I http://127.0.0.1:8080/ # 200/302
# ⑤ 浏览器访问 http://<IP>:8080/ 登录验证
5. 故障排查速查表
6. 运维要点
# 日常升级
cd /opt/netbox && sudo git pull
sudo PYTHON=/usr/bin/python3.12 /opt/netbox/upgrade.sh
sudo systemctl restart netbox
# 数据备份
sudo -u postgres pg_dump netbox > netbox_$(date +%F).sql
sudo tar czf media_$(date +%F).tar.gz /opt/netbox/netbox/media/
# 日志查看
journalctl -u netbox -f
sudo tail -f /var/log/nginx/error.log
后续切 HTTPS:certbot 签发或自签证书后,nginx 增加 443 段 apache2 若确认废弃:sudo apt purge apache2 -y 后可将 nginx 改回 80 端口 (同步更新 CSRF_TRUSTED_ORIGINS 为不带端口的地址)
