UniFi 控制器
|  由于以下警告 ⬇️,控制器图像文件不可用(以下链接已失效多年),并且 Alpine Linux 3.9 的支持级别为“无”,因此没有理由再保留这篇文章。(讨论) | 

简介
本指南介绍了如何安装通用的 Unix UniFi 控制器,可从 Ubiquiti Networks 获取。 在撰写本文时,尚无可用的原生 Alpine Linux 软件包。
此外,本指南使用极其可靠和高效的 s6 监控套件来启动和控制 UniFi 控制器。
以下是将在文件系统上安装内容的概要示意图。
选择 /srv 作为 UniFi 控制器的根目录是基于它包含运行时和配置数据的事实,因此安装到 /usr/local、/opt 或 /home 似乎不合适。 请随意调整以下步骤,将 /srv/unifi 替换为您希望安装 UniFi 控制器软件的任何位置。
/
`--etc
   |-- unifi
   |   `-- log
   |-- srv
   |   `-- unifi
   |       |-- bin
   |       |-- conf
   |       |-- data
   |       |-- dl
   |       |-- lib
   |       |-- logs
   |       |-- run
   |       `-- webapps
   |-- run
   |   `-- openrc
   |          `-- s6-scan
   |              `-- unifi --> /etc/unifi
    `-- var
        `-- log
            `-- unifi
先决条件软件包
OpenJDK 8 JRE
从 community 仓库安装 openjdk8-jre。
编辑 /etc/apk/repositories 并取消注释适用于您的 Alpine 版本的 community 仓库
http://host.name/alpine_version/community
更新软件包缓存。
apk update
安装软件包。
apk add openjdk8-jre
MongoDB
安装 MongoDB
apk add mongodb
s6
安装 s6
apk add s6,这是一个服务监控套件,用于可靠和高效地启动、停止和保持服务运行。
下面显示了 UniFi 控制器如何通过 s6 启动和监控的示意性进程树。 控制器是用 Java 编写的,因此有 Java 进程,它反过来启动 MongoDB 的专用实例来存储其配置和运行时数据。
init
`-- s6-svscan
    `-- s6-supervise
        |-- s6-log
        `-- java
            `-- mongod
安装 UniFi 控制器
创建 unifi 用户和组。
adduser -D -H -h /srv/unifi unifi
切换到您希望在其中安装 UniFi 控制器的父文件夹。
cd /srv
下载您希望安装的 VERSION 的通用 unix 归档文件。
wget https://www.ubnt.com/downloads/unifi/VERSION/UniFi.unix.zip[死链]
解压归档文件。
unzip UniFi.unix.zip
重命名解压后的目录。
mv UniFi unifi
更改所有权。
chown -R unifi:unifi unifi
锁定权限。
chmod o-rwx unifi
进入 UniFi bin 目录。
cd /srv/unifi/bin
删除现有文件。
rm mongod
创建到 /usr/bin/mongod 的符号链接
ln -s /usr/bin/mongod
配置服务管理
创建 UniFi 服务目录和文件
为 UniFi 创建 s6 服务目录。
mkdir -p /etc/unifi/log
添加 run 脚本,使用您喜欢的编辑器。
vim /etc/unifi/run
复制并粘贴以下内容。
#!/bin/ash
user='unifi'
group='unifi'
exec 2>&1
base='/srv/unifi'
if [ -d $base ]; then
    cd $base
    chown -R $user:$group .
    version=`head -1 webapps/ROOT/app-unifi/.version`
    echo "Starting UniFi Controller $version"
    exec s6-setuidgid $user java -jar lib/ace.jar start
else
    echo "Missing $base ... aborting"
    touch down
fi
确保 run 脚本是可执行的
chmod 755 /etc/unifi/run
添加 log/run 脚本,使用您喜欢的编辑器。
vim /etc/unifi/log/run
复制并粘贴以下内容。
#!/bin/ash log_user='log' exec s6-setuidgid $log_user s6-log -b n20 s1000000 t /var/log/unifi
确保 log/run 脚本是可执行的
chmod 755 /etc/unifi/log/run
创建日志用户和目录
创建 log 用户和组。
adduser -D -H -h /var/log log
创建 /var/log/unifi 目录
mkdir -p /var/log/unifi
更新目录所有权。
chown log:log /var/log/unifi
锁定权限。
chmod 750 /var/log/unifi
创建 OpenRC 服务脚本
使用您喜欢的编辑器打开脚本文件。
vim /etc/init.d/unifi
粘贴以下内容。
#!/sbin/openrc-run
name="unifi"
supervisor=s6
s6_service_path="${RC_SVCDIR}/s6-scan/${name}"
depend() {
	need net s6-svscan
	after firewall
}
start_pre() {
        if [ ! -L "${RC_SVCDIR}/s6-scan/${name}" ]; then
	        ln -s "/etc/${name}" "${RC_SVCDIR}/s6-scan/${name}"
	fi
}
确保脚本是可执行的。
chmod 755 /etc/init.d/unifi
启动 UniFi 控制器服务
rc-service unifi start
配置 UniFi 控制器服务在启动时运行
rc-update add unifi boot
简单备份脚本
使用您喜欢的编辑器创建 /usr/local/bin/unifi-backup。
注意: 此脚本假定使用 s6-svc 来控制 unifi。 我会在稍后修改它,以改用 rc-service。
将以下内容粘贴到文件中。
#!/bin/ash
conf_dir='/etc/unifi'
backup_dir='/srv/backup/unifi'
service_dir='/run/openrc/s6-scan/unifi'
start_state='down'
if s6-svok $service_dir; then
    if s6-svstat -o up,ready $service_dir | grep -q true; then
        echo 'Stopping the UniFi Controller'
        start_state='up'
        s6-svc -d $service_dir
        sleep 3
    fi
else
    echo 'Warning: The UniFi Controller is not supervised'
    exit 1
fi
if s6-svstat -o up $service_dir | grep -q false; then
    echo 'Success: The UniFi Controller was stopped'
else
    echo 'Error: The UniFi Controller is still running'
    exit 1
fi
stamp=`date +%Y-%m-%d_%H%M%S`
mkdir -p $backup_dir
cd $backup_dir
mkdir "data-$stamp"
echo "Backing up to /srv/backup/unifi/data-$stamp.tar.gz"
if rsync -az /srv/unifi/data/ "data-$stamp"; then
    echo '* rsync succeeded'
    if tar czf "data-$stamp.tar.gz" "data-$stamp"; then
        echo '* tar succeeded'
        rm -rf "data-$stamp"
        echo 'Backup succeeded'
    else
        echo 'Backup failed: tar failed'
	exit 1
    fi
fi
if [ "$start_state" == 'up' ]; then
    echo 'Starting the UniFi Controller'
    s6-svc -u $service_dir
    sleep 5
    s6-svstat $service_dir
fi