News for hackers. Stuff that matters.
Re:Avoiding Complexity with Systemd by atoav on Sunday June 27, 2021 @04:44AM (#27649774)
I use mostly Ubuntu and Debian and defining systemd units just means you have to spit the right text into a .service file placed at the right spot.

How does NixOS make that easier?

Re:Avoiding Complexity with Systemd by siraben on Sunday June 27, 2021 @05:02AM (#27649868)
In NixOS it's trivial to use and define NixOS modules, which handle restarting/starting/stopping systemd units. See the wiki example[0] on how to define and use a service that greets the user with GNU Hello. Also, since you have access to Nixpkgs, you can make the ExecStart as complicated as you want with whatever dependencies you desire, and trivially share it with others.

[0] https://nixos.wiki/wiki/Module#Example

Re:Avoiding Complexity with Systemd by drran on Sunday June 27, 2021 @09:07AM (#27651271)
It looks like NixWay of doing NixThings to solve NixProblems.

Why I need NixModules in the first place? ELI5, please.

Re:Avoiding Complexity with Systemd by leotaku on Sunday June 27, 2021 @10:31AM (#27651859)
It's basically just a nice way of composing the different parts of your system.

E.g. you could write a NixOS module to manage your web app. You declaratively configure that you want to run Nginx, Postgres, etc. open some ports, connect to your VPN and basically everything else you might want. There are a lot of existing modules, so in most cases you have to write very little code yourself. If you want to scale your system to run on multiple systems or containers, you can do that with relative ease.

You also have a singular source of truth for all of your information, down to your application binaries. Your configuration says you are using Postgres version X.Y.Z with compilation options A, B and C, so that's exactly what is running on your systems.

Re:Avoiding Complexity with Systemd by diragon on Sunday June 27, 2021 @03:14PM (#27654353)
It's an academically more impressive version of Ansible that's deeply intertwined with the distro's package manager.
Re:Avoiding Complexity with Systemd by nh2 on Sunday June 27, 2021 @11:04AM (#27652128)
You can override NixOS's predefined systemd settings from _outside_ using NixOS module options. This allows you to change default settings that are not optimal for your use case, without having to patch NixOS itself, or write your own unit config.

For example, systemd by default permanently gives up restarting services after a few number of tries (e.g. 5), even if you have set `Restart=always`. This is suboptimal for web servers that should recover by themselves after arbitrarily long failures (e.g. network downtimes outside of your control).

On NixOS, you can, from your machine config, set:

    systemd.services.nginx.unitConfig.StartLimitIntervalSec = 0;
This sets/overrides just that specific systemd option for the existing nginx module. On other distros, you often have to resort to global mutation in `/etc` that does not compose well.

We use NixOS for our infra (having used Ansible before), and this ability to override anything cleanly and keeping defaults otherwise made for much easier to maintain infra code and less ugly/surprising compromises.

Re:Avoiding Complexity with Systemd by Arnavion on Sunday June 27, 2021 @12:25PM (#27652876)
>On other distros, you often have to resort to global mutation in `/etc` that does not compose well.

Why does this "not compose well" ?

You don't have to override the whole unit as /etc/systemd/system/nginx.service , which would have problems if two things wanted to override different parts of the original unit. Just drop an override file in /etc/systemd/system/nginx.service.d/90-restart-always.conf with that one specific config you want to override.

Re:Avoiding Complexity with Systemd by nh2 on Sunday June 27, 2021 @05:26PM (#27655573)
> Why does this "not compose well" ?

Because you cannot easily write libraries/components that do this.

In NixOS, other modules can override the options of other modules. For example, a a web app can set the nginx options that it needs, instead of requiring you (the admin) to "drop a file" in /etc.

This is one of the reasons why on Ansible Galaxy (community repository of Ansible roles) there are 527 nginx roles [1], and in NixOS there is 1 nginx module that everybody code-reuses.

[1]: https://galaxy.ansible.com/search?deprecated=false&tags=web&...

Re:Avoiding Complexity with Systemd by Arnavion on Sunday June 27, 2021 @06:27PM (#27656062)
What does

    systemd.services.nginx.unitConfig.StartLimitIntervalSec = 0;
do that it doesn't require root?

If the point is that it's not manipulating a system-level nginx service but a user-level one, then writing the systemd override file in the way I described doesn't require root either.

Re:Avoiding Complexity with Systemd by nh2 on Monday June 28, 2021 @12:47PM (#27664222)
Applying the NixOS config requires root -- that's not what it's about.

What I mean is that services can set other services' options, without you (the admin) having to to write such overrides manually.

Re:Avoiding Complexity with Systemd by Arnavion on Tuesday June 29, 2021 @06:13PM (#27682464)
Nothing prevents $service's package from creating /etc/systemd/system/nginx.service.d/90-restart-always.conf in a regular distro.
Re:Avoiding Complexity with Systemd by nix23 on Sunday June 27, 2021 @05:02AM (#27649866)
Re:Avoiding Complexity with Systemd by goodpoint on Sunday June 27, 2021 @07:03AM (#27650516)
It does not.