nixos/mainsail: init

Changed files
+68 -1
nixos
modules
services
misc
web-apps
+1
nixos/modules/module-list.nix
···
./services/web-apps/komga.nix
./services/web-apps/lemmy.nix
./services/web-apps/limesurvey.nix
./services/web-apps/mastodon.nix
./services/web-apps/matomo.nix
./services/web-apps/mattermost.nix
···
./services/web-apps/komga.nix
./services/web-apps/lemmy.nix
./services/web-apps/limesurvey.nix
+
./services/web-apps/mainsail.nix
./services/web-apps/mastodon.nix
./services/web-apps/matomo.nix
./services/web-apps/mattermost.nix
+1 -1
nixos/modules/services/misc/moonraker.nix
···
example = {
authorization = {
trusted_clients = [ "10.0.0.0/24" ];
-
cors_domains = [ "https://app.fluidd.xyz" ];
};
};
description = lib.mdDoc ''
···
example = {
authorization = {
trusted_clients = [ "10.0.0.0/24" ];
+
cors_domains = [ "https://app.fluidd.xyz" "https://my.mainsail.xyz" ];
};
};
description = lib.mdDoc ''
+66
nixos/modules/services/web-apps/mainsail.nix
···
···
+
{ config, lib, pkgs, ... }:
+
with lib;
+
let
+
cfg = config.services.mainsail;
+
moonraker = config.services.moonraker;
+
in
+
{
+
options.services.mainsail = {
+
enable = mkEnableOption (lib.mdDoc "a modern and responsive user interface for Klipper");
+
+
package = mkOption {
+
type = types.package;
+
description = lib.mdDoc "Mainsail package to be used in the module";
+
default = pkgs.mainsail;
+
defaultText = literalExpression "pkgs.mainsail";
+
};
+
+
hostName = mkOption {
+
type = types.str;
+
default = "localhost";
+
description = lib.mdDoc "Hostname to serve mainsail on";
+
};
+
+
nginx = mkOption {
+
type = types.submodule
+
(import ../web-servers/nginx/vhost-options.nix { inherit config lib; });
+
default = { };
+
example = literalExpression ''
+
{
+
serverAliases = [ "mainsail.''${config.networking.domain}" ];
+
}
+
'';
+
description = lib.mdDoc "Extra configuration for the nginx virtual host of mainsail.";
+
};
+
};
+
+
config = mkIf cfg.enable {
+
services.nginx = {
+
enable = true;
+
upstreams.mainsail-apiserver.servers."${moonraker.address}:${toString moonraker.port}" = { };
+
virtualHosts."${cfg.hostName}" = mkMerge [
+
cfg.nginx
+
{
+
root = mkForce "${cfg.package}/share/mainsail";
+
locations = {
+
"/" = {
+
index = "index.html";
+
tryFiles = "$uri $uri/ /index.html";
+
};
+
"/index.html".extraConfig = ''
+
add_header Cache-Control "no-store, no-cache, must-revalidate";
+
'';
+
"/websocket" = {
+
proxyWebsockets = true;
+
proxyPass = "http://mainsail-apiserver/websocket";
+
};
+
"~ ^/(printer|api|access|machine|server)/" = {
+
proxyWebsockets = true;
+
proxyPass = "http://mainsail-apiserver$request_uri";
+
};
+
};
+
}
+
];
+
};
+
};
+
}