You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: bridge
    
    并在services.unifi-db下添加networks: - unifi-net
    在Unifi的Compose中加入外部网络:
    networks:
      unifi-net:
        external: true
    
    并在services.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. 验证步骤

  1. 停止所有容器并删除旧卷:docker-compose -f unifi_db.yml down -v、docker-compose -f unifi.yml down -v
  2. 检查secrets文件内容:cat /etc/docker/mongodb_unifi_user_password.txt,确保无换行或空格
  3. 启动MongoDB容器,进入容器测试用户连接:docker exec -it unifi-db mongo -u unifi -p KJDNFWI4R3R --authenticationDatabase admin unifi,确认能成功连接
  4. 启动Unifi容器,查看日志是否恢复正常

内容的提问来源于stack exchange,提问作者matteo-g

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:35:54