mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-03-26 09:05:06 +00:00
Extend nix flake setup
This commit is contained in:
parent
4167b64e31
commit
2e18274803
130
flake.lock
generated
Normal file
130
flake.lock
generated
Normal file
@ -0,0 +1,130 @@
|
||||
{
|
||||
"nodes": {
|
||||
"devshell-tools": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709936258,
|
||||
"narHash": "sha256-ziYmDU/5v++oYSSwyMqEOr2V75rO+dMQA5aEdwH8amw=",
|
||||
"owner": "eikek",
|
||||
"repo": "devshell-tools",
|
||||
"rev": "59900a3731a88508257525754a704ad2f8a3278e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "eikek",
|
||||
"repo": "devshell-tools",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709126324,
|
||||
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"inputs": {
|
||||
"systems": "systems_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709126324,
|
||||
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1709309926,
|
||||
"narHash": "sha256-VZFBtXGVD9LWTecGi6eXrE0hJ/mVB3zGUlHImUs2Qak=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "79baff8812a0d68e24a836df0a364c678089e2c7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-23.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1709677081,
|
||||
"narHash": "sha256-tix36Y7u0rkn6mTm0lA45b45oab2cFLqAzDbJxeXS+c=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "880992dcc006a5e00dd0591446fdf723e6a51a64",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-23.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"devshell-tools": "devshell-tools",
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
164
flake.nix
Normal file
164
flake.nix
Normal file
@ -0,0 +1,164 @@
|
||||
{
|
||||
description = "Docspell";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
|
||||
devshell-tools.url = "github:eikek/devshell-tools";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
devshell-tools,
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem (system: let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
devshellPkgs = with pkgs; [
|
||||
jq
|
||||
scala-cli
|
||||
sbt
|
||||
|
||||
netcat
|
||||
jdk17
|
||||
wget
|
||||
which
|
||||
dpkg
|
||||
elmPackages.elm
|
||||
fakeroot
|
||||
zola
|
||||
yarn
|
||||
];
|
||||
docspellPkgs = pkgs.callPackage (import ./nix/pkg.nix) {};
|
||||
dockerAmd64 = pkgs.pkgsCross.gnu64.callPackage (import ./nix/docker.nix) {
|
||||
inherit (docspellPkgs) docspell-server docspell-joex;
|
||||
};
|
||||
dockerArm64 = pkgs.pkgsCross.aarch64-multiplatform.callPackage (import ./nix/docker.nix) {
|
||||
inherit (docspellPkgs) docspell-server docspell-joex;
|
||||
};
|
||||
in {
|
||||
formatter = pkgs.alejandra;
|
||||
|
||||
packages = {
|
||||
inherit (docspellPkgs) docspell-server docspell-joex;
|
||||
};
|
||||
|
||||
legacyPackages = {
|
||||
docker = {
|
||||
amd64 = {
|
||||
inherit (dockerAmd64) docspell-server docspell-joex;
|
||||
};
|
||||
arm64 = {
|
||||
inherit (dockerArm64) docspell-server docspell-joex;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
checks = {
|
||||
build-server = self.packages.${system}.docspell-server;
|
||||
build-joex = self.packages.${system}.docspell-joex;
|
||||
|
||||
test = with import (nixpkgs + "/nixos/lib/testing-python.nix")
|
||||
{
|
||||
inherit system;
|
||||
};
|
||||
makeTest {
|
||||
name = "docspell";
|
||||
nodes = {
|
||||
machine = {...}: {
|
||||
nixpkgs.overlays = [self.overlays.default];
|
||||
imports = [
|
||||
self.nixosModules.default
|
||||
./nix/checks
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
testScript = builtins.readFile ./nix/checks/testScript.py;
|
||||
};
|
||||
};
|
||||
|
||||
devShells = {
|
||||
dev-cnt = pkgs.mkShellNoCC {
|
||||
buildInputs =
|
||||
(builtins.attrValues devshell-tools.legacyPackages.${system}.cnt-scripts)
|
||||
++ devshellPkgs;
|
||||
|
||||
DEV_CONTAINER = "docsp-dev";
|
||||
SBT_OPTS = "-Xmx2G -Xss4m";
|
||||
};
|
||||
dev-vm = pkgs.mkShellNoCC {
|
||||
buildInputs =
|
||||
(builtins.attrValues devshell-tools.legacyPackages.${system}.vm-scripts)
|
||||
++ devshellPkgs;
|
||||
|
||||
SBT_OPTS = "-Xmx2G -Xss4m";
|
||||
DEV_VM = "dev-vm";
|
||||
VM_SSH_PORT = "10022";
|
||||
};
|
||||
};
|
||||
})
|
||||
// {
|
||||
nixosModules = {
|
||||
default = {...}: {
|
||||
imports = [
|
||||
./nix/modules/server.nix
|
||||
./nix/modules/joex.nix
|
||||
];
|
||||
};
|
||||
server = import ./nix/modules/server.nix;
|
||||
joex = import ./nix/modules/joex.nix;
|
||||
};
|
||||
|
||||
overlays.default = final: prev: let
|
||||
docspellPkgs = final.callPackage (import ./nix/pkg.nix) {};
|
||||
in {
|
||||
inherit (docspellPkgs) docspell-server docspell-joex;
|
||||
};
|
||||
|
||||
nixosConfigurations = {
|
||||
test-vm = devshell-tools.lib.mkVm {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
self.nixosModules.default
|
||||
{
|
||||
nixpkgs.overlays = [self.overlays.default];
|
||||
}
|
||||
./nix/test-vm.nix
|
||||
];
|
||||
};
|
||||
docsp-dev = devshell-tools.lib.mkContainer {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
{
|
||||
services.dev-postgres.enable = true;
|
||||
services.dev-email.enable = true;
|
||||
services.dev-minio.enable = true;
|
||||
services.dev-solr.enable = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
dev-vm = devshell-tools.lib.mkVm {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
{
|
||||
services.dev-postgres.enable = true;
|
||||
services.dev-email.enable = true;
|
||||
services.dev-minio.enable = true;
|
||||
services.dev-solr.enable = true;
|
||||
port-forward.ssh = 10022;
|
||||
port-forward.dev-postgres = 6534;
|
||||
port-forward.dev-smtp = 10025;
|
||||
port-forward.dev-imap = 10143;
|
||||
port-forward.dev-webmail = 8080;
|
||||
port-forward.dev-minio-api = 9000;
|
||||
port-forward.dev-minio-console = 9001;
|
||||
port-forward.dev-solr = 8983;
|
||||
networking.hostName = "dev-vm";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,5 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
let
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
full-text-search = {
|
||||
enabled = true;
|
||||
backend = "postgresql";
|
||||
@ -9,9 +12,7 @@ let
|
||||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
in {
|
||||
i18n = {
|
||||
defaultLocale = "en_US.UTF-8";
|
||||
};
|
||||
@ -21,12 +22,11 @@ in
|
||||
password = "root";
|
||||
};
|
||||
|
||||
|
||||
services.docspell-joex = {
|
||||
enable = true;
|
||||
bind.address = "0.0.0.0";
|
||||
base-url = "http://localhost:7878";
|
||||
jvmArgs = [ "-J-Xmx1536M" ];
|
||||
jvmArgs = ["-J-Xmx1536M"];
|
||||
inherit full-text-search;
|
||||
};
|
||||
services.docspell-restserver = {
|
||||
@ -69,14 +69,12 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
environment.systemPackages =
|
||||
[
|
||||
pkgs.jq
|
||||
pkgs.inetutils
|
||||
pkgs.htop
|
||||
pkgs.jdk17
|
||||
];
|
||||
|
||||
environment.systemPackages = [
|
||||
pkgs.jq
|
||||
pkgs.inetutils
|
||||
pkgs.htop
|
||||
pkgs.jdk17
|
||||
];
|
||||
|
||||
services.xserver = {
|
||||
enable = false;
|
||||
@ -84,12 +82,11 @@ in
|
||||
|
||||
networking = {
|
||||
hostName = "docspelltest";
|
||||
firewall.allowedTCPPorts = [ 7880 ];
|
||||
firewall.allowedTCPPorts = [7880];
|
||||
};
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
|
||||
# This slows down the build of a vm
|
||||
documentation.enable = false;
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
{ ... }:
|
||||
{
|
||||
{...}: {
|
||||
imports = [
|
||||
./configuration-test.nix
|
||||
];
|
||||
|
@ -1,28 +0,0 @@
|
||||
# NOTE: modulesPath and imports are taken from nixpkgs#59219
|
||||
{ modulesPath, pkgs, lib, ... }: {
|
||||
imports = [ (modulesPath + "/virtualisation/qemu-vm.nix") ];
|
||||
services.openssh = {
|
||||
enable = true;
|
||||
permitRootLogin = "yes";
|
||||
};
|
||||
|
||||
services.docspell-restserver = {
|
||||
openid = lib.mkForce [ ];
|
||||
backend = lib.mkForce {
|
||||
signup = {
|
||||
mode = "open";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# Otherwise oomkiller kills docspell
|
||||
virtualisation.memorySize = 4096;
|
||||
|
||||
virtualisation.forwardPorts = [
|
||||
# SSH
|
||||
{ from = "host"; host.port = 64022; guest.port = 22; }
|
||||
# Docspell
|
||||
{ from = "host"; host.port = 64080; guest.port = 7880; }
|
||||
];
|
||||
|
||||
}
|
79
nix/docker.nix
Normal file
79
nix/docker.nix
Normal file
@ -0,0 +1,79 @@
|
||||
{
|
||||
dockerTools,
|
||||
busybox,
|
||||
cacert,
|
||||
wget,
|
||||
unpaper,
|
||||
ghostscript,
|
||||
ocrmypdf,
|
||||
tesseract4,
|
||||
python3Packages,
|
||||
unoconv,
|
||||
docspell-server,
|
||||
docspell-joex,
|
||||
}: let
|
||||
mkImage = {
|
||||
name,
|
||||
port,
|
||||
pkg,
|
||||
tools,
|
||||
}:
|
||||
dockerTools.buildLayeredImage {
|
||||
inherit name;
|
||||
created = "now";
|
||||
contents =
|
||||
[
|
||||
busybox
|
||||
cacert
|
||||
wget
|
||||
pkg
|
||||
]
|
||||
++ tools;
|
||||
|
||||
extraCommands = "mkdir -m 0777 tmp";
|
||||
|
||||
#https://github.com/moby/docker-image-spec/blob/main/spec.md#image-json-description
|
||||
config = {
|
||||
Entrypoint = ["bin/${name}" "-Dconfig.file="];
|
||||
#Cmd = ["bin/${name}" "-Dconfig.file="];
|
||||
ExposedPorts = {
|
||||
"${builtins.toString port}/tcp" = {};
|
||||
};
|
||||
Env = [
|
||||
"PATH=/bin"
|
||||
"SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt"
|
||||
];
|
||||
Healthcheck = {
|
||||
Test = [
|
||||
"CMD"
|
||||
"wget"
|
||||
"--spider"
|
||||
"http://localhost:${builtins.toString port}/api/info/version"
|
||||
];
|
||||
Interval = 60000000000; #1min
|
||||
Timeout = 10000000000; #10s
|
||||
Retries = 2;
|
||||
StartInterval = 10000000000;
|
||||
};
|
||||
Labels = {
|
||||
#https://github.com/microscaling/microscaling/blob/55a2d7b91ce7513e07f8b1fd91bbed8df59aed5a/Dockerfile#L22-L33
|
||||
"org.label-schema.vcs-ref" = "v${pkg.version}";
|
||||
"org.label-schema.vcs-url" = "https://github.com/eikek/docspell";
|
||||
};
|
||||
};
|
||||
tag = "v${pkg.version}";
|
||||
};
|
||||
in {
|
||||
docspell-server = mkImage {
|
||||
name = "docspell-restserver";
|
||||
port = 7880;
|
||||
pkg = docspell-server;
|
||||
tools = [];
|
||||
};
|
||||
docspell-joex = mkImage {
|
||||
name = "docspell-joex";
|
||||
port = 7878;
|
||||
pkg = docspell-joex;
|
||||
tools = [unpaper ghostscript ocrmypdf tesseract4 python3Packages.weasyprint unoconv];
|
||||
};
|
||||
}
|
26
nix/flake.lock
generated
26
nix/flake.lock
generated
@ -1,26 +0,0 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1706373441,
|
||||
"narHash": "sha256-S1hbgNbVYhuY2L05OANWqmRzj4cElcbLuIkXTb69xkk=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "56911ef3403a9318b7621ce745f5452fb9ef6867",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-23.11",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
134
nix/flake.nix
134
nix/flake.nix
@ -1,134 +0,0 @@
|
||||
{
|
||||
description = "Docspell flake";
|
||||
inputs = {
|
||||
nixpkgs.url = "nixpkgs/nixos-23.11";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs }:
|
||||
let
|
||||
supportedSystems = [ "x86_64-linux" "aarch64-linux" ];
|
||||
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||
nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });
|
||||
# Version config
|
||||
cfg = {
|
||||
v0_41_0 = rec {
|
||||
version = "0.41.0";
|
||||
server = {
|
||||
url = "https://github.com/eikek/docspell/releases/download/v${version}/docspell-restserver-${version}.zip";
|
||||
sha256 = "sha256-JFftIzI94UNLLh96I++qFsBZhOkquPIPhNhtS2Ov8wI=";
|
||||
};
|
||||
joex = {
|
||||
url = "https://github.com/eikek/docspell/releases/download/v${version}/docspell-joex-${version}.zip";
|
||||
sha256 = "sha256-flKWjEsMd2/XT3Bu6EjFgf3lCojvLbKFDEXemP1K+/8=";
|
||||
};
|
||||
};
|
||||
};
|
||||
current_version = cfg.v0_41_0;
|
||||
inherit (current_version) version;
|
||||
in
|
||||
rec
|
||||
{
|
||||
overlays.default = final: prev: {
|
||||
docspell-server = with final; stdenv.mkDerivation {
|
||||
inherit version;
|
||||
pname = "docspell-server";
|
||||
|
||||
src = fetchzip current_version.server;
|
||||
buildInputs = [ jdk17 ];
|
||||
buildPhase = "true";
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/{bin,docspell-restserver-${version}}
|
||||
cp -R * $out/docspell-restserver-${version}/
|
||||
cat > $out/bin/docspell-restserver <<-EOF
|
||||
#!${bash}/bin/bash
|
||||
$out/docspell-restserver-${version}/bin/docspell-restserver -java-home ${jdk17} "\$@"
|
||||
EOF
|
||||
chmod 755 $out/bin/docspell-restserver
|
||||
'';
|
||||
};
|
||||
docspell-joex = with final; stdenv.mkDerivation rec {
|
||||
inherit version;
|
||||
|
||||
pname = "docspell-joex";
|
||||
|
||||
src = fetchzip current_version.joex;
|
||||
|
||||
buildInputs = [ jdk17 ];
|
||||
|
||||
buildPhase = "true";
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/{bin,docspell-joex-${version}}
|
||||
cp -R * $out/docspell-joex-${version}/
|
||||
cat > $out/bin/docspell-joex <<-EOF
|
||||
#!${bash}/bin/bash
|
||||
$out/docspell-joex-${version}/bin/docspell-joex -java-home ${jdk17} "\$@"
|
||||
EOF
|
||||
chmod 755 $out/bin/docspell-joex
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
packages = forAllSystems (system:
|
||||
{
|
||||
default = (import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ self.overlays.default ];
|
||||
}).docspell-joex;
|
||||
});
|
||||
|
||||
checks = forAllSystems
|
||||
(system: {
|
||||
build = self.packages.${system}.default;
|
||||
|
||||
test =
|
||||
with import (nixpkgs + "/nixos/lib/testing-python.nix")
|
||||
{
|
||||
inherit system;
|
||||
};
|
||||
|
||||
makeTest {
|
||||
name = "docspell";
|
||||
nodes = {
|
||||
machine = { ... }: {
|
||||
imports = [
|
||||
self.nixosModules.default
|
||||
./checks
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
testScript = builtins.readFile ./checks/testScript.py;
|
||||
};
|
||||
});
|
||||
|
||||
nixosModules = {
|
||||
default = { ... }: {
|
||||
imports = [
|
||||
((import ./modules/server.nix) self.overlays.default)
|
||||
((import ./modules/joex.nix) self.overlays.default)
|
||||
];
|
||||
};
|
||||
server = ((import ./modules/server.nix) self.overlays.default);
|
||||
joex = ((import ./modules/joex.nix) self.overlays.default);
|
||||
};
|
||||
|
||||
nixosConfigurations =
|
||||
let
|
||||
lib = nixpkgs.lib;
|
||||
in
|
||||
{
|
||||
dev-vm = lib.makeOverridable nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
self.nixosModules.default
|
||||
./checks
|
||||
# nixos-shell specific module. Should be kept outside nix flake checks
|
||||
./dev-vm
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,17 @@
|
||||
overlay: { config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
let
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.services.docspell-restserver;
|
||||
# Extract the config without the extraConfig attribute. It will be merged later
|
||||
declared_config = attrsets.filterAttrs (n: v: n != "extraConfig") cfg;
|
||||
user = if cfg.runAs == null then "docspell" else cfg.runAs;
|
||||
user =
|
||||
if cfg.runAs == null
|
||||
then "docspell"
|
||||
else cfg.runAs;
|
||||
configFile = pkgs.writeText "docspell-server.conf" ''
|
||||
{"docspell": {"server":
|
||||
${builtins.toJSON (lib.recursiveUpdate declared_config cfg.extraConfig)}
|
||||
@ -44,7 +50,7 @@ let
|
||||
source-name = "integration";
|
||||
allowed-ips = {
|
||||
enabled = false;
|
||||
ips = [ "127.0.0.1" ];
|
||||
ips = ["127.0.0.1"];
|
||||
};
|
||||
http-basic = {
|
||||
enabled = false;
|
||||
@ -78,9 +84,9 @@ let
|
||||
user = "pguser";
|
||||
password = "";
|
||||
};
|
||||
pg-config = { };
|
||||
pg-config = {};
|
||||
pg-query-parser = "websearch_to_tsquery";
|
||||
pg-rank-normalization = [ 4 ];
|
||||
pg-rank-normalization = [4];
|
||||
};
|
||||
};
|
||||
auth = {
|
||||
@ -126,19 +132,17 @@ let
|
||||
};
|
||||
files = {
|
||||
chunk-size = 524288;
|
||||
valid-mime-types = [ ];
|
||||
valid-mime-types = [];
|
||||
};
|
||||
addons = {
|
||||
enabled = false;
|
||||
allow-impure = true;
|
||||
allowed-urls = [ "*" ];
|
||||
denied-urls = [ ];
|
||||
allowed-urls = ["*"];
|
||||
denied-urls = [];
|
||||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
in {
|
||||
## interface
|
||||
options = {
|
||||
services.docspell-restserver = {
|
||||
@ -156,12 +160,11 @@ in
|
||||
};
|
||||
jvmArgs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [ ];
|
||||
example = [ "-J-Xmx1G" ];
|
||||
default = [];
|
||||
example = ["-J-Xmx1G"];
|
||||
description = "The options passed to the executable for setting jvm arguments.";
|
||||
};
|
||||
|
||||
|
||||
app-name = mkOption {
|
||||
type = types.str;
|
||||
default = defaults.app-name;
|
||||
@ -232,7 +235,7 @@ in
|
||||
};
|
||||
|
||||
bind = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
address = mkOption {
|
||||
type = types.str;
|
||||
@ -245,13 +248,13 @@ in
|
||||
description = "The port to bind the REST server";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.bind;
|
||||
description = "Address and port bind the rest server.";
|
||||
};
|
||||
|
||||
server-options = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enable-http-2 = mkOption {
|
||||
type = types.bool;
|
||||
@ -269,13 +272,13 @@ in
|
||||
description = "Timeout when waiting for the response.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.server-options;
|
||||
description = "Tuning the http server";
|
||||
};
|
||||
|
||||
logging = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
minimum-level = mkOption {
|
||||
type = types.str;
|
||||
@ -293,13 +296,13 @@ in
|
||||
description = "Set of logger and their levels";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.logging;
|
||||
description = "Settings for logging";
|
||||
};
|
||||
|
||||
auth = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
server-secret = mkOption {
|
||||
type = types.str;
|
||||
@ -320,7 +323,7 @@ in
|
||||
'';
|
||||
};
|
||||
remember-me = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -333,18 +336,18 @@ in
|
||||
description = "The time a remember-me token is valid.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.auth.remember-me;
|
||||
description = "Settings for Remember-Me";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.auth;
|
||||
description = "Authentication";
|
||||
};
|
||||
|
||||
download-all = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
max-files = mkOption {
|
||||
type = types.int;
|
||||
@ -357,7 +360,7 @@ in
|
||||
description = "The maximum (uncompressed) size of the zip file contents.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.download-all;
|
||||
description = "";
|
||||
};
|
||||
@ -387,7 +390,7 @@ in
|
||||
description = "How to retrieve the collective name.";
|
||||
};
|
||||
provider = mkOption {
|
||||
type = (types.submodule {
|
||||
type = types.submodule {
|
||||
options = {
|
||||
provider-id = mkOption {
|
||||
type = types.str;
|
||||
@ -436,18 +439,18 @@ in
|
||||
description = "The expected algorithm used to sign the token.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.openid.provider;
|
||||
description = "The config for an OpenID Connect provider.";
|
||||
};
|
||||
};
|
||||
});
|
||||
default = [ ];
|
||||
default = [];
|
||||
description = "A list of OIDC provider configurations.";
|
||||
};
|
||||
|
||||
integration-endpoint = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -467,7 +470,7 @@ in
|
||||
'';
|
||||
};
|
||||
allowed-ips = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -480,7 +483,7 @@ in
|
||||
description = "The ips/ip patterns to allow";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.integration-endpoint.allowed-ips;
|
||||
description = ''
|
||||
IPv4 addresses to allow access. An empty list, if enabled,
|
||||
@ -491,7 +494,7 @@ in
|
||||
'';
|
||||
};
|
||||
http-basic = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -514,14 +517,14 @@ in
|
||||
description = "The password to check.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.integration-endpoint.http-basic;
|
||||
description = ''
|
||||
Requests are expected to use http basic auth when uploading files.
|
||||
'';
|
||||
};
|
||||
http-header = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -539,7 +542,7 @@ in
|
||||
description = "The value of the header to check.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.integration-endpoint.http-header;
|
||||
description = ''
|
||||
Requests are expected to supply some specific header when
|
||||
@ -547,7 +550,7 @@ in
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.integration-endpoint;
|
||||
description = ''
|
||||
This endpoint allows to upload files to any collective. The
|
||||
@ -566,7 +569,7 @@ in
|
||||
};
|
||||
|
||||
admin-endpoint = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
secret = mkOption {
|
||||
type = types.str;
|
||||
@ -574,13 +577,13 @@ in
|
||||
description = "The secret used to call admin endpoints.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.admin-endpoint;
|
||||
description = "An endpoint for administration tasks.";
|
||||
};
|
||||
|
||||
full-text-search = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -597,7 +600,7 @@ in
|
||||
description = "The backend to use, either solr or postgresql";
|
||||
};
|
||||
solr = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
url = mkOption {
|
||||
type = types.str;
|
||||
@ -629,13 +632,13 @@ in
|
||||
description = "The default combiner for tokens. One of {AND, OR}.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.full-text-search.solr;
|
||||
description = "Configuration for the SOLR backend.";
|
||||
};
|
||||
|
||||
postgresql = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
use-default-connection = mkOption {
|
||||
type = types.bool;
|
||||
@ -643,7 +646,7 @@ in
|
||||
description = "Whether to use the primary db connection.";
|
||||
};
|
||||
jdbc = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
url = mkOption {
|
||||
type = types.str;
|
||||
@ -663,7 +666,7 @@ in
|
||||
description = "The password to connect to the database.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.full-text-search.postgresql.jdbc;
|
||||
description = "Database connection settings";
|
||||
};
|
||||
@ -683,18 +686,18 @@ in
|
||||
description = "";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.full-text-search.postgresql;
|
||||
description = "PostgreSQL for fulltext search";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.full-text-search;
|
||||
description = "Configuration for full-text search.";
|
||||
};
|
||||
|
||||
backend = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
mail-debug = mkOption {
|
||||
type = types.bool;
|
||||
@ -707,7 +710,7 @@ in
|
||||
'';
|
||||
};
|
||||
jdbc = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
url = mkOption {
|
||||
type = types.str;
|
||||
@ -734,12 +737,12 @@ in
|
||||
description = "The password to connect to the database.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.backend.jdbc;
|
||||
description = "Database connection settings";
|
||||
};
|
||||
signup = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
mode = mkOption {
|
||||
type = types.str;
|
||||
@ -772,12 +775,12 @@ in
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.backend.signup;
|
||||
description = "Registration settings";
|
||||
};
|
||||
files = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
chunk-size = mkOption {
|
||||
type = types.int;
|
||||
@ -804,12 +807,12 @@ in
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.backend.files;
|
||||
description = "Settings for how files are stored.";
|
||||
};
|
||||
addons = mkOption {
|
||||
type = types.submodule ({
|
||||
type = types.submodule {
|
||||
options = {
|
||||
enabled = mkOption {
|
||||
type = types.bool;
|
||||
@ -832,19 +835,19 @@ in
|
||||
description = "Url patterns to deny to install";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.backend.addons;
|
||||
description = "Addon config";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
default = defaults.backend;
|
||||
description = "Configuration for the backend";
|
||||
};
|
||||
extraConfig = mkOption {
|
||||
type = types.attrs;
|
||||
description = "Extra configuration for docspell server. Overwrites values in case of a conflict.";
|
||||
default = { };
|
||||
default = {};
|
||||
example = ''
|
||||
{
|
||||
files = {
|
||||
@ -863,8 +866,6 @@ in
|
||||
|
||||
## implementation
|
||||
config = mkIf config.services.docspell-restserver.enable {
|
||||
|
||||
nixpkgs.overlays = [ overlay ];
|
||||
users.users."${user}" = mkIf (cfg.runAs == null) {
|
||||
name = user;
|
||||
isSystemUser = true;
|
||||
@ -873,24 +874,20 @@ in
|
||||
description = "Docspell user";
|
||||
group = user;
|
||||
};
|
||||
users.groups."${user}" = mkIf (cfg.runAs == null) { };
|
||||
users.groups."${user}" = mkIf (cfg.runAs == null) {};
|
||||
|
||||
|
||||
systemd.services.docspell-restserver =
|
||||
let
|
||||
args = builtins.concatStringsSep " " cfg.jvmArgs;
|
||||
cmd = "${pkgs.docspell-server}/bin/docspell-restserver ${args} -- ${configFile}";
|
||||
in
|
||||
{
|
||||
description = "Docspell Rest Server";
|
||||
after = [ "networking.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
path = [ pkgs.gawk ];
|
||||
preStart = ''
|
||||
systemd.services.docspell-restserver = let
|
||||
args = builtins.concatStringsSep " " cfg.jvmArgs;
|
||||
cmd = "${pkgs.docspell-server}/bin/docspell-restserver ${args} -- ${configFile}";
|
||||
in {
|
||||
description = "Docspell Rest Server";
|
||||
after = ["networking.target"];
|
||||
wantedBy = ["multi-user.target"];
|
||||
path = [pkgs.gawk];
|
||||
preStart = ''
|
||||
'';
|
||||
|
||||
script =
|
||||
"${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh ${user} -c \"${cmd}\"";
|
||||
};
|
||||
script = "${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh ${user} -c \"${cmd}\"";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
57
nix/pkg.nix
Normal file
57
nix/pkg.nix
Normal file
@ -0,0 +1,57 @@
|
||||
{
|
||||
stdenv,
|
||||
bash,
|
||||
fetchzip,
|
||||
jdk17,
|
||||
}: let
|
||||
version = "0.41.0";
|
||||
server = {
|
||||
url = "https://github.com/eikek/docspell/releases/download/v${version}/docspell-restserver-${version}.zip";
|
||||
sha256 = "sha256-JFftIzI94UNLLh96I++qFsBZhOkquPIPhNhtS2Ov8wI=";
|
||||
};
|
||||
joex = {
|
||||
url = "https://github.com/eikek/docspell/releases/download/v${version}/docspell-joex-${version}.zip";
|
||||
sha256 = "sha256-flKWjEsMd2/XT3Bu6EjFgf3lCojvLbKFDEXemP1K+/8=";
|
||||
};
|
||||
in {
|
||||
docspell-server = stdenv.mkDerivation {
|
||||
inherit version;
|
||||
pname = "docspell-server";
|
||||
|
||||
src = fetchzip server;
|
||||
buildInputs = [jdk17];
|
||||
buildPhase = "true";
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/{bin,docspell-restserver-${version}}
|
||||
cp -R * $out/docspell-restserver-${version}/
|
||||
cat > $out/bin/docspell-restserver <<-EOF
|
||||
#!${bash}/bin/bash
|
||||
$out/docspell-restserver-${version}/bin/docspell-restserver -java-home ${jdk17} "\$@"
|
||||
EOF
|
||||
chmod 755 $out/bin/docspell-restserver
|
||||
'';
|
||||
};
|
||||
|
||||
docspell-joex = stdenv.mkDerivation rec {
|
||||
inherit version;
|
||||
|
||||
pname = "docspell-joex";
|
||||
|
||||
src = fetchzip joex;
|
||||
|
||||
buildInputs = [jdk17];
|
||||
|
||||
buildPhase = "true";
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/{bin,docspell-joex-${version}}
|
||||
cp -R * $out/docspell-joex-${version}/
|
||||
cat > $out/bin/docspell-joex <<-EOF
|
||||
#!${bash}/bin/bash
|
||||
$out/docspell-joex-${version}/bin/docspell-joex -java-home ${jdk17} "\$@"
|
||||
EOF
|
||||
chmod 755 $out/bin/docspell-joex
|
||||
'';
|
||||
};
|
||||
}
|
77
nix/test-vm.nix
Normal file
77
nix/test-vm.nix
Normal file
@ -0,0 +1,77 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
full-text-search = {
|
||||
enabled = true;
|
||||
backend = "solr";
|
||||
solr.url = "http://localhost:8983/solr/docspell";
|
||||
};
|
||||
jdbc = {
|
||||
url = "jdbc:postgresql://localhost:5432/docspell";
|
||||
user = "dev";
|
||||
password = "dev";
|
||||
};
|
||||
in {
|
||||
services.dev-postgres = {
|
||||
enable = true;
|
||||
databases = ["docspell"];
|
||||
};
|
||||
services.dev-email.enable = true;
|
||||
services.dev-solr = {
|
||||
enable = true;
|
||||
cores = ["docspell"];
|
||||
};
|
||||
|
||||
port-forward.dev-webmail = 8080;
|
||||
port-forward.dev-solr = 8983;
|
||||
|
||||
networking = {
|
||||
hostName = "docspell-test-vm";
|
||||
firewall.allowedTCPPorts = [7880];
|
||||
};
|
||||
|
||||
virtualisation.memorySize = 6144;
|
||||
|
||||
virtualisation.forwardPorts = [
|
||||
{
|
||||
from = "host";
|
||||
host.port = 7881;
|
||||
guest.port = 7880;
|
||||
}
|
||||
];
|
||||
|
||||
services.docspell-restserver = {
|
||||
enable = true;
|
||||
bind.address = "0.0.0.0";
|
||||
backend = {
|
||||
addons.enabled = true;
|
||||
signup.mode = "open";
|
||||
inherit jdbc;
|
||||
};
|
||||
integration-endpoint = {
|
||||
enabled = true;
|
||||
http-header = {
|
||||
enabled = true;
|
||||
header-value = "test123";
|
||||
};
|
||||
};
|
||||
admin-endpoint = {
|
||||
secret = "admin123";
|
||||
};
|
||||
inherit full-text-search;
|
||||
};
|
||||
|
||||
services.docspell-joex = {
|
||||
enable = true;
|
||||
bind.address = "0.0.0.0";
|
||||
inherit jdbc full-text-search;
|
||||
addons = {
|
||||
executor-config = {
|
||||
runner = "nix-flake,trivial";
|
||||
nspawn.enabled = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,23 +1,35 @@
|
||||
let
|
||||
nixpkgs = builtins.fetchTarball {
|
||||
#url = "https://github.com/NixOS/nixpkgs/archive/92e990a8d6bc35f1089c76dd8ba68b78da90da59.tar.gz";
|
||||
url = "channel:nixos-23.05";
|
||||
url = "channel:nixos-23.05";
|
||||
};
|
||||
pkgs = import nixpkgs { };
|
||||
pkgs = import nixpkgs {};
|
||||
initScript = pkgs.writeScript "docspell-build-init" ''
|
||||
export LD_LIBRARY_PATH=
|
||||
${pkgs.bash}/bin/bash -c "sbt -mem 4096 -java-home ${pkgs.openjdk17}/lib/openjdk"
|
||||
export LD_LIBRARY_PATH=
|
||||
${pkgs.bash}/bin/bash -c "sbt -mem 4096 -java-home ${pkgs.openjdk17}/lib/openjdk"
|
||||
'';
|
||||
in with pkgs;
|
||||
in
|
||||
with pkgs;
|
||||
buildFHSUserEnv {
|
||||
name = "docspell-sbt";
|
||||
targetPkgs = pkgs:
|
||||
with pkgs; [
|
||||
netcat
|
||||
jdk17
|
||||
wget
|
||||
which
|
||||
dpkg
|
||||
sbt
|
||||
git
|
||||
elmPackages.elm
|
||||
ncurses
|
||||
fakeroot
|
||||
mc
|
||||
zola
|
||||
yarn
|
||||
|
||||
buildFHSUserEnv {
|
||||
name = "docspell-sbt";
|
||||
targetPkgs = pkgs: with pkgs; [
|
||||
netcat jdk17 wget which dpkg sbt git elmPackages.elm ncurses fakeroot mc
|
||||
zola yarn
|
||||
|
||||
# haskells http client needs this (to download elm packages)
|
||||
iana-etc
|
||||
];
|
||||
runScript = initScript;
|
||||
}
|
||||
# haskells http client needs this (to download elm packages)
|
||||
iana-etc
|
||||
];
|
||||
runScript = initScript;
|
||||
}
|
||||
|
@ -4,17 +4,16 @@ let
|
||||
#url = "https://github.com/NixOS/nixpkgs/archive/e6badb26fc0d238fda2432c45b7dd4e782eb8200.tar.gz";
|
||||
#url = "https://github.com/NixOs/nixpkgs/archive/0f316e4d72daed659233817ffe52bf08e081b5de.tar.gz"; #21.11
|
||||
};
|
||||
pkgs = import nixpkgs { };
|
||||
pkgs = import nixpkgs {};
|
||||
in
|
||||
with pkgs;
|
||||
|
||||
mkShell {
|
||||
buildInputs = [
|
||||
zola
|
||||
yarn
|
||||
sbt
|
||||
elmPackages.elm
|
||||
nodejs
|
||||
inotifyTools
|
||||
];
|
||||
}
|
||||
with pkgs;
|
||||
mkShell {
|
||||
buildInputs = [
|
||||
zola
|
||||
yarn
|
||||
sbt
|
||||
elmPackages.elm
|
||||
nodejs
|
||||
inotifyTools
|
||||
];
|
||||
}
|
||||
|
@ -8,9 +8,9 @@ weight = 24
|
||||
## Install via Nix
|
||||
|
||||
Docspell can be installed via the [nix](https://nixos.org/nix) package
|
||||
manager, which is available for Linux and OSX. Docspell is currently not
|
||||
part of the [nixpkgs collection](https://nixos.org/nixpkgs/), but you
|
||||
can use the flake from this repository.
|
||||
manager. Docspell is currently not part of the [nixpkgs
|
||||
collection](https://nixos.org/nixpkgs/), but you can use the flake
|
||||
from this repository.
|
||||
|
||||
## Upgrading
|
||||
|
||||
@ -31,7 +31,7 @@ There are the following modules provided:
|
||||
|
||||
```nix
|
||||
# flake.nix
|
||||
inputs.docspell.url = "github:eikek/docspell?dir=nix/";
|
||||
inputs.docspell.url = "github:eikek/docspell";
|
||||
|
||||
# in modules
|
||||
imports = [
|
||||
@ -134,10 +134,33 @@ inputs.docspell.url = "github:eikek/docspell?dir=nix/";
|
||||
'';
|
||||
};
|
||||
|
||||
|
||||
networking = {
|
||||
hostName = "docspellexample";
|
||||
firewall.allowedTCPPorts = [7880];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
You can also look at `nix/test-vm.nix` for another example.
|
||||
|
||||
## Without Flakes
|
||||
|
||||
Of course, you can also use it without flakes. There is `nix/pkg.nix`
|
||||
which contains the derivation of both packages, `docspell-server` and
|
||||
`docspell-joex`. Just call it with your nixpkgs instance as usual:
|
||||
|
||||
``` nix
|
||||
let
|
||||
repo = fetchurl {
|
||||
url = "https://github.com/eikek/docspell";
|
||||
sha256 = "sha256-X2mM+Z5s8Xm1E6zrZ0wcRaivLEvqbk5Dn+GSXkZHdLM=";
|
||||
};
|
||||
docspellPkgs = pkgs.callPackage (import "${repo}/nix/pkg.nix") {};
|
||||
in
|
||||
#
|
||||
# use docspellPkgs.docspell-server or docspellPkgs.docspell-joex
|
||||
#
|
||||
```
|
||||
|
||||
The same way import NixOS modules from
|
||||
`nix/modules/{joex|server}.nix`.
|
||||
|
Loading…
x
Reference in New Issue
Block a user