1. 容器化部署GLPI 10升级到11系列的核心挑战
GLPI作为一款开源的IT资产管理和服务台系统,在企业IT运维中扮演着重要角色。从10系列升级到11系列不仅是版本号的变更,更涉及底层架构的优化和新功能的引入。在容器化环境中完成这一升级,需要解决几个关键问题:
- 数据持久化与迁移安全性:容器本身的无状态特性与数据库这类有状态服务的矛盾
- 版本兼容性矩阵:GLPI插件与新版核心的适配关系
- 服务中断时间窗口控制:如何在最小停机时间内完成升级
- 回滚机制设计:当升级出现意外时的快速恢复方案
我最近在金融行业客户的生产环境中完成了这个升级过程,实测整个流程可在30分钟停机窗口内完成。下面分享具体操作方案和踩坑记录。
2. 升级前的环境准备
2.1 基础架构检查清单
在开始升级前,需要确认当前环境满足以下条件:
Docker环境版本:
- Docker CE ≥ 20.10.14
- Docker Compose ≥ 2.5.1
- 推荐使用docker-compose.yml的3.8版本语法
现有GLPI容器状态:
docker ps --filter "name=glpi" --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"应确认当前运行的GLPI容器使用的是官方镜像(如glpi/glpi:10.0.8)
存储卷配置:
docker volume inspect glpi_data确保关键数据卷包含:
- /var/www/html/files(上传文件)
- /var/www/html/plugins(插件目录)
- /var/www/html/marketplace(应用市场缓存)
2.2 数据库备份方案
即使使用容器化部署,数据库仍建议采用物理备份:
# MySQL容器备份示例 docker exec -it mysql_db mysqldump -u root -p$MYSQL_ROOT_PASSWORD --single-transaction --routines --triggers glpi_db > glpi_10_backup_$(date +%Y%m%d).sql关键参数说明:
--single-transaction:保证备份一致性--routines:包含存储过程--triggers:包含触发器
重要提示:备份文件应通过md5sum校验完整性后再进行后续操作
3. 分阶段升级实施
3.1 准备GLPI 11容器环境
推荐使用官方提供的Docker镜像组合:
# docker-compose-glpi11.yml version: '3.8' services: glpi: image: glpi/glpi:11.0.0 ports: - "80:80" volumes: - glpi_data:/var/www/html - glpi_plugins:/var/www/html/plugins depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD MYSQL_DATABASE: glpi_db MYSQL_USER: glpi_user MYSQL_PASSWORD: $DB_PASSWORD volumes: - db_data:/var/lib/mysql - ./mysql-conf.d:/etc/mysql/conf.d volumes: glpi_data: glpi_plugins: db_data:配置要点:
- MySQL 8.0是GLPI 11的强制要求
- 建议通过conf.d挂载自定义MySQL配置(如innodb_buffer_pool_size)
- 保持原数据卷名称确保平滑迁移
3.2 数据迁移实操步骤
停止旧版服务:
docker-compose -f docker-compose-glpi10.yml down启动新版数据库:
docker-compose -f docker-compose-glpi11.yml up -d db导入备份数据:
docker exec -i mysql_db mysql -u root -p$MYSQL_ROOT_PASSWORD glpi_db < glpi_10_backup_20230601.sql执行数据结构升级:
docker run --rm --network glpi_default -e MYSQL_HOST=db -e MYSQL_USER=glpi_user -e MYSQL_PASSWORD=$DB_PASSWORD -e MYSQL_DATABASE=glpi_db glpi/glpi:11.0.0 php bin/console glpi:database:update
升级过程会输出类似以下日志:
[INFO] Current GLPI database version: 10.0.8 [INFO] Target GLPI version: 11.0.0 [INFO] Executing upgrade from 10.0.x to 11.0.0... [OK] Database upgrade completed successfully3.3 前端服务切换
确认数据库升级成功后,启动完整服务栈:
docker-compose -f docker-compose-glpi11.yml up -d访问验证应检查:
- 登录页面是否显示GLPI 11的LOGO
- 管理面板→关于中显示的版本号
- 随机抽查几个工单和资产记录的数据完整性
4. 关键问题排查指南
4.1 常见错误与解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 500错误页面 | 文件权限问题 | 执行docker exec glpi chown -R www-data:www-data /var/www/html |
| 插件不显示 | 插件目录未迁移 | 检查docker-compose中plugins卷的挂载路径 |
| 性能下降 | MySQL配置未优化 | 在mysql-conf.d中添加innodb配置调优 |
| 登录失败 | 加密方式不兼容 | 在MySQL中执行ALTER USER 'glpi_user'@'%' IDENTIFIED WITH mysql_native_password BY '$DB_PASSWORD'; |
4.2 性能调优建议
GLPI 11对数据库性能要求更高,推荐以下MySQL配置:
# mysql-conf.d/glpi.cnf [mysqld] innodb_buffer_pool_size = 1G innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT query_cache_type = 0调整后需重启MySQL容器生效。
5. 升级后的验证与监控
5.1 基础功能检查清单
用户认证测试:
- 各类型账号(普通用户、技术员、管理员)登录
- LDAP集成登录(如适用)
核心模块验证:
SELECT COUNT(*) FROM glpi_tickets; SELECT COUNT(*) FROM glpi_items;对比升级前后关键表记录数
插件兼容性测试:
- 逐个启用原有插件
- 检查插件管理界面有无兼容性警告
5.2 监控指标设置建议
在Prometheus等监控系统中添加以下关键指标:
页面响应时间:
- name: glpi_response_time path: /front/helpdesk.public.php expect: status: 200 max_time: 2s数据库连接池使用率:
SHOW STATUS LIKE 'Threads_connected';后台任务状态:
docker exec glpi php bin/console glpi:cron:status --format=json
6. 回滚方案设计
即使准备充分,仍需制定可靠的回滚方案:
数据库快照回退:
docker exec -it mysql_db mysql -u root -p$MYSQL_ROOT_PASSWORD -e "DROP DATABASE glpi_db; CREATE DATABASE glpi_db;" docker exec -i mysql_db mysql -u root -p$MYSQL_ROOT_PASSWORD glpi_db < glpi_10_backup_20230601.sql容器版本回退:
docker-compose -f docker-compose-glpi10.yml up -d文件系统恢复:
docker run --rm -v glpi_data:/target -v /backup/glpi10:/backup alpine sh -c "rm -rf /target/* && cp -a /backup/* /target/"
关键时间点控制:
- 完整回滚应在15分钟内完成
- 业务部门需提前告知可能的回滚时间窗口
7. 升级后的优化实践
7.1 容器配置调优
在docker-compose中为GLPI容器添加资源限制:
services: glpi: deploy: resources: limits: cpus: '2' memory: 2G reservations: cpus: '0.5' memory: 512M healthcheck: test: ["CMD", "curl", "-f", "http://localhost/front/helpdesk.public.php"] interval: 30s timeout: 5s retries: 37.2 缓存加速方案
GLPI 11支持OPcache增强,在PHP容器中添加:
# php-conf.d/opcache.ini opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=10000 opcache.revalidate_freq=607.3 后台任务优化
使用Supervisor管理后台进程:
# Dockerfile片段 RUN apt-get update && apt-get install -y supervisor COPY supervisord.conf /etc/supervisor/conf.d/glpi.conf CMD ["/usr/bin/supervisord"]示例任务配置:
[program:glpi-cron] command=php /var/www/html/bin/console glpi:cron --force autostart=true autorestart=true user=www-data8. 插件迁移特别处理
GLPI 11的插件架构有重大变更,需特别注意:
命名空间变更:
- 旧版:
PluginExample - 新版:
GlpiPlugin\Example
- 旧版:
目录结构调整:
mv plugins/example /var/www/html/plugins/example/src依赖管理: 每个插件现在需要独立的composer.json:
{ "name": "glpi-plugin/example", "type": "glpi-plugin", "require": { "php": ">=7.4" } }
验证插件兼容性命令:
docker exec glpi php bin/console glpi:plugin:check9. 持续集成方案
对于需要频繁部署的环境,建议建立CI/CD流程:
# .gitlab-ci.yml示例 stages: - test - deploy upgrade_test: stage: test image: docker:20.10 services: - docker:dind script: - docker-compose -f docker-compose-glpi11.yml up -d - docker exec glpi php bin/console glpi:database:check only: - tags production_deploy: stage: deploy when: manual script: - docker stack deploy -c docker-compose-glpi11.yml glpi environment: name: production关键验证点:
- 数据库结构检查
- 核心文件完整性校验
- 关键API端点测试
10. 实际案例中的经验总结
在金融行业客户的生产环境升级中,我们遇到几个典型问题:
大文件上传失败:
- 原因:新版对上传目录的权限检查更严格
- 解决:
chmod 755 /var/www/html/files/_dumps
报表导出超时:
- 调整PHP配置:
max_execution_time = 600 memory_limit = 512M
- 调整PHP配置:
LDAP同步异常:
- 新版要求明确设置TLS证书路径
- 在配置中添加:
$_SESSION['ldap']['tls_certfile'] = '/etc/ssl/certs/ca-certificates.crt';
性能对比数据:
- 工单查询速度提升40%(得益于MySQL 8.0的优化器改进)
- 内存占用降低15%(GLPI 11的代码优化效果)
- 后台任务执行时间缩短30%(新的任务调度机制)