Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kanboard: init at 1.2.42 #357229

Merged
merged 1 commit into from
Dec 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions nixos/doc/manual/release-notes/rl-2505.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

- [agorakit](https://github.com/agorakit/agorakit), an organization tool for citizens' collectives. Available with [services.agorakit](#opt-services.agorakit.enable).

- [KanBoard](https://github.com/kanboard/kanboard), a project management tool that focuses on the Kanban methodology. Available as [services.kanboard](#opt-services.kanboard.enable).

<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->

## Backward Incompatibilities {#sec-release-25.05-incompatibilities}
Expand Down
1 change: 1 addition & 0 deletions nixos/modules/module-list.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1466,6 +1466,7 @@
./services/web-apps/jirafeau.nix
./services/web-apps/jitsi-meet.nix
./services/web-apps/kasmweb/default.nix
./services/web-apps/kanboard.nix
./services/web-apps/kavita.nix
./services/web-apps/keycloak.nix
./services/web-apps/kimai.nix
Expand Down
175 changes: 175 additions & 0 deletions nixos/modules/services/web-apps/kanboard.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
{
config,
lib,
pkgs,
...
}:

let
cfg = config.services.kanboard;

toStringAttrs = lib.mapAttrs (lib.const toString);
in
{
meta.maintainers = with lib.maintainers; [ yzx9 ];

options.services.kanboard = {
enable = lib.mkEnableOption "Kanboard";

package = lib.mkPackageOption pkgs "kanboard" { };

dataDir = lib.mkOption {
type = lib.types.str;
default = "/var/lib/kanboard";
description = "Default data folder for Kanboard.";
example = "/mnt/kanboard";
};

user = lib.mkOption {
type = lib.types.str;
default = "kanboard";
description = "User under which Kanboard runs.";
};

group = lib.mkOption {
type = lib.types.str;
default = "kanboard";
description = "Group under which Kanboard runs.";
};

settings = lib.mkOption {
type =
with lib.types;
attrsOf (oneOf [
str
int
bool
]);

default = { };

description = ''
Customize the default settings, refer to <https://github.com/kanboard/kanboard/blob/main/config.default.php>
for details on supported values.
'';
};

# Nginx
domain = lib.mkOption {
type = lib.types.str;
default = "kanboard";
description = "FQDN for the Kanboard instance.";
example = "kanboard.example.org";
};
nginx = lib.mkOption {
type = lib.types.nullOr (
lib.types.submodule (import ../web-servers/nginx/vhost-options.nix { inherit config lib; })
);
default = { };
description = ''
With this option, you can customize an NGINX virtual host which already
has sensible defaults for Kanboard. Set to `{ }` if you do not need any
customization for the virtual host. If enabled, then by default, the
{option}`serverName` is `''${domain}`. If this is set to null (the
default), no NGINX virtual host will be configured.
'';
example = lib.literalExpression ''
{
enableACME = true;
forceHttps = true;
}
'';
};

phpfpm.settings = lib.mkOption {
type =
with lib.types;
attrsOf (oneOf [
int
str
bool
]);

default = { };

description = ''
Options for kanboard's PHPFPM pool.
'';
};
};

config = lib.mkIf cfg.enable {
users = {
users = lib.mkIf (cfg.user == "kanboard") {
kanboard = {
isSystemUser = true;
group = cfg.group;
home = cfg.dataDir;
createHome = true;
};
};

groups = lib.mkIf (cfg.group == "kanboard") {
kanboard = { };
};
};

services.phpfpm.pools.kanboard = {
user = cfg.user;
group = cfg.group;

settings = lib.mkMerge [
{
"pm" = "dynamic";
"php_admin_value[error_log]" = "stderr";
"php_admin_flag[log_errors]" = true;
"listen.owner" = "nginx";
"catch_workers_output" = true;
"pm.max_children" = "32";
"pm.start_servers" = "2";
"pm.min_spare_servers" = "2";
"pm.max_spare_servers" = "4";
"pm.max_requests" = "500";
}
cfg.phpfpm.settings
];

phpEnv = lib.mkMerge [
{ DATA_DIR = cfg.dataDir; }
(toStringAttrs cfg.settings)
];
};

services.nginx = lib.mkIf (cfg.nginx != null) {
enable = lib.mkDefault true;
virtualHosts."${cfg.domain}" = lib.mkMerge [
{
root = lib.mkForce "${cfg.package}/share/kanboard";
locations."/".extraConfig = ''
rewrite ^ /index.php;
'';
locations."~ \\.php$".extraConfig = ''
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:${config.services.phpfpm.pools.kanboard.socket};
include ${config.services.nginx.package}/conf/fastcgi.conf;
include ${config.services.nginx.package}/conf/fastcgi_params;
'';
locations."~ \\.(js|css|ttf|woff2?|png|jpe?g|svg)$".extraConfig = ''
add_header Cache-Control "public, max-age=15778463";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;
access_log off;
'';
extraConfig = ''
try_files $uri /index.php;
'';
}
cfg.nginx
];
};
};
}
1 change: 1 addition & 0 deletions nixos/tests/all-tests.nix
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,7 @@ in {
jotta-cli = handleTest ./jotta-cli.nix {};
k3s = handleTest ./k3s {};
kafka = handleTest ./kafka.nix {};
kanboard = handleTest ./web-apps/kanboard.nix {};
kanidm = handleTest ./kanidm.nix {};
kanidm-provisioning = handleTest ./kanidm-provisioning.nix {};
karma = handleTest ./karma.nix {};
Expand Down
25 changes: 25 additions & 0 deletions nixos/tests/web-apps/kanboard.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import ../make-test-python.nix (
{ lib, ... }:

{
name = "kanboard";
meta.maintainers = with lib.maintainers; [ yzx9 ];

nodes = {
machine = {
services.kanboard = {
enable = true;
};
};
};

testScript = ''
start_all()
machine.wait_for_unit("nginx.service")
machine.wait_for_unit("phpfpm-kanboard.service")
machine.wait_for_open_port(80)
machine.succeed("curl -k --fail http://localhost", timeout=10)
'';
}
)
46 changes: 46 additions & 0 deletions pkgs/by-name/ka/kanboard/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
lib,
stdenvNoCC,
fetchFromGitHub,
nixosTests,
nix-update-script,
php,
}:

stdenvNoCC.mkDerivation (finalAttrs: {
pname = "kanboard";
version = "1.2.42";

src = fetchFromGitHub {
owner = "kanboard";
repo = "kanboard";
rev = "refs/tags/v${finalAttrs.version}";
hash = "sha256-/Unxl9Vh9pEWjO89sSviGGPFzUwxdb1mbOfpTFTyRL0=";
};

dontBuild = true;

installPhase = ''
runHook preInstall
mkdir -p $out/share/kanboard
cp -rv . $out/share/kanboard
yzx9 marked this conversation as resolved.
Show resolved Hide resolved
runHook postInstall
'';

passthru = {
updateScript = nix-update-script { };
tests = lib.optionalAttrs stdenvNoCC.hostPlatform.isLinux {
inherit (nixosTests) kanboard;
};
};

meta = {
inherit (php.meta) platforms;
description = "Kanban project management software";
homepage = "https://kanboard.org";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ yzx9 ];
yzx9 marked this conversation as resolved.
Show resolved Hide resolved
};
})
Loading