Unverified Commit 44f5a5f3 authored by lassulus's avatar lassulus Committed by GitHub
Browse files

Merge pull request #300917 from Tom-Hubrecht/crabfit

crabfit: init at unstable-2023-08-02
parents 05578863 96659af1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1320,6 +1320,7 @@
  ./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 −0
Original line number Diff line number Diff line
{
  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 −0
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ in {
  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 −0
Original line number Diff line number Diff line
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/")
    '';
  }
)
+3973 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading