- PVSM.RU - https://www.pvsm.ru -

UniFi Controller на Rasberry PI

Тестировалось на версиях UniFi v3.5.7 и v4.2.0.
Комплекс включает в себя Wi-Fi точки доступа UniFi и программный контроллер, который устанавливается на любой компьютер с операционной системой Windows, Mac OS или Linux. Программный контроллер является бесплатным, поэтому стоимость системы UniFi значительно ниже, чем аппаратные контроллеры других производителей. Это позволяет существенно снизить затраты на построение беспроводной сети.

Скачиваем образ RASPBIAN по ссылке downloads.raspberrypi.org/raspbian_latest [1]
Записываем образ на SD карточку с помощью Win32DiskImager или imageUSB

Подключеаем Rasberry PI

Устанавливаем подключение SSH
Логин pi
Пароль raspberry

Далее обновляем репозитарий и систему

sudo apt-get update && sudo apt-get install raspberrypi* raspi-config
sudo raspi-config
reboot 

Добавляем пользователя

sudo adduser unifi

Устанавливаем MC коммандер

sudo apt-get install mc

Устанавливаем Oracle Java 7 JDK

sudo apt-get install oracle-java7-jdk

Устанавливаем Mongodb

sudo mkdir /opt/mongodb
cd /opt/mongodb
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/bsondump?raw=true -O bsondump
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/mongo?raw=true -O mongo
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/mongod?raw=true -O mongod
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/mongodump?raw=true -O mongodump
sudo chmod +x *

Скачиваем UniFi

cd /home/pi/ 
sudo wget http://www.ubnt.com/downloads/unifi/3.2.7/UniFi.unix.zip

или

sudo wget http://www.ubnt.com/downloads/unifi/4.2.0/UniFi.unix.zip

Устанавливаем контроллер UniFi

sudo unzip UniFi.unix.zip
sudo mv UniFi /opt/UniFi
cd /opt/UniFi/bin
sudo ln -fs /opt/mongodb/mongod mongod

Создаем файл /etc/init.d/unifi

для версии 4.2.0

#!/bin/sh
### BEGIN INIT INFO
# Provides: unifi
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts the UniFi admin interface
# Description: Starts the UniFi admin interface.
### END INIT INFO

DAEMON=/usr/bin/java
DAEMON_ARGS="-jar /opt/UniFi/lib/ace.jar start"

start() {
    echo "Starting unifi"
    start-stop-daemon -b -o -c unifi -S -u unifi -x $DAEMON -- $DAEMON_ARGS
}

stop() {
    dbpid=`pgrep -fu unifi $DAEMON`
    if [ ! -z "$dbpid" ]; then
        echo "Stopping unifi"
        start-stop-daemon -o -c unifi -K -u unifi -x $DAEMON -- $DAEMON_ARGS
    fi
}

status() {
    dbpid=`pgrep -fu unifi $DAEMON`
    if [ -z "$dbpid" ]; then
        echo "unifi: not running."
    else
        echo "unifi: running (pid $dbpid)"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload|force-reload)
        stop
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: /etc/init.d/unifi {start|stop|reload|force-reload|restart|status}"
        exit 1
esac

exit 0

для версии 3.5.7

#!/bin/bash
# chkconfig: 2345 95 20
# description: UniFi system
# processname: UniFi

ctrl_start()
{
sudo java -jar /opt/UniFi/lib/ace.jar start &
}

ctrl_stop()
{
sudo java -jar /opt/UniFi/lib/ace.jar stop &
}

ctrl_restart()
{
ctrl_stop
sleep 1
ctrl_start
}

case "$1" in

start)

echo -n "starting UniFi system"
ctrl_start
echo " service started"
;;

stop)

echo -n "stopping UniFi system"
ctrl_stop
echo " service stopped"
;;

restart)

echo -n "restarting UniFi system"
ctrl_restart
echo "service restarted"
;;

*)

echo "usage: service UniFi {start|stop|restart}"
;;

esac
exit 0

Копируем для автоматической загрузки

sudo cp unifi /etc/init.d
sudo chmod +x /etc/init.d/unifi

Устанавливаем права

cd /opt/UniFi
sudo mkdir work && sudo mkdir data && sudo mkdir logs 
sudo chown -R unifi work data logs

Создаем еще один файл /etc/logrotate.d/unifi

/opt/UniFi/logs/*.log {
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        copytruncate
}

Вписаваем его в систему

sudo cp unifi /etc/logrotate.d
sudo chmod +x /etc/logrotate.d/unifi

Добавляем в загрузку

sudo update-rc.d unifi defaults

Запускаем

sudo java -jar /opt/UniFi/lib/ace.jar start &
sudo java -jar /opt/UniFi/lib/ace.jar stop &

Основные комманды

sudo service unifi start
sudo service unifi stop

Смотрим как работает

top

Перезагружаем

reboot

Дополнительно

EIRP = (transmit power + antenna gain — cable loss) There isn't a cable loss in the UAP or UAP-LR as they're internal cards, same with all but the UAP-Outdoor, UAP-Outdoor5, or UAP-Outdoor+ because you can use different cables to connect to the antenna.

Examples:

UAP-LR — (27dBm + 3dBi) = 30dBm EIRP
UAP — (20dBm + 3dBi) = 23dBm EIRP

По умолчанию контроллер UniFi использует следующие порты:

unifi.shutdown.port=8081 (для управления)
unifi.http.port=8080 (порт для UAP для информирования контроллера)
unifi.https.port=8443 (порт для GUI / API контроллера, как в браузере)
portal.http.port=8880 (порт для HTTP перенаправления)
portal.https.port=8843 (порт для HTTPS перенаправления)
unifi.db.port=27117 (локальный порт для сервера БД)

Так как база бастро распухает есть решение

purgebd.js

   // keep N-day worth of data
   days=30;
   dryrun=true;

   use ace;
   collectionNames = db.getCollectionNames();
   for (i=0; i < collectionNames.length; i++) {
            name = collectionNames[i];
            query = null;
            if (name.indexOf('stat')==0 || name.indexOf('event')==0 || name.indexOf('alarm')==0) {
                query = {time: {$lt:new Date().getTime()-days*86400*1000}};
            }
            if (name.indexOf('session')==0) {
                query = {assoc_time: {$lt:new Date().getTime()/1000-days*86400}};
            }
            if (name.indexOf('user')==0) {
                query = {last_seen: {$lt:new Date().getTime()/1000-days*86400}};
            }
            if (query) {
                count = db.getCollection(name).find(query).count();
                print((dryrun ? "[dryrun] " : "") + "pruning " + count + " entries from " + name + "... ");
                if (!dryrun)
                 db.getCollection(name).remove(query);
            }
   }
   if (!dryrun) db.repairDatabase();

Убедитесь, что скрипт верный перед тем, как выполнить следующую команду:

sudo /opt/mongodb/mongo --port=27117 < purgebd.js

По умолчанию, MongoDB находится в режиме 'dryrun' и сообщит о том, что сделала.


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/pesochnitsa/73575

Ссылки в тексте:

[1] downloads.raspberrypi.org/raspbian_latest: http://downloads.raspberrypi.org/raspbian_latest