Hola a tod@s,
En este post vamos a ver como desplegar phpIPAM con Docker, desplegaremos dos contenedores Docker para este servicio, uno de ellos será el de MariaDB para la base de datos que vamos a utilizar y el otro el propio de phpIPAM con la aplicación.
- Para empezar, vamos a ver que hemos preparado esta máquina virtual con Ubuntu Server 24.04 LTS, dónde tenemos dos discos, uno de sistema y otro de datos:
- Como podemos ver, el disco de datos lo hemos montado sobre /opt/docker que es dónde vamos a ubicar todos los contenedores Dockers y sus configuraciones:
- Nos creamos el registro DNS del tipo CNAME para phpIPAM apuntando a la máquina que tiene instalado el Docker con el Nginx Proxy Manager, ya que vamos a utilizar nuestro proxy inverso:
- Verificamos las versiones de Docker instaladas, docker –version, docker compose version:
- Ahora vamos a crear la estructura de directorios y permisos para los contenedores de mariadb y phpipam:
- sudo mkdir -p /opt/docker/mariadb/data
- sudo mkdir -p /opt/docker/mariadb/config
- sudo mkdir -p /opt/docker/phpipam/config
- sudo chmod -R 755 /opt/docker/mariadb /opt/docker/phpipam
- Ahora creamos la red interna para Docker, esto permite que los contenedores se comuniquen sin exponer puertos externos, sudo docker network create phpipam-net:
- Ahora vamos a crearnos los ficheros .env para no dejar credenciales en texto plano en los ficheros docker-compose.yaml que crearemos posteriormente, utilizando para ello variables.
- Empezaremos con el fichero .env para el contenedor de MariaDB, para ello, nos situamos en /opt/docker/mariadb, y ejecutamos sudo nano .env:
- Y así definimos el fichero:
- MYSQL_ROOT_PASSWORD=una_clave_muy_segura_root
- MYSQL_DATABASE=phpipam
- MYSQL_USER=phpipamuser
- MYSQL_PASSWORD=clave_usuario_phpipam
- Nos creamos el fichero docker-compose.yaml para el contenedor de MariaDB en la misma ubicación, sudo nano docker-compose.yaml:
- Este sería el contenido del fichero:
services:
phpipam-db:
image: mariadb:latest
container_name: phpipam-db
restart: unless-stopped
env_file: .env
ports:
– «3306:3306»
environment:
– MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
– MYSQL_DATABASE=${MYSQL_DATABASE}
– MYSQL_USER=${MYSQL_USER}
– MYSQL_PASSWORD=${MYSQL_PASSWORD}
volumes:
– /opt/docker/mariadb/data:/var/lib/mysql
– /opt/docker/mariadb/config:/etc/mysql/conf.d:ro
networks:
– phpipam-net
networks:
phpipam-net:
driver: bridge
- Aquí vemos los ficheros creados:
- Seguimos con el fichero .env para el contenedor de phpIPAM, para ello, nos situamos en /opt/docker/phpipam, y ejecutamos sudo nano .env:
- Y así definimos el fichero:
- IPAM_DATABASE_HOST=192.168.14.17 # IP docker02
- IPAM_DATABASE_USER=phpipamuser
- IPAM_DATABASE_PASS=clave_usuario_phpipam
- IPAM_DATABASE_NAME=phpipam
- IPAM_DATABASE_PORT=3306
- IPAM_BASE_URL=https://phpipam.ragasys.net
- PHPIPAM_TRUSTED_PROXIES=192.168.14.0/24 # Rango de red de docker01
- # IPAM_DISABLE_INSTALLER=1 Luego lo habilitamos
- Nos creamos el fichero docker-compose.yaml para el contenedor de phpIPAM en la misma ubicación, sudo nano docker-compose.yaml:
- Este sería el contenido del fichero:
services:
phpipam-web:
image: phpipam/phpipam-www:latest
container_name: phpipam-web
restart: unless-stopped
ports:
– «8080:80»
env_file: .env
environment:
– IPAM_DATABASE_HOST=${IPAM_DATABASE_HOST}
– IPAM_DATABASE_USER=${IPAM_DATABASE_USER}
– IPAM_DATABASE_PASS=${IPAM_DATABASE_PASS}
– IPAM_DATABASE_NAME=${IPAM_DATABASE_NAME}
– IPAM_DATABASE_PORT=${IPAM_DATABASE_PORT}
volumes:
– /opt/docker/phpipam/config:/copy-to-www-html
networks:
– phpipam-net
networks:
phpipam-net:
external: true
- Aquí vemos los ficheros creados:
- Protegemos los archivos .env aplicando estos permisos:
- sudo chmod 600 /opt/docker/mariadb/.env
- sudo chmod 600 /opt/docker/phpipam/.env
- Ahora, iniciamos primero el contenedor de MariaDB, cd /opt/docker/mariadb/, sudo docker compose up -d:
- Iniciamos el contenedor de phpIPAM, cd /opt/docker/phpipam/, sudo docker compose up -d:
- Aquí vemos los contenedores levantados, sudo docker ps:
- Accedemos a nuestro contenedor phpIPAM, http://192.168.14.17:8080:
- Voy a migrar de un servidor antiguo que tengo con phpIPAM v1.4, para ello, he realizado un backup de la base de datos que utilizaba este servidor, mysqldump -u phpipam -p phpipam > MIGRATE.sql:
- Copiamos el backup de la base de datos en /opt/docker/mariadb:
- Importamos los datos directamente al contenedor de MariaDB, sudo docker exec -i phpipam-db mariadb -u phpipamuser -p’passworduserdb’ phpipam < /opt/docker/mariadb/MIGRATE.sql:
- Ahora, accedemos a la interfaz web de phpipam y seleccionamos la opción 3, Working installation:
- Introducimos las credenciales de la base de datos que hemos migrado, es decir, la de nuestro servidor phpipam antiguo:
- Y le hacemos un Upgrade a la base de datos:
- Vemos que el Upgrade ha sido correcto, damos clic a Dashboard y vemos que ya tenemos nuestro phpIPAM operativo y migrado de nuestro servidor antiguo:
- Ahora accedemos a nuestro portal de Nginx Proxy Manager para crear el host para phpIPAM.
- Accedemos a Hosts > Hosts Proxy:
- Añadir Host Proxy:
- En la pestaña Detalles:
- Nombres de Dominio: ragasys.net
- Esquema: http
- Nombre de Host/IP de reenvío: IP máquina docker02
- Puerto: 80
- Bloquear Exploits Comunes
- Soporte de Websockets
- En la pestaña SSL:
- Seleccionamos el Certificado SSL que nos interese
- Marcamos Forzar SSL
- Guardar
- Aquí vemos el host creado y conectado:
- Como el phpIPAM lo tenemos detrás de un proxy inverso, tenemos que seguir estos pasos para que nos funcione y podamos acceder a la web de administración:
- Sobre Administración > phpIPAM settings configuramos la URL del sitio y guardamos:
- Con sudo docker exec -it phpipam-web sh entramos al contenedor:
- Con apk add –no-cache nano, instalamos el editor nano:
- Accedemos al directorio phpipam y editamos el fichero nano config.docker.php:
- Al final del fichero añadimos estas líneas:
/* — CONFIGURACIÓN FORZADA PARA PROXY Y BASE DE DATOS — */
// 1. Forzar que phpipam sepa que está en la raíz y es HTTPS
define(‘BASE’, «/»);
$_SERVER[‘HTTPS’] = ‘on’;
$_SERVER[‘SERVER_PORT’] = 443;
// 2. Forzar los datos de la Base de Datos (ajusta si tus datos son distintos)
$db[‘host’] = ‘192.168.14.17’;
$db[‘user’] = ‘phpipamuser’;
$db[‘pass’] = ‘phpipampass’; // <— PON AQUÍ TU CONTRASEÑA REAL
$db[‘name’] = ‘phpipam’;
$db[‘port’] = 3306;
/** Disable installation helper **/
define(‘TOOLKIT’, true);
$disable_installer = true;
- Con rm -f config.php y ln -s config.docker.php config.php borramos el enlace simbólico y lo volvemos a crear, con exit salimos del contenedor:
- Como hemos modificado un fichero dentro del contenedor docker de phpIPAM, ese mismo fichero lo guardamos en el volumen que creamos en el docker-compose.yaml, así cuando actualicemos el contenedor, ese fichero también será modificado dentro del contenedor actualizado, sudo docker cp phpipam-web:/phpipam/config.docker.php /opt/docker/phpipam/config/config.docker.php:
- Modificamos de nuevo el fichero docker-compose de phpIPAM con sudo nano docker-compose.yaml y añadimos las líneas:
– /opt/docker/phpipam/config/config.docker.php:/phpipam/config.docker.php:ro
– /opt/docker/phpipam/config/config.docker.php:/phpipam/config.php:ro
- Con sudo docker exec -it phpipam-db mariadb -u root -p accedemos al contenedor de MariaDB:
- Y ejecutamos:
- USE phpipam;
- UPDATE settings SET siteURL = ‘https://phpipam.ragasys.net/’ WHERE id = 1;
- UPDATE settings SET prettyLinks = ‘Yes’ WHERE id = 1;
- exit;
- Sobre la configuración del host de phpipam que configuramos en Nginx Proxy Manager, debemos de agregar esta configuración personalizada:
# Forzar cabeceras de protocolo seguro
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
# Evitar que el backend envíe redirecciones a http
proxy_redirect http:// https://;
# Desactivar compresión si da problemas con sub_filter
proxy_set_header Accept-Encoding «»;
# Cambiar cualquier mención de http por https en el código de la página
sub_filter ‘http://phpipam.ragasys.net’ ‘https://phpipam.ragasys.net’;
sub_filter_once off;
- Con sudo docker restart phpipam-web reiniciamos el contenedor de phpIPAM:
- Modificamos de nuevo el .env de phpIPAM, cd /opt/docker/phpipam/, nano .env:
- Y descomentamos la línea IPAM_DISABLE_INSTALLER=1:
- Reiniciamos el contenedor de phpIPAM con sudo docker compose up -d:
- Y como vemos ya tenemos acceso a nuestro phpIPAM a través de nuestro proxy inverso con Nginx Proxy Manager:
Saludos y espero que os sea de ayuda 😉




















































