0

Desplegar phpIPAM con Docker

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 😉

 

Jose Ramon Ramos Gata

Técnico Superior STI

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.