banner
二階堂春希

春希のブログ

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

AWS 上に NixOS + Nextcloud をデプロイする

NixOS の紹介とローカルサーバーのインストールについては、以前に投稿したブログ「最小化 NixOS の基本的なインストール手順」を参照してください。

NixOS ダウンロードページでは、AWS への簡単で迅速なデプロイ方法が提供されています。この方法を使用して、NixOS を迅速にデプロイします。

EC2 インスタンスの作成#

時々(このブログを書いているときのように)、ダウンロードページで NixOS の AMI を見つけることができないことがあります。その場合は、AWS コンソールでnixosを検索すると、NixOS の AMI を見つけることができます。

AMI リスト

AMI を選択する際は、アーキテクチャに注意し、x86_64を選択してください。正しい AMI は以下の画像のようになります:

正しい AMI

コストとパフォーマンスの要件に応じて、適切なインスタンスタイプを選択する必要があります。ブロガーはt2.microを選択しました。なぜなら、それは無料だからです。

AWS を初めて使用する場合は、新しいキーペアを作成する必要があります。キーペアは EC2 インスタンスに接続する唯一の方法ですので、必ずキーペアを適切に保管してください。AWS を初めて使用しない場合でも、キーペアが漏洩する可能性があるため、新しいキーペアを作成することをお勧めします。

キーペアとインスタンスタイプの参考

ネットワークセキュリティグループでは、EC2 インスタンスに接続するために SSH ポート(デフォルトは 22)を開放する必要があります。これは Web サーバーであるため、80(HTTP)および 443(HTTPS)ポートも開放する必要があります。

セキュリティグループの参考

接続の問題が発生した場合は、一時的にすべてのポートを開放して問題をトラブルシューティングできます。ただし、本番環境ではなく問題をトラブルシューティングする場合に限ります。終了後は必ずすぐに閉じてください。

最小化された NixOS は非常に少ないスペースを占有しますが、少なくとも 8GB のストレージスペースを選択することをお勧めします。インスタンスタイプが EBS 最適化をサポートしている場合は、EBS 最適化を有効にしてください。

EC2 インスタンスに接続して設定をコピー#

EC2 インスタンスに接続#

AWS コンソールでは、EC2 インスタンスのパブリック IP アドレスを見ることができます。この IP アドレスを使用して、EC2 インスタンスに接続できます。

次に、パブリック IP アドレスを1.14.51.4、ユーザー名をec2-userと仮定します。
この IP アドレスはあるジョークから来ています。面白いことに、この IP アドレスは実際に存在し、中国の大手インターネット企業(テンセント)が所有しています。

sudo ssh -i /path/to/your/key.pem [email protected]

私たちは以前のブログで、ローカルに Nextcloud をデプロイし、Nix 設定ファイルを作成しました。EC2 インスタンスから設定ファイルをダウンロードし、破壊的な操作を引き起こさない場合は、設定ファイルを EC2 インスタンスにコピーできます。

このプロセスでは、FileZilla + VS Code を使用することをお勧めします。便利だからです。FileZilla を使用したくない場合は、scpコマンドを使用できます。

設定ファイルのコピー#

実際、AWS のconfigurations.nixは、以前にインストールした NixOS のconfigurations.nixとは非常に異なります。23.05バージョンでは、設定は次のようになります:

{ modulesPath, ... }: {
  imports = [ "${modulesPath}/virtualisation/amazon-image.nix" ];
  
  
}

はい、私は何も変更していません。差はこれほど大きいです。

しかし、差が大きいからといって使えないわけではありません。ローカルでテストしたファイルでは、次のように Nextcloud を設定しました。

  environment.systemPackages = with pkgs; [
    vim
    wget
    curl
    openssh
    msmtp
  ];

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

  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 ];

これはサンプルファイルで、/path/to/your/nextcloud/adminpassのようなプレースホルダーが含まれているため、実際の状況に応じて変更する必要があります。

これらの設定を初期設定ファイルの空きスペースにコピーし、編集した設定ファイルで元の設定ファイルを置き換えます。

FileZilla では、変更したファイルを直接アップロードして元のファイルを上書きできます。

