Files
nix-los/flake.nix

204 lines
5.5 KiB
Nix
Raw Normal View History

2026-04-07 02:34:03 +02:00
{
description = "Portable NixOS + Home Manager configuration with sops secrets and disko";
inputs = {
# Core
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Flakes
flake-utils.url = "github:numtide/flake-utils";
# Home Manager
home-manager = {
url = "github:nix-community/home-manager/release-24.11";
inputs.nixpkgs.follows = "nixpkgs";
};
# Secrets management
sops-nix = {
url = "github:mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# Disk partitioning
disko = {
url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, nixpkgs-unstable, flake-utils, home-manager, sops-nix, disko }:
let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
};
pkgs-unstable = import nixpkgs-unstable {
inherit system;
config.allowUnfree = true;
};
# Utility to overlay unstable packages
overlayUnstable = final: prev: {
unstable = pkgs-unstable;
};
in {
# ============================================
# NixOS System Configurations
# ============================================
nixosConfigurations = {
# Example: Laptop configuration
laptop = nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = {
inherit sops-nix disko;
pkgs-unstable = pkgs-unstable;
};
modules = [
overlayUnstable
sops-nix.nixosModules.sops
disko.nixosModules.disko
# Machine-specific config
./hosts/laptop/default.nix
# Shared system modules
./nixos/default.nix
# Home Manager integration
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {
inherit sops-nix pkgs-unstable;
};
home-manager.users.youruser = import ./home/default.nix;
}
];
};
# Example: Server configuration
server = nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = {
inherit sops-nix disko;
pkgs-unstable = pkgs-unstable;
};
modules = [
overlayUnstable
sops-nix.nixosModules.sops
disko.nixosModules.disko
./hosts/server/default.nix
./nixos/default.nix
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = {
inherit sops-nix pkgs-unstable;
};
home-manager.users.youruser = import ./home/default.nix;
}
];
};
};
# ============================================
# Home Manager Standalone (Non-NixOS systems)
# ============================================
homeConfigurations = {
"youruser@linux" = home-manager.lib.homeManagerConfiguration {
inherit pkgs;
extraSpecialArgs = {
pkgs-unstable = pkgs-unstable;
sops-nix = sops-nix;
};
modules = [
overlayUnstable
./home/default.nix
];
};
};
# ============================================
# Development Shell
# ============================================
devShells.${system}.default = pkgs.mkShell {
buildInputs = with pkgs; [
nix
nixpkgs-fmt
sops
age
disko
git
];
shellHook = ''
echo "🔧 NixOS Configuration Development Shell"
echo "Available commands:"
echo " - nix flake check # Check flake validity"
echo " - nix flake show # Show all outputs"
echo " - sudo nixos-rebuild switch --flake .#hostname"
echo " - home-manager switch --flake .#youruser@linux"
echo " - sops secrets/secrets.yaml # Edit encrypted secrets"
'';
};
# ============================================
# Installer Script
# ============================================
apps.${system}.installer = {
type = "app";
program = toString (pkgs.writeShellScript "installer" ''
set -e
if [ -z "$1" ]; then
echo "Usage: nix run .#installer -- <hostname>"
echo "Example: nix run .#installer -- laptop"
exit 1
fi
HOSTNAME=$1
echo "🚀 Bootstrapping NixOS: $HOSTNAME"
# Check if on NixOS
if [ -f /etc/os-release ]; then
. /etc/os-release
if [ "$ID" = "nixos" ]; then
echo " Running on NixOS"
sudo nixos-rebuild switch --flake ".#$HOSTNAME"
echo " NixOS system configured"
else
echo " Not on NixOS - installing home-manager only"
home-manager switch --flake ".#youruser@linux"
echo " Home manager configured"
fi
else
echo " Cannot determine OS"
exit 1
fi
'');
};
};
}