hackerdeck/flake.nix

131 lines
4.4 KiB
Nix

{
description = "hackerdeck";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
pyproject-nix = {
url = "github:pyproject-nix/pyproject.nix";
inputs.nixpkgs.follows = "nixpkgs";
};
uv2nix = {
url = "github:pyproject-nix/uv2nix";
inputs.pyproject-nix.follows = "pyproject-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
pyproject-build-systems = {
url = "github:pyproject-nix/build-system-pkgs";
inputs.pyproject-nix.follows = "pyproject-nix";
inputs.uv2nix.follows = "uv2nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, uv2nix, pyproject-nix, pyproject-build-systems, ... }:
let
inherit (nixpkgs) lib;
forAllSystems = lib.genAttrs lib.systems.flakeExposed;
in
{
packages = forAllSystems (system:
let
pkgs = nixpkgs.legacyPackages.${system};
workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; };
overlay = workspace.mkPyprojectOverlay {
sourcePreference = "wheel";
};
inherit (pkgs.callPackages pyproject-nix.build.util { }) mkApplication;
python = pkgs.python314;
pythonSet = (pkgs.callPackage pyproject-nix.build.packages {
inherit python;
}).overrideScope (lib.composeManyExtensions [
pyproject-build-systems.overlays.default
overlay
]);
in
{
default = mkApplication {
venv = pythonSet.mkVirtualEnv "hackerdeck-env" workspace.deps.default;
package = pythonSet.hackerdeck;
};
});
nixosModules.default = { config, lib, pkgs, ... }:
let
cfg = config.services.hackerdeck;
in
{
options.services.hackerdeck = {
enable = lib.mkEnableOption "hackerdeck service";
port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
description = "Port to listen on (if not using Unix socket)";
};
uds = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "Unix domain socket path to listen on";
};
environmentFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
description = "Environment file containing NATS_USER and NATS_PASSWORD";
};
};
config = lib.mkIf cfg.enable {
systemd.services.hackerdeck = {
description = "HN Summary Service";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
ExecStartPre = "${self.packages.${pkgs.system}.default}/bin/hackerdeck-alembic upgrade head";
ExecStart = "${self.packages.${pkgs.system}.default}/bin/hackerdeck all"
+ lib.optionalString (cfg.port != null) " --port=${toString cfg.port}"
+ lib.optionalString (cfg.uds != null) " --uds=${cfg.uds}";
Restart = "always";
RestartSec = "10";
DynamicUser = true;
RuntimeDirectory = "hackerdeck";
EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
};
};
};
};
devShells = forAllSystems (system:
let
pkgs = nixpkgs.legacyPackages.${system};
workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; };
overlay = workspace.mkPyprojectOverlay {
sourcePreference = "wheel";
};
python = pkgs.python314;
pythonSet = (pkgs.callPackage pyproject-nix.build.packages {
inherit python;
}).overrideScope (lib.composeManyExtensions [
pyproject-build-systems.overlays.default
overlay
]);
in
{
default = pkgs.mkShell {
packages = [
pkgs.uv
python
];
shellHook = ''
unset PYTHONPATH
export UV_PYTHON=${python}
export UV_PYTHON_DOWNLOADS=never
'';
};
uv2nix = pythonSet.mkVirtualEnv "hackerdeck-dev-env" (workspace.deps.default ++ workspace.deps.dev);
});
};
}