Пожалуйста, см. Редактирование ниже для дополнительной информации.
Короче говоря, я пытаюсь запустить контроллер Unifi на моем домашнем кластере Kubernetes.При этом мне нужно было децентрализовать базу данных MongoDB, поскольку наличие экземпляра MongoDB, связанного с каждой репликой в Kubernetes, приводит к сбою базы данных.Вот мой проект на данный момент: https://github.com/zimmertr/Kubernetes-Manifests/tree/unifi_mongodb_separation/Unifi_Controller
При этом я написал следующий скрипт, который выполняется во время подготовки для MongoDB контейнера :
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.getSiblingDB("unifi").createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "readWrite", db: "unifi"}]})'
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.getSiblingDB("unifi_stat").createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "readWrite", db: "unifi_stat"}]})'
А затем я настроил Unifi Controller для связи с базой данных через смонтированный том system.properties
файл, настроенный так:
# Inform IP Address
system_ip={{ load_balancer_ip }}
# Autobackup directory
autobackup.dir=/backups
# External MongoDB information
db.mongo.local=false
db.mongo.uri=mongodb://ubnt:{{ mongodb_password }}@unifi-controller-mongodb:27017/unifi
statdb.mongo.uri=mongodb://ubnt:{{ mongodb_password }}@unifi-controller-mongodb:27017/unifi_stat
unifi.db.name=unifi
Это настроено как по указанию Ubiquiti.
Это все работает, и когда запускается развертывание Kubernetes, я вижу, что Unifi Controller подключается к экземпляру MongoDB в журналах.Кроме того, если я вручную подключаюсь к базам данных MongoDB и запускаю show collections
, я вижу, что было создано много новых коллекций.Однако контроллер Unifi перестает создавать журналы здесь.
Если я вручную остановлю файл jar
, на котором работает контроллер Unifi в фоновом режиме на контейнере, а затем перезапущу его, будет получена следующая трассировка стека:
$> s6-setuidgid abc java -Xmx1024M -jar /usr/lib/unifi/lib/ace.jar start
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: destroy called
Exception in thread "launcher" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Ò00000' defined in class com.ubnt.service.AppContext: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [com.ubnt.service.P.D com.ubnt.service.AppContext.Ò00000()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbService' defined in class com.ubnt.service.AppContext: Invocation of init method failed; nested exception is com.mongodb.CommandFailureException: { "serverUsed" : "unifi-controller-mongodb:27017" , "ok" : 0.0 , "errmsg" : "not authorized on unifi to execute command { dropDatabase: 1 }" , "code" : 13 , "codeName" : "Unauthorized"}
Ключевой элемент здесь
не авторизован в Unifi для выполнения команды {dropDatabase: 1} "
И это где мойпонимание MongoDB подходит к концу. И мой вопрос подходит к началу. Я считаю, что причина, по которой Unifi Controller не продолжает запускать или регистрировать какие-либо дополнительные сообщения после подключения к базе данных и создания коллекций, заключается в том, что он молчавыполнить действие с базой данных MongoDB, для которой у него нет необходимых разрешений.
Когда я инициализирую контейнер MongoDB Docker, я указываю переменные среды MONGO_INITDB_ROOT_USERNAME
& MONGO_INITDB_ROOT_PASSWORD
.Поверьте, включает режим auth
. Это убеждение подтверждается тем фактом, что я могу подключиться к Madmin
аутентификационная база данных ongoDB через имя пользователя и пароль, которые я предоставляю этим переменным.
Однако, на основании сценария, который я разместил выше, который создает мои базы данных и назначает роль readWrite
пользователю ubnt
,Мне любопытно, как мне дать пользователю ubnt
необходимые разрешения, необходимые для удаления базы данных.Если я поменяю readWrite
на другие роли, такие как root
и dbAdminAnyDatabase
, команды не пройдут.
Что мне нужно сделать, чтобы мой пользователь ubnt мог сбросить unifi
и unifi_stat
базы данных?Или что мне нужно изменить в строках подключения, чтобы этого не случилось?Я немного админ базы данных.
Продолжение редактирования:
Я обновил роль, которая приписывается ubnt
пользователь на unifi
и unifi_stat
будет dbAdmin
вместо readWrite
.И немного дальше.
#!/bin/bash
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "dbAdmin", db: "unifi"}]})'
mongo \
--username ubnt \
--password "{{ mongodb_password }}" \
--authenticationDatabase admin \
--eval 'db.createUser({user: "ubnt", pwd: "{{ mongodb_password }}", roles: [{role: "dbAdmin", db: "unifi_stat"}]})'
Тем не менее, контроллер Unifi все еще ведет себя странно.Теперь это просто повторяется в файлах журнала:
2019-02-10 22:33:45,449] <launcher> INFO system - ======================================================================
[2019-02-10 22:33:45,450] <launcher> INFO system - UniFi 5.6.40 (build atag_5.6.40_10370 - release) is started
[2019-02-10 22:33:45,450] <launcher> INFO system - ======================================================================
[2019-02-10 22:33:45,457] <launcher> INFO system - BASE dir:/usr/lib/unifi
[2019-02-10 22:33:45,464] <launcher> INFO system - Current System IP: 192.168.0.1
[2019-02-10 22:33:45,465] <launcher> INFO system - Hostname: unifi-controller-5bb95c7688-bzp4z
[2019-02-10 22:33:48,635] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:33:49,173] <launcher> INFO db - Connecting to mongodb://ubnt:PASSWORD@unifi-controller-mongodb:27017/unifi
[2019-02-10 22:33:49,526] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:33:49,534] <launcher> INFO db - *** Factory Default *** Database exists. Drop it
[2019-02-10 22:33:52,391] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:33:52,896] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:34:13,292] <launcher> INFO system - ======================================================================
[2019-02-10 22:34:13,295] <launcher> INFO system - UniFi 5.6.40 (build atag_5.6.40_10370 - release) is started
[2019-02-10 22:34:13,295] <launcher> INFO system - ======================================================================
[2019-02-10 22:34:13,303] <launcher> INFO system - BASE dir:/usr/lib/unifi
[2019-02-10 22:34:13,312] <launcher> INFO system - Current System IP: 192.168.0.1
[2019-02-10 22:34:13,313] <launcher> INFO system - Hostname: unifi-controller-5bb95c7688-bzp4z
[2019-02-10 22:34:16,781] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:34:17,300] <launcher> INFO db - Connecting to mongodb://ubnt:PASSWORD@unifi-controller-mongodb:27017/unifi
[2019-02-10 22:34:17,640] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
[2019-02-10 22:34:17,656] <launcher> INFO db - *** Factory Default *** Database exists. Drop it
[2019-02-10 22:34:20,463] <launcher> INFO db - waiting for db connection...
[2019-02-10 22:34:20,969] <launcher> DEBUG db - db connected (3.4.19@unifi-controller-mongodb:27017)
Так что я в растерянности.Не уверен, почему он пытается сбросить базу данных?Unifi пытается создать базы данных с нуля на экземпляре MongoDB?
Если я не создаю базы данных unifi
и unifi_stat
во время предоставления MongoDB, то UnifiКонтроллеру не удается подключиться к ним, и журналы там останавливаются.
Если я действительно создаю базы данных и даю ubnt
user dbAdmin
поверх них, тогда Unifi просто падаетих снова и снова.Показанный выше.
Если я действительно создаю базы данных и даю над ними ubnt
пользователя readWrite
, то Unifi просто подключается к базам данных, создает коллекции и молча останавливается длянет явной причины.И если я попытаюсь вручную выполнить файл jar
, упомянутый выше, то он оставит след от стека, описывающий отсутствие необходимых разрешений для удаления базы данных.
Если бы кто-то мог предоставить некоторую документацию о том, как должна быть подготовлена внешняя база данных MongoDB для использования контроллером Unifi, это было бы очень полезно для меня.Мне удалось отследить только сообщение на форуме, в котором сотрудник обсуждал, как настроить system.properties контроллера для указания на внешний экземпляр.