مقدمه

NetBox مرجع طراحی شبکه است؛ از دست رفتن database یا دسترسی API بیش از حد می‌تواند inventory و automation را مختل کند. نصب باید همراه با policy هویت و restore قابل آزمایش باشد.

مثال عملی

تیم شبکه سه دیتاسنتر، VLANها و prefixها را ثبت می‌کند. خواندن API برای automation مجاز است؛ write فقط به گروه مالک inventory داده می‌شود.

پیش‌نیازها

baseline: Ubuntu Server 24.04 LTS، NetBox 4.7.2، Python 3.12، PostgreSQL 16، Redis 7. patch و pluginها پیش از استقرار در staging تثبیت شوند.

سخت‌افزار و ظرفیت: پیشنهاد نمونه ۴ vCPU، ۸ GiB RAM، ۶۰ GiB SSD؛ ظرفیت DB/media، تعداد object و job اندازه‌گیری شود. نمونه single node است و HA کامل پیاده نمی‌کند.

نرم‌افزار و دسترسی: sudo، git و apt؛ PKI سازمان برای netbox.example.com، DNS و حساب PostgreSQL اختصاصی. netbox.example.com placeholder است؛ SECRET_KEY و pepper تازه تولید می‌شوند.

Architecture / Design

HTTPS/Nginx → Gunicorn loopback → Django/NetBox → PostgreSQL. Worker netbox-rq از Redis tasks استفاده می‌کند؛ cache و queue جدا هستند. backup مرجع اصلی شامل DB، media، config و secret است.

Installation / Configuration

نمونه برای VM تازه با DB محلی است. ابتدا dependency نصب و نسخه‌ها ثبت شوند؛ full upgrade خودکار انجام نمی‌شود.

sudo apt-get update
sudo apt-get install -y postgresql redis-server python3 python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev git nginx
python3 --version
psql --version
redis-cli ping
sudo -u postgres createuser netbox
sudo -u postgres psql -c '\password netbox'
sudo -u postgres createdb -O netbox netbox
sudo -u postgres psql -d netbox -c 'GRANT CREATE ON SCHEMA public TO netbox;'
sudo git clone --branch v4.7.2 --depth 1 https://github.com/netbox-community/netbox.git /opt/netbox
sudo adduser --system --group netbox
sudo chown netbox:netbox /opt/netbox/netbox/media

\password رمز را تعاملی می‌گیرد؛ همین رمز در configuration وارد شود. برای host تازه createuser/createdb است؛ روی نصب موجود اجرا نکنید. Redis باید روی loopback بماند. config کامل را با Python بسازید؛ prompt رمز DB را می‌گیرد؛ hostname نمونه را پیش از اجرا با نام واقعی جایگزین کنید.

sudo python3 - <<'PY'
from pathlib import Path
import getpass, secrets
db_password = getpass.getpass('PostgreSQL netbox password: ')
host = 'netbox.example.com'  # Replace with the real DNS hostname before running.
if not host or '/' in host or '*' in host:
    raise SystemExit('Use one explicit DNS hostname')
config = {
    'ALLOWED_HOSTS': [host],
    'DATABASES': {'default': {'NAME':'netbox','USER':'netbox','PASSWORD':db_password,'HOST':'127.0.0.1','PORT':'5432','CONN_MAX_AGE':300}},
    'REDIS': {'tasks': {'HOST':'127.0.0.1','PORT':6379,'DATABASE':0,'SSL':False}, 'caching': {'HOST':'127.0.0.1','PORT':6379,'DATABASE':1,'SSL':False}},
    'SECRET_KEY': secrets.token_urlsafe(64),
    'API_TOKEN_PEPPERS': {1:secrets.token_urlsafe(64)},
    'CSRF_TRUSTED_ORIGINS': ['https://' + host],
}
path = Path('/opt/netbox/netbox/netbox/configuration.py')
if path.exists():
    raise SystemExit('Configuration already exists; review it')
path.write_text('\n'.join(f'{k} = {v!r}' for k,v in config.items())+'\n')
PY
sudo chown root:netbox /opt/netbox/netbox/netbox/configuration.py
sudo chmod 640 /opt/netbox/netbox/netbox/configuration.py
sudo /opt/netbox/upgrade.sh
sudo -u netbox /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py check
sudo -u netbox /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py createsuperuser
sudo cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
sudo cp /opt/netbox/contrib/netbox.service /opt/netbox/contrib/netbox-rq.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now netbox netbox-rq

check باید بدون error و serviceها active باشند. Gunicorn contrib معمولاً 127.0.0.1:8001 است؛ bind را از فایل و ss بررسی کنید. Nginx نمونه کامل زیر را با hostname و certificate واقعی بنویسید. static alias به همان checkout اشاره کند.

