banner
二階堂春希

春希のブログ

山雨欲来风满楼,故攻八面以铸无双。 孤战非所望,俗安不可期。
tg_channel
telegram
twitter
github

NixOS を使用してローカルに Nextcloud を構築する

以前の記事で、私たちはサーバー用の NixOS をインストールしました。この記事では、その基盤の上に Nextcloud を構築します。

ブロガーは Nextcloud を構築する際に大きな困難に直面しました。主な理由は、メールを送信できないことと、NixOS の公式ドキュメントが不十分であることです。そのため、私はより良い Nextcloud NixOS Wikiを作成しました。Nextcloud + NixOS をいじった後、試しに提出して現在の Wiki を置き換えます。

実際には、ブログのやり方に従って一歩一歩進める必要はなく、私が設定したconfiguration.nixを直接ダウンロードし、自分のニーズに合わせて変更することができます。

なぜ Nextcloud なのか#

Nextcloud はオープンソースのクラウドストレージサービスで、プライベートクラウドを構築するために使用できます。その機能は非常に強力で、ファイルストレージ、カレンダー、メモ、チャットなどに利用できます。Nextcloud は古い PHP を使用していますが、その機能が非常に強力で、良い代替品が見つからないため、Nextcloud を選択しました。

Nextcloudの他に、ブロガーは以下のオープンソースのクラウドストレージサービスも試しました:

  • pydio:機能は同様に強力ですが、Nix パッケージがなく、NixOS のインストールがやや面倒です。
  • Seafile:十分に強力な代替品で、Nix パッケージがありますが、ドキュメントが不足しており、デプロイが面倒です。
  • ownCloud:Nextcloud の前身で、機能が不十分で、更新が不安定です。
  • cloudreve:機能が不十分で、ファイルの保存のみ可能で、Nix パッケージがありません。

ローカルで Nextcloud を構築する基本プロセス#

Nextcloud パッケージのインストール#

Nextcloud のインストールは非常に簡単で、/etc/nixos/configuration.nixファイルを変更し、environment.systemPackagesnextcloudを追加するだけです。

environment.systemPackages = with pkgs; [
  nextcloud26
];

注意:Nextcloud の Nix パッケージはnextcloud + バージョン番号であり、nextcloudではありません。

急いでnixos-rebuild switchを実行しないでください。まだ Nextcloud は設定されていません。

初期設定#

NixOS マニュアルには、次のような設定が示されています:

{
  services.nextcloud = {
    enable = true;
    hostName = "nextcloud.tld";
    config = {
      dbtype = "pgsql";
      dbuser = "nextcloud";
      dbhost = "/run/postgresql"; # nextcloudは自動的に/.s.PGSQL.5432を追加します
      dbname = "nextcloud";
      adminpassFile = "/path/to/admin-pass-file";
      adminuser = "root";
    };
  };

  services.postgresql = {
    enable = true;
    ensureDatabases = [ "nextcloud" ];
    ensureUsers = [
     { name = "nextcloud";
       ensurePermissions."DATABASE nextcloud" = "ALL PRIVILEGES";
     }
    ];
  };

  # セットアップを実行する前にpostgresが実行されていることを確認します
  systemd.services."nextcloud-setup" = {
    requires = ["postgresql.service"];
    after = ["postgresql.service"];
  };

  networking.firewall.allowedTCPPorts = [ 80 443 ];
}

この設定の意味は:

  • Nextcloud サービスを有効にする
  • ドメイン名をnextcloud.tldに指定する
  • データベースを PostgreSQL に指定し、データベースの具体的な設定を提供する
  • サービスの起動順序を指定する
  • 80 および 443 ポートを開放する
  • Nextcloud 管理者のパスワードファイルを/path/to/admin-pass-fileに指定する

/path/to/admin-pass-fileは実際のパスではなく、プレースホルダーであり、自分で指定する必要があります。NixOS の要件に従い、このファイルはnextcloudユーザーがアクセスできる必要があります。しかし、ブロガーのテストによると、このファイルが存在するディレクトリもnextcloudユーザーがアクセスできる必要があります。したがって、このファイルを/nextcloudディレクトリに置き、/nextcloudディレクトリの権限を777に設定する必要があります。

/path/to/admin-pass-file/nextcloud/nextcloud-admin-passに変更し、次に

# rootユーザーとして実行
cd /
mkdir nextcloud
chown nextcloud nextcloud/
chmod 777 nextcloud/
cd nextcloud
vim nextcloud-admin-pass
# パスワードを入力
nixos-rebuild switch

ローカルテスト環境のため、一時的にnextcloud.tldnextcloud.nixosに変更します(ブロガーのローカルネットワークには自前の DNS サーバーがあるため、もしない場合はアドレスに変更することをお勧めします)。

構築が完了したら、http://nextcloud.nixos/にアクセスすると、次のような Nextcloud のインストール画面が表示されます。

インストール画面

異なるバージョンの Nextcloud のインストール画面は異なる場合がありますが、大体は似ています。

service.nextcloud.config.adminuserで指定されたユーザー名と/nextcloud/nextcloud-admin-passで指定されたパスワードを入力すると、インストールが完了します。

nix 設定ファイルで Nextcloud アプリをインストールする(簡易用法)#

上記の設定でデプロイされた Nextcloud は、わずか数個のアプリしかインストールされていませんが、Nextcloud は強力なプラットフォームであり、アプリをインストールすることで機能を大幅に拡張できます。Nextcloud のアプリストアでは、多くのアプリを見つけてインストールできますが、NixOS では Nix パッケージマネージャーを使用してアプリをインストールする方が良い選択です。

NixWikiには、アプリをインストールするための例が提供されています。例えば、

services.nextcloud = {
  enable = true;
  [...]
  package = pkgs.nextcloud26;
  extraApps = with pkgs.nextcloud26Packages.apps; {
    inherit mail news contacts;
  };
  extraAppsEnable = true;
};

この設定では、mail、news、contacts の 3 つのアプリがインストールされます。しかし、これらのアプリの名前は Nextcloud のアプリストアでは見つかりませんが、NixWiki のSome appsでこれらのアプリの名前を見つけることができます。

Some apps の位置

この記事が公開された時点で、これらのアプリの名前は次の通りです:

[
  "bookmarks",
  "calendar",
  "contacts",
  "deck",
  "keeweb",
  "mail",
  "news",
  "notes",
  "onlyoffice",
  "polls",
  "tasks",
  "twofactor_webauthn"
]

明らかにこれらのアプリは不十分ですが、他の方法でアプリをインストールすることもできます。

nix 設定ファイルで Nextcloud アプリストアのアプリをインストールする#

NixWiki では、nix 設定ファイルで Nextcloud アプリストアからアプリをインストールする方法も示されています。例えば、

services.nextcloud = {                
  enable = true;                   
  [...]
  extraApps = {
    mail = pkgs.fetchNextcloudApp rec {
      url = "https://github.com/nextcloud-releases/mail/releases/download/v1.14.1/mail-v1.14.1.tar.gz";
      sha256 = "sha256-sQUsYC3cco6fj9pF2l1NrCEhA3KJoOvJRhXvBlVpNqo=";
    };
    contacts = pkgs.fetchNextcloudApp rec {
      url = "https://github.com/nextcloud-releases/contacts/releases/download/v4.2.2/contacts-v4.2.2.tar.gz";
      sha256 = "sha256-eTc51pkg3OdHJB7X4/hD39Ce+9vKzw1nlJ7BhPOzdy0=";
    };
  };
  extraAppsEnable = true;
};

この設定では、mail と contacts の 2 つのアプリがインストールされます。アプリのダウンロードリンクはNexcloud アプリストアで見つけることができ、そのリンクを設定ファイルに追加します。

注意:この方法でインストールされたアプリは手動で更新する必要があります。バージョンが更新されると、新しいダウンロードリンクを手動で再度入力する必要があります。(もちろん、Nextcloud 内のアプリストアを使用して更新することもできます)

ブロガーは次のアプリをインストールしました。

  services.nextcloud = {
    enable = true;
    package = pkgs.nextcloud26;
    [...]

    extraApps = {
      contacts = pkgs.nextcloud26Packages.apps.contacts;
      mail = pkgs.nextcloud26Packages.apps.mail;
      calendar = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/nextcloud-releases/calendar/releases/download/v4.3.4/calendar-v4.3.4.tar.gz";
        sha256 = "0pj1h86kdnckzfrn13hllgps4wa921z4s24pg5d2666fqx89rwrv";
      };
      notes = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/nextcloud-releases/notes/releases/download/v4.7.2/notes.tar.gz";
        sha256 = "0klqf8dixrrb8yp8cc60ggnvhmqb3yh9f6y1281jn8ia5jml622v";
      };
      camerarawpreviews = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/ariselseng/camerarawpreviews/releases/download/v0.8.1/camerarawpreviews_nextcloud.tar.gz";
        sha256 = "1n1395m81m81klxzxd03ww07m0xjp0blbmx23y457k62j3kkr0m2";
      };
      drawio = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v2.1.1/drawio-v2.1.1.tar.gz";
        sha256 = "0frizrgkbmc3mhhap7cq45z43l4whzkszx7v0v0q2ylmq8sbxszm";
      };
      registration = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/nextcloud-releases/registration/releases/download/v2.1.0/registration-v2.1.0.tar.gz";
        sha256 = "07dqc670qmdb3c8jjnj7azxxspjhiv6m9nrj960y3rjabyzy25m9";
      };
      music = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/owncloud/music/releases/download/v1.8.3/music_1.8.3_for_nextcloud.tar.gz";
        sha256 = "1kajm5ppp63g42xdvkmv0glw7snsc2fi7pcra1sg4kd005ffz42d";
      };
      bookmarks = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/nextcloud/bookmarks/releases/download/v13.0.1/bookmarks-13.0.1.tar.gz";
        sha256 = "0xx331bgly91y8ncxk36ha3ncrr2xlivblfi7rix6ffkrdx73yb9";
      };
    };

  }

