管理画面で以下のメッセージが表示されている。
Client Push is not installed, this might lead to performance issues when using desktop clients.
クライアント プッシュがインストールされていないため、デスクトップ クライアントを使用するときにパフォーマンスの問題が発生する可能性があります。
この設定をしていないと、デスクトップクライアントは定期的(30秒~数分)にサーバーに確認に行くそうだ。
Geminiさんに聞いたところ、ETagという仕組みを使っているという。ファイルを更新すると、そのディレクトリのETagが更新され、親ディレクトリがずーっと更新され、ルートまで更新される。クライアントは変化があれば掘り下げてチェックしていく、ということだった。
ディレクトリがたくさんあると、それなりに大変なことになるのかなと。
ちなみに、外部サーバー(Samba)も設定しているのだけれど、ポーリングしないし、この設定を入れても通知はされないということだった。
Client Push
Client Pushとは何か。
nextcloud / notify_push
リポジトリの名前がちょっと違っているのだけれど、これだった。
説明によると、クライアントはサーバーの更新を頻繁に確認しに行かなければならないので、サーバーに負荷が掛かっている。
サーバーからクライアントに更新を伝えることで、この負荷を低減しようということだそうだ。
家庭内の利用なので利用者は少ないけれど、ファイルやフォルダの数が多いのでそれなりの効果が期待できるだろう。
だが、Dockerで利用している場合のことはあまり説明されておらず、導入はちょっと大変そうだった。
アプリのインストール
まず、アプリストアからClient Pushをインストールする。
アプリの有効化は画面でもできるし、コマンドで実行することもできる。
$ sudo docker exec -it -u www-data nextcloud bash --login
$ ./occ app:enable notify_push
これで警告は消えているんだけれど、クライアントプッシュが動作しているわけではない。
プッシュサーバーのインストール
現状
プッシュサーバーはバイナリーで提供されているようだ。
そして、それをサービスとして登録するように書かれている。
Docker composeで動作させているのだけれど、その設定のみ抜粋するとこのような形。
※詳細はこちら。
docker-compose.yml
...
nextcloud:
build: ./nextcloud
...
Dockerfile
FROM nextcloud:32.0.6-apache
USER root
RUN apt update && apt install -y smbclient libsmbclient-dev && pecl install smbclient && docker-php-ext-enable smbclient
RUN sed -Ei 's/(exec "\$@")/\/bin\/su -s \/bin\/bash -c "\/usr\/local\/bin\/turn-on.sh" www-data \&\n\1/' /entrypoint.sh
COPY ./script /usr/local/bin
...
Dockerfileでは、コンテナの中で必要なパッケージをインストールしたり、entrypoint.shにある最後の exec "$@" の前にturn-on.shというスクリプトを起動する行を追加している。
最新版のダウンロード
プッシュサーバーはバイナリー形式で、Githubでリリースされていた。
この日の最新版だった1.3.1をダウンロードし、コンテナの中で実行ができるように、実行権を付けた。
$ wget https://github.com/nextcloud/notify_push/releases/download/v1.3.1/notify_push-x86_64-unknown-linux-musl -P ./nextcloud/script
$ chmod +x nextcloud/script/notify_push-x86_64-unknown-linux-musl
ダウンロード先を -P オプションで指定している。
ここに入れておけば、先程のDockerfileでプッシュサーバーをコンテナの中にコピーしてくれる。
起動スクリプト
プッシュサーバーを起動するためのスクリプトを作成する。
今回は turn-on.sh という曖昧かつそれっぽい名前のスクリプトがあるので、そこで起動させてみることにする。
nextcloud/script/turn-on.sh
#!/bin/bash
/bin/sleep 30
/var/www/html/occ fulltextsearch:stop
/var/www/html/occ fulltextsearch:live --service &
PORT=7867 NEXTCLOUD_URL=http://nextcloud /usr/local/bin/notify_push-x86_64-unknown-linux-musl /var/www/html/config/config.php &
NEXTCLOUD_URL指定をしないと認証が失敗して通知が受け取れないので注意。
ここでは、コンテナに付けたサービスの名前を指定している。
なお、このプロセスの停止はDockerが上手いことやってくれるらしく、特に処理を入れる必要はなさそうだ。
コンテナの設定変更
コンテナを停止。
$ sudo docker compose stop
プッシュサーバーが利用するポートを開放。
docker-compose.yml
...
nextcloud:
...
ports:
- 8080:80
- 7867:7867
...
コンテナを構築して起動。
$ sudo docker compose up -d --build
中に入って確認してみたところ、UID:www-dataでプッシュサーバーが起動していた。
ホストの設定
ホスト側のポートを開放。
$ sudo ufw allow from any to any port 7867 proto tcp comment "Nextcloud Push Server"
リバースプロキシーの設定。
ウチはApacheで運営しているので、以下の設定。
/etc/apache2/sites-available/nextcloud.conf
...
<VirtualHost *:443>
...
# Notify push
ProxyPass /push/ws ws://127.0.0.1:7867/ws
ProxyPass /push/ http://127.0.0.1:7867/
ProxyPassReverse /push/ http://127.0.0.1:7867/
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
...
※ポート80へのアクセスは強制的に443に書き換えられ暗号化されるようになっているが、NextcloudとApacheの間は素で通す形になっている。
必要なモジュールを有効にして、Apacheを再起動。
$ sudo a2enmod proxy proxy_http proxy_wstunnel
$ sudo systemctl reload apache2
※ウチでは、proxy_wstunnelだけが有効になっていなかった。
アプリの有効化
早速、セットアップしてみた。
$ ./occ notify_push:setup https://<your domain>/push
✓ redis is configured
✓ push server is receiving redis messages
✓ push server can load mount info from database
✓ push server can connect to the Nextcloud server
🗴 push server is not a trusted proxy by Nextcloud or another proxy in the chain.
Nextcloud resolved the following client address for the test request: "172.18.0.1" instead of the expected "1.2.3.4" test value.
The following trusted proxies are currently configured: "<ホストのIPアドレス>"
The following x-forwarded-for header was received by Nextcloud: "1.2.3.4, 172.18.0.7"
from the following remote: 172.18.0.1
エラー発生。プロキシーとして有効なIPアドレスを設定する必要があるらしい。
現状の設定を確認してみたところ、1つIPアドレスが登録されていた。
$ ./occ config:system:get trusted_proxies
<ホストのIPアドレス>
プロキシーとして有効なものを指定しておいてくれといっているので、Dockerのネットワーク設定を見てみた。
k$ sudo docker network inspect work_nextcloud
...
"Status": {
"IPAM": {
"Subnets": {
"172.18.0.0/16": {
"IPsInUse": 9,
"DynamicIPsAvailable": 65527
},
...
※ネットワークについては特に設定をしていないのでこの方法で確認したが、ネットワークを指定していたらそれを見ればOK。
これを追加で指定してみる。
docker-compose.yml
...
nextcloud:
...
environment:
...
- TRUSTED_PROXIES=<ホストのIPアドレス> 172.18.0.0/16
...
コンテナを再起動。
$ sudo docker compose stop
$ sudo docker compose up -d
状態を確認してみる。
$ sudo docker exec -it -u www-data nextcloud bash --login
$ ./occ config:system:get trusted_proxies
<ホストのIPアドレス>
172.18.0.0/16
上手く追加されていたので、再度セットアップしてみる。
$ ./occ notify_push:setup https://<your domain>/push
✓ redis is configured
✓ push server is receiving redis messages
✓ push server can load mount info from database
✓ push server can connect to the Nextcloud server
✓ push server is a trusted proxy
✓ push server is running the same version as the app
configuration saved
正しく動作しているかどうか確認してみる。
$ ./occ notify_push:self-test
✓ redis is configured
✓ push server is receiving redis messages
✓ push server can load mount info from database
✓ push server can connect to the Nextcloud server
✓ push server is a trusted proxy
✓ push server is running the same version as the app
設定完了時と同じ結果が表示された。
動作確認
ログで確認
プッシュ通知を受け取れているのか確認するには、クライアントアプリでログを出力させる。
通知領域にあるNextcloudのアイコンを右クリックし、設定を開く。
→ 設定画面でF12キーを押して「ログ出力」ダイアログを開く。
→ 「一時フォルダーへのログ記録を有効にする」にチェックを入れる。
→ 「フォルダーを開く」ボタンを押して、フォルダを開いておく。
→ 「閉じる」ボタンを押す。
→ 設定画面を×ボタンで閉じる。
ここまで操作したら、通知領域にあるNextcloudのアイコンを右クリックして終了させる。
改めてNextcloudを起動し、ログフォルダを見る。
すると、20260405_0013_nextcloud.log.0.gz、20260405_0013_nextcloud.log.1.gz、…というログファイルが1分ごとにできあがる。
起動直後にできた0のファイルを開いて「pushnotifications」で検索して確認。
Authenticated successful on websocket というメッセージが表示されていれば、恐らく上手くいっている。
2026-04-05 00:13:27:966 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:46 ]: Setup push notifications
2026-04-05 00:13:27:966 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:59 ]: Close websocket for account QUrl("https://<your domain>")
2026-04-05 00:13:27:966 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:167 ]: Open connection to websocket on QUrl("wss://<your domain>/push/ws") for account QUrl("https://<your domain>")
2026-04-05 00:13:27:975 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:78 ]: Connected to websocket for account QUrl("https://<your domain>")
2026-04-05 00:13:28:089 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:103 ]: Received push notification: "authenticated"
2026-04-05 00:13:28:089 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:185 ]: Authenticated successful on websocket
...
2026-04-05 00:13:29:117 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:103 ]: Received push notification: "notify_file"
2026-04-05 00:13:29:117 [ info nextcloud.sync.pushnotifications C:<省略>\pushnotifications.cpp:201 ]: Files push notification arrived
最初は認証エラーが発生しており、この表示になるまでだいぶ時間がかかった。
ラスボスは環境変数
NEXTCLOUD_URL=http://nextcloud
だった。
起動スクリプトに上記を加えたことで認証が上手くいくようになり、通知が飛んでくるようになった。
体感で確認
ExplorerでNextcloudの適当なフォルダを開く。
次に、ブラウザでNextcloudにアクセスし、同じフォルダを開く。
ブラウザにファイルを放り込んで、5秒くらいでエクスプローラーに表示されれば成功。
今までは1分ごとにポーリングしていたということなので、ファイルを入れるタイミングにもよるだろうから、何回かファイルを放り込んで試し、すべてが5秒くらいでエクスプローラーに表示されることが確認できれば概ね成功していると言えるのではないだろうか。
さいごに
NextcloudはDockerで使うのが簡単なんじゃないかと思って構築したが、この機能の実現方法を教えてくれるところは少なかった。
コミュニティで教えてくれている方がいらっしゃるのだが、コンテナをもう1つ作るやり方だった。
How to docker-compose with notify_push (2024)
これを参考にさせていただき、ウチの環境にあう極力少ない変更で実装することができた。
今回もGeminiさんに相談しながら概ねスムーズに進めることができたけれど、認証が上手くいかないトラブルの解決だけは自力でやるしかない感じだった。
情報が少ないと上手くいかないのかもしれないし、有料版なら答えを引き出せたのかもしれない。
いずれにしても、どうにかプッシュ通知の環境を設定できた。
Nextcloudは日々便利に使わせてもらっており、今回はそれが少しスマートになった訳で。
開発者の皆様、いつもありがとうございます。


コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他