{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; pyproject-nix = { url = "github:nix-community/pyproject.nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, ... } @ inputs: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; config.allowUnfree = true; }; python = pkgs.python3; serverProject = inputs.pyproject-nix.lib.project.loadPyproject { projectRoot = ./.; }; # Packages script = pkgs.writeShellApplication { name = "scanbuddy"; runtimeInputs = with pkgs; [sane-backends brscan5 ghostscript]; text = builtins.readFile ./scanbuddy.sh; }; # Returns an attribute set that can be passed to `buildPythonPackage`. attrs = serverProject.renderers.buildPythonPackage {inherit python;}; server = python.pkgs.buildPythonPackage (attrs // { env.CUSTOM_ENVVAR = "foobar"; }); scanbuddy-pkg = pkgs.symlinkJoin { name = "scanbuddy"; paths = [script server]; }; in { # devShells.${system}.default = pkgs.mkShell { # packages = with pkgs; [ # python313 # python313Packages.flask # python313Packages.waitress # ]; # # shellHook = '' # python --version # exec zsh # ''; # }; packages.${system} = { default = scanbuddy-pkg; inherit script; inherit server; }; nixosModules.default = { config, pkgs, lib, ... }: { options = let inherit (lib) mkOption mkEnableOption types; in { services.scanbuddy = { enable = mkEnableOption "Enable the scanbuddy server"; environment = mkOption { type = types.attrsOf (types.nullOr (types.oneOf [types.str types.path types.package])); default = {}; }; }; }; config = let cfg = config.services.scanbuddy; in { systemd.services.scanbuddy = lib.mkIf config.service.scanbuddy { description = "The scanbuddy webservice"; wantedBy = ["multi-user.target"]; serviceConfig = { ExecStart = "${scanbuddy-pkg}/bin/scanbuddy-server"; Path = ["${scanbuddy-pkg}/bin"]; WorkingDirectory = "/var/lib/scanbuddy"; }; environment = cfg.environment; }; }; }; }; }