NixOSでServerを構築

NixOS install media
NixOSのISOのダウンロードはここから。
今回はServer用途なのでMinimal ISO imageを選択。
RufusでISOの焼き付けができるので、インストールメディア作成。
NixOS minimal install
基本的にここを見ておけば大丈夫。
UEFIかBIOSかは年代や見た目、その他検索等で判断。
configuration.nix設定後、ユーザーのパスワードを設定するのを忘れずに。
Tips
NixOSインストールの際のディスク設定を宣言的に記述することや、リモート先のインストールを簡単にすることが可能。

ここで一旦Nixの周辺用語について自己整理
間違っている可能性が十分以上にあり得るため、参考程度かつ、訂正や指摘等があればコメントにお願いします。
Nixpkgs
すべての基盤となる巨大なパッケージ集。
Nixというシステム自体が参照しているのもここだし、Nixを下にしたHome ManagerもNix-darwinもすべてここが基盤。
Nix
宣言的かつ再現可能なパッケージマネージャー
NixOS
Nixを基盤としたLinuxディストリビューション。
Home Manager
TBW :-)
Nix-darwin
TBW :-)
Flake
上記Nixのシステムをまとめられるもの。
Dockerとk8sが近い。

Flakeについて、理解をするためにGPTの言ってることを自分なりに自己整理
間違っている、まとめかたが不適切な可能性が十分以上にあり得るため、参考程度かつ、訂正や指摘等があればコメントにお願いします。
Flakeとは
Flakeとは、Inputsで依存を指定し、Outputsで構成や成果物を定義することで、OSレベルの管理(NixOS / Nix-darwin / Home Manager)と、Nix単体のパッケージ・開発環境管理(packages / apps / devShells)を一元化できる仕組み。
Flake内でキーを付けて定義し、--flake .#キー で選択的に呼び出す。
複数構成をまとめるときはFlake内でキーを付け、実行コマンドの --flake .#キー で
どの構成を選択するかを切り替える。
FlakeのOutputsには大きく2つの世界がある:
- OS/環境管理の世界(
nixosConfigurations
,darwinConfigurations
,homeConfigurations
)nixos-rebuild switch --flake .#host
darwin-rebuild switch --flake .#id
home-manager switch --flake .#user@host
- Nix単体のパッケージ管理の世界(
packages
,apps
,devShells
)nix build .#pkg
nix run .#app
nix develop .#shell
これらを1つのFlakeにまとめることで、OSレベルの環境構築と、ユーザ/開発環境の管理を一元化できる。
慣習的には、
- ホストごとの構成は
hosts/<hostname>/configuration.nix
に分ける - 共通設定は
modules/
にまとめてimports
する - 開発用の devShells はプロジェクト直下の Flake に定義して
nix develop
で利用する
といった整理がよく使われる。
Flakeの構成の慣習
- OS構成(NixOS, Darwin, HM)
-
flake.nix
→outputs.nixosConfigurations.<hostname>
- それぞれ
hosts/<hostname>/configuration.nix
に分割 - 共通処理は
modules/
に置いてimports
-
- Nix単体機能(packages, apps, devShells)
- プロジェクト直下の Flake にまとめる
-
devShells.${system}.default
を定義しておけば、開発時に単にnix develop
で入れる -
packages
やapps
はそのプロジェクト固有のビルド物・CLIツールを定義

FlakeひとつでHub的にすべての環境を管理という意図を汲んでGPTが生成したFlake
{
description = "My unified flake";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
home-manager.url = "github:nix-community/home-manager";
darwin.url = "github:LnL7/nix-darwin";
};
outputs = { self, nixpkgs, home-manager, darwin, ... }@inputs: {
nixosConfigurations = {
server = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./hosts/server/configuration.nix
./hosts/server/hardware-configuration.nix
./modules/common
];
};
laptop = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./hosts/laptop/configuration.nix
./hosts/laptop/hardware-configuration.nix
./modules/common
];
};
};
darwinConfigurations = {
macbook = darwin.lib.darwinSystem {
system = "aarch64-darwin";
modules = [
./hosts/macbook/configuration.nix
./modules/darwin
];
};
};
homeConfigurations = {
"steola@laptop" = home-manager.lib.homeManagerConfiguration {
pkgs = nixpkgs.legacyPackages.x86_64-linux;
modules = [ ./modules/home ];
};
};
devShells.x86_64-linux = {
python = import ./devshells/python.nix { inherit nixpkgs; };
rust = import ./devshells/rust.nix { inherit nixpkgs; };
};
};
}

ディレクトリ構成イメージ
Version 1
flake.nix
flake.lock
modules/
common/ # 全マシン共通設定
common.nix <- (EX:time.timeZone, i18n.defaultLocale, nix.settings.experimental-features)
hosts/
nixos/ # NixOS 専用モジュール
darwin/ # macOS 専用モジュール
home/ # Home Manager 共通設定
nixos-server/
configuration.nix
hardware-configuration.nix
laptop/
configuration.nix
hardware-configuration.nix
darwin/
macbook/
configuration.nix
home manager/
steola@laptop.nix
devshells/
python.nix
rust.nix
Version 2
repo/
├─ flake.nix
├─ flake.lock
├─ os/ # OSごとの“共通”ルール
│ ├─ nixos.nix # すべての NixOS マシンに共通
│ ├─ nixos-wsl.nix # NixOS-WSL 共通(nixos-wsl モジュール等)
│ └─ darwin.nix # すべての macOS マシンに共通
├─ hosts/ # 各マシン固有
│ ├─ desktop.nix
│ ├─ laptop.nix
│ ├─ server.nix
│ ├─ wsl.nix # NixOS-WSL 用(hardware は要らないこと多い)
│ └─ macbook.nix # macOS 固有(Dock等・好み)
├─ home/ # Home Manager(ユーザ環境)
│ ├─ common.nix # 共通(基本はこれ1枚)
│ ├─ linux.nix # Linuxだけの差分(必要なら)
│ └─ darwin.nix # macOSだけの差分(必要なら)
└─ modules/ # 機能別の“積み木”
├─ shell.nix # zsh, starship など
├─ editors.nix # neovim, vscode など
├─ users.nix # ユーザー設定など
└─ devtools.nix # git, rust, uv, volta など
↓でも可
modules/
└─ dev/
├─ lang/ # 言語ツールチェーン
│ ├─ rust.nix
│ ├─ python.nix
│ ├─ node.nix
│ └─ go.nix # 追加しやすい
├─ ops/ # 周辺ツール・Ops系
│ ├─ git.nix
│ ├─ shell.nix
│ ├─ docker.nix
│ ├─ kubernetes.nix # kubectl/helm/kind 等
│ ├─ terraform.nix
│ └─ cloudcli.nix # awscli/gcloud/az など
└─ editors.nix # neovim/vscode など共通エディタ
└─ editor
├─ cursor.nix # vscodeやcursor など
└─ neovim.nix # neovim など
Version 3
repo/
├─ flake.nix
├─ flake.lock
├─ overlays/
│ └─ default.nix
├─ os/
│ ├─ default.nix # 各OS共通モジュールを束ねる
│ ├─ nixos.nix
│ ├─ nixos-wsl.nix
│ └─ darwin.nix
├─ profiles/
│ ├─ default.nix
│ ├─ base.nix
│ ├─ desktop.nix
│ ├─ server.nix
│ └─ dev.nix
├─ hosts/
│ ├─ desktop.nix
│ ├─ laptop.nix
│ ├─ server.nix
│ ├─ wsl.nix
│ └─ macbook.nix
├─ home/
│ ├─ default.nix # 共通HMをここに集約
│ ├─ common.nix
│ ├─ linux.nix
│ └─ darwin.nix
├─ modules/
│ ├─ system/
│ │ ├─ users.nix
│ │ ├─ devtools.nix # system側(docker等)
│ │ ├─ editors.nix
│ │ └─ shell.nix # zsh等をsystemで入れる場合
│ └─ home/
│ ├─ shell.nix # zsh/starship等をHMで入れる場合
│ ├─ editors.nix # neovim/cursorをHMで
│ └─ devtools.nix # git/uv/volta 等をHMで
└─ secrets/ # agenix/sops-nix