关于NixOS的介绍和本地服务器安装,请参考之前发的博客「安装最小化NixOS的基本步骤」。
NixOS下载页面中,提供了简单快速部署到AWS的方法。我们采用这种方法,快速部署NixOS。
有时候(比如写这篇博客的时候),不能在下载页面中找到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优化。
在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的概览页面。
首先处理这个警告。
按照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
中查看日志。
请参考这篇文章。
虽然是英文,但我相信你会使用翻译工具的,对吧。
如上图,警告strings buffer接近上限。解决这个警告不难,只需要按照上面所说的那样,把opcache.interned_strings_buffer
调高即可。
这里我把它设置成了16
。
services.nextcloud = {
enable = true;
[...]
phpOptions = {
"opcache.interned_strings_buffer" = "16";
};
};
由于我把Nextcloud搭建在EC2上,所以我使用了AWS的SES服务来发送邮件。你也可以选择使用其他服务,比如SendGrid。
SES配置比较麻烦,但简单来说,需要做以下几步:
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;
};
大体上就是把本地部署的配置文件的一部分复制到EC2中,然后按照先前说的那样做一些调整。
使用块存储比较不划算,在文件更多时,以后可能会需要使用对象存储以节省费用。Nix提供了方便的将S3挂载Nextcloud的方法。
因为php的性能问题,不建议在Nextcloud中存放大量文件。
刚刚搭建好,还没有遇到什么问题,如果遇到了,会在这里更新。对于比较大的问题,可能会单独发一篇文章。如果想要不错过任何消息,请在区块链上关注我的博客。