Ubiquiti Unifi Network Application: Unterschied zwischen den Versionen

Aus TippvomTibb
Zur Navigation springen Zur Suche springen
Zeile 65: Zeile 65:
  
 
===Docker Container===
 
===Docker Container===
 +
====MongoDB====
 
Mit
 
Mit
 
  docker run ...
 
  docker run ...
Zeile 168: Zeile 169:
  
 
Also probiere ich
 
Also probiere ich
 +
 +
mongo 172.17.0.4:27018
 +
 +
und scheitere. Obwohl ich den internen Port (Container) auf den externen Port (Host) umgelenkt habe klappt die Kontaktaufnahme nicht. Erst mit
 +
 +
mongo 172.17.0.4:27017
 +
 +
klappt es. Komisch. Die Portumlenkung scheint sich nur auf den Host zu beziehen, nicht auf die Bridge.
 +
 +
MongoDB shell version v4.4.26
 +
connecting to: mongodb://172.17.0.4:27017/test?compressors=disabled&gssapiServiceName=mongodb
 +
Implicit session: session { "id" : UUID("ab1224d3-543b-46bc-a7d1-8824bc288512") }
 +
MongoDB server version: 4.4.26
 +
---
 +
The server generated these startup warnings when booting:
 +
        2023-12-25T08:56:12.469+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
 +
        2023-12-25T08:56:14.368+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
 +
        2023-12-25T08:56:14.368+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
 +
---
 +
> show dbs
 +
admin  0.000GB
 +
config  0.000GB
 +
local  0.000GB
 +
> db.getSiblingDB("MONGO_DBNAME").createUser({user: "MONGO_USER", pwd: "MONGO_PASS", roles: [{role: "dbOwner", db: "MONGO_DBNAME"}]});
 +
Successfully added user: {
 +
        "user" : "MONGO_USER",
 +
        "roles" : [
 +
                {
 +
                        "role" : "dbOwner",
 +
                        "db" : "MONGO_DBNAME"
 +
                }
 +
        ]
 +
}
 +
 +
Noch den zweiten Befehl hinterher.
 +
 +
db.getSiblingDB("MONGO_DBNAME_stat").createUser({user: "MONGO_USER", pwd: "MONGO_PASS", roles: [{role: "dbOwner", db: "MONGO_DBNAME_stat"}]});
 +
 +
und schon sind die Vorbereitungen der MongoDB abgeschlossen.
 +
 +
Der Weg ueber mongosh und docker exec waere wohl auch gegangen. [https://www.mongodb.com/docs/manual/reference/method/db.getSiblingDB/]
 +
 +
====Unifi Network Application====
 +
 +
Der Befehl startet den Container.
 +
 +
docker run -d  --name=unifi-network-application  -e PUID=1000  -e PGID=1000  -e TZ=Etc/UTC  -e MONGO_USER=unifimongouser  -e MONGO_PASS=XXXXXXX  -e MONGO_HOST=172.17.0.3  -e MONGO_PORT=27017  -e MONGO_DBNAME=unifiDB  -e MEM_LIMIT=1024  -e MEM_STARTUP=1024  -e MONGO_TLS=    -e MONGO_AUTHSOURCE=  -p 8443:8443  -p 3478:3478/udp  -p 10001:10001/udp  -p 8080:8080  -p 1900:1900/udp    -p 8843:8843  -p 8880:8880    -p 6789:6789  -p 5514:5514/udp    -v /path/to/data:/config  --restart unless-stopped  linuxserver/unifi-network-application:latest
 +
 +
Jetzt etwas Geduld. Ich war zu schnell und habe im Log nichtssehen koennen. Aber die UNA benoetigt ein wenig Zeit die MongoDB zu initialisieren. Dann hat auch der Zugriff ueber hhtps://HOSTIP:8443 geklappt.
 +
 +
Beim Einspielen des Backups hat es allerdings ewig gedauert, bis ich  mich entschlossen habe den Vorgang abzubrechen.
 +
 +
fhem:/opt # docker logs -f unifi-network-application
 +
[migrations] started
 +
[migrations] no migrations found
 +
───────────────────────────────────────
 +
 +
      ██╗    ███████╗██╗ ██████╗
 +
      ██║    ██╔════╝██║██╔═══██╗
 +
      ██║    ███████╗██║██║  ██║
 +
      ██║    ╚════██║██║██║  ██║
 +
      ███████╗███████║██║╚██████╔╝
 +
      ╚══════╝╚══════╝╚═╝ ╚═════╝
 +
 +
  Brought to you by linuxserver.io
 +
───────────────────────────────────────
 +
 +
To support LSIO projects visit:
 +
https://www.linuxserver.io/donate/
 +
 +
───────────────────────────────────────
 +
GID/UID
 +
───────────────────────────────────────
 +
 +
User UID:    1000
 +
User GID:    1000
 +
───────────────────────────────────────
 +
 +
*** Waiting for MONGO_HOST 172.17.0.3 to be reachable. ***
 +
Generating 4,096 bit RSA key pair and self-signed certificate (SHA384withRSA) with a validity of 3,650 days
 +
        for: CN=unifi
 +
[custom-init] No custom files found, skipping...
 +
[ls.io-init] done.
 +
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: destroy called
 +
Exception in thread "Thread-9" java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
 +
        at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:168)
 +
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1172)
 +
        at com.ubnt.service.Object.return(Unknown Source)
 +
        at com.ubnt.ace.Launcher.Ö00000(Unknown Source)
 +
        at java.base/java.lang.Thread.run(Thread.java:840)
 +
 +
