diff --git a/apps/server/docker/traefik/traefik.yml b/apps/server/docker/traefik/traefik.yml index 4c582bd01..0fb59ab1d 100644 --- a/apps/server/docker/traefik/traefik.yml +++ b/apps/server/docker/traefik/traefik.yml @@ -1,6 +1,10 @@ entryPoints: web: address: ":8090" + http: + encodedCharacters: + allowEncodedSlash: true + allowEncodedHash: true providers: file: diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html index 672edae1c..a69329fce 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html @@ -216,7 +216,7 @@ #calendar:color - ❌️ Removed since v0.100.0. Use **#color** instead. + ❌️ Removed since v0.100.0. Use **#color** instead.

Similar to #color, but applies the color only for the event in the calendar and not for other places such as the note tree. diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html index b48e60add..b2aea2650 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.html @@ -1,5 +1,24 @@ -

Configure Traefik proxy and HTTPS. See #7768 for - reference

+

The goal of this article is to configure Traefik proxy and HTTPS. See + #7768for reference.

+

Breaking change in Traefik 3.6.4

+

Traefik 3.6.4 introduced a breaking change regarding + how percent-encoded characters are handled in URLs. More specifically some + URLs used by Trilium (such as search/%23workspace%20%23!template) + are automatically rejected by Traefik, resulting in HTTP 400 errors.

+

To solve this, the Traefik static configuration must + be modified in order to allow those characters:

entryPoints:
+  web:
+    http:
+      encodedCharacters:
+        allowEncodedSlash: true
+        allowEncodedHash: true
+

Build the docker-compose file

Setting up Traefik as reverse proxy requires setting the following labels:

    labels:
       - traefik.enable=true
@@ -16,8 +35,8 @@
       - traefik.http.middlewares.trilium-headers.headers.customrequestheaders.X-Forwarded-Proto=https

Setup needed environment variables

After setting up a reverse proxy, make sure to configure the [missing note].

-

Example docker-compose.yaml

services:
+  href="#root/_help_LLzSMXACKhUs">Trusted proxy.

+

Example docker-compose.yaml

services:
   trilium:
     image: triliumnext/trilium
     container_name: trilium
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets.html
index 4f1d6731f..2ef613b9b 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets.html	
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets.html	
@@ -1,33 +1,28 @@
-

Launch bar widgets are a subset of Custom Widgets that +

Launch bar widgets are a subset of Custom Widgets that can be used to render custom buttons and widgets inside the Launch Bar.

+ href="#root/_help_xYmIYSP6wE3F">Launch Bar.

Creating a launch bar widget

-

Unlike Custom Widgets, +

Unlike Custom Widgets, the process of setting up a launch bar widget is slightly different:

    -
  1. Create a Code note of type JavaScript (front-end). +
  2. Create a Code note of type JavaScript (front-end).
      -
    • The script itself uses the same concepts as Custom Widgets, - including the use of a NoteContextAwareWidget or - a BasicWidget (according to needs).
    • -
    • As examples, see Note Title Widget and  +
    • The script itself uses the same concepts as Custom Widgets, including the use of a NoteContextAwareWidget or + a BasicWidget (according to needs).
    • +
    • As examples, see Note Title Widget and  Analog Watch.
    • -
    + class="reference-link" href="#root/_help_gcI7RPbaNSh3">Analog Watch.
  3. + -
  4. Don't set #widget, as that attribute is - reserved for Custom Widgets.
  5. -
  6. In the Global menu, +
  7. Don't set #widget, as that attribute is reserved for  + Custom Widgets.
  8. +
  9. In the Global menu, select Configure launchbar.
  10. -
  11. In the Visible Launchers section, select Add a custom widget.
  12. -
  13. Give the newly created launcher a name (and optionally a name).
  14. -
  15. In the Promoted Attributes section, - modify the widget field to point to the newly created note.
  16. -
  17. Refresh the UI. 
  18. +
  19. In the Visible Launchers section, select Add a custom widget.
  20. +
  21. Give the newly created launcher a name (and optionally a name).
  22. +
  23. In the Promoted Attributes section, + modify the widget field to point to the newly created note.
  24. +
  25. Refresh the UI.
\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Analog Watch.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Analog Watch.html index f0fb7e5b6..e9625e39b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Analog Watch.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Analog Watch.html @@ -4,7 +4,7 @@

This is a more intricate example of a basic widget, which displays an analog watch in the launch bar. Unlike note-context aware widgets, basic - widgets don't react to note navigation.

const TPL = `
+  widgets don't react to note navigation.

const TPL = `
 <div class="analog-watch" style="
     position: relative;
     height: 38px;
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Note Title Widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Note Title Widget.html
index 9549f5d81..6e6da3273 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Note Title Widget.html	
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Note Title Widget.html	
@@ -6,7 +6,7 @@
   currently opened note and refreshes automatically as the user navigates
   through the notes.

In this example, the title of the note is displayed. It works best on - the horizontal layout.

const TPL = `\
+  the horizontal layout.

const TPL = `\
 <div style="
     display: flex;
     height: 53px;
diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md
index 35bdcf096..cb411c0f7 100644
--- a/docs/Developer Guide/Developer Guide/Documentation.md	
+++ b/docs/Developer Guide/Developer Guide/Documentation.md	
@@ -1,5 +1,5 @@
 # Documentation
-There are multiple types of documentation for Trilium:
+There are multiple types of documentation for Trilium:
 
 *   The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing F1.
 *   The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers.
diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json
index 7878fb278..d846c6d27 100644
--- a/docs/User Guide/!!!meta.json	
+++ b/docs/User Guide/!!!meta.json	
@@ -15662,6 +15662,48 @@
                                     "type": "text",
                                     "mime": "text/html",
                                     "attributes": [
+                                        {
+                                            "type": "relation",
+                                            "name": "internalLink",
+                                            "value": "MgibgPcfeuGz",
+                                            "isInheritable": false,
+                                            "position": 10
+                                        },
+                                        {
+                                            "type": "relation",
+                                            "name": "internalLink",
+                                            "value": "xYmIYSP6wE3F",
+                                            "isInheritable": false,
+                                            "position": 20
+                                        },
+                                        {
+                                            "type": "relation",
+                                            "name": "internalLink",
+                                            "value": "IPArqVfDQ4We",
+                                            "isInheritable": false,
+                                            "position": 30
+                                        },
+                                        {
+                                            "type": "relation",
+                                            "name": "internalLink",
+                                            "value": "gcI7RPbaNSh3",
+                                            "isInheritable": false,
+                                            "position": 40
+                                        },
+                                        {
+                                            "type": "relation",
+                                            "name": "internalLink",
+                                            "value": "x3i7MxGccDuM",
+                                            "isInheritable": false,
+                                            "position": 50
+                                        },
+                                        {
+                                            "type": "relation",
+                                            "name": "internalLink",
+                                            "value": "OFXdgB2nNk1F",
+                                            "isInheritable": false,
+                                            "position": 60
+                                        },
                                         {
                                             "type": "label",
                                             "name": "iconClass",
@@ -15675,48 +15717,6 @@
                                             "value": "launch-bar-widgets",
                                             "isInheritable": false,
                                             "position": 40
-                                        },
-                                        {
-                                            "type": "relation",
-                                            "name": "internalLink",
-                                            "value": "MgibgPcfeuGz",
-                                            "isInheritable": false,
-                                            "position": 50
-                                        },
-                                        {
-                                            "type": "relation",
-                                            "name": "internalLink",
-                                            "value": "xYmIYSP6wE3F",
-                                            "isInheritable": false,
-                                            "position": 60
-                                        },
-                                        {
-                                            "type": "relation",
-                                            "name": "internalLink",
-                                            "value": "x3i7MxGccDuM",
-                                            "isInheritable": false,
-                                            "position": 70
-                                        },
-                                        {
-                                            "type": "relation",
-                                            "name": "internalLink",
-                                            "value": "OFXdgB2nNk1F",
-                                            "isInheritable": false,
-                                            "position": 80
-                                        },
-                                        {
-                                            "type": "relation",
-                                            "name": "internalLink",
-                                            "value": "IPArqVfDQ4We",
-                                            "isInheritable": false,
-                                            "position": 90
-                                        },
-                                        {
-                                            "type": "relation",
-                                            "name": "internalLink",
-                                            "value": "gcI7RPbaNSh3",
-                                            "isInheritable": false,
-                                            "position": 100
                                         }
                                     ],
                                     "format": "markdown",
@@ -15741,6 +15741,13 @@
                                             "type": "text",
                                             "mime": "text/html",
                                             "attributes": [
+                                                {
+                                                    "type": "relation",
+                                                    "name": "internalLink",
+                                                    "value": "x0JgW8UqGXvq",
+                                                    "isInheritable": false,
+                                                    "position": 10
+                                                },
                                                 {
                                                     "type": "label",
                                                     "name": "shareAlias",
@@ -15754,13 +15761,6 @@
                                                     "value": "note-title-widget",
                                                     "isInheritable": false,
                                                     "position": 40
-                                                },
-                                                {
-                                                    "type": "relation",
-                                                    "name": "internalLink",
-                                                    "value": "x0JgW8UqGXvq",
-                                                    "isInheritable": false,
-                                                    "position": 50
                                                 }
                                             ],
                                             "format": "markdown",
diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.md
index 1582093a4..6630185a5 100644
--- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.md	
+++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik.md	
@@ -1,5 +1,23 @@
 # Traefik
-Configure Traefik proxy and HTTPS. See [#7768](https://github.com/TriliumNext/Trilium/issues/7768#issuecomment-3539165814) for reference
+The goal of this article is to configure Traefik proxy and HTTPS. See [#7768](https://github.com/TriliumNext/Trilium/issues/7768#issuecomment-3539165814) for reference.
+
+## Breaking change in Traefik 3.6.4
+
+Traefik 3.6.4 introduced a [breaking change](https://doc.traefik.io/traefik/migrate/v3/#encoded-characters-in-request-path) regarding how percent-encoded characters are handled in URLs. More specifically some URLs used by Trilium (such as `search/%23workspace%20%23!template`) are automatically rejected by Traefik, resulting in HTTP 400 errors.
+
+To solve this, the Traefik [**static** configuration](https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-install-configuration) must be modified in order to allow those characters:
+
+```yaml
+entryPoints:
+  web:
+    http:
+      encodedCharacters:
+        allowEncodedSlash: true
+        allowEncodedHash: true
+```
+
+> [!TIP]
+> If you still have issues, depending on how Trilium is used (especially regarding search), you might need to enable more encoded character groups. For more information, see [the relevant GitHub issue](https://github.com/TriliumNext/Trilium/issues/7968); feel free to report your findings.
 
 ### Build the docker-compose file
 
@@ -23,7 +41,7 @@ Setting up Traefik as reverse proxy requires setting the following labels:
 
 ### Setup needed environment variables
 
-After setting up a reverse proxy, make sure to configure the [missing note].
+After setting up a reverse proxy, make sure to configure the Trusted proxy.
 
 ### Example `docker-compose.yaml`