#+TITLE: Nix Nix is a functional package manager that isolates and sandboxes dependencies. * Tools [[https://github.com/elitak/nixos-infect][nixos-infect]]: install nixos over an existing os on digitalocean and other vps systems [[https://github.com/numtide/devshell][devshell]]: universally compatible nix-shell * Tutorials [[https://nix.dev/][Resources for learning more about the Nix ecosystem]] [[https://nixos.org/nixos/nix-pills/pr01.html][The de-facto introduction to NixOS]] [[https://ebzzry.io/en/nix/][Another great introduction to the Nix ecosystem]]. This has better overviews of technology like overlays than the official documentation. [[https://www.reddit.com/r/emacs/comments/hniz19/using_nix_to_manage_emacs_packages/][Using Nix to manage Emacs packages]] ([[file:emacs.org][Emacs]]). [[https://gitlab.com/rycee/configurations/-/blob/master/user/emacs.nix][Rycee's configuration]] is a good start or source of inspiration for this. [[https://christine.website/blog/i-was-wrong-about-nix-2020-02-10][Why Nix: Cachix, niv and nix-build overview]] [[https://spartanengineer.com/nixos/2017/09/25/basic-git-server-with-nixos.html][Set up a basic git server with NixOS]] [[https://rbf.dev/blog/2020/05/custom-nixos-build-for-raspberry-pis/][Set up Nix with preconfigured SSH]] [[https://github.com/justinwoo/nix-shorts][Nix shorts]]: Lots of quick and helpful Nix tips to check out. - Building derivations at the Nix REPL - Installing packages from files and derivation expressions - Working with Nix shells - Creating derivations ** NixOps [[https://sandervanderburg.blogspot.com/2015/03/on-nixops-disnix-service-deployment-and.html?m=1][An evaluation of and tutorial for Disnix and NixOps]] [[https://github.com/nh2/nixops-tutorial][nixops-tutorial]]: development with NixOps [[https://hydra.nixos.org/build/115931128/download/1/manual/manual.html#idm140737322673584][Hydra (and nixops) manual]] [[https://hydra.nixos.org/build/115931128/download/1/manual/manual.html#chap-introduction][nixops user guide]] ** MacOS [[https://medium.com/@zw3rk/provisioning-a-nixos-server-from-macos-d36055afc4ad][Provisioning a Nix server from MacOS]] ** Server [[https://www.youtube.com/watch?v=0tsfQskVW18&app=desktop][nixos router for the homelab]] -- useful for learning to set everything up [[https://www.linode.com/docs/tools-reference/custom-kernels-distros/install-nixos-on-linode/][installing and configuring nixos on linode]] [[https://www.codedbearder.com/posts/nixos-terramaster-f2-221/][Running NixOS on a consumer NAS]] * Evaluation ** Why NixOS? [[https://medium.com/@jethroksy/a-year-with-nixos-113b534f446b][src]] [[https://myme.no/posts/2020-01-26-nixos-for-development.html][src2]] [[https://engineering.shopify.com/blogs/engineering/what-is-nix][what is nix?]] - It's the simplest way to quickly iterate and try new programs. From `nix-shell` to `nix-env` to configuration options like `windowManager.xmonad.enable`, it's incredibly easy to swap parts of your system in very few lines of code. A lot of the grunt work has been done already to ensure that common configurations are perfectly functional and reproducible out of the box. - It's trivial to revert the state of your system. All it takes is booting to a previous NixOS interation. - Declaring SystemD services happens in one place and is incredibly simple! No more managing configuration files scattered throughout your computer - you can 'metaprogram' them in Nix and serialize the files out to disk. This applies to lots of other types of files, too; I use templates to manage color schemes for all of my applications, for example. - It's incredibly simple to set up reproducible build environments for writing and running code, especially in sandboxes when you don't want to confuse your globally installed programs. ** Nix vs. Docker [[https://discourse.nixos.org/t/is-there-much-difference-between-using-nix-shell-and-docker-for-local-development/807][src]] [[https://blog.container-solutions.com/step-towards-future-configuration-infrastructure-management-nix][src2]] [[https://blog.container-solutions.com/step-towards-future-configuration-infrastructure-management-nix][src3 (has good NixOps tutorial too)]] [[https://discourse.nixos.org/t/is-there-much-difference-between-using-nix-shell-and-docker-for-local-development/807][Nix vs Docker for local development]] - Docker image is a snapshot of a machine that was assembled by running commands in a particular fashion - Making changes to the machine introduces nondeterminism; shell commands typically fetch information from outside sources that aren't pinned, so they change over time, and the functionality of your container will change as time progresses. Builds in Nix when properly pinned will not diverge the same way other deployment systems do. - There is no absolute guarantee that your Docker image produces the same image every rebuild - Nix runs natively, while Docker requires a Linux virtual machine - Nix can run as any user without particular privileges * Configs [[https://github.com/jakeisnt/nix-cfg][My personal configuration]]: - Wayland enabled - Incredibly modular with thorough abstractions (in progress...) - Robust configuration of many programs, including mail server [[https://github.com/hlissner/dotfiles][hlissner's config]] - Heavily inspires mine - I forked his - Incredibly modular and allows for easy, opinionated program configuration - Some basic modular support and great library utilities - Consistent and comprehensive theme work [[https://github.com/grahamc/nixos-config][Graham's NixOS config]]: - ZFS with remote backups - Wayland dedicated - Start all programs in SystemD cgroups - Erase systems on every boot [[https://github.com/bjornfor/nixos-config][bjornfor config]]: - Lots of home automation utility configuration; zigbee, home audio management, etc. - Custom derivations for tons of obscure programs corresponding to the above - Backup service infrastructure across multiple devices - Wonky configuration for chromium, networking, VPNs, etc. Very thorough management of loads of different devices. - Has pirate radio and torrent setups as well if you're into that [[https://github.com/bqv/nixrc][bqv]]: - Makes substantial use of nix flakes, properly managing them as overlays - Way over my head... come back to this later! I haven't fully looked through this one. [[https://github.com/SoxinOS/soxin/][Soxin]] and [[https://github.com/kalbasit/soxincfg][cfg]]: - A modular NixOS configuration system and language - (How can I improve upon these ideas?) - I haven't fully examined this one. [[https://github.com/colemickens/nixcfg][colemickens]]: - I haven't fully examined this one either. Looks thorough, uses flakes and is constantly updated. [[https://git.sr.ht/~aasg/nixexprs/tree][nixexprs]]: - Sourcehut-based CI configuration. Tons of good networking to inspire, plus a decent organization system. The system has IPFS, MacOS configuration, tons of default packages, and more. Could be used as a flake to install some of their packages; looks like it's compatible with NUR. * Installation ** Good practices - Create a separate partition for all of your nix derivations, /nix - Label all of your disks so that `hardware-configuration.nix` is reproducible ** initial installation worth noting that what i found the most confusing was: - user configuration - vps specific, ensuring that i could remove the virtual disk (not delete it) and log in as an unprivileged user without booting to the installation disk *** partition partition for space for nixos sudo fdisk /dev/sda new partition sector1 no selection for start of partition no selection for last sector w to write to disk sudo mkfs.ext4 -j -L nixos /dev/sda1 ** Installation Outline Make sure to name your disks; some configurations use some disk names by default. nixos-generate-config --root /mnt Edit /mnt/etc/nixos/configuration.nix. Uncomment: - localization for us - terminal font and keymap - timezone = America/NewYork, America/Los_Angeles, etc. These are defined somewhere on your system. UEFI systems: - You must set the option boot.loader.systemd-boot.enable to true. nixos-generate-config should do this automatically for new configurations when booted in UEFI mode. - Look at options with boot.loader.efi and boot.loader.systemd as well. To dual boot, supposedly boot.loader.grub.useOSProber can be set to true to add other OS to the grub menu. This failed when I tried it (I may have accidentally damaged the partition table, though) but it might work for you. You may have to manually start the SSH daemon: `sudo systemctl start sshd` * Pro tips - If the configuration isn't running properly after successfully refreshing it, you can use `nixos-rebuild boot` instead of `... refresh` to use the new configuration on the next boot but not enable it immediately. The `nixos-rebuild` utilities aside from `switch` all come in handy when fixing a broken configuration. - Write your own script to wrap common Nix commands. The command-line utilities aren't great, but you can just wrap others to create your own! (Who in their right mind would provide so many different names for programs `nixos-rebuild`, `nix-env`, `nix-shell` -- it's difficult to know which one to even query the manpage for unless you're very familiar with Nix(OS) already.) * Future configuration ideas [[https://askubuntu.com/questions/95716/automatically-adjust-the-volume-based-on-content][Adjust system volume based on context]] [[https://github.com/grahamc/nixos-config/tree/master/packages/recognize-thunderbolt][Thunderbolt system utility; investigate if any issues arise]] [[https://github.com/gvolpe/nix-config/blob/master/home/programs/browsers/install-ext.nix][cool config trick for installing chrome extensions]] [[https://github.com/bjornfor/nixos-config/blob/master/cfg/software-defined-radio.nix][set up software defined radio!]] Run programs in systemd cgroups (check out grahamc's config) [[https://github.com/RaitoBezarius/nix-scripts/blob/master/autoinstall/justdoit.nix][this does some crazy things with subvolumes to automatically set up a btrfs system with nixos, including initial mounts]] * Nix tools [[https://github.com/Mic92/nix-update][Swiss knife for updating nix packages.]] [[https://github.com/spwhitt/nix-zsh-completions][SSH Completions for Nix]] [[https://github.com/chisui/zsh-nix-shell][ssh plugin that lets you use zsh in nix-shell shell.]] [[https://github.com/cleverca22/not-os][cleverca22/not-os: An operating system generator, based on NixOS, that, giv]] [[https://github.com/NixOS/nixpkgs/issues/26067][Make a service abstraction layer · Issue #26067 · NixOS/nixpkgs]]: Abstract over systemd [[https://github.com/dustinlacewell/dotfiles][dustinlacewell/dotfiles: Nix configuration for all my workstations and serv]] workstation ux [[https://github.com/brainrape/nixform][brainrape/nixform: define terraform infrastructure in nix]] [[https://github.com/brainrape/nixos-tutorial][brainrape/nixos-tutorial: one hour, hands-on]] [[https://sandervanderburg.blogspot.com/2020/06/using-disnix-as-simple-and-minimalistic.html?m=1][Sander van der Burg's blog: Using Disnix as a simple and minimalistic depen]] [[https://blog.patchgirl.io/haskell/2020/07/13/static-haskell-binary.html][Building static Haskell binary with Nix on Linux · PatchGirl]] [[https://www.reddit.com/r/haskell/comments/hzeued/neuron_06_released_futureproof_notetaking_tool/][Neuron 0.6 released: future-proof note-taking tool written in Haskell, Nix ]] [[https://www.reddit.com/r/NixOS/comments/i2gaul/searching_and_installing_packages_in_nixos/][Searching and installing packages in NixOS - NixOS]] [[https://github.com/stites/haskell.nix-niv][stites/haskell.nix-niv]] [[https://nixos.wiki/wiki/NixOS_on_ZFS][NixOS on ZFS - NixOS Wiki]] [[https://elvishjerricco.github.io/2018/12/06/encrypted-boot-on-zfs-with-nixos.html][Encrypted /boot on ZFS with NixOS]] [[https://github.com/brainrape/nixform][brainrape/nixform]] [[https://sevdev.hu/posts/2017-12-26-discovering-nix-deploying-a-simple-nginx-with-nixops.html][Discovering Nix: Provisioning a static webserver with NixOps]] [[https://hugoreeves.com/posts/2019/continuously-delivering-this-blog-with-nix-hugo-and-circleci][Continuously Delivering this Blog with Nix, Hugo and CircleCI]] [[https://blog.container-solutions.com/step-towards-future-configuration-infrastructure-management-nix][configuring infra in nix]] https://davedellacosta.com/posts/2019-03-29-why-nixos-is-hard-and-how-to-fix.html https://github.com/dustinlacewell/dotfiles https://github.com/nix-community/nixos-generators image builders for nix https://github.com/nix-community/todomvc-nix: canonical example for nix, works with or without flakes apparently. https://lemire.me/blog/2020/05/22/programming-inside-a-container/ programming inside of containers https://unix.stackexchange.com/questions/522822/different-methods-to-run-a-non-nixos-executable-on-nixos https://github.com/NixOS/nixpkgs/issues/26067 making a nix service abstraction layer, abstracting over systemd to produce a more generic solution https://grahamc.com/blog/erase-your-darlings https://gitlab.com/vdemeester/home this seems like a config worth looking through! [[https://www.johnbcoughlin.com/posts/nix-dynamic-linking/index.html][debugging a dynamic linking bug in a nix project]] [[https://github.com/danielfullmer/robotnix][danielfullmer/robotnix: Build Android (AOSP) using Nix]] [[file:mobile.org][Mobile]] ** TODO [[https://gist.github.com/owenleonard11/18acac79e3ccee1adbfd4a38f2730885][Haskell Minimax with Alpha-Beta Pruning]] Captured On: [2020-10-18 Sun 14:28] ** TODO [[https://www.reddit.com/r/haskell/comments/1ha5dd/rss_reader_written_in_haskell_and_urweb/][RSS reader written in Haskell and Ur/Web : haskell]] Captured On: [2020-10-18 Sun 15:12] ** TODO [[https://github.com/lehins/hip][lehins/hip: Haskell Image Processing Library]] Captured On: [2020-10-18 Sun 15:14] ** TODO [[https://stackoverflow.com/questions/7147799/displaying-dynamically-generated-images-in-yesod][haskell - Displaying dynamically generated images in Yesod - Stack Overflow]] Captured On: [2020-10-18 Sun 15:15] ** TODO [[https://serokell.io/blog/dimensions-haskell-singletons][Dimensions and Haskell: Singletons in Action]] Captured On: [2020-10-18 Sun 16:36] https://github.com/Trundle/NixOS-WSL nixos on wsl https://github.com/telent/nixwrt build images for MIPS using nixpkgs https://github.com/serokell/deploy-rs nix flake deploy tool https://bou.ke/blog/nix/ very cool nix configuration and deployment get a nix shell for your whole configuration! # const ua = event.request.headers.get('User-Agent'); # if (url.pathname === '/' && ua.match(/\bNix\//) != null) { # return new Response('', { status: 302, headers: { location: `https://github.com/bouk/b/archive/master.tar.gz` } }); # } * Flake tips Do not be afraid to use the --help flag! I've learned a lotfrom it. - Update a specific input: `nix flake update --update-input spicetify-nix` do * Go #+BEGIN_SRC nix { lib, buildGoModule, fetchFromGithub }: # buildGoModule can be pulled in from the package buildGoModule rec { pname = "mangadesk"; version = "0.0.1"; # fetch the derivation from wherever src = pkgs.fetchFromGitHub { owner = "darylhjd"; repo = "mangadesk"; rev = "v${version}"; sha256 = "1kgb5k55fxjcf1829fkp7wyd162391am9zhfgl50a606rlsfsh7h"; }; # this is an intermediate sha256 that is spit out when the derivation fails, somehow. needs more work! # vendorSha256 = "1879j77k96684wi554rkjxydrj8g3hpp0kvxz03sd8dmwr3lh83j"; subPackages = [ "." ]; deleteVendor = true; runVend = true; meta = with lib; { homepage = "https://github.com/darylhjd/mangadesk"; description = "Terminal client for MangaDex"; license = licenses.mit; maintainers = with maintainers; [ jakeisnt ]; platforms = platforms.linux ++ platforms.darwin; }; } #+END_SRC