UniFi Controller на Rasberry PI

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

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

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

Далее обновляем репозитарий и систему
sudo apt-get update && sudo apt-get install raspberrypi* raspi-config

sudo raspi-config
Expand Filesystem
Advanced Options > Memory split As we're running headless, 4MB

ssh-keygen (I hit enter for all three options to accept defaults and no passphrase)
sudo service ssh start (to start sshd)
sudo update-rc.d ssh defaults (to run the ssh server on startup by default)

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' и сообщит о том, что сделала.