Exception na toll:-((

Version vom 25. Dezember 2023, 12:09 Uhr

Allgemeines

Nachdem ich die Erstinstallation von meinen Ubiquiti-WLAN-Netzwerk (Secure Gateway, 4 APs und 1 Bridge) an einem Windows PC vorgenommen habe, empfinde ich es mittlerweile als laestig jedesmal wenn ich im Netzwerk etwas nachschauen moechte den Windowsrechner anzuschalten und den Unifi Network Server, mittlerweile in der Version 8.0.24, zu starten und mich im Browser einzuloggen.

Zu Anfang gleich was zur Begriffsverwirrung

Die "Kurzbezeichnung" der Managing Software (Streamlined Network Management) ist Network Server. Die Software wird oftmals als Unifi Controller benannt.

Im DockerHub ist folgender Eintrag zum unifi-controller zu finden.

From 2024-01-01 this image will be deprecated and it will no longer be updated. Please migrate to our Unifi Network Application image instead

Deprecation Note

Interessanterweise hat dieses (auslaufende) Image immer noch deutlich mehr Downloads als das Unifi Network Application Image. Ich benutze natuerlich hier das unifi-network-application Image.

Das Original findet man unter https://ui.com/download/releases/network-server.

Unifi OS

Ganz aktuell ist es seit Version 8 (20.11.2023 V8.0.7) auch moeglich den Server auf UnifiOS-Maschinen (DreamMachine,...) laufen zu lassen. Das werde ich bei Gelegenheit testen. Noch habe ich keine entsprechende Hardware.

Installation auf meinen SmartHome (FHEM) Linux Server

Man benoetigt zum Betrieb eine MongoDB und die Network Application Software. Die MongoDB wird in den Versionen 3.6 bis 4.4 empfohlen. Abgesehen davon, dass alte Versionen oft bei der Installation zicken, ist sie auch in den Reposotories von openSuSE nicht vorhanden.

Da sowohl die MongoDB als auch der Unifi Network Application Server (UNAS) als DockerImage angeboten werden habe ich diesen Weg eingeschlagen, um den Anpassungproblemen der MongoDB Version und der Java Umgebung für den UNAS aus dem Weg zu gehen.


Da ich bisher noch nicht ernsthaft mit docker gearbeitet hatte, nutze ich gleich die Gelegenheit hier nuetzlich Erfahrungen zu sammeln.

Zu Beginn sind erst einmal nur Downloads zumachen. Zusaetzlich habe ich aber trotz des MongoDB-Docker-Image auch noch die MongoDB native auf dem Server installiert. https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-suse/

Die MongoDB Downloads von mongodb.org waren irgendwie unvollstaendig.

Download

Die MongoDb steht nicht im Linuxserver.io-Fleet (https://fleet.linuxserver.io/) wird aber per pull vom DockerHub geliefert.

docker pull linuxserver/unifi-network-application
docker pull mongo:4.4

Da der UNAS nicht ohne eine funktionierende MongoDB-Installation starten will, kommt sie zuerst dran.

Hier die Doku.

Erste Schritte

Docker Images

Mit

docker images

kann man sich ueber die vorhanden Images ein Bild machen. Dabei koennen ruhig mehrere Images mit gleichem Name, aber unterschiedlichen Versionen (TAG) vorliegen. Die ImageID macht sie eindeutig.

docker image ls 

hat die gleiche Wirkung. Mit

docker image help

lassen sich alle Kommandos sehen. Dabei sind erst einmal 2 von besonderem Nutzen.

docker image rm <Image Name>

und

docker image prune

Aus den Images lassen sich jetzt Container erstellen.

Docker Container

MongoDB

Mit

docker run ...

kann man nun aus einem vorhandenen Image einen "laufenden" Container erzeugen, Wenn man will auch mehrere parallel. Neben den vielen Optionen die 'docker run' anbietet, empfehle ich '--name -it'.

Man kann zwar den (eigenen) Namen auch weglassen, dann wird er von docker automatisch per Zufall vergeben, wie z.B. flamboyant_rosalind ;-)

Die beiden Optionen

-i   --interactive                    Keep STDIN open even if not attached
-t   --tty                            Allocate a pseudo-TTY

erlauben es aehnlich wie per ssh auf die bash-console des laufenden Containers zu verbinden. Das kann nuetzlich sein, um ein wenig umherzustoebern. Aenderungen an der Installation werden dardurch zwar moeglich aber mangels oft nicht installierter Editoren erschwert und zudem wird eine derartige Anpassung auch nicht empfohlen.

Mit

docker run (-itd) (--name MeineMongoDB) mongo:4.4

kann man nun der Container beim ersten mal starten, da er run auch gleichzeitig erzeugt wird. Der Conteiner laesst sich dann spaeter, nach der Erzeugung, mit

docker container start/stop/restart/stats/.... <name>

bedienen.

Wenn der MongoContainer gestartet wurde, sollte standardmaessig auf Port 27017 eine Kontaktaufnahme gelingen.

Nachdem ich den UnifiDB auf Mongo laufen hatte war dadurch der Standard-Port 27017 belegt. Weitere Test ohne den Port anzupassen waren damit bei laufendem UNAS nicht (mehr) moeglich. Also brauchte wenigstens eine weitere Option naemlich -p:

-p=[]      : Publish a container's port or a range of ports to the host
              format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
              Both hostPort and containerPort can be specified as a
              range of ports. When specifying ranges for both, the
              number of container ports in the range must match the
              number of host ports in the range, for example:
                  -p 1234-1236:1234-1236/tcp
              When specifying a range for hostPort only, the
              containerPort must not be a range.  In this case the
              container port is published somewhere within the
              specified hostPort range. (e.g., `-p 1234-1236:1234/tcp`)
              (use 'docker port' to see the actual mapping)  

Da ich noch keine Moeglichkeit gefunden habe, wie ich nachtraeglich (nach docker run) das Portmapping veraendern kann, loesche ich kurzerhand den Container und erzeuge ihn neu.

docker run -itd -p 27018:27017 --name mongotestdb mongo:4.4

Nun kommt mongo (MongoDB shell version v4.4.26) auf dem Hostsystem zum Einsatz. Mit

mongo IP:PORT/DBNAME

kann man jetzt die Kontaktaufnahme testen. Vorher brauche ich aber noch die IP des Containers.

docker container inspect mongotestdb

Unter dem Abschnitt "NetworkSettings" finde folgendes.

      "NetworkSettings": {
           "Bridge": "",
           "SandboxID": "9687d7931fab057018a021244845ece6888ba95341a8daba6fcc361af644bb8f",
           "HairpinMode": false,
           "LinkLocalIPv6Address": "",
           "LinkLocalIPv6PrefixLen": 0,
           "Ports": {
               "27017/tcp": [
                   {
                       "HostIp": "0.0.0.0",
                       "HostPort": "27018"
                   },
                   {
                       "HostIp": "::",
                       "HostPort": "27018"
                   }
               ]
           },
           "SandboxKey": "/var/run/docker/netns/9687d7931fab",
           "SecondaryIPAddresses": null,
           "SecondaryIPv6Addresses": null,
           "EndpointID": "5f95ee4da8a744a6c4228d97d6daec11675f6a8a3c653ff23200c6f5980e7d75",
           "Gateway": "172.17.0.1",
           "GlobalIPv6Address": "",
           "GlobalIPv6PrefixLen": 0,
           "IPAddress": "172.17.0.4",
           "IPPrefixLen": 16,
           "IPv6Gateway": "",
           "MacAddress": "02:42:ac:11:00:04",
           "Networks": {
               "bridge": {
                   "IPAMConfig": null,
                   "Links": null,
                   "Aliases": null,
                   "NetworkID": "fcd1687abcf1e061b8f56fc14c63d103cc76f5dbd4c8584e6d8f1ff50582ac5a",
                   "EndpointID": "5f95ee4da8a744a6c4228d97d6daec11675f6a8a3c653ff23200c6f5980e7d75",
                   "Gateway": "172.17.0.1",
                   "IPAddress": "172.17.0.4",
                   "IPPrefixLen": 16,
                   "IPv6Gateway": "",
                   "GlobalIPv6Address": "",
                   "GlobalIPv6PrefixLen": 0,
                   "MacAddress": "02:42:ac:11:00:04",
                   "DriverOpts": null
               }
           }
       }

Also probiere ich

mongo 172.17.0.4:27018

und scheitere. Obwohl ich den internen Port (Container) auf den externen Port (Host) umgelenkt habe klappt die Kontaktaufnahme nicht. Erst mit

mongo 172.17.0.4:27017

klappt es. Komisch. Die Portumlenkung scheint sich nur auf den Host zu beziehen, nicht auf die Bridge.

MongoDB shell version v4.4.26 connecting to: mongodb://172.17.0.4:27017/test?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("ab1224d3-543b-46bc-a7d1-8824bc288512") } MongoDB server version: 4.4.26 --- The server generated these startup warnings when booting:

       2023-12-25T08:56:12.469+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
       2023-12-25T08:56:14.368+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
       2023-12-25T08:56:14.368+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'

--- > show dbs admin 0.000GB config 0.000GB local 0.000GB > db.getSiblingDB("MONGO_DBNAME").createUser({user: "MONGO_USER", pwd: "MONGO_PASS", roles: [{role: "dbOwner", db: "MONGO_DBNAME"}]}); Successfully added user: {

       "user" : "MONGO_USER",
       "roles" : [
               {
                       "role" : "dbOwner",
                       "db" : "MONGO_DBNAME"
               }
       ]

}

Noch den zweiten Befehl hinterher.

db.getSiblingDB("MONGO_DBNAME_stat").createUser({user: "MONGO_USER", pwd: "MONGO_PASS", roles: [{role: "dbOwner", db: "MONGO_DBNAME_stat"}]});

und schon sind die Vorbereitungen der MongoDB abgeschlossen.

Der Weg ueber mongosh und docker exec waere wohl auch gegangen. [1]

Unifi Network Application

Der Befehl startet den Container.

docker run -d   --name=unifi-network-application   -e PUID=1000   -e PGID=1000   -e TZ=Etc/UTC   -e MONGO_USER=unifimongouser   -e MONGO_PASS=XXXXXXX   -e MONGO_HOST=172.17.0.3   -e MONGO_PORT=27017   -e MONGO_DBNAME=unifiDB   -e MEM_LIMIT=1024   -e MEM_STARTUP=1024   -e MONGO_TLS=    -e MONGO_AUTHSOURCE=   -p 8443:8443   -p 3478:3478/udp   -p 10001:10001/udp   -p 8080:8080   -p 1900:1900/udp    -p 8843:8843   -p 8880:8880    -p 6789:6789   -p 5514:5514/udp    -v /path/to/data:/config   --restart unless-stopped  linuxserver/unifi-network-application:latest

Jetzt etwas Geduld. Ich war zu schnell und habe im Log nichtssehen koennen. Aber die UNA benoetigt ein wenig Zeit die MongoDB zu initialisieren. Dann hat auch der Zugriff ueber hhtps://HOSTIP:8443 geklappt.

Beim Einspielen des Backups hat es allerdings ewig gedauert, bis ich mich entschlossen habe den Vorgang abzubrechen.

fhem:/opt # docker logs -f unifi-network-application

[migrations] started [migrations] no migrations found ───────────────────────────────────────

     ██╗     ███████╗██╗ ██████╗ 
     ██║     ██╔════╝██║██╔═══██╗
     ██║     ███████╗██║██║   ██║
     ██║     ╚════██║██║██║   ██║
     ███████╗███████║██║╚██████╔╝
     ╚══════╝╚══════╝╚═╝ ╚═════╝ 
  Brought to you by linuxserver.io

───────────────────────────────────────

To support LSIO projects visit: https://www.linuxserver.io/donate/

─────────────────────────────────────── GID/UID ───────────────────────────────────────

User UID: 1000 User GID: 1000 ───────────────────────────────────────

      • Waiting for MONGO_HOST 172.17.0.3 to be reachable. ***

Generating 4,096 bit RSA key pair and self-signed certificate (SHA384withRSA) with a validity of 3,650 days

       for: CN=unifi

[custom-init] No custom files found, skipping... [ls.io-init] done. org.tuckey.web.filters.urlrewrite.UrlRewriteFilter INFO: destroy called Exception in thread "Thread-9" java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

       at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:168)
       at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1172)
       at com.ubnt.service.Object.return(Unknown Source)
       at com.ubnt.ace.Launcher.Ö00000(Unknown Source)
       at java.base/java.lang.Thread.run(Thread.java:840)

Exception na toll:-((