UniFi 控制器

来自 Alpine Linux
此材料已被提议删除...

由于以下警告 ⬇️,控制器图像文件不可用(以下链接已失效多年),并且 Alpine Linux 3.9 的支持级别为“无”,因此没有理由再保留这篇文章。(讨论
在删除之前,请确保没有其他页面链接到这里,并检查页面的历史记录

警告: Ubiquiti Unifi 控制器 Linux 自包含 Java 镜像依赖于 MongoDB,而 MongoDB 由于 SPL 许可变更已从 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