nixos-config/README.adoc

308 lines
14 KiB
Plaintext
Raw Normal View History

2020-08-06 15:35:49 +00:00
= foo-dogsquared's NixOS config
2021-11-30 01:03:05 +00:00
:toc:
2022-07-09 06:04:17 +00:00
:devos_link: https://github.com/divnix/digga/tree/580fc57ffaaf9cf3a582372235759dccfe44ac92/examples/devos
2022-09-28 11:11:12 +00:00
:canonical_flake_url: github:foo-dogsquared/nixos-config
:canonical_flake_url_tarball_master: https://github.com/foo-dogsquared/nixos-config/archive/master.tar.gz
:canonical_flake_url_tarball_specific: https://github.com/foo-dogsquared/nixos-config/archive/35c27749c55077727529f412dade862e4deb2ae8.tar.gz
2020-08-06 15:35:49 +00:00
This is my NixOS config as a link:https://www.tweag.io/blog/2020-05-25-flakes/[Nix flake].
2020-08-06 15:35:49 +00:00
2021-12-21 06:29:27 +00:00
I finally have some time trying to grok flakes and redo my NixOS config from scratch after leaving it for some time (because I have work and have to quickly set things up without me trying to debug how NixOS works).
Here is the result.
2020-08-06 15:35:49 +00:00
2022-02-11 04:31:44 +00:00
== Getting started
2022-07-05 14:33:01 +00:00
[CAUTION]
====
Despite being a NixOS system, it isn't entirely reproducible to the point of installing this config will work out-of-the-box.
It has some things needed in the first place to work like my external backup setup where it needs my SSH private keys to work in the first place.
Nonetheless, the parts is it isn't reproducible is only about 10% of this config.
Everything else is fine and dandy.
2022-07-09 06:04:17 +00:00
Oh right...
Don't expect everything is working in each commit but I'm doing my best to make them build successfully in each, yeah?
Also, this configuration is expected to use under non-restricted evaluation mode.
2022-07-05 14:33:01 +00:00
====
2022-02-11 04:31:44 +00:00
Hey there, fellow traveler!
You've fell into the rabbit hole we call Nix where it leads to other rabbit holes such as functional package management, reproducibility, declarative systems, and immutable operating systems.
This is one of the many tickets to that rabbit hole, allow me to be your guide in this mark:[painful] wonderful declarative journey.
Hope to see you on the other side!
=== Installation
2020-08-06 15:35:49 +00:00
Since this uses Nix flakes, you should have Nix v2.8 and above installed.
2021-12-21 06:29:27 +00:00
2022-02-11 04:31:44 +00:00
If you're going to install one of my NixOS configs, be sure to download the unstable versions from link:https://releases.nixos.org/?prefix=nixos/unstable/[their release page].
As an additional option, you can also use link:https://github.com/foo-dogsquared/nixos-config/releases/tag/latest[my personalized NixOS installers] which is primarily intended for me configs.
This primarily uses Nix flakes so you can have a preview of what's available in my config.
2020-08-06 15:35:49 +00:00
2022-10-01 04:51:10 +00:00
[source, shell, subs=attributes]
2020-08-06 15:35:49 +00:00
----
2022-09-28 11:11:12 +00:00
nix flake show {canonical_flake_url}
----
It should export my NixOS configurations of my different hosts (of only one so far excluding VMs and VPSs ;p) among other things.
2022-09-28 11:11:12 +00:00
To install it, run the `nixos-install --flake {canonical_flake_url}#ni`.
(Please see the respective appropriate host README for more information.)
2021-12-26 10:43:23 +00:00
2022-02-11 04:31:44 +00:00
=== The remote repo
For a complete overkill, we use a CI to further the configuration abomination.
It uses GitHub workflows to enable things such as...
2022-02-11 04:31:44 +00:00
* Automatically building link:./pkgs[my custom packages] and sending them to my binary cache to easily distribute it for others.
* Building my personalized NixOS installers and link:https://github.com/foo-dogsquared/nixos-config/releases[making a release out of it].
* Testing the flake outputs (in progress lel).
2022-02-11 04:31:44 +00:00
=== Project structure
Last and foremost, we have the project directory — the environment you'll be living in for the next year, tinkering your Nix configs.
.
It is required to be familiar with the workspace, after all.
2022-07-09 06:04:17 +00:00
My configuration takes a lot of cues from link:{devos_link}[devos] (which is unfortunately is a lot to take if you're just beginning to grok Nix as a whole).
2021-11-29 10:27:56 +00:00
My NixOS config should look like the following:
[source, tree]
----
nixos-config
├── hosts/
├── lib/
├── modules/
├── pkgs/
2022-11-26 16:52:16 +00:00
├── scripts/
├── secrets/
├── shells/
├── templates/
2021-11-29 10:27:56 +00:00
├── users/
├── default.nix
2021-11-29 10:27:56 +00:00
├── flake.lock
├── flake.nix
├── images.toml
2021-11-29 10:27:56 +00:00
└── README.adoc
----
One of the more notable files here when first start looking is the link:./images.toml[`./images.toml`] file where it contains a description of the images.
For more details, see <<declarative-host-management>>.
2022-02-23 08:34:48 +00:00
Most of the said folders are related to a flake output attribute, see <<whats-in-my-flake>> for more details.
2022-02-11 04:31:44 +00:00
2021-11-29 10:27:56 +00:00
* link:./hosts/[`./hosts/`] contain machine-specific configuration.
This usually configures like the hardware setup, timezone, and users.
Host configurations are also exported in the flakes in `outputs.nixosConfigurations`.
2021-12-06 09:57:54 +00:00
* link:./modules/[`./modules/`] contain my custom modules including NixOS and home-manager modules.
2021-11-29 10:27:56 +00:00
For more information, see the link:./modules/README.adoc[related documentation].
* link:./pkgs/[`./pkgs/`] contains my custom packages.
2021-12-06 10:12:00 +00:00
It is exported in the flakes at `outputs.packages` compiled through various systems.
2021-11-29 10:27:56 +00:00
2023-01-06 12:26:13 +00:00
* link:./scripts/[`./scripts/`] contains various scripts for various purposes.
2022-11-26 16:52:16 +00:00
Should be self-explanatory.
2023-01-12 15:00:06 +00:00
* link:./secrets/[`./secrets/`] contains my cluster-wide secrets managed with link:https://github.com/mozilla/sops[sops] and link:https://github.com/Mic92/sops-nix[sops-nix].
Take note, each component (e.g., hosts, modules, users) could have their own specific secrets.
* link:./shells/[`./shells/`] contains my development shells for interacting with the usual type of projects.
Setting this up can bring benefits outside of NixOS (unless you're interacting with projects with any OpenGL-related stuff).
footnote:[Since packages brought from Nix shells can only work with the store, a container might be better at some situations.]
* link:./templates/[`./templates/`] contains my custom templates handy for quickly initializing for various types of projects.
2022-01-03 09:30:24 +00:00
* link:./users/[`./users/`] contains my link:https://github.com/nix-community/home-manager[home-manager] configurations.
2021-11-29 10:27:56 +00:00
It is exported in the flakes at `outputs.homeConfigurations`.
For more information, see the link:./users/README.adoc[related documentation].
[#declarative-host-management]
=== Declarative host management
This project uses a custom setup for declarative host management.
Specifically, it is done with a simple file at link:./images.toml[`./images.toml`] where it expects a table of the hosts' metadata.
Each host in the table represents one of the hosts at link:./hosts/[`./hosts/`].
A host metadata has a certain schema which the following example is a complete version of it.
The data is then used for certain functions in the flake definition file (i.e., `flake.nix`).
[#lst:images-metadata-example]
[source, toml]
----
[plover]
system = "x86_64-linux"
format = "iso"
hostname = "ploverrific"
domain = "foodogsquared.one"
nixpkgs-channel = "nixos-unstable-small"
[plover.deploy]
hostname = "plover.foodogsquared.one"
ssh-user = "admin"
fast-connection = true
auto-rollback = true
magic-rollback = true
remote-build = true
----
For a complete reference, here are the expected attributes.
- `system` contains the platform of the host system.
This is mainly used to indicate the platform used for the nixpkgs repository.
- `format` is the image output format for the host.
It expects an accepted value from link:https://github.com/nix-community/nixos-generators[nixos-generators] project.
- `hostname` is the canonical hostname for the host.
If unset, the hostname is the name of the table key.
In the <<lst:images-metadata-example, previous example>>, if `plover.hostname` is unset, the value would be `plover` instead of `ploverrific`.
- `domain` is the domain used for networking configuration.
It is set for `networking.domain` in NixOS configuration.
- `nixpkgs-channel` is the nixpkgs channel to be used for the host.
The value could be any one of the nixpkgs flake inputs imported into this flake.
By default, it uses `nixpkgs` flake input which points to the `nixos-unstable` channel.
- `deploy` is a table containing arguments from link:https://github.com/serokell/deploy-rs[deploy-rs].
Only a few arguments are accepted (i.e., `hostname`, `fast-connection`, `remote-build`, `magic-rollback`, and `auto-rollback`).
Take note, only certain hosts can be considered as a NixOS configuration (e.g., `nixosConfigurations`).
Specifically, those images with a format of `iso` and those without (since they fall back to `iso` anyways).
Those NixOS configuration are then included as part of the deploy nodes for deploy-rs.
Otherwise, most images are intended to be built.
footnote:[Though, one could create a custom activation and deployment script with deploy-rs.]
[#declarative-user-management]
=== Declarative user management
Similarly to <<declarative-host-management>>, this project also provides a way to declare home-manager users.
Similar to `images.toml`, it expects a table of users with each representing one of the users from link:./users/home-manager/[`./users/home-manager/`].
These are then included as part of `homeConfigurations` for easier installation with the standalone home-manager tool.
Of which they are then included as part of deploy nodes for deploy-rs (also for easier deployment).
Here's an example user with complete schema.
[source, toml]
----
[foo-dogsquared]
system = "x86_64-linux"
home-manager-channel = "home-manager-23.05"
home-directory = "/home/foo-dogsquared"
username = "foodogsquared"
[foo-dogsquared.deploy]
hostname = "local.foodogsquared.one"
ssh-user = "admin"
profile = "foodogsquared"
fast-connection = true
auto-rollback = true
magic-rollback = true
remote-build = true
----
- `system` contains the platform of the home-manager user.
This is mainly used to indicate the platform used for the nixpkgs repository.
- `home-manager-channel` contains the home-manager channel to be used.
The value should be one of the home-manager channel that is imported into this flake.
By default, it sets the home-manager channel at `home-manager` which is pointed at the unstable channel.
- `home-directory` is the associated home directory of the home-manager.
It is set for `config.home.directory` at the home-manager configuration.
By default, it will be set at `/home/$USERNAME`.
- `username` is the username of the home-manager user to be used for `config.home.username` at the home-manager configuration.
If unset, it will use the table key.
In the above example, the unset value would be `foo-dogsquared`.
- `deploy` is pretty similar to the previous configuration setting that it sets certain options for deploy-rs.
[#secrets-management]
=== Secrets management
This repo uses link:https://github.com/mozilla/sops[sops] as the main secret management tool.
For integrating this into NixOS, I use link:https://github.com/Mic92/sops-nix[sops-nix].
To get started using sops, I recommend to take a look at `.sops.yaml` file which secrets belong to whom.
Then edit a secrets with `sops PATH_TO_SECRET`.
Take note, you need to respective keys to edit the secret in the first place.
If you edit `./secrets/backup-archive.yaml` for example, it needs one of the keys (either my age and GPG key or the age key from host `ni`).
2021-11-29 10:27:56 +00:00
== TODO
In order of priority:
* [x] Create custom modules.
* [x] Create a themes system similar to link:https://github.com/hlissner/dotfiles[this NixOS config].
2022-02-04 15:59:57 +00:00
* [x] Create a good workflow for creating ISOs.
* [x] Create development shells.
2021-11-29 10:27:56 +00:00
* [x] Manage secrets with agenix.
2021-12-26 10:43:23 +00:00
* [ ] Create a good workflow for tests.
* [x] Automate backups with NixOS config.
2021-11-29 10:27:56 +00:00
* [x] Create custom packages and export it to flakes. (Maybe consider making it to upstream)
* [x] Create cluser-wide configs.
* [x] Create host-wide configs.
2021-11-29 10:27:56 +00:00
* [x] Create user-specific configs with home-manager.
2022-07-09 06:04:17 +00:00
* [x] ~Steal~ Get some ideas from link:{devos_link}[this overengineered template].
2021-11-29 10:27:56 +00:00
* [x] Make use of other established utilities such as link:https://github.com/divnix/digga/[digga], link:https://github.com/gytis-ivaskevicius/flake-utils-plus[flake-utils-plus], and link:https://github.com/nix-community/home-manager[home-manager] once I'm familiar to create my own Nix programs.
2022-02-23 08:34:48 +00:00
=== Out of scope:
* Set most program configurations with Nix.
This is especially applicable to programs I always use such as my text editor configs.
** The reason: managing them can be chaotic when applied with Nix.
The potential for it is pretty nice especially when seen with similar implementations such as Guix home environment.
However, I don't want to rebuild it every time I change it.
** Plus, most of my applications are now installed using link:https://flatpak.org/[Flatpak] anyways.
It is a tad easier to manage configurations installed this way (e.g., just copy `~/.var` between your systems or make backups with it).
* Migration of my link:https://github.com/foo-dogsquared/dotfiles[dotfiles].
I still use it on other non-NixOS systems.
2022-02-23 08:34:48 +00:00
* To be a configuration framework.
This is my personal configuration which means experimentation will always be here.
Sudden changes can happen at any point.
2022-09-28 11:11:12 +00:00
== Inspirations and acknowledgment
2021-11-29 10:27:56 +00:00
I ~stole~ got several parts of this configuration from the following projects:
2021-11-29 10:27:56 +00:00
2022-07-09 06:04:17 +00:00
* link:{devos_link}[devos, an overengineered configuration framework.]
2021-12-18 08:20:58 +00:00
I'm slowly grokking Nix and its ecosystem so I didn't use this outright.
Though, this is where my config is heading to be and instead slowly making parts of my config based from this template.
2021-11-29 10:27:56 +00:00
* link:https://github.com/divnix/digga/[digga, an flake utility library for your overengineered config.]
2021-12-18 08:20:58 +00:00
I also stole parts of it for my custom library.
I may have to use this at some point.
* link:https://github.com/hlissner/dotfiles/[hlissner's dotfiles, the original inspiration for this functional abomination of a configuration.]
Very nice.
2022-09-28 11:11:12 +00:00
== Copyright
This project is licensed under MIT license.
I just chose it to make it easier to upstream parts of this project to nixpkgs and to make it easier to copy it without much problems (just don't forget to add attribution as indicated from the license).
Please see link:./LICENSE[`./LICENSE`] for the full text.