server {
    listen 443 ssl;
    server_name netbox.example.com;
    ssl_certificate /etc/nginx/tls/fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    client_max_body_size 25m;
    location /static/ { alias /opt/netbox/netbox/static/; }
    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

فایل را در sites-available/netbox ذخیره، symlink نخستین نصب بسازید، nginx -t و reload انجام دهید؛ گواهی قبل test موجود باشد. curl --fail https://netbox.example.com/login/، login و یک API read با token محدود آزموده شود. سایت و prefix نمونه را با UI بسازید و permission منفی write را برای حساب read-only تست کنید.

Security Hardening

PostgreSQL و Redis به WAN bind نشوند؛ فقط 443 عمومی سازمانی و SSH مدیریت مجاز باشد. SECRET_KEY و API_TOKEN_PEPPERS در backup رمزنگاری‌شده ثابت بمانند؛ چرخش بدون طرح می‌تواند credentialها را باطل کند. roleهای object-level و expiration token، SSO/MFA و جداسازی superuser لازم‌اند.

Monitoring

health login/API، وضعیت worker، queue age، DB connection، disk و certificate expiry در Zabbix/Prometheus ثبت شوند. endpoint metrics فقط از monitoring قابل دسترسی باشد. active بودن Nginx بدون worker سالم، موفقیت job را ثابت نمی‌کند.

Troubleshooting

502: Gunicorn bind و service log. DisallowedHost: hostname واقعی در ALLOWED_HOSTS. CSRF 403: trusted origin و forwarded proto. job pending: Redis tasks و netbox-rq.

systemctl is-active postgresql redis-server netbox netbox-rq nginx
sudo journalctl -u netbox -u netbox-rq -n 100 --no-pager
sudo ss -lntp
redis-cli ping
sudo -u netbox /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py check

خروجی config دارای secret را در ticket عمومی منتشر نکنید. plugin failure پس از upgrade با نسخه plugin و release note بررسی شود؛ پاک‌کردن migration history راه‌حل نیست.

Backup / Recovery

برای RPO نمونه ۲۴ ساعت، backup روزانه DB و media/config و کپی off-host لازم است. اگر media/config تغییر می‌کنند، export زیر در پنجره maintenance بدون job نویسنده اجرا شود؛ برای RPO کوتاه‌تر PostgreSQL PITR طراحی شود.

sudo install -d -m 700 /var/backups/netbox
sudo bash -c 'umask 077; sudo -u postgres pg_dump -Fc netbox > /var/backups/netbox/netbox.dump'
sudo tar -czf /var/backups/netbox/application-state.tar.gz -C /opt/netbox netbox/media netbox/netbox/configuration.py
sudo chmod 600 /var/backups/netbox/application-state.tar.gz

این redirection داخل shell root انجام می‌شود؛ sudo pg_dump > مسیر محافظت‌شده کافی نیست. backup باید به vault/off-host منتقل و hash ثبت شود. restore روی سرور ایزوله با همان نسخه و plugin، نه روی DB اصلی:

sudo -u postgres createdb -O netbox netbox_restore
sudo bash -c 'sudo -u postgres pg_restore --no-owner --role=netbox -d netbox_restore < /var/backups/netbox/netbox.dump'
sudo -u postgres psql -d netbox_restore -c 'SELECT count(*) FROM dcim_site;'

config سرور restore به netbox_restore اشاره کند؛ SECRET_KEY/pepper و media از backup بازگردانده شوند، automation و webhook خروجی خاموش باشند. login، count object، API و job canary تأیید و RTO اندازه‌گیری شود. downgrade code بعد migration بدون restore DB معتبر نیست.

Best Practices

نسخه و plugin lock، staging migration، backup پیش از upgrade و تست restore از شروط انتشارند. NetBox ابزار discovery یا NMS نیست؛ inventory مالک روشن نیاز دارد.

نسخه‌های قدیمی و Compatibility

4.7.2 baseline این بازنویسی است، نه وعده سازگاری patchهای آینده. نصب Python package در 4.7 experimental است؛ مسیر Git/archive استفاده شده. API token قدیمی و Bearer جدید را با نسخه token تطبیق دهید.

پرسش‌های متداول

آیا backup PostgreSQL به‌تنهایی کافی است؟

خیر؛ media، configuration، secret key، pepper و نسخه pluginها نیز باید حفظ شوند.

آیا بعد migration می‌توان فقط code را downgrade کرد؟

خیر؛ rollback باید سازگاری schema و بازیابی DB پیش از تغییر را در نظر بگیرد.

منابع رسمی

تاریخ بررسی منابع: 2026-09-30. اعتبارسنجی عملی روی محیط هدف باید پیش از انتشار تغییر زیرساخت انجام شود.

Share