objectifier/objectifier-module.nix

91 lines
2.5 KiB
Nix
Raw Normal View History

2023-01-06 14:46:11 -08:00
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.objectifier;
pythonYolo = pkgs.python3.withPackages (pyPkgs:
with pyPkgs; [
fastapi
gunicorn
opencv4
python-multipart
uvicorn
]);
in {
options.services.objectifier = with types; {
enable = mkEnableOption "Enable Objectifier object-detection web sevice.";
port = mkOption {
type = port;
description = "Port on which to run the Objectifier web service.";
default = 5121;
};
workers = mkOption {
type = int;
description = "Number of worker threads to launch.";
default = 3;
};
listen-addresses = mkOption {
type = listOf str;
description =
"List of IP addresses on which to listen for incoming requests.";
default = [ "127.0.0.1" ];
};
};
config = mkIf cfg.enable {
systemd.services.objectifier = {
after = [ "network-online.target" ];
2023-01-06 14:59:27 -08:00
wantedBy = [ "multi-user.target" ];
2023-01-06 14:46:11 -08:00
reloadIfChanged = true;
path = with pkgs; [ pythonYolo ];
environment = {
OBJECTIFIER_YOLOV3_CONFIG = "${yolo-data}/yolov3.cfg";
OBJECTIFIER_YOLOV3_WEIGHTS = "${yolo-data}/yolov3.weights";
OBJECTIFIER_YOLOV3_LABELS = "${yolo-data}/labels";
OBJECTIFIER_BUFFER_SIZE = 524288;
};
serviceConfig = {
# PrivateUsers = true;
# PrivateDevices = true;
# PrivateTmp = true;
# PrivateMounts = true;
# ProtectControlGroups = true;
# ProtectKernelTunables = true;
# ProtectKernelModules = true;
# ProtectSystem = true;
# ProtectHostname = true;
# ProtectHome = true;
# ProtectClock = true;
# ProtectKernelLogs = true;
# DynamicUser = true;
# MemoryDenyWriteExecute = true;
# RestrictRealtime = true;
# LockPersonality = true;
# PermissionsStartOnly = true;
WorkingDirectory = "${pkgs.objectifier}";
2023-01-06 14:59:27 -08:00
LimitNOFILE = 4096;
2023-01-06 14:46:11 -08:00
Restart = "on-failure";
2023-01-06 14:59:27 -08:00
RestartSec = "5s";
2023-01-06 14:46:11 -08:00
Type = "simple";
PIDFile = "/run/objectifier.pid";
ExecStart = let
bindClause =
map (addr: "--bind ${addr}:${cfg.port}") cfg.listen-addresses;
2023-01-06 15:50:48 -08:00
in (concatStringsSep " " [
2023-01-06 14:46:11 -08:00
"gunicorn"
bindClause
"--workers ${cfg.workers}"
"-k uvicorn.workers.UvicornWorker"
"objectifier:app"
"--pid /run/objectifier.pid"
2023-01-06 15:50:48 -08:00
]);
2023-01-06 14:46:11 -08:00
};
};
};
}