phpIPAM is an open-source IP address management (IPAM) tool. It tracks subnet allocations, individual IP assignments, VLANs, VRFs, and devices — giving you a searchable source of truth for your network addressing instead of a spreadsheet.
Run it when your homelab has grown to the point where you're guessing whether an IP is in use, or when you want to plan subnets before assigning them. It's lighter-weight than NetBox and purpose-built for IP management specifically.
Browser → Traefik (TLS + lan-only) → phpipam-web :80
↓
phpipam-db (MariaDB)
↑
phpipam-cron (network scanning)
Three containers:
- phpipam-web — Apache/PHP frontend
- phpipam-db — MariaDB 11 database
- phpipam-cron — runs scheduled network discovery scans (ping sweeps, SNMP)
The web and cron containers require NET_ADMIN and NET_RAW capabilities for ping and SNMP to work. The cron container stays on the internal phpipam network; only the web container joins traefik.
- Traefik running with the
traefikexternal network created - Host directories created:
sudo mkdir -p /mnt/SSD/Containers/phpipam/{db,logo,ca}cp .env.example .envEdit .env:
| Variable | Description |
|---|---|
TZ |
Timezone (default: America/New_York) |
PHPIPAM_DOMAIN |
FQDN Traefik routes to phpIPAM (e.g. ipam.virtuallyboring.com) |
PHPIPAM_PORT |
Host port for direct access (default: 8030) |
PHPIPAM_DB_PASSWORD |
MariaDB password for the phpipam user |
PHPIPAM_DB_ROOT_PASSWORD |
MariaDB root password |
docker compose up -d
docker compose logs -f phpipam-webMariaDB will initialize on first start — wait for the healthcheck to pass before the web container comes up.
- Via Traefik:
https://<PHPIPAM_DOMAIN>(LAN only) - Direct:
http://<host-ip>:8030
On first visit, phpIPAM detects no database schema and redirects to the installer at /install/. Choose Automatic database installation.
It will prompt for database credentials — these are the root credentials phpIPAM needs to create the schema, not the application user:
| Field | Value |
|---|---|
| Username | root |
| Password | PHPIPAM_DB_ROOT_PASSWORD from your .env |
| Database location | phpipam-db (Docker DNS hostname of the MariaDB container) |
After this one-time step, phpIPAM switches to the phpipam user for all normal operation.
Default credentials after install:
| Field | Value |
|---|---|
| Username | admin |
| Password | ipamadmin |
Change the admin password immediately via Administration → Users → admin → Change password.
Go to Administration → phpIPAM settings:
- Set Site URL to your
PHPIPAM_DOMAIN— required for correct redirect and link generation behind a reverse proxy - Enable modules you want in the sidebar (Subnets, Hosts, VLANs, VRFs, etc.)
- Set your preferred IP addressing format (IPv4 / dual-stack)
Go to Subnets → select or create a Section (e.g. "HomeLab") → Add subnet:
- Enter the network in CIDR notation (e.g.
10.0.0.0/20) - Enable Check hosts if you want the cron job to ping-sweep and auto-mark IPs as used/free
- Optionally enable DNS resolution to auto-resolve hostnames
The phpipam-cron container runs scans on the interval set by SCAN_INTERVAL (default: 1h). For subnets to be scanned, discovery must be enabled on each subnet individually under Subnet → Edit → Discovery.
For SNMP discovery, add your devices under Devices and configure community strings in Administration → SNMP communities.
docker compose pull
docker compose up -d