at 23.11-pre 2.0 kB view raw
1{ config, lib, pkgs, ... }: 2with lib; 3let 4 cfg = config.services.fluidd; 5 moonraker = config.services.moonraker; 6in 7{ 8 options.services.fluidd = { 9 enable = mkEnableOption (lib.mdDoc "Fluidd, a Klipper web interface for managing your 3d printer"); 10 11 package = mkOption { 12 type = types.package; 13 description = lib.mdDoc "Fluidd package to be used in the module"; 14 default = pkgs.fluidd; 15 defaultText = literalExpression "pkgs.fluidd"; 16 }; 17 18 hostName = mkOption { 19 type = types.str; 20 default = "localhost"; 21 description = lib.mdDoc "Hostname to serve fluidd on"; 22 }; 23 24 nginx = mkOption { 25 type = types.submodule 26 (import ../web-servers/nginx/vhost-options.nix { inherit config lib; }); 27 default = { }; 28 example = literalExpression '' 29 { 30 serverAliases = [ "fluidd.''${config.networking.domain}" ]; 31 } 32 ''; 33 description = lib.mdDoc "Extra configuration for the nginx virtual host of fluidd."; 34 }; 35 }; 36 37 config = mkIf cfg.enable { 38 services.nginx = { 39 enable = true; 40 upstreams.fluidd-apiserver.servers."${moonraker.address}:${toString moonraker.port}" = { }; 41 virtualHosts."${cfg.hostName}" = mkMerge [ 42 cfg.nginx 43 { 44 root = mkForce "${cfg.package}/share/fluidd/htdocs"; 45 locations = { 46 "/" = { 47 index = "index.html"; 48 tryFiles = "$uri $uri/ /index.html"; 49 }; 50 "/index.html".extraConfig = '' 51 add_header Cache-Control "no-store, no-cache, must-revalidate"; 52 ''; 53 "/websocket" = { 54 proxyWebsockets = true; 55 proxyPass = "http://fluidd-apiserver/websocket"; 56 }; 57 "~ ^/(printer|api|access|machine|server)/" = { 58 proxyWebsockets = true; 59 proxyPass = "http://fluidd-apiserver$request_uri"; 60 }; 61 }; 62 } 63 ]; 64 }; 65 }; 66}