Create nixos service

This commit is contained in:
Zuckerberg 2023-11-08 23:14:57 -07:00
parent 320b2635fa
commit e06f47d2ff
6 changed files with 128 additions and 15 deletions

6
flake.lock generated
View File

@ -5,11 +5,11 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1681202837, "lastModified": 1694529238,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401", "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -7,19 +7,42 @@
}; };
outputs = { self, nixpkgs, flake-utils }: outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system: let
supportedSystems = with flake-utils.lib.system; [ x86_64-linux i686-linux aarch64-linux ];
in
{
overlays.default = final: prev: {
picture-frame = {
inherit (final.callPackage ./server { }) server smartcrop;
firmware = final.callPackage ./firmware { };
};
};
}
//
flake-utils.lib.eachSystem supportedSystems (system:
let let
pkgs = nixpkgs.legacyPackages.${system}; pkgs = import nixpkgs {
server = pkgs.callPackage ./server { }; inherit system;
firmware = pkgs.callPackage ./firmware { }; overlays = [ self.overlays.default ];
};
in in
{ {
packages = { packages = with pkgs.picture-frame; {
inherit (server) server smartcrop; inherit server firmware smartcrop;
inherit firmware; default = server;
}; };
packages.default = server.server;
devShell = pkgs.callPackage ./shell.nix { }; devShell = pkgs.callPackage ./shell.nix { };
checks.build = pkgs.picture-frame.server;
checks.service = import ./server/service-test.nix {
inherit nixpkgs system;
service = self.nixosModules.service;
};
} }
); )
//
{
nixosModules.default = self.nixosModules.service;
nixosModules.service = import ./server/service.nix { overlay = self.overlays.default; };
};
} }

6
overlay.nix Normal file
View File

@ -0,0 +1,6 @@
final: prev: {
dynamic-frame = {
inherit (final.callPackage ./server { }) server smartcrop;
firmware = final.callPackage ./firmware { };
};
}

View File

@ -21,6 +21,7 @@ import (
) )
var imageDir = "./img" var imageDir = "./img"
var port = "8080"
func getRandomFile(dir string) (string, error) { func getRandomFile(dir string) (string, error) {
files, err := ioutil.ReadDir(dir) files, err := ioutil.ReadDir(dir)
@ -109,7 +110,12 @@ func basicAuth(next http.Handler) http.Handler {
func main() { func main() {
if len(os.Args) > 1 { if len(os.Args) > 1 {
imageDir = os.Args[1] port = os.Args[1]
}
fmt.Println("Starting on port: ", port)
if len(os.Args) > 2 {
imageDir = os.Args[2]
} }
fmt.Println("Choosing images from: ", imageDir) fmt.Println("Choosing images from: ", imageDir)
@ -128,6 +134,6 @@ func main() {
fmt.Println("Started server") fmt.Println("Started server")
// Start the HTTP server on port 8080 and log any errors // Start the HTTP server
log.Fatal(http.ListenAndServe("0.0.0.0:8080", router)) log.Fatal(http.ListenAndServe("0.0.0.0:"+port, router))
} }

23
server/service-test.nix Normal file
View File

@ -0,0 +1,23 @@
{ nixpkgs, system, service }:
with import (nixpkgs + "/nixos/lib/testing-python.nix") { inherit system; };
simpleTest {
name = "dynamic-frame-server";
nodes.machine = { config, pkgs, ... }: {
imports = [ service ];
virtualisation.memorySize = 256;
services.picture-frame-server = {
enable = true;
imgDir = "/tmp";
};
};
testScript =
''
machine.start()
machine.wait_for_unit("multi-user.target")
machine.wait_for_unit("picture-frame-server")
'';
}

55
server/service.nix Normal file
View File

@ -0,0 +1,55 @@
{ overlay }:
{ config, pkgs, lib, ... }:
let
cfg = config.services.picture-frame-server;
in
{
options.services.picture-frame-server = {
enable = lib.mkEnableOption "enable picture-frame-server";
user = lib.mkOption {
type = lib.types.str;
default = "picture-frame-server";
description = ''
The user the server should run as
'';
};
group = lib.mkOption {
type = lib.types.str;
default = "picture-frame-server";
description = ''
The group the server should run as
'';
};
imgDir = lib.mkOption {
type = lib.types.str;
description = ''
Directory of images that the server will serve
'';
};
port = lib.mkOption {
type = lib.types.int;
default = 18450;
description = ''
The port the server runs on
'';
};
};
config = lib.mkIf cfg.enable {
nixpkgs.overlays = [ overlay ];
users.users.${cfg.user} = {
isSystemUser = true;
group = cfg.group;
};
users.groups.${cfg.group} = { };
systemd.services.picture-frame-server = {
enable = true;
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig.ExecStart = "${pkgs.picture-frame.server}/bin/server ${toString cfg.port} ${cfg.imgDir}";
serviceConfig.User = cfg.user;
serviceConfig.Group = cfg.group;
};
};
}