注意:最初の行の{ modulesPath, ... }: {{ config, pkgs, ... }: {に変更する必要があります。
あなたはおそらく Nix の構文を学んでいないと思うので、ここで簡単に説明します。

元の設定ファイルを上書きした後、設定ファイルを適用します。

sudo nixos-rebuild switch

nixos-rebuildコマンドは大量のスペースを使用するため、ハードディスクの空き容量を確認してください。また、nix-shellの下でnixos-rebuildコマンドを使用しないように注意してください。

設定調整#

ローカルデプロイとは異なり、AWS の環境に適応するためにいくつかの設定を調整する必要があります。調整が必要な設定は、Nextcloud の概要ページを参照してください。

概要

HTTPS の設定#

まず、この警告を処理します。

Wikiに従って、HTTPS を有効にするために次のように設定できます。

  services.nextcloud = {
    enable = true;
    [...]
    hostName = "example.org";
    https = true;
  };

  services.nginx.virtualHosts.${config.services.nextcloud.hostName} = {
    forceSSL = true;
    enableACME = true;
  };

この設定では、ACMEを使用して無料の Let's Encrypt 証明書を自動的に取得します。ほとんどのユーザーにとって、これは非常に良い選択です。

もちろん、ACME を使用するので、設定する必要があります。ACME を設定する前に、ドメイン名を持っていて、すでにそのドメイン名がサーバーに解決されていることを確認してください。

  security.acme = {
    acceptTerms = true;
    email = "[email protected]"; # あなたのメールアドレスに置き換えてください。
    certs = {
      "yourdomain.com".extraDomains = [ "www.yourdomain.com" ]; # あなたのドメインとサブドメインに置き換えてください。
    };
  };

undefined variable 'config'というエラーが発生することがあります。これは、{ modulesPath, ... }: {configを追加していないためです。上記の説明を参照してください。

environment.systemPackagesに ACME を手動でインストールする必要はありません。security.acme.acceptTerms = trueを設定すると、Nix が自動的にインストールします。デフォルトでは、ACME は証明書を自動的に更新します。したがって、証明書の期限切れについて心配する必要はありません。

問題が発生した場合は、/var/log/acme/acme.logでログを確認できます。

デフォルトの電話地域の設定#

この記事を参照してください。

英語ですが、翻訳ツールを使用すると思いますよね。

OPcache モジュールが正しく設定されていない#

上の図のように、警告の strings buffer が上限に近づいています。この警告を解決するのは難しくなく、上記のようにopcache.interned_strings_bufferを高く設定するだけです。

ここでは、16に設定しました。

  services.nextcloud = {
    enable = true;
    [...]
    phpOptions = {
      "opcache.interned_strings_buffer" = "16";
    };
  };

メール送信#

Nextcloud を EC2 に構築したため、AWS の SES サービスを使用してメールを送信しました。他のサービス(例えば SendGrid)を使用することもできます。

SES の設定は少し面倒ですが、簡単に言うと、次の手順を実行する必要があります:

  1. AWS コンソールで IAM ユーザーを作成し、SES のメール送信権限を付与します。
  2. SES でドメインを検証します。
  3. SES で SMTP 資格情報を作成します。IAM ユーザーの SMTP ユーザー名とパスワードを取得します。
  4. 受信者のメールアドレスを追加するか、サンドボックス制限を解除します。
  5. Nextcloud で SMTP を設定します。
  services.nextcloud = {
    enable = true;
    [...]
    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";`
    };
  };

SMTP の設定は AWS コンソールの SMTP 資格情報を参照する必要があります。smtp サーバーのアドレスとポートは SES の情報を参照してください。

アプリストアの起動#

Nix 設定ファイルを使用してアプリストアのアプリをインストールすると、アプリストアが自動的に無効になります。しかし、Nix 設定を調整して手動で有効にすることができます。

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

Nix 設定ファイルの参考#

基本的には、ローカルデプロイの設定ファイルの一部を EC2 にコピーし、その後、前述のようにいくつかの調整を行います。

完全な設定ファイルの IPFS リンク

メンテナンス#

ブロックストレージはあまりコスト効率が良くないため、ファイルが増えると、将来的にはオブジェクトストレージを使用してコストを節約する必要があるかもしれません。Nix は S3 を Nextcloud にマウントする便利な方法を提供しています。

php のパフォーマンスの問題から、Nextcloud に大量のファイルを保存することはお勧めしません。

まだ構築したばかりで、問題には遭遇していませんが、問題が発生した場合はここで更新します。大きな問題については、別の記事を投稿するかもしれません。最新情報を見逃さないように、ブロックチェーン上で私のブログをフォローしてください。

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