131 lines
4.4 KiB
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);
|
|
});
|
|
};
|
|
}
|