Versões avaliadas: Docker 24.0.2 + GLPI 10.0.7
Os passos abaixo são para uma nova instalação.
Para upgrade basta trocar a versão "php:8.1.20-apache-bullseye" e os arquivos persistentes continuaram.
Com a versão do glpi-10.0.7 é possível usar a versão 8.2.0 do PHP.
Eu optei em usar os arquivos php.ini, 000-default.conf e downstream.php criados fora do contexto do container por mera opção e para deixar o script mais objetivo.
Montar o compartilhamento NFS e Criar os diretórios
# mkdir -p /mnt/resource/CONTAINER/glpi/config
# mkdir -p /mnt/resource/CONTAINER/glpi/etc/glpi
# mkdir -p /mnt/resource/CONTAINER/glpi/inc
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_cron
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_dumps
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_graphs
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_lock
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_plugins
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_rss
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_sessions
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_tmp
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_uploads
# mkdir -p /mnt/resource/CONTAINER/glpi/files/_pictures
# mkdir -p /mnt/resource/CONTAINER/glpi/documents
# mkdir -p /mnt/resource/CONTAINER/glpi/log
# mkdir -p /mnt/resource/CONTAINER/glpi/marketplace
O modulo rewrite tem que ser ativado antes de subir o Web Config
# a2enmod rewrite
Configurações para o webserver /mnt/resource/CONTAINER/glpi/config/glpi.conf
<VirtualHost *:80>
#ServerName www.example.com
#ServerAdmin webmaster@localhost
#ServerAlias servicedesk.local.domain inventory.local.domain
#DirectoryIndex index.php index.html
#TraceEnable Off
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Require all granted
RewriteEngine On
# Redirect all requests to GLPI router, unless file exists.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Configurações para o webserver /mnt/resource/CONTAINER/glpi/config/php.ini
[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
zend.exception_ignore_args = On
zend.exception_string_param_max_len = 0
expose_php = On
max_input_time = 60
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
max_execution_time = 600
memory_limit = 256M
upload_max_filesize = 5M
max_file_uploads = 20
cgi.fix_pathinfo=0
magic_quotes_sybase = off
register_globals = off
[CLI Server]
cli_server.color = On
[Date]
date.timezone = America/Sao_Paulo
[filter]
[iconv]
[imap]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 1
session.cookie_samesite =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = -1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[dba]
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=180
opcache.consistency_checks=0
[apcu]
apc.enabled=1
apc.enable_cli=1
apc.shm_size=128M
apc.ttl=7200
apc.serializer=php
[curl]
[openssl]
[ffi]
Criar o arquivo de configuração do caminho que contem os diretórios /mnt/resource/CONTAINER/glpi/etc/glpi/local_define.php
<?php
define('GLPI_VAR_DIR', '/var/lib/glpi');
define('GLPI_LOG_DIR', '/var/log/glpi');
Nota: Depois de criar o diretório /mnt/resource/CONTAINER/glpi/etc/glpi/, ele ira armazenar o arquivo de configuração de banco de dados.
Tambem em /mnt/resource/CONTAINER/glpi/inc/downstream.php
<?php
define('GLPI_CONFIG_DIR', '/etc/glpi/');
if (file_exists(GLPI_CONFIG_DIR . '/local_define.php')) {
require_once GLPI_CONFIG_DIR . '/local_define.php';
}
Baixar o arquivo do GLPI
# cd /mnt/resource/CONTAINER/glpi
# wget https://github.com/glpi-project/glpi/releases/download/10.0.7/glpi-10.0.7.tgz
# tar -zvxf glpi-10.0.7.tgz
Ajustar o arquivo htaccess do GLPI
echo "
# for GLPI version 10.0.7 or later.
# https://glpi-install.readthedocs.io/en/latest/prerequisites.html#web-server
RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public
RewriteRule ^(.*)$ public/index.php [QSA,L]" >> /mnt/resource/CONTAINER/glpi/glpi/.htaccess
Habilitar timezone no serviço do MariaDB
# mariadb-tzinfo-to-sql /usr/share/zoneinfo | mariadb -u root mysql
# systemctl restart mariadb.service
Criar database e permissões
# mariadb -u root -p
]> CREATE DATABASE glpi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
]> GRANT ALL PRIVILEGES ON glpi.* TO 'glpiuser'@'IP ou %' IDENTIFIED BY '<SENHA>';
]> GRANT SELECT ON `mysql`.`time_zone_name` TO 'glpiuser'@'IP ou %';
]> FLUSH PRIVILEGES;
]> quit
Segue abaixo o script para instalação do serviço para funcionamento do glpi
#!/usr/bin/env bash
### NOME CONTAINER
NCAPACHE="GLPI"
### PACOTE CONTAINER
PCAPACHE="php:8.1.20-apache-bookworm"
### VARIAVEIS
TIMEZONE="America/Sao_Paulo"
RESTART="unless-stopped"
HOME="/mnt/resource/CONTAINER/glpi"
DOCKER=`which docker`
MKDIR=`which mkdir`
MV=`which mv`
RM=`which rm`
CP=`which cp`
VGLPI="10.0.7"
### NET - /29 = 192.168.252.1-6 IPs
CTDRI="bridge"
CTSUB="192.168.252.0/29"
CTRAN="192.168.252.0/29"
CTGAT="192.168.252.1"
CTNET="glpi-net"
echo ""
echo "### CRIANDO OS DIRETORIOS"
echo ""
if [[ -d $HOME && -d $HOME/config && -d $HOME/documents && -d $HOME/etc/glpi && -d $HOME/files && -d $HOME/glpi && -d $HOME/inc && -d $HOME/log && -d $HOME/marketplace ]]; then
echo "# Diretorios existente."
else
$MKDIR -p $HOME $HOME/config $HOME/documents $HOME/etc/glpi $HOME/files $HOME/glpi $HOME/inc $HOME/log $HOME/marketplace
echo "# Diretorios criado."
fi
echo ""
echo "### BAIXANDO O GLPI"
if [[ -f $HOME/glpi/INSTALL.md ]]; then
echo "# Diretorio GLPI existente."
else
wget -c -P $HOME https://github.com/glpi-project/glpi/releases/download/$VGLPI/glpi-$VGLPI.tgz
tar -zvxf $HOME/glpi-$VGLPI.tgz -C $HOME
echo "# Diretorio GLPI criado."
fi
echo ""
echo "### CRIAR WEB CONFIG - sera substituído por web config pela referencia 10.0.7"
if [[ -f $HOME/config/glpi.conf ]]; then
echo "<VirtualHost *:80>
DocumentRoot /var/www/html
<Directory /var/www/html>
Require all granted
</Directory>
</VirtualHost>" > $HOME/config/glpi.conf
fi
echo ""
echo "### REMOVE CONTAIER ANTIGO E NETWORK"
$DOCKER stop $NCAPACHE && \
$DOCKER rm $NCAPACHE && \
$DOCKER network rm $CTNET
#$DOCKER rmi $PCAPACHE && \
#$DOCKER system prune --all --volumes --force
echo ""
echo "### CRIANDO NETWORK"
$DOCKER network create \
--driver=$CTDRI \
--subnet=$CTSUB \
--ip-range=$CTRAN \
--gateway=$CTGAT \
$CTNET
echo ""
echo "### INSTALANDO NOVO CONTAINER"
$DOCKER run --name $NCAPACHE \
-p 8091:80 \
-e TZ=$TIMEZONE \
-v $HOME/etc/glpi:/etc/glpi \
-v $HOME/config/php.ini:/usr/local/etc/php/php.ini:ro \
-v $HOME/config/glpi.conf:/etc/apache2/sites-available/000-default.conf:ro \
-v $HOME/log:/var/log/apache2 \
-v $HOME/log:/var/log/glpi \
-v $HOME/glpi:/var/www/html \
-v $HOME/files:/var/lib/glpi \
-v $HOME/documents:/var/www/html/documents \
-v $HOME/marketplace:/var/www/html/marketplace \
-v $HOME/inc/downstream.php:/var/www/html/inc/downstream.php:ro \
--network=$CTNET \
--restart $RESTART \
-d $PCAPACHE
echo ""
echo "### ATUALIZACAO DE PACOTES REQUERIDOS"
$DOCKER exec -u 0 $NCAPACHE /bin/bash -c "apt update; \
apt upgrade -y; \
apt install libmcrypt-dev libldap2-dev zlib1g-dev libpng-dev libicu-dev libcurl4-openssl-dev libsnmp-dev libxml++2.6-dev libzip-dev libbz2-dev cron -y; \
apt autoclean; \
apt autoremove; \
docker-php-ext-install mysqli gd intl exif ldap zip bz2 opcache snmp; docker-php-ext-enable mysqli gd intl exif ldap zip bz2 opcache snmp; \
pecl install apcu; \
docker-php-ext-enable apcu; \
echo -e '* * * * * root /usr/local/bin/php /var/www/html/front/cron.php' >> /etc/crontab; echo -e '' >> /etc/crontab; \
echo -e '0 */12 * * * root php bin/console -n ldap:sync' >> /etc/crontab; echo -e '' >> /etc/crontab; \
a2enmod rewrite"
echo ""
echo "### SUBSTITUIR WEB CONFIG"
## https://glpi-install.readthedocs.io/en/latest/prerequisites.html#web-server
$RM $HOME/config/glpi.conf
$CP $HOME/config/glpi.conf.10.0.7 $HOME/config/glpi.conf
echo ""
echo "### REINICIANDO CONTAINER"
$DOCKER restart $NCAPACHE
echo ""
echo "### DESATIVANDO SCRIPT DE INSTALACAO"
if [[ -d $HOME/glpi/install ]]; then
$RM -rf $HOME/glpi/install
echo "# Diretorio install foi removido."
#$MV $HOME/glpi/install $HOME/glpi/install.APAGAR
else
echo "# Diretorio install inexistente"
fi
echo ""
echo "END OF SCRIPT"
echo ""
Por motivos de segurança, altere as senhas dos usuários padrão: glpi, post-only, tech, normal
Por motivos de segurança, remova o arquivo: install/install.php ou mover o diretório install
# rm -rf /mnt/resource/CONTAINER/glpi/glpi/install/install.php
Ou
# mv /mnt/resource/CONTAINER/glpi/glpi/install /mnt/resource/CONTAINER/glpi/glpi/install.APAGAR
Ou
# mv /mnt/resource/CONTAINER/glpi/glpi/install/install.php /mnt/resource/CONTAINER/glpi/glpi/install/install.php.APAGAR
Acesse a interface do GLPI em Administration > Users de desative os usuários post-only tech normal.
Acesse Administration > Users > glpi e altere a senha para uma senha mais complexa.
Criar os diretórios
/home/STORAGE001/$NGINX/conf
/home/STORAGE001/$NGINX/log
/home/STORAGE001/$NGINX/www
Script para o webserver + php
$ vi deploy_nginx.sh
#!/usr/bin/env bash
NGINX="Nginx"
PHP="PHP-Nginx"
NGINXD="nginx:latest"
PHPD="php:7.4.20-fpm-buster"
PATHNGINX="/home/STORAGE001/$NGINX"
DOCKER="/usr/bin/docker"
MKDIR="/usr/bin/mkdir"
APT="/usr/bin/apt"
if [[ -d $PATHNGINX ]]; then
#&& -d $CONF
echo "Diretorios existente."
else
$MKDIR -p $PATHNGINX
#$CONF
echo "Diretorios criado."
fi
### Remove
$DOCKER stop $NGINX && \
$DOCKER stop $PHP && \
$DOCKER rm $NGINX && \
$DOCKER rm $PHP && \
$DOCKER rmi $NGINXD && \
$DOCKER rmi $PHPD
### Install
$DOCKER run --name $PHP \
-e TZ='America/Sao_Paulo' \
-e PHP_MEMORY_LIMIT=128M \
-v $PATHNGINX/www:/usr/share/nginx/html \
-v $PATHNGINX/conf/php.ini:/usr/local/etc/php/php.ini \
--restart unless-stopped \
-d $PHPD
$DOCKER exec -u 0 $PHP /bin/bash -c \
"apt update; \
apt install libmcrypt-dev libldap2-dev zlib1g-dev libpng-dev libicu-dev libxml++2.6-dev libzip-dev libbz2-dev -y; \
apt autoclean; apt autoremove; \
docker-php-ext-install ldap bcmath gd intl mysqli opcache xmlrpc exif zip bz2; \
docker-php-ext-enable ldap bcmath gd intl mysqli opcache xmlrpc exif zip bz2; \
pecl install apcu mcrypt; \
docker-php-ext-enable apcu mcrypt"
$DOCKER restart $PHP
$DOCKER run --name $NGINX \
--link $PHP:PHP \
-p 8082:80 \
-e TZ='America/Sao_Paulo' \
-v $PATHNGINX/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v $PATHNGINX/conf/default.conf:/etc/nginx/conf.d/default.conf:ro \
-v $PATHNGINX/conf/glpi.conf:/etc/nginx/conf.d/glpi.conf:ro \
-v $PATHNGINX/www:/usr/share/nginx/html \
-v $PATHNGINX/log:/var/log/nginx \
--restart unless-stopped \
-d $NGINXD
Conf do nginx
$ vi /home/STORAGE001/$NGINX/conf/glpi.conf
server {
listen 80;
listen [::]:80;
server_name glpi.iscmc.local;
access_log /var/log/nginx/glpi.access.log;
error_log /var/log/nginx/glpi.error.log;
root /usr/share/nginx/html/Glpi;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass PHP-Nginx:9000; <- Nome do container PHP
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 365d;
}
# Security for 'files' directory
location /config/ {
#try_files $uri /index.php;
deny all;
}
# Security for 'files' directory
location /files/ {
try_files $uri /index.php;
deny all;
}
}
Disponibilizar os arquivos descompactados do Glpi no caminho abaixo:
/home/STORAGE001/$NGINX/www/Glpi
Iniciar o processo de configuração
Arquivo Compose
$ cd dockercompose
$ mkdir GLPI
$ vi docker-compose-GLPI.yml
version: "3.3"
services:
debian:
build: ./GLPI
container_name: "GLPI"
ports:
- "8083:80"
#restart: always
volumes:
- "glpi:/var/www/html"
environment:
TZ: "America/Sao_Paulo"
LANG: "US.UTF-8"
volumes:
glpi:
external: false
Arquivo Dockerfile
$ vi GLPI/Dockerfile
FROM --platform=linux/amd64 debian:stable-slim
# LOCALES
RUN apt-get update && apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.utf8
RUN apt update && apt install apt-get install nginx-light vim curl git \
composer zip unzip bzip2 unrar-free
RUN apt update && apt install php7.3 php7.3-fpm php7.3-gd php7.3-mysql \
php7.3-intl php7.3-mbstring php7.3-xml php7.3-curl php7.3-ldap \
php7.3-json php7.3-readline php7.3-cli php7.3-common php7.3-bcmath \
php7.3-imap php7.3-xmlrpc php7.3-soap php7.3-pspell php7.3-recode \
php7.3-sqlite3 php7.3-tidy php7.3-xsl php-memcache php-imagick \
php-apcu php-cas php-apcu php-pecl-http php-pear libmcrypt-dev
RUN apt autoremove -y && apt autoclean -y
EXPOSE 8083/TCP
CMD ["nginx", "-g", "daemon off;"]
Executar o arquivo compose
$ docker volume create glpi
$ docker-compose -f docker-compose-GLPI.yml up -d
COPY glpi.conf /etc/nginx/
EXPOSE 8084
RUN mkdir /var/lib/docker/volume/GLPI
RUN wget https://github.com/glpi-project/glpi/releases/download/9.4.4/glpi-9.4.4.tgz
RUN tar -zvxf glpi-9.4.4.tgz
COPY glpi-9.4.4/* /var/lib/docker/volume/GLPI/
#ter volume separado para armazenar os arquivos /files /images
RUN echo && \
# Install and configure missing PHP requirements
/usr/local/bin/docker-php-ext-configure bcmath && \
/usr/local/bin/docker-php-ext-install bcmath && \
apk add --no-cache openldap-dev && \
/usr/local/bin/docker-php-ext-configure ldap && \
/usr/local/bin/docker-php-ext-install ldap && \
apk del openldap-dev && \
echo "max_execution_time = 120" >> /usr/local/etc/php/conf.d/docker-vars.ini && \
echo
VOLUME /var/lib/docker/volumes/GLPI
https://www.alura.com.br/artigos/desvendando-o-dockerfile
# docker-php-ext-configure/install
https://gist.github.com/giansalex/2776a4206666d940d014792ab4700d80
https://olvlvl.com/2019-06-install-php-ext-source
https://codereviewvideos.com/course/docker-tutorial-for-beginners/video/docker-php-7-tutorial-7-7-1-and-higher