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,也建議創建一個新的密鑰對,以防你的密鑰對洩露。

密鑰對和實例類型參考

對於網絡安全組,你必須開放 SSH 端口(默認 22),以便連接到 EC2 實例。因為這是一台 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 will add /.s.PGSQL.5432 by itself
      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]"; # Replace with your email.
    certs = {
      "yourdomain.com".extraDomains = [ "www.yourdomain.com" ]; # Replace with your domain and subdomains.
    };
  };

你可能會遇到報錯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 中存放大量文件。

剛剛搭建好,還沒有遇到什麼問題,如果遇到了,會在這裡更新。對於比較大的問題,可能會單獨發一篇文章。如果想要不錯過任何消息,請在區塊鏈上關注我的博客。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。