Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

Dockerで構築したNextCloudを自宅内や外出先から利用してきました。バージョンアップするタイミングで再度構築し直したら、以前とは色々と変わっていてハマりました。

差しあたり再度稼働させています。これまでと同様か新しくエラーに悩まされました。調べると、多くのサイトで解消例があり助かりますね。

そこで、全てではありませんが、自分が経験したエラーの解消法を紹介します。特にDockerで構築した事例で、Raspberry Piに直接インストールする方法とは異なりますのでご注意ください。

あっ、Raspberry Pi 4をSSDドライブ起動にして、外部HDDも接続した環境で行っています。OSは古いbullseyeの64bitです。bookwormだとまた違うかもしれません。

権限類の解消

今度のDockerでNextcloudの構築は、前回とは異なる構成です。

これまでのNextcloud

まだWireguardを入れていませんので外部からアクセスできる前の段階です。相変わらずDockerの更新に付いていけず、よく分からないところもたくさんあります。

最初にDockerでNextcloudを立ち上げた際、パーミションエラーがありました。

前回はどうだったか覚えていませんが、概ね必要なディレクトリに対し、サーバーの権限であるwww-dataを付与するのと、読み書きの権限として750や770を与えました。

  • 750(drwxr-x— )
  • 770(drwxrwx—)
  • www-data:www:data

コマンドで作業していきます。およそ次のようなコマンドです。

chown -R www-data:www-data /var/www/html/data
chmod -R 750 /var/www/html/data

付与されていたディレクトリもありましたが、次のディレクトリとファイルをDockerのコンテナに入って実行しました。

  • /var/www/html/data
  • /var/www/html/config
  • /var/www/html/custom_apps
  • /var/www/html/data/.ocdata
  • /var/www/html/data/.ncdata
chmod -R 750 /var/www/html/data
chmod -R 750 /var/www/html/config
chmod -R 770 /var/www/html/custom_apps
chown www-data:www-data /var/www/html/data/.ocdata
chown -R www-data:www-data /var/www/html/data/.ncdata

Dockerのコンテナは概ね次のようしてあり、コマンドで入ります。

  • next-cloud-app(Nexcloud)
  • nextcloud-cron
  • nextcloud-db(MariaDB)
  • nextcloud-proxy
  • nextcloud-redis

実行しているコンテナへ入るコマンド

docker exec -it nextcloud-app-1 bash

Nextcloudのイメージは「nextcloud:apache」を使用しました。

元々Nextcloudは内部にApache2があります。Webサーバを用意することもあり、ちょっとややこしいですね。私もよく分かっていません。

事例①インストール時のエラー

権限管理で最初に遭遇したのは、インストール時です。

Nextcloudのあるコンテナ(ここではapp)内の/var/www/html/dataディレクトリがroot権限で644だかに設定されていました。これだと書き込めずにエラーが出ます。

Webサーバのグループに所有者を変更し、書込権限を付与します。

docker exec -it nextcloud-app-1 bash
chown -R www-data:www-data /var/www/html/data
chmod -R 750 /var/www/html/data
exit

Dockerを使う場合、ローカル環境でもDockerグループに自分を入れます。

sudo usermod -aG docker $USER

事例② .ocdata

データディレクトリに必要な.ocdataが存在しないか所有者が違うとエラーになります。

config/config.phpにあるように、ocはデータベーステーブルの接頭語になっています。'dbtableprefix' => 'oc_'

このためだと思うのですが、所有権はrootになっていました。これも変更します。やはりコンテナ内での実行です。もしファイルがなければ作成し付与します。

docker exec -it nextcloud-app-1 bash
#ファイルが存在しない場合
touch /var/www/html/data/.ocdata
#所有者変更
chown www-data:www-data /var/www/html/data/.ocdata

事例③ .ncdata

似ようなものに、.ncdataもあります。こちらは次のエラーで気が付きます。

CLIを介してcronジョブを実行することはできませんでした。以下の技術的なエラーが発生しました: - データディレクトリが無効です データディレクトリのルートに".ncdata"というファイルがあることを確認します。内容は次のようになります:"# Nextcloud data directory" - データディレクトリに書き込み権がありません Webサーバーのルートディレクトリに書き込み権限パーミッションが必要です。詳しくはhttps://docs.nextcloud.com/server/30/go.php?to=admin-dir_permissionsを確認してください。

