UniFi Controller – self hosted – od podstaw

Lokalny kontroler UniFi – pełna kontrola nad Twoją siecią

UniFi to jedno z tych rozwiązań, które szybko zdobywa zaufanie administratorów sieci – szczególnie tam, gdzie liczy się kontrola nad danymi, bezpieczeństwo i prostota zarządzania. Kluczową zaletą tego ekosystemu jest możliwość uruchomienia kontrolera lokalnie, we własnej infrastrukturze, bez wysyłania informacji o sieci do zewnętrznych chmur czy zagranicznych serwerów. Dzięki temu zachowujemy pełną suwerenność nad konfiguracją, ruchem i logami naszej sieci, co ma ogromne znaczenie zwłaszcza w środowiskach firmowych i infrastrukturalnych.

W materiale pokazany został praktyczny sposób uruchomienia UniFi na serwerze z Debianem przy użyciu Dockera i Docker Compose. Kontroler oparty jest o bazę MongoDB, a całość konfiguracji została sprowadzona do czytelnego pliku docker-compose.yml, co pozwala szybko postawić, odtworzyć lub przenieść środowisko w inne miejsce. Dzięki temu nawet awaria serwera nie oznacza utraty sieci – wystarczy backup i kilka minut, aby wszystko przywrócić do działania.

Dużo uwagi poświęcono portom i bezpieczeństwu. Okazuje się, że do poprawnego działania infrastruktury nie trzeba wystawiać „wszystkiego na świat” – w praktyce wystarczą tylko dwa kluczowe porty: jeden do zarządzania panelem administracyjnym i drugi do komunikacji urządzeń z kontrolerem. Reszta to funkcje opcjonalne, które warto świadomie włączać tylko wtedy, gdy są naprawdę potrzebne.

Bardzo ciekawym elementem jest sposób adopcji urządzeń. Access pointy UniFi mogą automatycznie odnajdywać kontroler w tej samej sieci, można je również dodać ręcznie przez SSH, a najbardziej eleganckim rozwiązaniem jest wykorzystanie lokalnego DNS-a. Wystarczy, że router będzie rozwiązywał nazwę unifi na adres IP kontrolera – wtedy każde nowe urządzenie podłączone do prądu samo zgłosi się do adopcji, bez klikania, aplikacji i ręcznej konfiguracji.

Po dodaniu pierwszego access pointa tworzona jest sieć Wi-Fi, która automatycznie rozgłasza się na wszystkich kolejnych urządzeniach. UniFi pokazuje pełną topologię sieci, podłączonych klientów, zużycie pasma i umożliwia zarządzanie każdym elementem z jednego panelu. Co ważne – z poziomu kontrolera można nawet uzyskać dostęp do konsoli urządzeń i wykonywać na nich operacje diagnostyczne, co pokazuje jak dużą władzę ma administrator nad infrastrukturą.

Na końcu backupy – jeden z najważniejszych elementów całego systemu. UniFi potrafi wykonywać automatyczne kopie zapasowe konfiguracji, statystyk i bazy danych, a wszystkie kluczowe pliki znajdują się w jasno określonych katalogach. Dzięki temu łatwo zabezpieczyć je dodatkowym backupem i mieć pewność, że w razie awarii sieć da się szybko odtworzyć w innym miejscu.

To wszystko sprawia, że UniFi jest rozwiązaniem, które łączy w sobie prostotę, dużą funkcjonalność i realną kontrolę nad bezpieczeństwem danych – bez kompromisów i bez oddawania kluczowej infrastruktury w cudze ręce.

Project GitHub Link  https://github.com/linuxserver/docker-unifi-network-application

Plik konfiguracyjny docker compose

docker-compose.yaml:

				
					---
services:

  unifi-db:
    image: mongo:${MONGO_TAG_VERSION}
    container_name: unifi-db
    env_file: .env
    volumes:
      - ./mongodb:/data/db
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh:ro
    restart: unless-stopped

  unifi-network-application:
    image: linuxserver/unifi-network-application:${UNIFI_TAG_VERSION}
    container_name: unifi-app
    env_file: .env
    volumes:
      - ./config:/config
    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 

				
			

Plik ze zmiennymi (koniecznie dostosuj hasła) .env

				
					PGID=1000
TZ=Etc/UTC
MONGO_USER=unifi
MONGO_PASS=unifi-pass
MONGO_HOST=unifi-db
MONGO_PORT=27017
MONGO_DBNAME=unifi
MONGO_AUTHSOURCE=admin
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root-pass
MEM_LIMIT=1024
MEM_STARTUP=1024
MONGO_TLS=24 #optional
MONGO_TLS= #optional
MONGO_TAG_VERSION=8.0-noble
UNIFI_TAG_VERSION=10.0.162-ls111 

				
			

Skrypt inicjujący bazę danych MongoDB dla aplikacji

init-mongo.sh

				
					#!/bin/bash

if which mongosh > /dev/null 2>&1; then
  mongo_init_bin='mongosh'
else
  mongo_init_bin='mongo'
fi
"${mongo_init_bin}" <<EOF
use ${MONGO_AUTHSOURCE}
db.auth("${MONGO_INITDB_ROOT_USERNAME}", "${MONGO_INITDB_ROOT_PASSWORD}")
db.createUser({
  user: "${MONGO_USER}",
  pwd: "${MONGO_PASS}",
  roles: [
    { db: "${MONGO_DBNAME}", role: "dbOwner" },
    { db: "${MONGO_DBNAME}_stat", role: "dbOwner" },
    { db: "${MONGO_DBNAME}_audit", role: "dbOwner" }
  ]
})
EOF 

				
			

Skrypt inicjujący bazę danych MongoDB dla aplikacji

init-mongo.sh

				
					arp -a | grep 6a:ec:48 
				
			

Logowanie do urządzenia

				
					ssh ubnt@$AP-IP
pass: ubnt 

				
			

Przekierwoanie urządzenia dl naszego kontrolera

				
					set-inform http://$address:8080/inform 
				
			

Resetowanie urządzenia z CLI

				
					syswrapper.sh restore-default 
				
			

Struktura katalogów

unifi/

├─┬─ config – application

│ ├─┬ data – unifi data 

│ │ └─┬ backup

│ │   └─ autobackup – unify backup

│ └── logs – unifi logs

├── mongodb – database folder

├── .env – variables of the entire installation

├── docker-compose.yaml – ddocker compose configuration

└── init-mongo.sh – mongodb initial script