Commit ffba543dfb99

Vincent Demeester <vincent@sbr.pm>
2025-12-03 10:32:16
fix: Enable large file uploads for Immich through Traefik
- Resolve 502 Bad Gateway errors for photo backups over 400MB - Add buffering middleware with unlimited request/response size - Buffer up to 100MB in memory for optimal performance Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 55f83c9
Changed files (1)
systems
systems/rhea/extra.nix
@@ -92,6 +92,15 @@
             tls.certResolver = "letsencrypt";
           };
 
+          # Helper function to create a router with middlewares
+          mkRouterWithMiddlewares = name: hosts: middlewares: {
+            rule = lib.concatStringsSep " || " (map (host: "Host(`${host}`)") hosts);
+            service = name;
+            entryPoints = [ "websecure" ];
+            tls.certResolver = "letsencrypt";
+            inherit middlewares;
+          };
+
           # Helper function to create a simple HTTP service
           mkService = url: {
             loadBalancer.servers = [ { inherit url; } ];
@@ -188,6 +197,8 @@
               syncthingRouters
               // localRouters
               // {
+                # Override immich router to add large file upload middleware
+                immich = mkRouterWithMiddlewares "immich" [ "immich.sbr.pm" ] [ "immich-buffering" ];
                 kiwix = mkRouter "kiwix" [ "kiwix.sbr.pm" ];
                 n8n = mkRouter "n8n" [ "n8n.sbr.pm" ];
                 paperless = mkRouter "paperless" [ "paperless.sbr.pm" ];
@@ -202,7 +213,20 @@
                 paperless = mkService "http://${builtins.head globals.machines.sakhalin.net.ips}:8000";
                 grafana = mkService "http://${builtins.head globals.machines.sakhalin.net.ips}:3000";
               };
-            middlewares = syncthingMiddlewares // syncthingAddSlashMiddlewares;
+            middlewares =
+              syncthingMiddlewares
+              // syncthingAddSlashMiddlewares
+              // {
+                # Middleware for handling large file uploads (Immich)
+                immich-buffering = {
+                  buffering = {
+                    maxRequestBodyBytes = 0; # No limit
+                    memRequestBodyBytes = 104857600; # 100MB in memory
+                    maxResponseBodyBytes = 0; # No limit
+                    memResponseBodyBytes = 104857600; # 100MB in memory
+                  };
+                };
+              };
           };
           tcp = {
             routers = {