diff --git a/.gitignore b/.gitignore index 93bd8fd..9c78e51 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ # Whitelist nix !flake.nix !flake.lock +!default.nix +!module.nix # Whitelist database !*.sqlite diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..b71ad24 --- /dev/null +++ b/default.nix @@ -0,0 +1,18 @@ +{ lib, buildGoModule }: + +buildGoModule { + pname = "henna"; + version = "0.1.0"; + + src = ./.; + + vendorHash = null; + + CGO_ENABLED = 1; + + meta = with lib; { + description = "Henna gallery server"; + license = licenses.mit; + maintainers = [ ]; + }; +} diff --git a/flake.nix b/flake.nix index 42362fd..110f971 100644 --- a/flake.nix +++ b/flake.nix @@ -7,7 +7,9 @@ }; outputs = { self, nixpkgs, flake-utils }: - flake-utils.lib.eachDefaultSystem (system: + { + nixosModules.default = import ./module.nix; + } // flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; in diff --git a/main.go b/main.go index 7d0fee8..8108bce 100644 --- a/main.go +++ b/main.go @@ -34,6 +34,8 @@ var ( imaginaryURL string galleryPath string databasePath string + listenAddr string + listenPort int randomCovers []CoverData ) @@ -41,6 +43,8 @@ func main() { flag.StringVar(&imaginaryURL, "imaginary", "http://192.168.88.54:10001", "imaginary root URL") flag.StringVar(&galleryPath, "gallery", "/home/user/mnt/panda/galleries/", "gallery path") flag.StringVar(&databasePath, "database", "./db.sqlite", "database path") + flag.StringVar(&listenAddr, "address", "localhost", "listen address") + flag.IntVar(&listenPort, "port", 10000, "listen port") flag.Parse() var err error @@ -68,8 +72,9 @@ func main() { http.Handle("/assets/", http.FileServer(http.FS(assetsFS))) http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(galleryPath)))) - log.Println("Server listening on :8080") - log.Fatal(http.ListenAndServe(":10000", nil)) + addr := fmt.Sprintf("%s:%d", listenAddr, listenPort) + log.Printf("Server listening on %s", addr) + log.Fatal(http.ListenAndServe(addr, nil)) } func handleRandom(w http.ResponseWriter, r *http.Request) { diff --git a/module.nix b/module.nix new file mode 100644 index 0000000..8eb1e93 --- /dev/null +++ b/module.nix @@ -0,0 +1,86 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.services.henna; +in +{ + options.services.henna = { + enable = lib.mkEnableOption "Henna gallery server"; + + package = lib.mkOption { + type = lib.types.package; + default = pkgs.callPackage ./default.nix { }; + description = "The henna package to use."; + }; + + imaginaryUrl = lib.mkOption { + type = lib.types.str; + description = "Imaginary server root URL."; + }; + + galleryPath = lib.mkOption { + type = lib.types.path; + description = "Path to the gallery directory."; + }; + + databasePath = lib.mkOption { + type = lib.types.path; + default = ./db.sqlite; + description = "Path to the SQLite database file."; + }; + + address = lib.mkOption { + type = lib.types.str; + default = "localhost"; + description = "Address to listen on."; + }; + + port = lib.mkOption { + type = lib.types.port; + default = 10000; + description = "Port to listen on."; + }; + + user = lib.mkOption { + type = lib.types.str; + default = "henna"; + description = "User to run henna as."; + }; + + group = lib.mkOption { + type = lib.types.str; + default = "henna"; + description = "Group to run henna as."; + }; + }; + + config = lib.mkIf cfg.enable { + users.users.${cfg.user} = { + isSystemUser = true; + group = cfg.group; + }; + + users.groups.${cfg.group} = { }; + + systemd.services.henna = { + description = "Henna gallery server"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + serviceConfig = { + ExecStart = '' + ${cfg.package}/bin/henna \ + -imaginary "${cfg.imaginaryUrl}" \ + -gallery "${cfg.galleryPath}" \ + -database "${cfg.databasePath}" \ + -address "${cfg.address}" \ + -port ${toString cfg.port} + ''; + User = cfg.user; + Group = cfg.group; + Restart = "on-failure"; + RestartSec = 5; + }; + }; + }; +}