Files
netbox/README.md

661 lines
16 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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**
---
## Despliegue con Docker CLI
Si prefieres trabajar desde la línea de comandos:
### 1. Clonar el repositorio
```bash
git clone https://git.ictiberia.com/groales/netbox.git
cd netbox
```
### 2. Generar contraseñas seguras
Necesitas generar **4 contraseñas** distintas:
```bash
# PostgreSQL
openssl rand -base64 32
# Redis
openssl rand -base64 32
# Superuser Email
openssl rand -base64 32
# Superuser Password
openssl rand -base64 32
```
### 3. Elegir modo de despliegue
#### Opción A: Traefik (recomendado para producción)
```bash
cp docker-compose.override.traefik.yml.example docker-compose.override.yml
cp .env.example .env
nano .env # Editar: pegar las 4 contraseñas generadas, configurar DOMAIN_HOST
```
#### Opción B: Nginx Proxy Manager
```bash
cp .env.example .env
nano .env # Editar: pegar las 4 contraseñas generadas
```
### 4. Iniciar el servicio
```bash
docker compose up -d
```
La inicialización puede tardar **60-90 segundos** (PostgreSQL + Redis + NetBox migrations).
### 5. Verificar el despliegue
```bash
# Ver logs en tiempo real
docker compose logs -f netbox
# Verificar contenedores activos
docker compose ps
# Comprobar base de datos
docker compose exec netbox-db psql -U netbox -d netbox -c '\dt'
```
**Crear directorio de medios** (necesario para subir imágenes):
```bash
docker compose exec netbox mkdir -p /config/media
docker compose exec netbox chown 1000:1000 /config/media
```
**Acceso**:
- Traefik: `https://<DOMAIN_HOST>` (ejemplo: `https://netbox.example.com`)
- NPM: Configurar en NPM apuntando a `netbox` puerto `8000`
**Credenciales iniciales**:
- Usuario: `admin` (⚠️ **NO** es el email, es el nombre de usuario)
- Contraseña: La configurada en `SUPERUSER_PASSWORD`
---
## Modos de Despliegue
### Traefik (Proxy Inverso con SSL automático)
**Requisitos**:
- Stack de Traefik desplegado
- Red `proxy` creada
- DNS apuntando al servidor
**Pasos**:
Si desplegaste con **Opción A (Git Repository)**, ya configuraste todo en el paso 5 y 7. Simplemente accede a `https://netbox.tudominio.com`
Si usas otra forma de despliegue:
1. Asegúrate de tener el archivo `docker-compose.override.traefik.yml.example` como `docker-compose.override.yml`
2. En las **Environment variables**, añade:
```env
DOMAIN_HOST=netbox.tudominio.com
```
3. Despliega el stack y 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:
- **Username**: `admin`
- **Password**: El configurado en `SUPERUSER_PASSWORD`
3. NetBox creará automáticamente la base de datos en el primer inicio (puede tardar 1-2 minutos)
> **Nota**: El username es siempre `admin`, el email (`SUPERUSER_EMAIL`) se usa solo para notificaciones.
### 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 (para notificaciones) | `admin@example.com` |
| `SUPERUSER_PASSWORD` | Contraseña del usuario `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.