feat: add module and package for self-hosting ignis

This commit is contained in:
Ceferino Patino 2026-06-28 14:08:42 -05:00
commit 2d2f62fd14
Signed by: c4patino
SSH key fingerprint: SHA256:Wu+cU1t+7zVT9wzew/4meNmeulo66NzMqc22MdDBgXI
3 changed files with 133 additions and 0 deletions

View file

@ -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"
];
};
}

View file

@ -0,0 +1,3 @@
{...}: final: prev: {
ignis = final.callPackage ./package.nix {};
}

View file

@ -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
];
};
}