FIWARE IoT Agent-UL容器重启后丢失服务组与设备求助
IoT Agent-UL重启后服务组和设备丢失的解决方法
核心原因分析
你的IoT Agent-UL已配置使用MongoDB作为注册表,但重启后数据丢失,大概率是MongoDB认证数据库配置缺失导致的:
- 你的MongoDB启用了
--auth,root用户默认创建在admin数据库下 - IoT Agent默认会使用指定的业务数据库(
iotagentul)作为认证数据库,但root用户并不属于这个库,导致连接时认证逻辑异常,IoT Agent无法读取已有的服务组/设备数据,重启后会重新初始化空集合
另外需要先确认MongoDB中是否实际存储了服务组和设备数据。
解决方案
方案1:添加认证数据库环境变量(快速验证)
修改Docker Compose中iot-agent的environment部分,新增认证数据库配置:
environment: - IOTA_CB_HOST=orion - IOTA_CB_PORT=1026 - IOTA_NORTH_PORT=4041 - IOTA_REGISTRY_TYPE=mongo - IOTA_LOG_LEVEL=DEBUG - IOTA_TIMESTAMP=true - IOTA_CB_NGSI_VERSION=v2 - IOTA_AUTOCAST=true - IOTA_MONGO_HOST=mongo - IOTA_MONGO_PORT=27017 - IOTA_MONGO_DB=iotagentul - IOTA_MONGO_USER=mongoroot - IOTA_MONGO_PASS=abc123 - IOTA_MONGO_AUTH_DB=admin # 新增此行,指定root用户所在的认证库 - IOTA_HTTP_PORT=7896 - IOTA_PROVIDER_URL=http://iot-agent:4041
修改后重启IoT Agent容器:
docker-compose up -d --force-recreate iot-agent
方案2:创建专用数据库用户(更安全)
避免使用root用户操作业务数据库,为iotagentul创建专用读写用户:
- 进入MongoDB容器:
docker exec -it <你的Mongo容器名> mongosh -u mongoroot -p abc123 --authenticationDatabase admin
- 创建专用用户:
use iotagentul db.createUser({ user: "iotagent_user", pwd: "abc123", roles: [{ role: "readWrite", db: "iotagentul" }] }) exit
- 修改IoT Agent的环境变量:
- IOTA_MONGO_USER=iotagent_user - IOTA_MONGO_PASS=abc123 - IOTA_MONGO_AUTH_DB=iotagentul
- 重启IoT Agent容器。
验证步骤
- 先创建一个测试服务组/设备
- 进入MongoDB容器,检查
iotagentul数据库下的services和devices集合是否存在数据:
docker exec -it <Mongo容器名> mongosh -u mongoroot -p abc123 --authenticationDatabase admin use iotagentul db.services.find() # 查看服务组数据 db.devices.find() # 查看设备数据
- 重启IoT Agent容器,再次调用API查看服务组/设备是否存在,同时检查Mongo中的数据是否保留
额外排查点
- 查看IoT Agent重启时的日志,确认是否有MongoDB连接/认证相关错误:
docker logs fiware-iot-agent | grep -i "auth\|mongo\|connection"
- 确认主机
/mongo/datadir目录权限是否正确(Mongo容器运行用户为UID 999):
ls -ld /mongo/datadir chown -R 999:999 /mongo/datadir # 权限不正确时执行此命令修正
内容的提问来源于stack exchange,提问作者Sara Aziz
相关产品推荐
相关产品推荐