cronジョブに関することです。今回cronは別サーバとしてコンテナを作りましたので、そちらで変更しました。ケースバイケースによるかも知れません。

docker exec -it nextcloud-cron-1 bash
#無ければ作成し中身を編集
touch /var/www/html/data/.ncdata
nano /var/www/html/data/.ncdata
#書き込む内容(コメントアウト含む)
# Nextcloud data directory

#最後に所有権も変更
chown -R www-data:www-data /var/www/html/data/.ncdata

Dockerコンテナ内で初心者に嬉しい「nano」が入っていない場合、コンテナ毎にインストールすれば使えます。コンテナに居る状態で、次のコマンド。

apt update
apt install nano

■Pi 5は8GBモデルがオススメ

エラー毎の解消

表示されたエラー毎に対処していきます。

HTTPヘッダー

インスタンスの一部のヘッダーが正しく設定されていません - Strict-Transport-Security HTTPヘッダーが設定されていません(少なくとも 15552000 秒に設定する必要があります)。セキュリティを強化するために、HSTSを有効にすることを推奨します。 詳細については、ドキュメント↗を参照してください。

confファイルに書くなどスマートな方法はあります。直接記述でサクッと対応しました。

サーバ公開ディレクトリ(/var/www/html)にある.htaccessファイルを編集しました。

<IfModule mod_env.c>
    # Add security and privacy related headers

    Header set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

バインドマウントしているので、ローカルで作業しました。

私の場合、./nextcloud:/var/www/htmlとしたので、ローカル(つまりラズパイ)の~/stack/nextcloud/.htaccessにあります。

Add security and privacy related headersの後に追記しておきました。

国コード

ご使用のシステムには、デフォルトの電話地域が設定されていません。これは、国コードなしでプロファイル設定の電話番号を検証するために必要です。国コードなしで番号を許可するには、地域のそれぞれの ISO3166-1コード↗とともに “default_phone_region” を設定ファイルに追加してください。

ISO3166-1コードで日本は「JP」です。

これをconfig.phpの末尾に追記しました。);の前です。

  'installed' => true,
  'default_language' => 'ja',
  'default_phone_region' => 'JP',
);

‘default_language’ => ‘ja’,(デフォルトはUS)は無くても良い?‘default_phone_region’はデフォルトが何も設定されていないので必要になります。

リバースプロキシヘッダーのエラー

リバースプロキシヘッダの設定が正しくありません。これはセキュリティ上の問題で、攻撃者が自分のIPアドレスをNextcloudに見えるように偽装することができます。

これもconfig.phpを編集します。

Dockerの構成でリバースプロキシを設定しているので出たと思います。そうでないなら出ないのかな。

**'trusted_domains'**の後にローカルのIPアドレスと、ローカルの範囲を指定しました。xxは読み替えてください。

  'trusted_proxies' => array(
    0 => '192.168.xx.xx',
    1 => '192.168.x.x/24',
  ),

ドメインの範囲

何のエラーか忘れました。——調べておきます。

こちらもローカルホストとローカルの範囲を指定しました。

  'allowed_admin_ranges' => [
    '127.0.0.1/8',
    '192.168.x.0/24',
    'fd00::/8',
  ],

これはDocker内部のIPアドレスは関係ないのだろうか・・・。ちょっと理解していません。一応、これでエラーは消えました。

Occコマンドで2つ

One or more mimetype migrations are available. Occasionally new mimetypes are added to better handle certain file types. Migrating the mimetypes take a long time on larger instances so this is not done automatically during upgrades. Use the command occ maintenance:repair –include-expensive to perform the migrations.

(翻訳) 1つ以上のマイムタイプの移行が可能です。特定のファイルタイプをより適切に処理するために、新しいマイムタイプが追加されることがあります。より大きなインスタンスでは、mimetypesの移行に時間がかかるため、アップグレード中に自動的には行われません。Occ maintenance:repair –include-expensive コマンドを使用して、移行を実行します。

このOccコマンドで設定するのが2つありました。

1つはこのMIMEtypeの問題です。

コンテナに入るのに1つ異なる点があります。rootではなくwww-dataで実行するコマンドなので、コンテナに入る前に指定して入ります。

-u 33がそれです。

実はwww-dataのuid=33、gid=33、groups=33だからです。

