nixos/crabfit: init

Changed files
+212
nixos
modules
services
web-apps
tests
pkgs
by-name
cr
crabfit-api
crabfit-frontend
+1
nixos/modules/module-list.nix
···
./services/web-apps/cloudlog.nix
./services/web-apps/code-server.nix
./services/web-apps/convos.nix
+
./services/web-apps/crabfit.nix
./services/web-apps/davis.nix
./services/web-apps/dex.nix
./services/web-apps/discourse.nix
+171
nixos/modules/services/web-apps/crabfit.nix
···
+
{
+
config,
+
lib,
+
pkgs,
+
...
+
}:
+
+
let
+
inherit (lib)
+
literalExpression
+
mkEnableOption
+
mkIf
+
mkOption
+
mkPackageOption
+
;
+
+
inherit (lib.types)
+
attrsOf
+
package
+
port
+
str
+
;
+
+
cfg = config.services.crabfit;
+
in
+
+
{
+
options.services.crabfit = {
+
enable = mkEnableOption "Crab Fit, a meeting scheduler based on peoples' availability";
+
+
frontend = {
+
package = mkPackageOption pkgs "crabfit-frontend" { };
+
+
finalDrv = mkOption {
+
readOnly = true;
+
type = package;
+
default = cfg.frontend.package.override {
+
api_url = "https://${cfg.api.host}";
+
frontend_url = cfg.frontend.host;
+
};
+
+
defaultText = literalExpression ''
+
cfg.package.override {
+
api_url = "https://''${cfg.api.host}";
+
frontend_url = cfg.frontend.host;
+
};
+
'';
+
+
description = ''
+
The patched frontend, using the correct urls for the API and frontend.
+
'';
+
};
+
+
environment = mkOption {
+
type = attrsOf str;
+
default = { };
+
description = ''
+
Environment variables for the crabfit frontend.
+
'';
+
};
+
+
host = mkOption {
+
type = str;
+
description = ''
+
The hostname of the frontend.
+
'';
+
};
+
+
port = mkOption {
+
type = port;
+
default = 3001;
+
description = ''
+
The internal listening port of the frontend.
+
'';
+
};
+
};
+
+
api = {
+
package = mkPackageOption pkgs "crabfit-api" { };
+
+
environment = mkOption {
+
type = attrsOf str;
+
default = { };
+
description = ''
+
Environment variables for the crabfit API.
+
'';
+
};
+
+
host = mkOption {
+
type = str;
+
description = ''
+
The hostname of the API.
+
'';
+
};
+
+
port = mkOption {
+
type = port;
+
default = 3000;
+
description = ''
+
The internal listening port of the API.
+
'';
+
};
+
};
+
};
+
+
config = mkIf cfg.enable {
+
systemd.services = {
+
crabfit-api = {
+
description = "The API for Crab Fit.";
+
+
wantedBy = [ "multi-user.target" ];
+
after = [ "postgresql.service" ];
+
+
serviceConfig = {
+
# TODO: harden
+
ExecStart = lib.getExe cfg.api.package;
+
User = "crabfit";
+
};
+
+
environment = {
+
API_LISTEN = "127.0.0.1:${builtins.toString cfg.api.port}";
+
DATABASE_URL = "postgres:///crabfit?host=/run/postgresql";
+
FRONTEND_URL = "https://${cfg.frontend.host}";
+
} // cfg.api.environment;
+
};
+
+
crabfit-frontend = {
+
description = "The frontend for Crab Fit.";
+
+
wantedBy = [ "multi-user.target" ];
+
+
serviceConfig = {
+
# TODO: harden
+
CacheDirectory = "crabfit";
+
DynamicUser = true;
+
ExecStart = "${lib.getExe pkgs.nodejs} standalone/server.js";
+
WorkingDirectory = cfg.frontend.finalDrv;
+
};
+
+
environment = {
+
NEXT_PUBLIC_API_URL = "https://${cfg.api.host}";
+
PORT = builtins.toString cfg.frontend.port;
+
} // cfg.frontend.environment;
+
};
+
};
+
+
users = {
+
groups.crabfit = { };
+
+
users.crabfit = {
+
group = "crabfit";
+
isSystemUser = true;
+
};
+
};
+
+
services = {
+
postgresql = {
+
enable = true;
+
+
ensureDatabases = [ "crabfit" ];
+
+
ensureUsers = [
+
{
+
name = "crabfit";
+
ensureDBOwnership = true;
+
}
+
];
+
};
+
};
+
};
+
}
+1
nixos/tests/all-tests.nix
···
corerad = handleTest ./corerad.nix {};
coturn = handleTest ./coturn.nix {};
couchdb = handleTest ./couchdb.nix {};
+
crabfit = handleTest ./crabfit.nix {};
cri-o = handleTestOn ["aarch64-linux" "x86_64-linux"] ./cri-o.nix {};
cups-pdf = handleTest ./cups-pdf.nix {};
curl-impersonate = handleTest ./curl-impersonate.nix {};
+33
nixos/tests/crabfit.nix
···
+
import ./make-test-python.nix (
+
{ lib, pkgs, ... }:
+
+
{
+
name = "crabfit";
+
+
meta.maintainers = with lib.maintainers; [ thubrecht ];
+
+
nodes = {
+
machine =
+
{ pkgs, ... }:
+
{
+
services.crabfit = {
+
enable = true;
+
+
frontend.host = "http://127.0.0.1:3001";
+
api.host = "127.0.0.1:3000";
+
};
+
};
+
};
+
+
# TODO: Add a reverse proxy and a dns entry for testing
+
testScript = ''
+
machine.wait_for_unit("crabfit-api")
+
machine.wait_for_unit("crabfit-frontend")
+
+
machine.wait_for_open_port(3000)
+
machine.wait_for_open_port(3001)
+
+
machine.succeed("curl -f http://localhost:3001/")
+
'';
+
}
+
)
+3
pkgs/by-name/cr/crabfit-api/package.nix
···
{
lib,
+
nixosTests,
rustPlatform,
fetchFromGitHub,
fetchpatch,
···
buildFeatures = [ "${adaptor}-adaptor" ];
PROTOC = "${protobuf}/bin/protoc";
+
+
passthru.tests = [ nixosTests.crabfit ];
meta = {
description = "Enter your availability to find a time that works for everyone";
+3
pkgs/by-name/cr/crabfit-frontend/package.nix
···
{
lib,
+
nixosTests,
stdenv,
fetchFromGitHub,
fetchYarnDeps,
···
ln -s /var/cache/crabfit $out/standalone/.next/cache
'';
+
+
passthru.tests = [ nixosTests.crabfit ];
meta = {
description = "Enter your availability to find a time that works for everyone";