9.7 KiB
A Flask-based web application for comprehensive IP Address Management (IPAM). Manage subnets, IP addresses, devices, DHCP pools, and physical rack infrastructure with an intuitive web interface.
Features
- Subnet Management: Create and manage IP subnets with CIDR notation (supports /24 to /32)
- IP Address Tracking: Automatic IP address generation and tracking for each subnet
- Device Management: Track devices with types (Server, VM, Switch, Firewall, WiFi AP, Printer, Other)
- IP Assignment: Assign IP addresses to devices with automatic hostname updates
- DHCP Pool Configuration: Configure DHCP pools with start/end IP ranges and excluded IPs
- Rack Management: Physical infrastructure tracking with U positions and front/back sides
- Site Organization: Organize subnets and devices by site/location
- Audit Logging: Complete audit trail of all changes with user, action, details, and timestamps
- User Management: Multi-user support with secure password authentication
- Role-Based Access Control (RBAC): Granular permission system with default roles (admin, user, view_only) and custom role creation
- REST API: Full-featured REST API with API key authentication for programmatic access
- CSV Export: Export subnet and rack data to CSV files
- Device Statistics: View device counts by type
- Web Interface: Modern, responsive web GUI built with Tailwind CSS and dark mode support
Quick Start with Docker
Docker Run
docker run -d \
--name ipam \
-p 5000:5000 \
-e MYSQL_HOST=10.10.2.27 \
-e MYSQL_USER=ipam \
-e MYSQL_PASSWORD=your_password \
-e MYSQL_DATABASE=ipam \
-e SECRET_KEY=your_secret_key \
-e NAME="Your Organization" \
-e LOGO_PNG="https://example.com/logo.png" \
ghcr.io/jdb-net/ipam:latest
Docker Compose
version: '3.8'
services:
ipam:
image: ghcr.io/jdb-net/ipam:latest
container_name: ipam
restart: unless-stopped
ports:
- "5000:5000" # Web interface
environment:
- MYSQL_HOST=10.10.2.27
- MYSQL_USER=ipam
- MYSQL_PASSWORD=your_password
- MYSQL_DATABASE=ipam
- SECRET_KEY=your_secret_key
- NAME=Your Organization
- LOGO_PNG=https://example.com/logo.png
Configuration
Environment Variables
MYSQL_HOST: MySQL/MariaDB host (default: localhost)MYSQL_USER: Database user (default: user)MYSQL_PASSWORD: Database password (default: password)MYSQL_DATABASE: Database name (default: ipam)SECRET_KEY: Flask secret key for sessions (REQUIRED in production!)NAME: Organization name displayed in header (default: JDB-NET)LOGO_PNG: URL or path to organization logo (default: JDB-NET logo)
Database Setup
The application automatically initializes the database schema on first run. Ensure the database and user exist with appropriate permissions:
CREATE DATABASE ipam;
CREATE USER 'ipam'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON ipam.* TO 'ipam'@'%';
FLUSH PRIVILEGES;
Usage
First Login
- Access the web interface at
http://your-server:5000 - Log in with the default credentials:
- Email:
admin@example.com - Password:
password
- Email:
- Change the default password immediately via the Users page
Managing Subnets
- Navigate to "Admin" from the main menu
- Click "Add Subnet" and fill in:
- Name: Friendly name for the subnet (e.g., "Office LAN")
- CIDR: Subnet in CIDR notation (e.g.,
192.168.1.0/24) - Site: Site/location identifier
- The system automatically generates all IP addresses in the subnet
Adding Devices
- Navigate to "Devices" from the main menu
- Click "Add Device"
- Enter device name and select device type
- Click "Create Device"
Assigning IP Addresses to Devices
- Open a device from the Devices page
- Select a subnet and available IP address
- Click "Assign IP" - the hostname is automatically updated
Configuring DHCP Pools
- Open a subnet view
- Click "Configure DHCP Pool"
- Set the start and end IP addresses
- Optionally specify excluded IPs (comma-separated)
- IPs within the pool range are automatically marked as "DHCP"
Managing Racks
- Navigate to "Racks" from the main menu
- Click "Add Rack" and specify:
- Name: Rack identifier
- Site: Site location
- Height: Rack height in U units
- Open a rack to assign devices to specific U positions (front or back)
Audit Log
View all changes and actions in the "Audit Log" section, with filtering by user, subnet, action type, or device name.
Exporting Data
- Subnet CSV: Click "Export CSV" on any subnet page to download IP addresses with hostnames
- Rack CSV: Click "Export CSV" on any rack page to download rack layout information
Role-Based Access Control
The system uses a granular role-based access control (RBAC) system to manage user permissions:
-
Default Roles:
- Admin: Full access to all features including user and role management
- User: Can view and manage most features (devices, subnets, racks, etc.) but cannot manage users or roles
- View Only: Read-only access to view pages but cannot make any changes
-
Custom Roles: Administrators can create custom roles with specific permission sets from the Users page
-
Permission Granularity: Permissions are organized into categories:
- View permissions (access to pages)
- Device Management (add, edit, delete devices)
- Network Management (subnet operations)
- Rack Management (rack operations)
- DHCP Configuration
- Administration (user and role management)
-
User Management: Navigate to the Users page to:
- Create and manage users
- Assign roles to users
- Create custom roles with specific permissions
- View and regenerate API keys
REST API
The application includes a comprehensive REST API for programmatic access:
-
Authentication: All API requests require an API key, which can be provided via:
X-API-KeyheaderAuthorization: Bearer <api_key>header?api_key=<api_key>query parameter
-
Base URL: All API endpoints are prefixed with
/api/v1 -
Available Endpoints:
- Devices:
GET,POST,PUT,DELETE /api/v1/devices - Subnets:
GET,POST,PUT,DELETE /api/v1/subnets - Racks:
GET,POST,DELETE /api/v1/racks - Device Types:
GET /api/v1/device-types - DHCP:
GET,POST /api/v1/subnets/{id}/dhcp - Audit Log:
GET /api/v1/audit - Users & Roles:
GET /api/v1/users,GET /api/v1/roles(admin only)
- Devices:
-
API Keys: Each user has a unique API key that can be viewed and regenerated from the Users page. API keys respect the same role-based permissions as the web interface.
-
Documentation: Full API documentation is available in the Help page of the web interface.
Example API Request:
curl -H "X-API-Key: your_api_key" \
https://your-server:5000/api/v1/devices
Kubernetes Deployment
The project includes a Kubernetes deployment manifest. See deployment.yml for details.
Example Kubernetes deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ipam
namespace: ipam
spec:
replicas: 1
template:
spec:
containers:
- name: ipam
image: ghcr.io/jdb-net/ipam:latest
ports:
- containerPort: 5000
env:
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: ipam-secrets
key: secret-key
- name: MYSQL_HOST
value: "mysql-service"
- name: MYSQL_USER
value: "ipam"
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: ipam-secrets
key: mysql-password
- name: MYSQL_DATABASE
value: "ipam"
Security Notes
- CHANGE THE DEFAULT ADMIN PASSWORD immediately after first login
- CHANGE THE SECRET_KEY in production - use a strong random string (e.g.,
openssl rand -hex 32) - Use strong passwords for database access
- Ensure database connections are secured (consider SSL/TLS for MySQL connections)
- Review audit logs regularly for unauthorized changes
- Limit database user permissions if possible (though CREATE/ALTER may be needed for schema initialization)
- API Keys: Keep API keys secure and never share them publicly. Regenerate keys if they may have been compromised
- Role-Based Access: Use the RBAC system to grant users only the permissions they need (principle of least privilege)
- HTTPS: Use HTTPS in production to protect API keys and session data in transit
Troubleshooting
Database Connection Issues
- Ensure MySQL/MariaDB is running and accessible from the container
- Check database credentials in environment variables
- Verify database and user exist with proper permissions
- Check network connectivity between container and database
- Ensure the database name matches exactly (case-sensitive on some systems)
Application Not Starting
- Check container logs:
docker logs ipam - Verify all required environment variables are set
- Ensure port 5000 is not already in use
- Check that MySQL/MariaDB is reachable
Subnet or IP Not Appearing
- Verify CIDR notation is correct (supports /24 to /32)
- Check subnet was created successfully (view in Admin page)
- Ensure you're logged in with appropriate permissions
- Check application logs for errors
Device IP Assignment Issues
- Verify the IP address is available (not already assigned)
- Check that the IP is not in a DHCP pool range
- Ensure the device exists and is visible in the Devices list
License
This project is provided as-is for IP Address Management.