Ubiquiti UniFi は別途コントローラーを用意する必要があります。コントローラーには UniFi OS Cloud Gateway が推奨されていますが、手間を掛ければ Ubuntu / Debian / Windows / macOS に無償配布されている UniFi Network Application をインストールして、Self-Hosted環境を構築することもできます。Ubuntu / Debian はx86_64のみがサポートされていますが、この記事ではARMである Raspberry Pi 4 Model B に構築する方法を紹介します。
システム要件
システム要件は UniFi Network - Self-Hosting your UniFi Network Without a Console (Advanced) – Ubiquiti Support and Help Center に記載されています。
- Ubuntu Desktop / Server 16.04; Debian 9 "Stretch"
- CPU: x86-64 Processor (Intel / AMD x64 Processors)
- RAM: 2GB
- Network: 100Mbps Wired Ethernet
- HDD: Minimum 10GB free (20GB or more preferred)
- Java: Java Runtime Environment (JRE) 8
- MongoDB: version 3.2 or later
私の Raspberry Pi 4 Model B はメモリー8GBで、Ubuntu 20.04 がインストールされているので、CPUアーキテクチャ以外は要件を満たした状態です。私は未確認ですが、Raspberry Pi OS (Raspbian) でも動作するようです。
インストール
APTの依存パッケージ解決に任せるとopenjdk-17-jre-headlessがインストールされてしまいますが、UniFi Network Application は JRE 8 である必要があります。そのため、事前に JRE 8 と関連パッケージだけインストールしておきます。
tats@fox:~$ sudo apt install openjdk-8-jre-headless jsvc libcommons-daemon-java
UbiquitiはAPTリポジトリも提供していますが、x86_64しか対応していません。そのため、ARMであるラズパイの場合は手動でインストールおよびアップデートを行う必要があります。UniFi Network Application (unifi_sysvinit_all.deb) の最新バージョンのURLは Ubiquiti - Downloads を参考にすると良いでしょう。また、apt install -f
によってMongoDBなどの依存パッケージがインストールされます。
tats@fox:~$ curl -O https://dl.ui.com/unifi/7.1.66/unifi_sysvinit_all.deb tats@fox:~$ sudo dpkg -i unifi_sysvinit_all.deb tats@fox:~$ sudo apt install -f
UniFi Network Application が動作していることを確認しましょう。
tats@fox:~$ systemctl status unifi ● unifi.service - unifi Loaded: loaded (/lib/systemd/system/unifi.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-06-22 11:07:32 JST; 1 weeks 1 days ago Main PID: 1100 (jsvc) Tasks: 122 (limit: 4435) CGroup: /system.slice/unifi.service
https://
にアクセスするとSSL証明書の警告が出るものの、これで Unifi Network Application にアクセスできます。
SSL証明書の設定
SSL証明書の警告を消すためにSSL証明書を設定します。この記事ではSSL証明書の取得方法は省きますが、Let’s Encrypt のSSL証明書を使っています。
UniFi Linux Utils のunifi_ssl_import.shをダウロードします。
tats@fox:~$ curl -O https://raw.githubusercontent.com/stevejenkins/unifi-linux-utils/master/unifi_ssl_import.sh
unifi_ssl_import.sh内の変数を設定します。UNIFI_HOSTNAME
は Raspberry Pi のホスト名ですが、私の環境ではワイルドカード証明書を使っているため、ドメイン名を設定しています。何を設定すれば良いのか分からないときは66行目を参照すると分かってくるでしょう。また、UNIFI_DIR
, JAVA_DIR
, KEYSTORE
もUbuntuの用の値に変更します。
unifi_ssl_import.sh
UNIFI_HOSTNAME=rewse.jp UNIFI_DIR=/var/lib/unifi JAVA_DIR=/usr/lib/unifi KEYSTORE=${UNIFI_DIR}/keystore
unifi_ssl_import.shを実行すると、UniFiのKeystoreにファイルがインポートされます。
tats@fox:~$ sudo chmod 755 unifi_ssl_import.sh tats@fox:~$ sudo ./unifi_ssl_import.sh Starting UniFi Controller SSL Import... Running in Standard Mode... Importing the following files: Private Key: /etc/letsencrypt/live/rewse.jp/privkey.pem CA File: /etc/letsencrypt/live/rewse.jp/chain.pem Stopping UniFi Controller... Backup of original keystore exists! Creating non-destructive backup as keystore.bak... Exporting SSL certificate and key data into temporary PKCS12 file... Removing previous certificate data from UniFi keystore... Importing SSL certificate into UniFi keystore... Importing keystore /tmp/tmp.ePaAJOSchq to /var/lib/unifi/keystore... Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /var/lib/unifi/keystore -destkeystore /var/lib/unifi/keystore -deststoretype pkcs12". Removing temporary files... Restarting UniFi Controller to apply new Let's Encrypt SSL certificate... Done!
https://<hostname_of_raspberrypi>:8443/
にアクセスするとSSL証明書の警告が出なくなっているはずです。
SSL証明書の自動更新設定
certbotなどでSSL証明書は自動更新されるでしょうが、このままではUniFiのKeystore内のファイルは更新されません。そのため、Cronで自動更新するようにしておきましょう。
tats@fox:~$ sudo cp unifi_ssl_import.sh /usr/local/sbin
/etc/cron.monthly/update-unifi-ssl
#!/bin/sh /usr/local/sbin/unifi_ssl_import.sh
ポート番号の変更
HTTPSのデフォルトポート番号443でアクセスしたい場合は、Apacheでプロキシを構成します。
/etc/apache2/sites-available/unifi.rewse.jp.conf
<VirtualHost *:443> ServerAdmin hostmaster@<hostname_of_raspberrypi> ServerName <hostname_of_raspberrypi> ProxyPreserveHost on ProxyRequests off SSLProxyEngine on ProxyPass / https://<hostname_of_raspberrypi>
:8443/ ProxyPassReverse / https://<hostname_of_raspberrypi>
:8443/ RewriteEngine on RewriteRule /(.*) https://<hostname_of_raspberrypi>:8443/$1 [P,L] SSLCertificateFile /etc/letsencrypt/live/rewse.jp/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/rewse.jp/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost>
tats@fox:~$ sudo a2ensite unifi.rewse.jp
これで https://
でアクセスできるようになりました。<hostname_of_raspberrypi>
/