1. 容器化部署GLPI 10升级至11全流程解析
作为一款开源的IT资产和服务管理工具,GLPI在企业IT资源管理、工单系统和库存跟踪等场景中扮演着重要角色。最近在将公司内部使用的GLPI 10升级到11版本时,我踩了不少坑,也积累了一些实战经验。下面就把整个升级过程详细记录下来,希望能帮到有同样需求的同行。
1.1 为什么需要升级到GLPI 11?
GLPI 11带来了多项重要改进:
- 全面支持PHP 8.1+环境,性能提升显著
- 数据库查询效率优化,响应速度更快
- 用户界面现代化改造,操作体验更佳
- 安全机制增强,减少潜在漏洞风险
更重要的是,GLPI 10的维护周期即将结束,官方支持重心已转向11版本。不及时升级的话,后续的安全补丁和功能更新都无法获取。
1.2 升级前的环境检查
先来看下GLPI 11的环境要求变化:
| 组件 | GLPI 11要求 | GLPI 10要求 |
|---|---|---|
| PHP版本 | 8.0+ | 7.2.5+ |
| MySQL | 8.0+ | 5.7+ |
| MariaDB | 10.5+ | 10.2+ |
| Apache | 2.4+ | 推荐2.2+ |
我们原有的GLPI 10环境:
- Docker:25.0.5
- MySQL:5.7
- Apache:2.4
- PHP:8.2(基础镜像php:8.2-apache)
幸运的是,PHP和Apache版本已经满足要求,主要需要处理的是MySQL的升级。
2. 升级方案设计与准备工作
2.1 升级路径规划
官方推荐的升级路径是:
GLPI 10.0.x → GLPI 10.0.23 → GLPI 11.0.x
不能直接从10.0.x跳到11.0.x,主要是因为数据库结构在10.0.23版本有重大变更,这是升级到11的必要前提。
2.2 完整升级流程
- 备份GLPI 10的所有关键数据
- 备份MySQL 5.7数据库
- 升级MySQL 5.7到8.0
- 升级GLPI 10.0.x到10.0.23
- 最终升级到GLPI 11.0.x
- 验证所有功能正常
2.3 关键备份策略
数据库备份:
- 使用mysqldump完整备份glpi数据库
- 包含存储过程、触发器和事件
- 采用单事务模式确保一致性
文件备份:
- 备份config目录:包含数据库配置等关键信息
- 备份files目录:存放上传的文档和图片
- 备份plugins目录:所有安装的插件
3. 详细升级步骤实现
3.1 备份现有数据库
首先停止相关容器,避免备份过程中有数据写入:
bash复制sudo docker stop my-glpi
使用mysqldump进行完整备份:
bash复制sudo docker exec -it glpi-db sh -c 'mysqldump -uroot -p123456 --single-transaction --routines --events --triggers --databases glpi > /var/lib/mysql/glpi_backup.sql'
关键参数说明:
--single-transaction:保证备份一致性且不锁表--routines:备份存储过程和函数--events:备份事件调度器--triggers:备份触发器
备份完成后,停止数据库容器:
bash复制sudo docker stop glpi-db
3.2 备份GLPI文件数据
bash复制sudo cp -rf /usr/local/glpi/ /usr/local/glpi_10
3.3 升级MySQL到8.0
创建新的Dockerfile构建MySQL 8.0镜像:
dockerfile复制FROM mysql:8.0
COPY glpi_backup.sql /docker-entrypoint-initdb.d/
ENV MYSQL_ROOT_PASSWORD=rootP@ssw0rd
ENV MYSQL_DATABASE=glpi
EXPOSE 3306
构建并运行新镜像:
bash复制sudo docker build -t glpi-db:11 .
特别注意:MySQL 8.0默认使用caching_sha2_password认证插件,而GLPI使用的是mysql_native_password,需要在docker-compose中明确指定:
yaml复制environment:
MYSQL_DEFAULT_AUTHENTICATION_PLUGIN: mysql_native_password
command:
- --default-authentication-plugin=mysql_native_password
3.4 升级GLPI到10.0.23
创建新的Dockerfile:
dockerfile复制FROM php:8.2-apache
# 安装系统依赖和PHP扩展
RUN apt-get update && apt-get install -y \
libpng-dev libjpeg-dev libfreetype6-dev \
libxml2-dev libldap2-dev libicu-dev \
libzip-dev libcurl4-openssl-dev libonig-dev \
libxslt1-dev unzip wget curl cron nano \
&& rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install \
pdo_mysql mysqli gd intl ldap zip xml xsl mbstring \
curl soap sockets opcache bcmath bz2
# 下载GLPI 10.0.23
ENV GLPI_VERSION=10.0.23
ENV GLPI_FILE=glpi-${GLPI_VERSION}.tgz
RUN wget -O "/tmp/${GLPI_FILE}" \
"https://github.com/glpi-project/glpi/releases/download/${GLPI_VERSION}/${GLPI_FILE}" \
&& tar -xzf "/tmp/${GLPI_FILE}" -C /var/www/html --strip-components=1 \
&& rm -f "/tmp/${GLPI_FILE}"
# 配置Apache
COPY glpi.conf /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite && a2enmod headers
# 设置权限
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html
EXPOSE 80
CMD ["apache2-foreground"]
构建并运行新版本:
bash复制sudo docker build -t my-glpi:10.0.23 .
sudo docker compose up -d
3.5 最终升级到GLPI 11.0.4
GLPI 11的一个重要变化是将web根目录改为public子目录,提升了安全性。我们需要相应调整Apache配置:
apache复制<VirtualHost *:80>
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
AllowOverride All
Require all granted
DirectoryIndex index.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>
</VirtualHost>
构建GLPI 11的Docker镜像:
dockerfile复制FROM php:8.2-apache
[...之前的依赖安装...]
# 下载GLPI 11.0.4
ENV GLPI_VERSION=11.0.4
ENV GLPI_FILE=glpi-${GLPI_VERSION}.tgz
RUN wget -O "/tmp/${GLPI_FILE}" \
"https://github.com/glpi-project/glpi/releases/download/${GLPI_VERSION}/${GLPI_FILE}" \
&& tar -xzf "/tmp/${GLPI_FILE}" -C /var/www/html --strip-components=1 \
&& rm -f "/tmp/${GLPI_FILE}"
[...其余配置...]
4. 升级后的验证与问题排查
4.1 常见问题及解决方案
-
数据库连接失败
- 检查MySQL认证插件是否为mysql_native_password
- 确认数据库用户权限
- 查看容器日志定位具体错误
-
页面样式丢失
- 确认Apache的rewrite模块已启用
- 检查public目录权限
- 清除浏览器缓存
-
插件不兼容
- 逐个禁用插件测试
- 检查插件是否有GLPI 11兼容版本
- 在测试环境先验证插件兼容性
4.2 升级验证清单
- 登录系统检查版本号
- 验证所有菜单功能正常
- 检查工单创建和处理流程
- 测试资产管理功能
- 验证报表生成
- 检查所有集成插件
5. 关键经验与注意事项
-
一定要按步骤升级
- 不能跳过10.0.23直接到11
- 每个中间版本都有其必要性
-
充分测试备份恢复
- 升级前实际演练恢复过程
- 确保备份的完整性和可用性
-
注意认证方式变更
- MySQL 8.0的默认认证插件变化
- 必须在配置中明确指定mysql_native_password
-
处理目录结构变化
- GLPI 11的public目录是强制要求
- 需要相应调整Apache配置
-
插件兼容性处理
- 提前联系插件开发者获取兼容版本
- 准备替代方案应对不兼容情况
这次升级过程中最大的收获是理解了渐进式升级的重要性。看似多了一步10.0.23的升级,实际上避免了很多潜在的数据库结构问题。另外,MySQL认证插件的变更也是一个容易忽略的坑,需要在升级前就做好预案。