2020-12-28 23:27:32 +01:00
|
|
|
> Since flakes are still quite new, I've listed some learning resources
|
|
|
|
> [below](#resources).
|
|
|
|
|
2019-12-03 06:18:30 +01:00
|
|
|
# Introduction
|
2020-08-03 00:10:53 +02:00
|
|
|
Herein lies a [NixOS][NixOS] configuration template using the new [flakes][wiki]
|
|
|
|
mechanism. Its aim is to provide a generic repository which neatly separates
|
|
|
|
concerns and allows one to get up and running with NixOS faster than ever, while
|
|
|
|
keeping your code clean and organized.
|
|
|
|
|
|
|
|
Some key advantages include:
|
|
|
|
* A single home for all your Nix expressions, easily sharable and portable!
|
2020-12-28 05:33:28 +01:00
|
|
|
* Skip the boilerplate, simply use the included [nix-shell](./shell.nix) or
|
2020-08-03 00:10:53 +02:00
|
|
|
[direnv][direnv] profile and get up and running with flakes right away.
|
|
|
|
* Thanks to flakes, the entire system is more [deterministic](./flake.lock).
|
|
|
|
* Systems defined under [hosts](./hosts) are automatically imported into
|
|
|
|
`nixosConfigurations`, ready to deploy.
|
|
|
|
* [Profiles](./profiles/list.nix) are a simple mechanism for using portable
|
|
|
|
code across machines, and are available to share via the
|
|
|
|
`nixosModules.profiles` output.
|
|
|
|
* Defined [packages](./pkgs/default.nix) and
|
|
|
|
[modules](./modules/list.nix), are automatically wired and available from
|
|
|
|
anywhere. They are _also_ sharable via their respective flake outputs.
|
|
|
|
* Easily [override](./pkgs/override.nix) packages from different nixpkgs versions.
|
|
|
|
* Keep [user](./users) configuration isolated and easily reusable by taking
|
|
|
|
advantage of [user profiles](./users/profiles) and [home-manager][home-manager].
|
|
|
|
* [Overlay](./overlays) files are automatically available and sharable.
|
2020-12-28 05:33:28 +01:00
|
|
|
* Automatic [NUR][nur] support.
|
2020-08-03 00:10:53 +02:00
|
|
|
|
|
|
|
For a more detailed explanation of the code structure, check out the
|
|
|
|
[docs](./DOC.md).
|
2020-01-12 03:51:23 +01:00
|
|
|
|
|
|
|
### ⚠ Advisory
|
2020-08-03 00:10:53 +02:00
|
|
|
Flakes are still new, so not everything works yet. However, it has been to
|
|
|
|
merged in [nixpkgs][nixpkgs] via [`pkgs.nixFlakes`][nixFlakes]. Thus, this
|
|
|
|
project should be considered _experimental_, until flakes become the default.
|
2019-12-05 09:36:15 +01:00
|
|
|
|
2020-12-29 06:15:10 +01:00
|
|
|
Also, flakes are meant to deprecate nix-channels. It's recommended not to
|
|
|
|
install any. If your really want them, they should work if you hook them into
|
2020-08-03 00:10:53 +02:00
|
|
|
`NIX_PATH`.
|
2020-01-08 00:37:46 +01:00
|
|
|
|
2020-12-29 06:15:10 +01:00
|
|
|
# Sharing
|
|
|
|
One of the great benefits of flakes is the ability to easily share your user
|
|
|
|
defined packages, modules and other nix expressions without having to merge
|
|
|
|
anything upstream. In that spirit, everything defined in this flake is usable
|
|
|
|
from other flakes. So even if you don't want to use this project as a template,
|
|
|
|
you can still pull in any useful modules, packages or profiles defined here.
|
|
|
|
|
|
|
|
From the command line:
|
|
|
|
```sh
|
|
|
|
# to see what this flake exports
|
|
|
|
nix flake show "github:nrdxp/nixflk"
|
|
|
|
|
|
|
|
# run an app
|
|
|
|
nix run "github:nrdxp/nixflk#someApp"
|
|
|
|
|
|
|
|
# start a dev shell for a given derivation
|
|
|
|
nix develop "github:nrdxp/nixflk#somePackage"
|
|
|
|
|
|
|
|
# a nix shell with the package in scope
|
|
|
|
nix shell "github:nrdxp/nixflk#somePackage"
|
|
|
|
```
|
|
|
|
|
|
|
|
From within a flake:
|
|
|
|
```nix
|
|
|
|
{
|
|
|
|
inputs.nixflk.url = "github:nrdxp/nixflk";
|
|
|
|
|
|
|
|
outputs = { self, nixpkgs, nixflk, ... }:
|
|
|
|
{
|
|
|
|
nixosConfigurations.example = nixpkgs.lib.nixosSystem {
|
|
|
|
# ...
|
|
|
|
modules = [
|
|
|
|
nixflk.nixosModules.someModule
|
|
|
|
({
|
|
|
|
nixpkgs.overlays = [ nixflk.overlay nixflk.overlays.someOverlay ];
|
|
|
|
})
|
|
|
|
# ...
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-01-08 00:37:46 +01:00
|
|
|
# Setup
|
2020-12-29 06:15:10 +01:00
|
|
|
There are a few ways to get up and running. You can fork this repo or use it as
|
2021-02-04 03:16:27 +01:00
|
|
|
a template. There is a [community][community] branch with a bunch of useful
|
|
|
|
profiles, modules, overlays, etc, already configured for you to use. Please
|
|
|
|
consider adding your own expressions there if you feel they would be helpful
|
|
|
|
for others.
|
|
|
|
|
|
|
|
The only hard requirement is nix itself. The `shell.nix` will pull in
|
|
|
|
everything else.
|
2020-01-04 01:47:17 +01:00
|
|
|
|
2020-12-29 06:15:10 +01:00
|
|
|
## Flake Templates
|
2020-08-03 00:10:53 +02:00
|
|
|
If you already have [nix-command][nix-command] setup you can:
|
2020-12-28 05:33:28 +01:00
|
|
|
```sh
|
2021-02-04 03:16:27 +01:00
|
|
|
# for the core template with no profiles
|
2020-08-03 00:10:53 +02:00
|
|
|
nix flake new -t "github:nrdxp/nixflk" flk
|
2020-01-04 01:47:17 +01:00
|
|
|
|
2021-02-04 03:16:27 +01:00
|
|
|
# for the community template
|
|
|
|
nix flake new -t "github:nrdxp/nixflk/community" flk
|
2020-08-03 00:10:53 +02:00
|
|
|
```
|
2020-01-07 00:57:35 +01:00
|
|
|
|
2020-12-29 06:15:10 +01:00
|
|
|
## Nix Only
|
|
|
|
Once you have this repo, you'll want to __move or symlink__ it to `/etc/nixos`
|
|
|
|
for ease of use. Once inside:
|
2020-12-28 05:33:28 +01:00
|
|
|
```sh
|
2021-02-04 03:16:27 +01:00
|
|
|
# probably want to use a separate branch for you config
|
|
|
|
git checkout -b my-branch
|
|
|
|
|
2020-12-29 06:15:10 +01:00
|
|
|
# This will setup nix-command and pull in the needed tools
|
2020-08-03 00:10:53 +02:00
|
|
|
nix-shell # or `direnv allow` if you prefer
|
2020-08-02 23:24:00 +02:00
|
|
|
|
2021-01-11 21:15:55 +01:00
|
|
|
# use nixos-generate-config to generate a basic config for your system
|
|
|
|
# edit hosts/up-$(hostname).nix to modify.
|
|
|
|
flk up
|
2019-12-05 09:36:15 +01:00
|
|
|
|
2020-12-29 06:15:10 +01:00
|
|
|
# The following should work fine for EFI systems.
|
|
|
|
# boot.loader.systemd-boot.enable = true;
|
|
|
|
# boot.loader.efi.canTouchEfiVariables = true;
|
|
|
|
|
|
|
|
# Set your locale
|
|
|
|
$EDITOR local/locale.nix
|
|
|
|
|
|
|
|
# install NixOS to bare metal
|
|
|
|
flk install yourConfig # deploys hosts/yourConfig.nix
|
|
|
|
|
|
|
|
# if you already have NixOS and just want to deploy your new setup
|
|
|
|
flk yourConfig switch
|
2020-01-12 03:51:23 +01:00
|
|
|
```
|
2019-12-05 09:36:15 +01:00
|
|
|
|
2021-01-12 01:32:58 +01:00
|
|
|
### Note on `flk up`:
|
|
|
|
While the `up` sub-command is provided as a convenience to quickly set up and
|
|
|
|
install a "fresh" NixOS system on current hardware, committing these files is
|
|
|
|
discouraged.
|
|
|
|
|
|
|
|
They are placed in the git staging area automatically because they would be
|
|
|
|
invisible to the flake otherwise, but it is best to move what you need from
|
|
|
|
them directly into your hosts file and commit that instead.
|
|
|
|
|
2021-01-16 20:24:58 +01:00
|
|
|
## Home Manager Integration
|
|
|
|
The home-manager nixos module is available for each host. It is meant
|
|
|
|
to be used in the user profiles, you can find an example in the nixos user profile
|
|
|
|
|
|
|
|
The home-manager configuration for each user in each system is available in the
|
|
|
|
outputs as homeConfigurations and the activation packages in hmActivationPackages.
|
|
|
|
|
|
|
|
This allows you to just build the home-manager environment without the rest of the
|
|
|
|
system configuration. The feature is useful on systems without nixos or root access.
|
|
|
|
|
2021-02-04 03:16:27 +01:00
|
|
|
Lets say you want to activate the home configuration for the user `nixos` in the
|
2021-01-16 20:24:58 +01:00
|
|
|
host `NixOS`.
|
|
|
|
|
|
|
|
With the flk script:
|
|
|
|
```sh
|
|
|
|
# You can build it using
|
|
|
|
flk home NixOS nixos
|
|
|
|
# and activate with
|
|
|
|
./result/activate
|
|
|
|
|
|
|
|
# Or do both like this
|
|
|
|
flk home NixOS nixos switch
|
|
|
|
```
|
|
|
|
|
2020-08-03 00:10:53 +02:00
|
|
|
## Build an ISO
|
2020-01-04 01:47:17 +01:00
|
|
|
|
2021-01-25 22:48:51 +01:00
|
|
|
You can make an ISO out of any config:
|
2020-12-28 05:33:28 +01:00
|
|
|
```sh
|
2021-01-25 22:48:51 +01:00
|
|
|
flk iso yourConfig # build an iso for hosts/yourConfig.nix
|
2020-12-28 05:33:28 +01:00
|
|
|
```
|
|
|
|
|
2021-01-18 08:37:11 +01:00
|
|
|
## Hardware Specific Profile for a Single Host
|
|
|
|
|
2021-02-04 03:16:27 +01:00
|
|
|
Find out the fitting
|
|
|
|
[nixos-hardware profile](https://github.com/NixOS/nixos-hardware#list-of-profiles)
|
|
|
|
for the hardware of your host, then find the corresponding modules in the
|
|
|
|
[flake](https://github.com/NixOS/nixos-hardware/blob/master/flake.nix) and add
|
|
|
|
it to the configuration. For example for a Dell XPS 13 9370 the host
|
|
|
|
configuration would contain:
|
2021-01-18 08:37:11 +01:00
|
|
|
```nix
|
|
|
|
{
|
2021-01-19 10:45:06 +01:00
|
|
|
imports = [ hardware.dell-xps-13-9370 ... ];
|
2021-01-18 08:37:11 +01:00
|
|
|
...
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-12-28 05:33:28 +01:00
|
|
|
## Use a Package from NUR
|
|
|
|
|
|
|
|
NUR is wired in from the start. For safety, nothing is added from it by default,
|
|
|
|
but you can easily pull packages from inside your configuration like so:
|
|
|
|
```nix
|
|
|
|
{ pkgs, ... }:
|
|
|
|
{
|
|
|
|
environment.systemPackages = with pkgs; [ nur.repos.<owner>.<package> ];
|
|
|
|
}
|
2020-01-05 11:43:28 +01:00
|
|
|
```
|
2020-12-28 23:27:32 +01:00
|
|
|
# Resources
|
|
|
|
|
|
|
|
## Links
|
|
|
|
* [Example Repo](https://github.com/colemickens/nixos-flake-example)
|
|
|
|
* [Tweag.io _Flakes_ Blog Series](https://www.tweag.io/blog/2020-05-25-flakes)
|
|
|
|
* [NixOS _Flakes_ Wiki](https://nixos.wiki/wiki/Flakes)
|
|
|
|
* [Zimbatm's _Flakes_ Blog](https://zimbatm.com/NixFlakes)
|
|
|
|
* [Original RFC](https://github.com/tweag/rfcs/blob/flakes/rfcs/0049-flakes.md)
|
2020-01-02 07:17:50 +01:00
|
|
|
|
2020-08-03 00:10:53 +02:00
|
|
|
## Flake Talk:
|
|
|
|
[![Flake talk at NixConf][thumb]][video]
|
|
|
|
|
2020-12-28 23:27:32 +01:00
|
|
|
|
2019-12-03 06:18:30 +01:00
|
|
|
# License
|
|
|
|
|
|
|
|
This software is licensed under the [MIT License](COPYING).
|
|
|
|
|
|
|
|
Note: MIT license does not apply to the packages built by this configuration,
|
|
|
|
merely to the files in this repository (the Nix expressions, build
|
|
|
|
scripts, NixOS modules, etc.). It also might not apply to patches
|
|
|
|
included here, which may be derivative works of the packages to
|
|
|
|
which they apply. The aforementioned artifacts are all covered by the
|
|
|
|
licenses of the respective packages.
|
|
|
|
|
2021-02-04 03:16:27 +01:00
|
|
|
[community]: https://github.com/nrdxp/nixflk/tree/community
|
2020-01-02 07:17:50 +01:00
|
|
|
[direnv]: https://direnv.net
|
2020-12-30 17:47:46 +01:00
|
|
|
[home-manager]: https://github.com/nix-community/home-manager
|
2020-08-03 00:10:53 +02:00
|
|
|
[nix-command]: https://nixos.wiki/wiki/Nix_command
|
|
|
|
[nixFlakes]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/package-management/nix/default.nix#L211
|
2019-12-03 06:18:30 +01:00
|
|
|
[NixOS]: https://nixos.org
|
2020-08-03 00:10:53 +02:00
|
|
|
[nixpkgs]: https://github.com/NixOS/nixpkgs
|
2020-01-11 07:49:18 +01:00
|
|
|
[nur]: https://github.com/nix-community/NUR
|
2020-08-03 00:10:53 +02:00
|
|
|
[wiki]: https://nixos.wiki/wiki/Flakes
|
2020-01-08 00:37:46 +01:00
|
|
|
[thumb]: https://img.youtube.com/vi/UeBX7Ide5a0/hqdefault.jpg
|
2020-08-03 00:10:53 +02:00
|
|
|
[video]: https://www.youtube.com/watch?v=UeBX7Ide5a0
|
2020-12-28 05:33:28 +01:00
|
|
|
[nur]: https://github.com/nix-community/NUR
|