diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..0e43f05 --- /dev/null +++ b/flake.nix @@ -0,0 +1,130 @@ +{ + description = "plebsaber.stream SvelteKit application"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + }; + + outputs = { self, nixpkgs }: let + inherit (nixpkgs.lib) genAttrs; + systems = [ "x86_64-linux" "aarch64-linux" ]; + forAllSystems = genAttrs systems; + + mkPackage = pkgs: + pkgs.buildNpmPackage { + pname = "plebsaber-stream"; + version = "0.0.1"; + src = pkgs.lib.cleanSourceWith { + src = ./.; + filter = path: type: + !(pkgs.lib.hasInfix "/.git/" path) + && !(pkgs.lib.hasInfix "/node_modules/" path) + && !(pkgs.lib.hasInfix "/.svelte-kit/" path); + }; + + nodejs = pkgs.nodejs_22; + npmDepsHash = "sha256-q2C2NBxjVoxA6XFEMjGZcHAujp5OTiz7llhq3aRFiY0="; + npmBuildScript = "build"; + NODE_OPTIONS = "--dns-result-order=ipv4first"; + + nativeBuildInputs = [ pkgs.makeWrapper ]; + + installPhase = '' + runHook preInstall + mkdir -p $out/app + cp -r build $out/app/ + makeWrapper ${pkgs.nodejs_22}/bin/node $out/bin/plebsaber-stream \ + --set NODE_ENV production \ + --add-flags "$out/app/build/index.js" + runHook postInstall + ''; + + meta = { + description = "plebsaber.stream SvelteKit application"; + mainProgram = "plebsaber-stream"; + }; + }; + in rec { + packages = forAllSystems (system: let + pkgs = import nixpkgs { inherit system; }; + pkg = mkPackage pkgs; + in { + plebsaber-stream = pkg; + default = pkg; + }); + + overlays.default = final: prev: { + plebsaber-stream = self.packages.${prev.stdenv.hostPlatform.system}.plebsaber-stream; + }; + + nixosModules.default = { config, lib, pkgs, ... }: + let + inherit (lib) mkEnableOption mkIf mkOption types; + cfg = config.services.plebsaber-stream; + system = pkgs.stdenv.hostPlatform.system; + defaultPackage = self.packages.${system}.plebsaber-stream; + in { + options.services.plebsaber-stream = { + enable = mkEnableOption "plebsaber.stream SvelteKit service"; + + package = mkOption { + type = types.package; + default = defaultPackage; + defaultText = "self.packages.${system}.plebsaber-stream"; + description = "Derivation that provides the plebsaber.stream server."; + }; + + port = mkOption { + type = types.port; + default = 8037; + description = "HTTP listen port for the Node server."; + }; + + stateDirectory = mkOption { + type = types.str; + default = "plebsaber-stream"; + description = "Name of the state directory managed by systemd."; + }; + + environment = mkOption { + type = types.attrsOf types.str; + default = {}; + description = "Additional environment variables for the service."; + }; + + environmentFile = mkOption { + type = types.nullOr types.path; + default = null; + description = "Optional environment file consumed by systemd."; + }; + }; + + config = mkIf cfg.enable { + systemd.services.plebsaber-stream = { + description = "plebsaber.stream SvelteKit service"; + wantedBy = [ "multi-user.target" ]; + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + + environment = { + NODE_ENV = "production"; + PORT = builtins.toString cfg.port; + } // cfg.environment; + + serviceConfig = { + Type = "simple"; + ExecStart = "${cfg.package}/bin/plebsaber-stream"; + DynamicUser = true; + StateDirectory = cfg.stateDirectory; + WorkingDirectory = "/var/lib/${cfg.stateDirectory}"; + Restart = "on-failure"; + RestartSec = 3; + } // lib.optionalAttrs (cfg.environmentFile != null) { + EnvironmentFile = cfg.environmentFile; + }; + }; + }; + }; + }; +} + diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index da54164..1181a08 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -23,7 +23,7 @@ Gitea Source code - Built with SvelteKit, and joy + Built with SvelteKit, and ❤️