Files
netbox/README.md

582 lines
15 KiB
Markdown

# NetBox
IPAM (IP Address Management) y DCIM (Data Center Infrastructure Management) de código abierto. Solución completa para documentar y gestionar infraestructura de red.
## Características
- 📊 **IPAM completo**: Gestión de direcciones IP, VLANs, VRFs
- 🖥️ **DCIM**: Inventario de racks, dispositivos, cables
- 🔌 **Gestión de circuitos**: Proveedores, circuitos, conexiones
- 📝 **Documentación**: Custom fields, tags, journaling
- 🔗 **API REST**: Integración completa con sistemas externos
- 🔐 **Multi-tenancy**: Soporte para múltiples organizaciones
- 📈 **Reportes**: Visualización y exportación de datos
- 🔄 **Webhooks**: Automatización y notificaciones
## Requisitos Previos
- Docker Engine instalado
- Portainer configurado (recomendado)
- **Para Traefik o NPM**: Red Docker `proxy` creada
- **Dominio configurado**: Para acceso HTTPS
- **Contraseñas generadas**: DB_PASSWORD, REDIS_PASSWORD y SUPERUSER_PASSWORD
⚠️ **IMPORTANTE**: NetBox requiere PostgreSQL 18 y Redis. Este compose incluye ambos contenedores.
### Sobre Redis
Redis se utiliza como **caché de sesiones y tareas**:
-**tmpfs (RAM)**: Más rápido, no usa disco
- 🔒 **Contraseña requerida**: Seguridad defense-in-depth
-**No persistente**: El caché se regenera automáticamente al reiniciar
- 💾 **No requiere backup**: Solo almacena datos temporales
## Generar Contraseñas
**Antes de cualquier despliegue**, genera contraseñas seguras:
```bash
# DB_PASSWORD (PostgreSQL)
openssl rand -base64 32
# REDIS_PASSWORD
openssl rand -base64 32
# SUPERUSER_PASSWORD (admin de NetBox)
openssl rand -base64 32
```
Guarda los resultados, los necesitarás en el archivo `.env`.
> ⚠️ **Importante**: Usa comillas simples en el archivo `.env` si las contraseñas contienen caracteres especiales.
> Ejemplo: `DB_PASSWORD='tu_password_generado'`
---
## Despliegue con Portainer
### Opción A: Git Repository (Recomendada)
Permite mantener la configuración actualizada automáticamente desde Git.
1. En Portainer, ve a **Stacks****Add stack**
2. Nombra el stack: `netbox`
3. Selecciona **Git Repository**
4. Configura:
- **Repository URL**: `https://git.ictiberia.com/groales/netbox`
- **Repository reference**: `refs/heads/main`
- **Compose path**: `docker-compose.yml`
- **GitOps updates**: Activado (opcional - auto-actualización)
5. **Solo para Traefik**: En **Additional paths**, añade:
- `docker-compose.override.traefik.yml.example`
6. En **Environment variables**, añade:
```env
DB_PASSWORD=tu_password_generado_1
REDIS_PASSWORD=tu_password_generado_2
SUPERUSER_EMAIL=admin@example.com
SUPERUSER_PASSWORD=tu_password_generado_3
```
7. **Solo para Traefik**: Añade también `DOMAIN_HOST=netbox.example.com`
8. Click en **Deploy the stack**
### Opción B: Web editor
Para personalización completa del compose.
1. En Portainer, ve a **Stacks****Add stack**
2. Nombra el stack: `netbox`
3. Selecciona **Web editor**
4. Pega el contenido de `docker-compose.yml`
5. En **Environment variables**, añade las mismas variables que la Opción A
6. Click en **Deploy the stack**
---
## Modos de Despliegue
### Traefik (Proxy Inverso con SSL automático)
**Requisitos**:
- Stack de Traefik desplegado
- Red `proxy` creada
- DNS apuntando al servidor
**Pasos**:
1. Copia el archivo de ejemplo:
```bash
cp docker-compose.override.traefik.yml.example docker-compose.override.traefik.yml
```
2. Edita `docker-compose.override.traefik.yml` y cambia `${DOMAIN_HOST}` si es necesario
3. En Portainer, en las **Environment variables** del stack, añade:
```env
DOMAIN_HOST=netbox.tudominio.com
```
4. Sube el archivo `docker-compose.override.traefik.yml` como **Additional file**:
- Path: `docker-compose.override.traefik.yml`
- Contenido: pega el contenido del archivo
5. Despliega el stack
6. Accede a `https://netbox.tudominio.com`
**Ejemplo de compose completo con Traefik**:
```yaml
services:
netbox:
container_name: netbox
image: lscr.io/linuxserver/netbox:latest
restart: unless-stopped
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Madrid
SUPERUSER_EMAIL: ${SUPERUSER_EMAIL}
SUPERUSER_PASSWORD: ${SUPERUSER_PASSWORD}
ALLOWED_HOST: ${ALLOWED_HOST}
DB_NAME: ${DB_NAME:-netbox}
DB_USER: ${DB_USER:-netbox}
DB_PASSWORD: ${DB_PASSWORD}
DB_HOST: netbox-db
DB_PORT: 5432
REDIS_HOST: netbox-redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
volumes:
- netbox_config:/config
networks:
- proxy
- netbox-internal
depends_on:
- netbox-db
- netbox-redis
labels:
- traefik.enable=true
- traefik.http.routers.netbox-http.rule=Host(`${DOMAIN_HOST}`)
- traefik.http.routers.netbox-http.entrypoints=web
- traefik.http.routers.netbox-http.middlewares=redirect-to-https
- traefik.http.routers.netbox.rule=Host(`${DOMAIN_HOST}`)
- traefik.http.routers.netbox.entrypoints=websecure
- traefik.http.routers.netbox.tls=true
- traefik.http.routers.netbox.tls.certresolver=letsencrypt
- traefik.http.routers.netbox.service=netbox-svc
- traefik.http.services.netbox-svc.loadbalancer.server.port=8000
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
- traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
netbox-db:
container_name: netbox-db
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-netbox}
POSTGRES_USER: ${DB_USER:-netbox}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- netbox_db:/var/lib/postgresql
networks:
- netbox-internal
netbox-redis:
container_name: netbox-redis
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
tmpfs:
- /data:rw,noexec,nosuid,size=256m
networks:
- netbox-internal
volumes:
netbox_config:
name: netbox_config
netbox_db:
name: netbox_db
networks:
proxy:
external: true
netbox-internal:
name: netbox-internal
```
### Nginx Proxy Manager (NPM)
**Requisitos**:
- NPM desplegado y accesible
- Red `proxy` creada
- DNS apuntando al servidor
**Pasos**:
1. Despliega el stack con el `docker-compose.yml` base (sin override)
2. En NPM, crea un nuevo **Proxy Host**:
- **Domain Names**: `netbox.tudominio.com`
- **Scheme**: `http`
- **Forward Hostname / IP**: `netbox`
- **Forward Port**: `8000`
- **Cache Assets**: ✅ Activado
- **Block Common Exploits**: ✅ Activado
- **Websockets Support**: ✅ Activado
3. En la pestaña **SSL**:
- **SSL Certificate**: Request a new SSL Certificate (Let's Encrypt)
- **Force SSL**: ✅ Activado
- **HTTP/2 Support**: ✅ Activado
- **HSTS Enabled**: ✅ Activado (opcional)
4. Guarda y accede a `https://netbox.tudominio.com`
---
## Configuración Inicial
### Primer Acceso
1. Accede a NetBox usando tu dominio configurado
2. Haz login con las credenciales del superusuario:
- **Email**: El configurado en `SUPERUSER_EMAIL`
- **Password**: El configurado en `SUPERUSER_PASSWORD`
3. NetBox creará automáticamente la base de datos en el primer inicio (puede tardar 1-2 minutos)
### Panel de Administración
1. Ve a **Admin** (esquina superior derecha) → **Admin Panel**
2. Configura los parámetros básicos:
#### Users & Groups
- Crea usuarios adicionales en **Users** → **Add**
- Define grupos y permisos en **Groups**
- Asigna tokens de API en **Tokens**
#### Sites & Racks
- Crea sitios (locations) en **DCIM** → **Sites**
- Define racks y ubicaciones físicas
- Configura regiones y tenant groups
#### IP Management
- Define prefijos de red en **IPAM** → **Prefixes**
- Crea VLANs en **IPAM** → **VLANs**
- Configura VRFs si usas routing avanzado
#### Device Types
- Importa tipos de dispositivos desde [NetBox Device Type Library](https://github.com/netbox-community/devicetype-library)
- O crea tipos personalizados en **Device Types**
---
## Personalización
### Configuración Avanzada
NetBox almacena su configuración en `/config/` dentro del contenedor. Puedes personalizarla:
```bash
# Acceder al contenedor
docker exec -it netbox bash
# Editar configuración
nano /config/configuration.py
```
**Configuraciones comunes**:
```python
# Banner personalizado
BANNER_TOP = 'NetBox Producción - ICT Iberia'
BANNER_BOTTOM = ''
# Preferencias de sesión
SESSION_COOKIE_AGE = 1209600 # 2 semanas
# Paginación
PAGINATE_COUNT = 50
# Tiempo de expiración de tokens
AUTH_TOKEN_TIMEOUT = 60 * 60 * 24 * 7 # 7 días
```
Reinicia el contenedor después de cambios: `docker restart netbox`
### Plugins
NetBox soporta plugins para funcionalidad extendida. Instálalos en `/config/plugins/`:
```bash
# Ejemplo: NetBox Topology Views
docker exec -it netbox pip install netbox-topology-views
# Añadir a configuration.py
PLUGINS = ['netbox_topology_views']
# Reiniciar
docker restart netbox
```
### LDAP / SSO
Configura autenticación LDAP editando `/config/ldap_config.py`:
```python
import ldap
from django_auth_ldap.config import LDAPSearch
AUTH_LDAP_SERVER_URI = "ldap://ldap.example.com"
AUTH_LDAP_BIND_DN = "CN=netbox,OU=Services,DC=example,DC=com"
AUTH_LDAP_BIND_PASSWORD = "password"
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"OU=Users,DC=example,DC=com",
ldap.SCOPE_SUBTREE,
"(sAMAccountName=%(user)s)"
)
```
---
## Backup y Restauración
### Backup Manual
```bash
# Backup de PostgreSQL
docker exec netbox-db pg_dump -U netbox netbox > netbox-backup-$(date +%Y%m%d).sql
# Backup de configuración
docker run --rm -v netbox_config:/backup -v $(pwd):/target alpine tar czf /target/netbox-config-$(date +%Y%m%d).tar.gz -C /backup .
# Redis usa tmpfs (no requiere backup - solo caché)
```
### Backup Automático
Crea un script en `/root/backup-netbox.sh`:
```bash
#!/bin/bash
BACKUP_DIR="/backups/netbox"
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p $BACKUP_DIR
# PostgreSQL
docker exec netbox-db pg_dump -U netbox netbox | gzip > $BACKUP_DIR/netbox-db-$DATE.sql.gz
# Configuración
docker run --rm -v netbox_config:/backup -v $BACKUP_DIR:/target alpine tar czf /target/netbox-config-$DATE.tar.gz -C /backup .
# Limpiar backups antiguos (mantener 7 días)
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "Backup completado: $DATE"
```
Programa con cron:
```bash
chmod +x /root/backup-netbox.sh
crontab -e
# Backup diario a las 2 AM
0 2 * * * /root/backup-netbox.sh
```
### Restauración
```bash
# Detener NetBox
docker stop netbox
# Restaurar PostgreSQL
gunzip < netbox-db-20250101.sql.gz | docker exec -i netbox-db psql -U netbox netbox
# Restaurar configuración
docker run --rm -v netbox_config:/restore -v $(pwd):/source alpine tar xzf /source/netbox-config-20250101.tar.gz -C /restore
# Iniciar NetBox
docker start netbox
```
---
## Actualización
### Actualizar NetBox
```bash
# 1. Backup ANTES de actualizar
docker exec netbox-db pg_dump -U netbox netbox > netbox-pre-update-$(date +%Y%m%d).sql
# 2. Detener stack
docker stop netbox netbox-redis netbox-db
# 3. Actualizar imágenes
docker pull lscr.io/linuxserver/netbox:latest
docker pull postgres:18-alpine
docker pull redis:7-alpine
# 4. Iniciar stack
docker start netbox-db netbox-redis netbox
# 5. Verificar logs
docker logs -f netbox
# 6. Verificar versión en Admin Panel
```
### Actualizar PostgreSQL
Si necesitas actualizar de PostgreSQL 16 a 18 (ya está en 18):
```bash
# 1. Backup
docker exec netbox-db pg_dump -U netbox netbox > netbox-pg-migration.sql
# 2. Detener y eliminar contenedor antiguo
docker stop netbox-db
docker rm netbox-db
# 3. Eliminar volumen antiguo
docker volume rm netbox_db
# 4. Recrear con PostgreSQL 18
docker compose up -d netbox-db
# 5. Restaurar datos
cat netbox-pg-migration.sql | docker exec -i netbox-db psql -U netbox netbox
# 6. Iniciar NetBox
docker start netbox
```
---
## Solución de Problemas
### NetBox no inicia
**Síntomas**: Contenedor se reinicia constantemente
**Diagnóstico**:
```bash
docker logs netbox
```
**Soluciones**:
- Verificar que PostgreSQL esté funcionando: `docker logs netbox-db`
- Verificar que Redis esté funcionando: `docker logs netbox-redis`
- Comprobar contraseñas en `.env`
- Verificar permisos del volumen: `docker exec netbox ls -la /config`
### Error de conexión a base de datos
**Síntomas**: `could not connect to server: Connection refused`
**Solución**:
```bash
# Verificar que la BD esté lista
docker exec netbox-db pg_isready -U netbox
# Reiniciar servicios en orden
docker restart netbox-db
sleep 5
docker restart netbox-redis
sleep 5
docker restart netbox
```
### Error de permisos
**Síntomas**: `PermissionError: [Errno 13] Permission denied`
**Solución**:
```bash
docker run --rm -v netbox_config:/data alpine chown -R 1000:1000 /data
docker restart netbox
```
### NetBox lento o no responde
**Diagnóstico**:
```bash
# Ver uso de recursos
docker stats netbox netbox-db netbox-redis
# Ver queries lentas en PostgreSQL
docker exec netbox-db psql -U netbox -c "SELECT query, calls, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;"
```
**Soluciones**:
- Incrementar memoria de Redis
- Optimizar índices en PostgreSQL
- Limpiar sesiones antiguas en Django admin
### Comandos de emergencia
```bash
# Reiniciar todo el stack
docker restart netbox netbox-redis netbox-db
# Ver logs en tiempo real
docker logs -f --tail 100 netbox
# Acceder a shell de NetBox
docker exec -it netbox bash
# Ejecutar comandos de Django
docker exec netbox python /app/netbox/manage.py shell
# Limpiar caché
docker exec netbox-redis redis-cli --pass "TU_REDIS_PASSWORD" FLUSHALL
# Reconstruir búsqueda
docker exec netbox python /app/netbox/manage.py reindex --lazy
```
---
## Variables de Entorno
### Requeridas
| Variable | Descripción | Ejemplo |
|----------|-------------|---------|
| `DB_PASSWORD` | Contraseña de PostgreSQL | `generada_con_openssl` |
| `REDIS_PASSWORD` | Contraseña de Redis | `generada_con_openssl` |
| `SUPERUSER_EMAIL` | Email del admin | `admin@example.com` |
| `SUPERUSER_PASSWORD` | Contraseña del admin | `generada_con_openssl` |
### Opcionales
| Variable | Descripción | Valor por defecto |
|----------|-------------|-------------------|
| `DB_NAME` | Nombre de la base de datos | `netbox` |
| `DB_USER` | Usuario de PostgreSQL | `netbox` |
| `ALLOWED_HOST` | Hosts permitidos | `*` |
| `DOMAIN_HOST` | Dominio (solo Traefik) | - |
| `PUID` / `PGID` | UID/GID del usuario | `1000` |
| `TZ` | Zona horaria | `Europe/Madrid` |
---
## Recursos
- [Documentación oficial de NetBox](https://docs.netbox.dev/)
- [LinuxServer NetBox Image](https://docs.linuxserver.io/images/docker-netbox)
- [NetBox Device Type Library](https://github.com/netbox-community/devicetype-library)
- [NetBox Plugins](https://github.com/netbox-community/netbox/wiki/Plugins)
- [API Documentation](https://demo.netbox.dev/api/docs/)
---
## Licencia
NetBox es software de código abierto bajo licencia Apache 2.0.