Docker部署Unifi Network Application无法连接MongoDB求助
问题:Unifi Network Application无法连接MongoDB,认证失败
我使用两个Docker Compose文件分别部署MongoDB和Unifi Network Application,容器均可正常启动,但Unifi始终无法连接数据库,日志显示认证异常。
部署配置
1. MongoDB的unifi_db.yml
--- version: "3.1" services: unifi-db: image: docker.io/mongo:4.4.18 ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD_FILE : /run/secrets/mongodb_admin_user_password container_name: unifi-db volumes: - db_data:/data/db # - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro restart: unless-stopped secrets: - mongodb_admin_user_password volumes: db_data: secrets: mongodb_admin_user_password: file: /etc/docker/mongodb_admin_user_password.txt
2. Unifi Network Application的docker-compose.yml
--- version: "3.1" services: unifi-network-application: image: lscr.io/linuxserver/unifi-network-application:latest environment: - PUID=1000 - PGID=1000 - TZ=Europe/Amsterdam - MONGO_USER=unifi - FILE__MONGO_PASS=/run/secrets/mongodb_unifi_user_password - MONGO_HOST=unifi-db - MONGO_PORT=27017 - MONGO_DBNAME=unifi - MEM_LIMIT=1024 #optional - MEM_STARTUP=1024 #optional volumes: - db_data:/data/db ports: - 8443:8443 - 3478:3478/udp - 10001:10001/udp - 8080:8080 - 1900:1900/udp #optional - 8843:8843 #optional - 8880:8880 #optional - 6789:6789 #optional - 5514:5514/udp #optional restart: unless-stopped secrets: - mongodb_unifi_user_password volumes: db_data: secrets: mongodb_unifi_user_password: file: /etc/docker/mongodb_unifi_user_password.txt
已执行操作
MongoDB容器启动后,通过mongo -u admin -p登录,执行以下命令创建unifi用户:
db.getSiblingDB("unifi").createUser({user: "unifi", pwd: "KJDNFWI4R3R", roles: [{role: "dbOwner", db: "unifi"}, {role: "dbOwner", db: "unifi_stat"}]});
操作返回成功:
Successfully added user: { "user" : "unifi", "roles" : [ { "role" : "dbOwner", "db" : "unifi" }, { "role" : "dbOwner", "db" : "unifi_stat" } ] }
错误日志
[2023-10-17 17:25:10,082] <launcher> INFO db - Connecting to mongodb://unifi:~MONGO_PASS~@unifi-db:27017/unifi [2023-10-17 17:25:11,255] <launcher> INFO db - db connection established... [2023-10-17 17:25:12,634] <launcher> ERROR db - Got error while connecting to db: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='unifi', source='unifi', password=<hidden>, mechanismProperties=<hidden>}
需排查:Docker卷配置、密钥注入、用户创建是否存在问题?
排查与解决方案
1. 密钥注入问题
LinuxServer的Unifi镜像用FILE__前缀读取文件内容作为环境变量,需注意两点:
- 确保
/etc/docker/mongodb_unifi_user_password.txt内的密码无多余换行符或空格,文件末尾的换行常被当作密码一部分,导致认证失败。 - 容器内secrets路径权限正确:镜像默认以PUID/PGID=1000的用户运行,需确保该用户能读取
/run/secrets/mongodb_unifi_user_password文件。
2. Docker卷与网络问题
- 卷命名冲突:Docker卷默认以Compose项目名(所在目录名)作为命名空间,若两个Compose文件在不同目录,
db_data是两个独立卷,会导致Unifi无法访问MongoDB的数据。 - 冗余卷挂载:Unifi容器无需挂载MongoDB的
db_data卷,这会导致不必要的权限冲突,直接删除Unifi Compose中的volumes: - db_data:/data/db配置。 - 网络隔离:两个容器需在同一Docker网络中通信,修改配置如下:
在unifi_db.yml中添加自定义网络:
并在networks: unifi-net: driver: bridgeservices.unifi-db下添加networks: - unifi-net
在Unifi的Compose中加入外部网络:
并在networks: unifi-net: external: trueservices.unifi-network-application下添加networks: - unifi-net
3. MongoDB用户创建问题
你创建的用户认证源是unifi数据库,但Unifi默认会用MONGO_DBNAME作为认证源,若密码匹配失败,可调整用户创建方式:
- 重新在
admin库下创建用户(推荐,因为root用户在admin库):use admin; db.createUser({ user: "unifi", pwd: "KJDNFWI4R3R", roles: [ {role: "dbOwner", db: "unifi"}, {role: "dbOwner", db: "unifi_stat"} ], authenticationDatabase: "admin" }); - 然后在Unifi的环境变量中添加
MONGO_AUTHSOURCE=admin,指定认证源为admin库。
4. 验证步骤
- 停止所有容器并删除旧卷:
docker-compose -f unifi_db.yml down -v、docker-compose -f unifi.yml down -v - 检查secrets文件内容:
cat /etc/docker/mongodb_unifi_user_password.txt,确保无换行或空格 - 启动MongoDB容器,进入容器测试用户连接:
docker exec -it unifi-db mongo -u unifi -p KJDNFWI4R3R --authenticationDatabase admin unifi,确认能成功连接 - 启动Unifi容器,查看日志是否恢复正常
内容的提问来源于stack exchange,提问作者matteo-g
相关产品推荐
相关产品推荐