どうもNextcloudのイメージファイルによって異なるようで、php:<version>-fpmか、php:<version>-alpineだと異なります。alpineだと82だそうです。

本来、sudo -u 33とかできるのですが、コンテナ内では既にrootのため、入る前からユーザー指定して入ります。

docker exec -u 33 -it nextcloud-app-1 bash
php occ maintenance:repair --include-expensive

次も同じようなコマンドで解消できるエラーです。

いくつかの欠落しているオプションのインデックスを検出しました。データベースのパフォーマンスを向上させるために、(Nextcloudまたはインストールされたアプリケーションによって)新しいインデックスが追加されることがあります。インデックスの追加には時間がかかり、一時的にパフォーマンスが低下することがあるため、アップグレード時には自動的には行われません。インデックスが追加されると、それらのテーブルへのクエリが速くなるはずです。インデックスを追加するには、occ db:add-missing-indices コマンドを使用してください。インデックスが不足: “systag_by_objectid” テーブル内の “systemtag_object_mapping”. 詳細については、ドキュメント↗を参照してください。

こちらも-u 33で入り実行します。

docker exec -u 33 -it nextcloud-app-1 bash
php occ db:add-missing-indices

以前はバグで実行してもエラーだったようですが、記事執筆時点のバージョン(Nextcloud Hub 9 (30.0.1))ではOKでした。

WebDAVインターフェイスの設定

WebDAVインターフェースが動作していないようです。Webサーバーは、ファイルの同期を許可するよう適切に設定されていません。 To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its trusted_domains or the overwrite.cli.url. This failure may be the result of a server-side DNS mismatch or outbound firewall rule.

——今回はここまで。

ちょっとまだたくさんある!

Web サーバが `.js.map` ファイルを提供するように設定されていません。これらのファイルがないと、JavaScriptソースマップは正しく機能せず、トラブルシューティングや問題が発生した場合のデバッグが難しくなります。

JavaScriptサポートのチェックを実行できません。WebサーバーがJavaScript MIMEタイプを使用して`.mjs`ファイルを提供しているかどうかを手動で確認してください。 このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。

Web サーバが "/ocm-provider/", "/ocs-provider/" を解決するように正しく設定されていません。 これは、このフォルダを直接配信するように更新されていないウェブサーバの設定に関連している可能性が高いです。 Apacheの場合は".htaccess"、Nginxの場合はドキュメントに記載されているリライトルールと比較してください。 Nginxの場合、これらは通常「location ~」で始まる行で、更新が必要です。 詳細については、ドキュメント↗を参照してください。

ウェブサーバが `.well-known` URL を正しく解決できるように設定されていません。失敗箇所: `/.well-known/webfinger` 詳細については、ドキュメント↗を参照してください。
ウェブサーバーがセキュリティヘッダーを正しく提供しているか確認できませんでした。 `/heartbeat` をクエリできません。 詳細については、ドキュメント↗を参照してください。

otfローディングのサポートをチェックできませんでした。ウェブサーバーが `.otf` ファイルを提供しているかどうかを手動で確認してください。 このチェックを実行させるには、Webサーバーが自分自身に接続できることを確認しなければならない。そのため、少なくとも一つの `trusted_domains` または `overwrite.cli.url` を解決して接続できなければなりません。この失敗は、サーバ側のDNSの不一致やアウトバウンドファイアウォールルールの結果かもしれません。 詳細については、ドキュメント↗を参照してください。

とりとめないまとめ

ほとんどはNextcloudの設定ではなく、Webサーバとしての設定が多いですね。やればやるほど分からない反面、勉強にはなります。

何かあってもまぁ困りませんから、エラーに出くわすのも乙です。

ここに挙げた対処のいくつかは、/etc/apache2/sites-available/nextcloud.confなどを作成して設定ができます。

途中まで手動でやってしまったので、どれを対処したのか分からなくなりました。次は最初からconfファイルで対処したいですね。

まだエラー解消の続きがあります。

この記事に追記していきますので、またご覧ください。

Docker + Nexcloud は少々難しいように感じますが、手軽に環境をイジれるので好みです。前回と異なる方法で構築しましたが、また別に構築方法の手順をまとめたいと思います。Docfileや外部テキストファイルでスマートに構築したいですね。非エンジニアにはハードルが高そうだ。