Title: My NixOS workflow after migrating from OpenBSD
       Author: Solène
       Date: 24 September 2022
       Tags: openbsd nixos life
       Description: This article tells my journey migrating my computers from
       OpenBSD to NixOS
       
       # Introduction
       
       After successfully switching my small computer fleet to NixOS, I'd like
       to share about the journey.
       
       I currently have a bunch of computers running NixOS:
       
       * my personal laptop
       * the work laptop
       * home router
       * home file server
       * some home lab computer
       * e-mail / XMPP / Gemini server hosted at openbsd.amsterdam
       
       That sums up to 6 computers running NixOS, half of them is running the
       development version, and the other is running the latest release.
       
       # Migration
       
       ## From OpenBSD to NixOS
       
       All the computers above used to run OpenBSD, let me explain why I
       migrated.  It was a very complicated choice for me, because I still
       like OpenBSD despite I uninstalled it.
       
       * NixOS offers more software choice than OpenBSD, this is especially
       true for recent software, and porting them to OpenBSD is getting
       difficult over time.
       * After spending too much time with OpenBSD, I wanted to explore a
       whole new world, NixOS being super different, it was a good
       opportunity.  As a professional IT worker, it's important for me to
       stay up to date, Linux ecosystem evolved a lot over that past ten
       years.  What's funny is OpenBSD and NixOS share similar issues such as
       not being able to use binaries found on the Internet (but for various
       reasons)
       * NixOS maintenance is drastically reduced compared to OpenBSD
       * NixOS helps me to squeeze more from my hardware (speed, storage
       capacity, reliability)
       * systemd: I bet this one will be controversial, but since I learned
       how to use it, I really like it (and NixOS make it even greater for
       writing units)
       
       Security is hard to measure, but it's the main argument in favor of
       OpenBSD, however it is possible to enable mitigations on Linux as well
       such as hardened memory allocator or a hardened Kernel.  OpenBSD isn't
       practical to separate services from running all in the same system,
       while on Linux you can easily sandbox services.  In the end, the
       security mechanisms are different, but I feel the result is pretty
       similar for my threat model of protecting against script kiddies.
       
       I give a bonus point for Linux for its ability to account
       CPU/Memory/Swap/Disk/network per user, group and process.  This allows
       spotting unusual activity.  Security is about protection, but also
       about being aware of intrusion, OpenBSD isn't very good at it at the
       moment.
       
       ## NixOS modules
       
       One issue I had migrating my mail server and the router was to find
       what changes were made in /etc.  I was able to figure which services
       were enabled, but not really all the steps done a few years ago to
       configure them.  I had to scrape all the configuration file to see if
       it looked like verbatim default configuration or something I changed
       manually.
       
       This is where NixOS shines for maintenance and configuration,
       everything is declarative, so you never touch anything in /etc.  At
       anytime, even in a few years, I'll be able to exactly tell what I need
       for each service, without having to dig up /etc/ and compare with
       default files.  This is a saner approach, and also ease migration
       toward another system (OpenBSD? ;) ) because I'd just have to apply
       these changes to configuration files.
       
       # Workflow
       
       Working with NixOS can be disappointing.  Most of the system is
       read-only, you need to learn a new language (Nix) to configure
       services, you have to "rebuild" your system to make a change as simple
       as adding an entry in /etc/hosts, not very "Unix-like".
       
       Your biggest friend is the man page configuration.nix which contains
       all the possible configurations settings available in NixOS, from
       Kernel choice and grub parameters, to Docker containers started at boot
       or your desktop environment.
       
       The workflow is pretty easy, take your configuration.nix file, apply
       changes to it, and run "nixos-rebuild test" (or switch if you prefer)
       to try the changes.  Then, you may want something more elaborated like
       tracking your changes in a git or darcs repository, and start sharing
       pieces of configuration between machines.
       
       But in the end, you just declare some configuration.  I prefer to keep
       my configurations very easy to read, I still don't have any modules or
       much variable, the common pieces are just .nix files imported for the
       systems needing it.  It's super easy to track and debug.
       
       # Bento
       
 (HTM) Bento GitHub project page
       
       After a while, I found it very tedious to have to run nixos-rebuild on
       each machine to keep them up to date, so I started using the
       autoUpgrade module which basically do it for you in a scheduled task.
       
       But then, I needed to centralize each configuration file somewhere, and
       have fun with ssh keys because I don't like publishing my configuration
       files publicly.  Which isn't optimal either as if you make a change
       locally, you need to push the changes and connect to the remote host to
       pull the changes and rebuild immediately instead of waiting for the
       auto upgrade process.
       
       So, I wrote bento, which allows me to manage all the configuration
       files in a single place, but better than that, I can build the
       configuration locally to ensure they will work once shipped.  I quickly
       added a way to track the status of each remote system to be sure they
       picked up and applied the changes (every 10 minutes).  Later, I
       improved the network efficiency by central management computer as a
       local binary cache, so other systems are now downloading packages from
       it locally, instead of downloading them again from the Internet.
       
       The coolest thing ever is that I can manage offline systems such as my
       work laptop, I can update its configuration file in the weekend for an
       update or to improve the environment (it mostly shares the same
       configuration as my main laptop), and it will automatically pick it up
       when I boot it.
       
       # Conclusion
       
       Moving to NixOS was a very good and pleasant experience, but I had some
       knowledge about it before starting.  It might be confusing a lot of
       people, and you certainly need to get into NixOS mindset to appreciate
       it.