diff --git a/modules/nixos/services/apps/ignis/default.nix b/modules/nixos/services/apps/ignis/default.nix new file mode 100644 index 0000000..37890a7 --- /dev/null +++ b/modules/nixos/services/apps/ignis/default.nix @@ -0,0 +1,72 @@ +{ + config, + lib, + namespace, + pkgs, + ... +}: let + inherit (lib) mkIf; + inherit (lib.${namespace}) getAttrByNamespace hostHasService resolveServicePort; + inherit (config.networking) hostName; + + networkCfg = getAttrByNamespace config "${namespace}.services.networking"; + + isEnabled = hostHasService networkCfg.network-services hostName "ignis"; + port = resolveServicePort networkCfg.network-services "ignis" 8081; +in { + config = mkIf isEnabled { + users = { + users.ignis = { + isSystemUser = true; + group = "ignis"; + }; + groups.ignis = {}; + }; + + systemd.tmpfiles.rules = [ + "d /var/lib/ignis/vaults 0750 ignis ignis -" + "d /var/lib/ignis/data 0750 ignis ignis -" + ]; + + networking.firewall.allowedTCPPorts = [port]; + + systemd.services.ignis = { + description = "Ignis - Self-hosted Obsidian web app"; + after = ["network.target"]; + wantedBy = ["multi-user.target"]; + + path = with pkgs; [ + git + ]; + + environment = { + PORT = toString port; + VAULT_ROOT = "/var/lib/ignis/vaults"; + DATA_ROOT = "/var/lib/ignis/data"; + OBSIDIAN_ASSETS_PATH = "${pkgs.ignis}/lib/ignis/obsidian-app"; + OBSIDIAN_VERSION = "1.12.7"; + }; + + preStart = '' + mkdir -p /var/lib/ignis/vaults /var/lib/ignis/data + chown -R ignis:ignis /var/lib/ignis/vaults /var/lib/ignis/data + ''; + + serviceConfig = { + Type = "simple"; + User = "ignis"; + Group = "ignis"; + Restart = "always"; + RestartSec = 5; + ExecStart = "${pkgs.ignis}/bin/ignis-server"; + StateDirectory = "ignis"; + StateDirectoryMode = "0750"; + WorkingDirectory = "${pkgs.ignis}/lib/ignis"; + }; + }; + + ${namespace}.services.storage.impermanence.folders = [ + "/var/lib/ignis/data" + ]; + }; +} diff --git a/overlays/ignis/default.nix b/overlays/ignis/default.nix new file mode 100644 index 0000000..c96e52c --- /dev/null +++ b/overlays/ignis/default.nix @@ -0,0 +1,3 @@ +{...}: final: prev: { + ignis = final.callPackage ./package.nix {}; +} diff --git a/overlays/ignis/package.nix b/overlays/ignis/package.nix new file mode 100644 index 0000000..0fc3437 --- /dev/null +++ b/overlays/ignis/package.nix @@ -0,0 +1,58 @@ +{ + lib, + fetchFromGitHub, + buildNpmPackage, + makeWrapper, + nodejs, + obsidian, + asar, +}: +buildNpmPackage rec { + pname = "ignis"; + version = "0.8.7"; + + src = fetchFromGitHub { + owner = "Nystik-gh"; + repo = "ignis"; + rev = "v${version}+obsidian.1.12.7"; + hash = "sha256-jbtuoVgCNApqijTHmPcjnh842WVWAPUtTVXJHa1Nm+Q="; + }; + + npmDepsHash = "sha256-u4DV2MXga+J4YotyYKrLIldSQljY+MNNA9uVWGjJLpE="; + npmDepsFetcherVersion = 2; + + nativeBuildInputs = [ + makeWrapper + asar + obsidian + ]; + + installPhase = '' + runHook preInstall + + npm prune --omit=dev --ignore-scripts + + mkdir -p $out/lib/ignis + cp -r . $out/lib/ignis/ + + mkdir -p $out/lib/ignis/obsidian-app + ${lib.getExe asar} extract ${obsidian}/share/obsidian/obsidian.asar $out/lib/ignis/obsidian-app + + mkdir -p $out/bin + makeWrapper ${lib.getExe nodejs} $out/bin/ignis-server \ + --add-flags "$out/lib/ignis/apps/ignis-server/server/index.js" \ + --chdir "$out/lib/ignis" + + runHook postInstall + ''; + + meta = { + description = "Run Obsidian as a self-hosted web app"; + homepage = "https://github.com/Nystik-gh/ignis"; + license = lib.licenses.agpl3Only; + platforms = lib.platforms.linux; + maintainers = with lib.maintainers; [ + c4patino + ]; + }; +}