nix-prefetch-url --unpack <url>コマンドを使用して tar.gz パッケージの sha256 値を取得できます。
フォーマットや一部のドキュメントに違いがあっても、この方法は機能します。

注意:camerarawpreviewsなどの名前は tar.gz パッケージの名前と一致する必要があります。そうでないと、インストールできません。

設定が正しければ、管理設定 -> 概要にエラーは表示されないはずです。

管理設定 -> 概要

よくある質問の解決策#

Nix は Nextcloud をどこにインストールしたのか?#

ソースコードによれば、デフォルトのインストールパスは/var/lib/nextcloudで、データディレクトリは/var/lib/nextcloud/dataです。

ログが見つからない#

デフォルトでは、NixOS は Nextcloud のログ出力モードを次のように変更します。

'log_type' => 'syslog',
'loglevel' => '2',

この場合、Nextcloud のログはデーモンのログに出力され、journalctl -t Nextcloudで確認できます。

面白いことに、'loglevel' => '2'は無効な設定のようです。Nextcloud 内部の Warning、Error、さらには Fatal も Debug 出力として扱われます。したがって、'loglevel' => '2''loglevel' => '0'に変更する必要があるかもしれません。

  services.nextcloud = {
    [...]
    logLevel = 0;
  };

必要に応じて、-fオプションを追加してリアルタイムでログを確認できます。

アプリストアはどこにあるのか?#

デフォルトでは、NixOS にインストールされた Nextcloud にはアプリストアがありません。

appstoreEnabletrueに設定することで、アプリストアを有効にできます。

  services.nextcloud = {
    [...]
    appstoreEnable = true;
  };

メールが送信できない#

設計上の欠陥により、Nix ファイルを介してメール送信を直接設定することはできず、extraConfigを使用して設定する必要があります。

services.nextcloud = {
  [...]
  extraOptions = {
    mail_smtpmode = "smtp";
    smtpsecure = "ssl";
    mail_sendmailmode = "smtp";
    mail_from_address = "nextcloud";
    mail_domain = "example.com";
    mail_smtphost = "smtp.example.com";
    mail_smtpport = "465";
    mail_smtpauth = 1;
    mail_smtpname = "[email protected]";
    mail_smtppassword = "password";
  };
};

上記の設定はconfig.phpファイルに由来し、新しい Nextcloud インスタンスでこれらの設定を見つけることができます。

ローカルでテストサーバーを構築する際、どの設定を使用してもメールを送信できないようですが、クラウドサーバー(AWS など)では正常に送信できます。この問題はローカルネットワーク環境によるもので、解決策は見つかりませんでした。

Nix 設定ファイルの例#

ここにIPFS リンクを示します。

いくつかの設定にはプレースホルダーが使用されているため、この設定ファイルを直接使用しないでください。

主な変更点は次の通りです:

  services.nextcloud = {
    enable = true;
    hostName = "nextcloud.nixos";
    config = {
      dbtype = "pgsql";
      dbuser = "nextcloud";
      dbhost = "/run/postgresql"; # nextcloudは自動的に/.s.PGSQL.5432を追加します
      dbname = "nextcloud";
      adminpassFile = "/path/to/your/nextcloud/adminpass.txt";  # 自分のパスに置き換えてください
      adminuser = "root";
    };
    package = pkgs.nextcloud26;
    extraApps = {
      contacts = pkgs.nextcloud26Packages.apps.contacts;
      mail = pkgs.nextcloud26Packages.apps.mail;
      calendar = pkgs.fetchNextcloudApp rec {
        url = "https://github.com/nextcloud-releases/calendar/releases/download/v4.3.4/calendar-v4.3.4.tar.gz";
        sha256 = "0pj1h86kdnckzfrn13hllgps4wa921z4s24pg5d2666fqx89rwrv";
      };
      # さらなる設定は私のIPFS共有で見つけることができます
    };
    extraOptions = {
      # 以下を自分のメールサーバーの設定に置き換えてください
      mail_smtpmode = "smtp";
      smtpsecure = "ssl";
      mail_sendmailmode = "smtp";
      mail_from_address = "system";
      mail_dmoain = "example.com";
      mail_smtphost = "smtp.example.com";
      mail_smtpport = "465";
      mail_smtpayth = 1;
      mail_smtpname = "[email protected]";
      mail_smtppassword = "password";
    };
  };

  services.postgresql = {
    enable = true;
    ensureDatabases = [ "nextcloud" ];
    ensureUsers = [
     { name = "nextcloud";
       ensurePermissions."DATABASE nextcloud" = "ALL PRIVILEGES";
     }
    ];
  };

  systemd.services."nextcloud-setup" = {
    requires = ["postgresql.service"];
    after = ["postgresql.service"];
  };

  networking.firewall.allowedTCPPorts = [ 80 443 465 587 ];

メンテナンス#

最近構築したばかりなので、まだメンテナンス上の問題には直面していません。問題が発生した場合は、ここで更新します。

大きな問題については、別の記事を書くかもしれません。その問題を解決する記事にこのブログのリンクを掲載し、ここに解決策へのリンクを掲載します。

最新の更新を受け取りたい場合は、ブロックチェーン上で私のブログをフォローしてください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。