Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

systemd service drop-ins #5401

Open
devurandom opened this issue May 13, 2024 · 2 comments
Open

systemd service drop-ins #5401

devurandom opened this issue May 13, 2024 · 2 comments
Assignees

Comments

@devurandom
Copy link

Description

NixOS allows defining foo.service.d drop in files using systemd.user.services.<name>.overrideStrategy. How do I do the same with home-manager?

I tried various things, but do not get the result I would expect, a ~/.config/systemd/user/foo.service.d/override.conf file containing:

[Service]
EnvironmentFile=.../env

  systemd.user.services = {
    foo = {
      # https://nixos.org/manual/nixos/unstable/options#opt-systemd.user.services._name_.overrideStrategy
      overrideStrategy = "asDropin";
      # https://nixos.org/manual/nixos/unstable/options#opt-systemd.user.services._name_.serviceConfig
      serviceConfig = {
        EnvironmentFile = ".../env";
      };
    };
  };

causes:

error: A definition for option `home-manager.users.[REDACTED].systemd.user.services.foo.overrideStrategy' is not of type `attribute set of (boolean or signed integer or string or path or list of (boolean or signed integer or string or path))'.

  systemd.user.services = {
    foo = {
      # https://nixos.org/manual/nixos/unstable/options#opt-systemd.user.services._name_.serviceConfig
      serviceConfig = {
        EnvironmentFile = ".../env";
      };
    };
  };

creates ~/.config/systemd/user/foo.service:

[serviceConfig]
EnvironmentFile=.../env

which overrides the whole foo.service installed by NixOS.


  systemd.user.services = {
    foo = {
      Service = {
        EnvironmentFile = ".../env";
      };
    };
  };

creates ~/.config/systemd/user/foo.service:

[Service]
EnvironmentFile=.../env

which again overrides the whole foo.service installed by NixOS.


  systemd.user."services.d" = {
    foo = {
      Service = {
        EnvironmentFile = ".../env";
      };
    };
  };

causes:

error: The option `home-manager.users.[REDACTED].systemd.user."services.d"' does not exist.

I also skimmed through https://github.com/nix-community/home-manager/blob/44677a1c96810a8e8c4ffaeaad10c842402647c1/modules/systemd.nix but could not figure out how systemd service drop-ins are supposed to work.


My flake.nix:

{
  inputs = {
    nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable;
    home-manager = {
      url = flake:home-manager;
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, home-manager, ... }@inputs: {
      nixosConfigurations.system = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        specialArgs = inputs;
        modules = [
          ./hardware-configuration.nix
          ./configuration.nix
          home-manager.nixosModules.home-manager {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.users.[REDACTED] = import ./home/[REDACTED].nix;
          }
        ];
      };
    };
}
@jackwilsdon
Copy link

jackwilsdon commented May 24, 2024

It seems like HM doesn't have built-in support for drop-in files, so I've been creating them like this:

xdg.configFile."systemd/user/my.service.d/overrides.conf".text = ''
  [Service]
  EnvironmentFile=.../env
'';

@devurandom
Copy link
Author

Thanks! It worked:

  xdg.configFile."systemd/user/my.service.d/99-env.conf" = let
    envFile = pkgs.writeTextDir "override.env" ''
      VAR_A=1
      VAR_B=2
    '';
  in {
    text = ''
      [Service]
      EnvironmentFile=${envFile}/override.env
    '';
  };

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants