-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add new post: nixos-on-aws-lightsail-deploying-with-colmena
- Loading branch information
1 parent
ece8e47
commit 2310afd
Showing
1 changed file
with
120 additions
and
0 deletions.
There are no files selected for viewing
120 changes: 120 additions & 0 deletions
120
...t/posts/2024-04-23-nixos-on-aws-lightsail-deploying-with-colmena/index.zh-cn.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
+++ | ||
title = '在 AWS Lightsail 上安装并使用 NixOS && 使用 Colmena 实现远程部署' | ||
date = 2024-04-23T01:14:34+08:00 | ||
tags = ['NixOS', 'VPS'] | ||
+++ | ||
|
||
# 序 | ||
|
||
最近把自己的 VPS 从 Vultr 换成了 AWS 的 Lightsail,决定正好装上我正在用的 NixOS。 | ||
|
||
## 安装 NixOS | ||
|
||
在不提供安装自定义系统的 VPS 提供商上安装 NixOS 主要有两种方式,分别是 [`nixos-infect`](https://github.com/elitak/nixos-infect) 和 [`nixos-anywhere`](https://github.com/nix-community/nixos-anywhere) | ||
|
||
> NixOS-Infect 工具的原理是在本地系统上安装 Nix Daemon,再使用它构建一个完整的 NixOS 系统,最后将原系统的启动项替换成 NixOS 的。由于这种方法不需要在内存中解压 NixOS 的完整安装镜像,这种方法更适合小内存的 VPS。但这种方法的缺点是无法自定义分区结构和文件系统类型。只能使用 VPS 服务商的默认分区配置。对于使用 Btrfs/ZFS 以及 Impermanence 等非标准分区方案/文件系统的用户不友好。 | ||
> | ||
> 而 NixOS-Anywhere 的原理是通过 Linux 内核的 kexec 功能替换当前运行的内核,直接启动到内存中的 NixOS 的安装镜像,本质原理与 netboot.xyz 大致相同,因此也与 netboot.xyz 一样需要较大的内存空间。 | ||
-- Lan Tian @ [NixOS 系列(五):制作小内存 VPS 的 DD 磁盘镜像](https://lantian.pub/article/modify-computer/nixos-low-ram-vps.lantian/) | ||
|
||
`nixos-infect` 相对来说比 `nixos-anywhere` 简单,只需要跑一个脚本即可。由于我没有尝试过 `nixos-infect` 故本文不赘述。 | ||
|
||
在 Lightsail 上使用 `nixos-infect` 安装 NixOS 只需要运行以下这条命令,通常来说大致运行十分钟就会自动重启到 NixOS。重启后可以直接使用 AWS 提供的 ssh key 登陆 root 账户。 | ||
|
||
```sh | ||
curl https://raw.githubusercontent.com/elitak/nixos-infect/master/nixos-infect | PROVIDER="lightsail" NIX_CHANNEL=nixos-23.05 bash | ||
``` | ||
|
||
## 配置 NixOS | ||
|
||
Nixpkgs 里包含了 AWS EC2/Lightsail 的懒人配置,会自动获取机器的 metadata 与配置 hostname, ssh key, NTP 等。 | ||
|
||
实现详情可以查看 https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/amazon-image.nix | ||
|
||
你可以在 `/etc/nixos/configuration.nix` 找到 `nixos-infect` 提前帮你安装的配置,通常来说会长这样: | ||
|
||
```nix | ||
{ config, pkgs, modulesPath, lib, ... }: | ||
{ | ||
imports = [ "${modulesPath}/virtualisation/amazon-image.nix" ]; | ||
boot.loader.grub.device = lib.mkForce "/dev/nvme0n1"; | ||
} | ||
``` | ||
|
||
## 配置 Colmena | ||
|
||
其实完成上一步后你已经可以使用完整的 NixOS 了,~~但是因为某些不知名的原因~~我还是选择了使用 [Colmena](https://github.com/zhaofengli/colmena)。 | ||
(对于我一台机器来说是有点大材小用了,Colmena 主要还是更适用于批量部署。) | ||
|
||
假设你已经在使用 Flake,第一步是在你的 `flake.nix` 里添加 Colmena 的 output 配置与在本地安装 Colmena。 | ||
|
||
可以在 https://colmena.cli.rs/unstable/reference/index.html 找到选项的详细信息。 | ||
|
||
```nix | ||
{ | ||
inputs = { | ||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; | ||
... | ||
}; | ||
outputs = inputs: { | ||
nixosConfigurations = { | ||
... | ||
}; | ||
colmena = { | ||
meta = { | ||
specialArgs = {inherit inputs;}; # 在配置文件里使用 flake inputs | ||
nixpkgs = import inputs.nixpkgs { | ||
system = "x86_64-linux"; | ||
}; | ||
}; | ||
"lightsail-tokyo" = { | ||
imports = [./hosts/lightsail-tokyo]; # 导入配置文件或 modules | ||
# 相当于 imports = [./hosts/lightsail-tokyo/default.nix]; | ||
deployment = { | ||
targetHost = "123.456.789.012"; # 替换为你自己机器的地址 | ||
targetPort = 2222; # ssh 端口 | ||
# 标签,可以通过 colmena apply --on 'web' 仅部署给部分机器,支持通配符。 | ||
deployment.tags = [ "web" "infra-lax" ]; | ||
}; | ||
}; | ||
}; | ||
}; | ||
} | ||
``` | ||
|
||
接下来你需要在 `~/.ssh/config` 配置 VPS 需要的 ssh 密钥,格式如下: | ||
|
||
``` | ||
Host 123.456.789.012 | ||
IdentityFile ~/Documents/LightsailDefaultKey | ||
-ap-xxx-1.pem.crt | ||
``` | ||
|
||
(不要忘记 `chmod 600`。) | ||
|
||
## 使用 Colmena | ||
|
||
你可以通过 `colmena -h` 查看帮助,简要的教程是: | ||
|
||
- 通过 `colmena apply` 可以批量部署。 | ||
|
||
添加 `--on xxx` 可以用 tags 指定部分机器。 | ||
|
||
添加 `--build-on-target` 在远端构建。 | ||
|
||
添加 `-v` 显示日志。 | ||
|
||
- 通过 `colmena build` 可以批量构建所有机器的 NixOS | ||
|
||
- 通过 `colmena exec "echo \$LANG | tee /tmp/test"` 可以批量远程运行命令。 | ||
|
||
``` | ||
❯ cat /tmp/test | ||
en_US.UTF-8 | ||
``` |