關於 NixOS 的介紹和本地伺服器安裝,請參考之前發的博客「安裝最小化 NixOS 的基本步驟」。
NixOS 下載頁面中,提供了簡單快速部署到 AWS 的方法。我們採用這種方法,快速部署 NixOS。
創建 EC2 實例#
有時候(比如寫這篇博客的時候),不能在下載頁面中找到 NixOS 的 AMI。這時候,可以在 AWS 控制台中搜索nixos
,就可以找到 NixOS 的 AMI 了。
選擇 AMI 時,注意架構,選擇x86_64
。正確的 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 配置比較麻煩,但簡單來說,需要做以下幾步:
- 在 AWS 控制台中創建一個 IAM 用戶,給予 SES 的發送郵件權限。
- 在 SES 中驗證你的域名。
- 在 SES 中創建一個 SMTP 憑證。獲取到 IAM 用戶的 SMTP 用戶名和密碼。
- 添加收件人郵箱或者申請解除沙箱限制。
- 在 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 中,然後按照先前說的那樣做一些調整。
維護#
使用塊存儲比較不划算,在文件更多時,以後可能會需要使用對象存儲以節省費用。Nix 提供了方便的將 S3 掛載 Nextcloud 的方法。
因為 php 的性能問題,不建議在 Nextcloud 中存放大量文件。
剛剛搭建好,還沒有遇到什麼問題,如果遇到了,會在這裡更新。對於比較大的問題,可能會單獨發一篇文章。如果想要不錯過任何消息,請在區塊鏈上關注我的博客。