Cloud Keyはもう不要:UniFi Network ApplicationをDockerでホストする方法

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

中央集権管理に潜むコスト

UbiquitiのUniFi製品はHomeLab愛好家に人気がありますが、一つ注意点があります。一般的な家庭用ルーターとは異なり、アクセスポイント(AP)のIPアドレスにログインしてSSIDを変更するといったことはできません。これらのデバイスには、司令塔となる「UniFi Network Application」が必要です。長年、Ubiquitiはユーザーに対し、200ドルもする専用ドングル「Cloud Key」の購入や、自社のクラウドホスト型ポータルの利用を推奨してきました。

Cloud Keyを購入すると、ラックの消費電力がさらに13W増えるだけでなく、単一障害点(SPOF)にもなり得ます。これらのユニットは、内蔵バッテリーの膨張やmicroSDカードの破損が起こりやすいことで知られています。また、クラウドに依存するのも得策ではありません。遅延が発生するだけでなく、プライベートなネットワーク構成をサードパーティのサーバーに渡すことになります。インターネットが切断されると、HomeLabの監視や管理ができなくなることも少なくありません。

ソフトウェアをハードウェアから切り離すことで、この問題は解決します。UniFiコントローラーをDockerコンテナに移行すれば、インフラの主導権を取り戻せます。コストを抑え、配線をスッキリさせ、データを自分のディスク内に安全に保管できるのです。

ホスティングオプションの比較

適切なホスティング方法の選択は、メンテナンスの手間と予算のバランスで決まります。プロフェッショナルなHomeLab資産管理において、効率はすべてです。Dockerは、コントロールのしやすさと使い勝手の良さを両立しているため、常に最適な選択肢となります。

方法 初期費用 メンテナンス データプライバシー
Cloud Key Gen2 Plus $199以上 ローカル
UI.com クラウドアカウント 無料 / 段階制 なし 外部
Windows/Mac アプリ ゼロ 高(PCを常時起動させる必要あり) ローカル
Docker コンテナ ゼロ 自動化 厳格なローカル管理

なぜDockerが優れた選択肢なのか

Dockerのメリットは、200ドルを節約できることだけではありません。ネットワークのライフサイクル管理そのものが変わります。例えば、Raspberry Piから高性能なNUCにアップグレードする場合でも, ネットワークを再設定する必要はありません。データボリュームを移動してイメージをプルするだけで完了します。

バージョン管理は救世主です。 Ubiquitiは時折、古いAPのアドプション(管理下への登録)ができなくなるようなアップデートをリリースすることがあります。Dockerなら、数秒で以前のイメージバージョンにロールバックできます。バックアップも同様に簡単です。すべての設定はマッピングされたフォルダに保存されているため、一つの tar コマンドやスケジュールされたスクリプトで、ネットワーク全体のステートをバックアップできます。

多少のハードルもあります。ポートマッピングの管理やデータベースのセットアップが必要です。最新のUniFi(バージョン7.5以降)にはデータベースが同梱されていないため、動作には別途MongoDBインスタンスが必要になります。

モダンなスタック:UniFi + MongoDB 7.0

最も安定したアーキテクチャは、docker-compose を使用してUniFiアプリケーションとMongoDBを連携させる方法です。私は **LinuxServer.io** のイメージを推奨します。これらは頻繁に更新されており、ファイル権限の扱いが非常にスムーズです。

導入ガイド

1. ファイルの整理

まずは、クリーンなディレクトリ構造を作成することから始めましょう。これにより、ホストシステム内に設定ファイルが散らばるのを防ぎます。

mkdir -p ~/unifi-stack/config
mkdir -p ~/unifi-stack/db
cd ~/unifi-stack

2. Docker Composeの設定

docker-compose.yml ファイルを作成します。このスクリプトは環境を定義し、L2デバイスの検出や管理インターフェースに必要な特定のポートを開放します。

version: "3.8"
services:
  unifi-db:
    image: mongo:7.0
    container_name: unifi-db
    volumes:
      - ./db:/data/db
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
    restart: unless-stopped

  unifi-network-application:
    image: lscr.io/linuxserver/unifi-network-application:latest
    container_name: unifi-network-application
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - MONGO_USER=unifi
      - MONGO_PASS=unifi-password
      - MONGO_HOST=unifi-db
      - MONGO_PORT=27017
      - MONGO_DBNAME=unifi
      - MEM_LIMIT=1024
    volumes:
      - ./config:/config
    ports:
      - 8443:8443 # Webインターフェース
      - 3478:3478/udp # STUN
      - 10001:10001/udp # デバイス検出
      - 8080:8080 # デバイス情報通知
    restart: unless-stopped
    depends_on:
      - unifi-db

3. データベースセットアップの自動化

UniFiには特定のデータベースユーザーが必要です。初回起動時にこれを自動的に処理するため、フォルダ内に init-mongo.js を作成します:

db.getSiblingDB('unifi').createUser({
  user: 'unifi',
  pwd: 'unifi-password',
  roles: [{ role: 'dbOwner', db: 'unifi' }, { role: 'dbOwner', db: 'unifi_stat' }]
});

4. スタックのデプロイ

コンテナをバックグラウンド(デタッチモード)で起動します:

docker-compose up -d

Javaベースのアプリケーションは起動に時間がかかるため、しばらくお待ちください。通常、Webサーバーが応答するまで120秒ほどかかります。docker logs -f unifi-network-application を実行して、進捗を確認できます。

デバイスのアドプション(管理下への登録)

https://<your-ip>:8443 にアクセスします。SSL警告が表示される自己署名証明書を使用している場合は正常な動作です。もしAPがすぐに表示されない場合は、手動で通知先を指定する必要があります。APにSSHでログインし(デフォルトのログイン情報は ubnt/ubnt)、新しいコントローラーの場所を手動で設定します:

set-inform http://<your-server-ip>:8080/inform

メンテナンスのヒント

メモリ管理は非常に重要です。3台程度のAPがある一般的な家庭では、1GBのRAMが最適です。UIの動作が重いと感じる場合は、MEM_LIMIT を2048に増やしてください。また、セットアップウィザードでは「Switch to Local User(ローカルユーザーに切り替える)」オプションを選択することを忘れないでください。これにより、UI.comアカウントが不要になり、インターネットが不通になってもネットワーク管理が可能になります。

Share: