Open5

NixOSでServerを構築

steolasteola

NixOS install media

NixOSのISOのダウンロードはここから。
今回はServer用途なのでMinimal ISO imageを選択。
RufusでISOの焼き付けができるので、インストールメディア作成。

NixOS minimal install

基本的にここを見ておけば大丈夫。
UEFIかBIOSかは年代や見た目、その他検索等で判断。
configuration.nix設定後、ユーザーのパスワードを設定するのを忘れずに。

Tips

NixOSインストールの際のディスク設定を宣言的に記述することや、リモート先のインストールを簡単にすることが可能。

steolasteola

ここで一旦Nixの周辺用語について自己整理
間違っている可能性が十分以上にあり得るため、参考程度かつ、訂正や指摘等があればコメントにお願いします。

Nixpkgs

すべての基盤となる巨大なパッケージ集。
Nixというシステム自体が参照しているのもここだし、Nixを下にしたHome ManagerもNix-darwinもすべてここが基盤。

Nix

宣言的かつ再現可能なパッケージマネージャー

NixOS

Nixを基盤としたLinuxディストリビューション。

Home Manager

TBW :-)

Nix-darwin

TBW :-)

Flake

上記Nixのシステムをまとめられるもの。
Dockerとk8sが近い。

steolasteola

Flakeについて、理解をするためにGPTの言ってることを自分なりに自己整理
間違っている、まとめかたが不適切な可能性が十分以上にあり得るため、参考程度かつ、訂正や指摘等があればコメントにお願いします。

Flakeとは

Flakeとは、Inputsで依存を指定し、Outputsで構成や成果物を定義することで、OSレベルの管理(NixOS / Nix-darwin / Home Manager)と、Nix単体のパッケージ・開発環境管理(packages / apps / devShells)を一元化できる仕組み。
Flake内でキーを付けて定義し、--flake .#キー で選択的に呼び出す。
複数構成をまとめるときはFlake内でキーを付け、実行コマンドの --flake .#キー で
どの構成を選択するかを切り替える。

FlakeのOutputsには大きく2つの世界がある:

  1. OS/環境管理の世界(nixosConfigurations, darwinConfigurations, homeConfigurations
    • nixos-rebuild switch --flake .#host
    • darwin-rebuild switch --flake .#id
    • home-manager switch --flake .#user@host
  2. 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.nixoutputs.nixosConfigurations.<hostname>
    • それぞれhosts/<hostname>/configuration.nixに分割
    • 共通処理はmodules/に置いてimports
  • Nix単体機能(packages, apps, devShells)
    • プロジェクト直下の Flake にまとめる
    • devShells.${system}.defaultを定義しておけば、開発時に単にnix developで入れる
    • packagesappsはそのプロジェクト固有のビルド物・CLIツールを定義
steolasteola

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; };
    };
  };
}
steolasteola

ディレクトリ構成イメージ

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