Is TLS required for a local-only server on my RasPi5? #10238
Replies: 2 comments 3 replies
|
No, TLS is not required for a local-only sync server. HTTP sync works fine on local networks with Your issue is almost certainly the sync server URL format in your desktop client. You must include the In your desktop client's Options → Sync, set the server address to: Also, two other things from your post:
So in summary: add To reply, just mention @dosu. Share context across your team and agents. Try Dosu. |
|
TLS is not required for the local HTTP listener itself. With your current config: [Network]
https=false
host=10.1.1.65
port=8080the working URL should be The thing I would fix first is the sync URL. In the config you pasted it is: syncServerHost=10.1.1.65:8080For Trilium this should be a full URL, including the scheme: syncServerHost=http://10.1.1.65:8080Same for the desktop Options -> Sync “Server instance address”: enter Also, for the “existing desktop -> empty server” setup, the important value is on the desktop instance. The Pi server just needs to be running and reachable while still uninitialized. A quick sanity check from the desktop machine is: curl http://10.1.1.65:8080/api/setup/statusIf that works, leave TLS off for the LAN test and get sync working first. After that, add TLS via a reverse proxy if you decide to expose it outside your trusted LAN. |
Uh oh!
There was an error while loading. Please reload this page.
I apologize if I'm missing something obvious here, but I can't get this to work.
I want to set up a Trilium sync server on my local RasPi5.
Linux raspberrypi 6.12.87+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.12.87-1+rpt1~bookworm (2026-05-12) aarch64
I tried:
Recommended: Docker Installation - Available for AMD64 and ARM architectures.
I think it is installed:
Details
pi@raspberrypi:~/builds/trilium $ ls -al total 13148 drwxr-xr-x 9 pi pi 4096 Jun 11 18:31 . drwxr-xr-x 6 pi pi 4096 Jun 11 18:28 .. drwxr-xr-x 8 pi pi 4096 Jun 11 18:31 assets -rw-r--r-- 1 pi pi 17062 May 13 12:56 ckeditor5-content.css -rw-r--r-- 1 pi pi 296027 May 13 12:56 docker_healthcheck.cjs -rw-r--r-- 1 pi pi 11796331 May 13 12:56 main.cjs -rw-r--r-- 1 pi pi 1305312 May 13 12:56 meta.json drwxr-xr-x 6 pi pi 4096 Jun 11 18:31 node drwxr-xr-x 11 pi pi 4096 Jun 11 18:31 node_modules drwxr-xr-x 4 pi pi 4096 Jun 11 18:31 pdfjs-viewer drwxr-xr-x 8 pi pi 4096 Jun 11 18:31 public drwxr-xr-x 4 pi pi 4096 Jun 11 18:31 share-theme drwxr-xr-x 8 pi pi 4096 Jun 11 18:30 TriliumNotes-Server-0.103.0-linux-arm64 -rwxr-xr-x 1 pi pi 40 May 13 12:56 trilium.sh pi@raspberrypi:~/builds/trilium $pi@raspberrypi:
/builds/trilium $ cat trilium.sh/builds/trilium $#!/bin/sh
exec ./node/bin/node main.cjs
pi@raspberrypi:
pi@raspberrypi:
/builds/trilium $ ls -al public/builds/trilium $total 80
drwxr-xr-x 8 pi pi 4096 Jun 11 18:31 .
drwxr-xr-x 9 pi pi 4096 Jun 11 18:31 ..
drwxr-xr-x 2 pi pi 4096 Jun 11 18:31 assets
drwxr-xr-x 3 pi pi 4096 Jun 11 18:31 fonts
-rw-r--r-- 1 pi pi 1594 May 13 12:56 index.html
drwxr-xr-x 3 pi pi 4096 Jun 11 18:31 node_modules
drwxr-xr-x 2 pi pi 49152 Jun 11 18:31 src
drwxr-xr-x 3 pi pi 4096 Jun 11 18:31 stylesheets
drwxr-xr-x 40 pi pi 4096 Jun 11 18:31 translations
pi@raspberrypi:
pi@raspberrypi:
/builds/trilium $ ls -al assets/builds/trilium $total 260
drwxr-xr-x 8 pi pi 4096 Jun 11 18:31 .
drwxr-xr-x 9 pi pi 4096 Jun 11 18:31 ..
-rw-r--r-- 1 pi pi 3086 May 13 12:56 config-sample.ini
drwxr-xr-x 2 pi pi 4096 Jun 11 18:31 db
drwxr-xr-x 4 pi pi 4096 Jun 11 18:31 doc_notes
-rw-r--r-- 1 pi pi 114668 May 13 12:56 icon-dev.ico
-rw-r--r-- 1 pi pi 114244 May 13 12:56 icon.ico
drwxr-xr-x 2 pi pi 4096 Jun 11 18:31 images
drwxr-xr-x 4 pi pi 4096 Jun 11 18:31 llm
drwxr-xr-x 40 pi pi 4096 Jun 11 18:31 translations
drwxr-xr-x 2 pi pi 4096 Jun 11 18:31 views
pi@raspberrypi:
I followed the instructions to run it:
pi@raspberrypi:~/builds/trilium $ ./trilium.sh
Generated session secret
Language option not found, falling back to en.
📦 Versions: app=0.103.0 db=238 sync=39 clipper=1.0
🔧 Build: 2026-05-13 19:56:19 (44f5be8)
📂 Data dir: /home/pi/.local/share/trilium-data
⏰ UTC time: 2026-06-19 22:26:02
💻 CPU: Cortex-A76 (4-core @ 2400 Mhz)
💾 DB size: 4 KiB
DB not initialized, please visit setup page - http://[your-server-host]:8080 to see instructions on how to initialize Trilium.
MCP server registered at /mcp (localhost only)
Trusted reverse proxy: false
App HTTP server starting up at port 8080
Listening on port 8080
The Setup Page:
==> Setup instructions (can't copy text).pdf
Short notes from Setup Page:
Trilium app -> Options -> Sync
Set address http://10.1.1.65:8080
Click Save
--> There is no "Save" anywhere on that page, at least in dark mode!
Test sync
--> Error popups...
I opened my Trilium on my System76 Meerkat with Pop!_OS 24.04 and Cosmic .16, and went to Sync:
Got a variety of errors...
With noproxy:

Screenshot noproxy error 2026-06-19_15-40-04.png
With proxy blank:
Sync handshake failed, SSL error:

Screenshot SSL error 2026-06-19_16-07-41.png
Screenshot Trilium app no connection 2026-06-19_16-10-35.png

--> I noticed this in the non-Docker instructions. Do I need to have TLS ???
TLS#
Don't forget to configure TLS which is required for secure usage!
The RasPi5 and all sync instances are on my local network. How would I setup TLS there? Is it really required?
--> My config.ini seems to have TLS disabled:
pi@raspberrypi:~/builds/trilium $ cat /home/pi/.local/share/trilium-data/config.ini
[Network]
true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
https=false
path to certificate (run "bash bin/generate-cert.sh" to generate self-signed certificate). Relevant only if https=true
certPath=
keyPath=
--> Should that work without TLS?
--> "you may want to enable TLS" (but maybe not?):
https://docs.triliumnotes.org/user-guide/setup/server
After setting up your server installation, you may want to configure settings such as the port or enable TLS. Configuration is managed via the Trilium config.ini file, which is located in the data directory by default.
--> I Edited my config.ini:
Details
pi@raspberrypi:~/.local/share/trilium-data $ sudo nano config.ini pi@raspberrypi:~/.local/share/trilium-data $ cat config.ini[General]
Instance name can be used to distinguish between different instances using backend api.getInstanceName()
instanceName=
set to true to allow using Trilium without authentication (makes sense for server build only, desktop build doesn't need password)
noAuthentication=true
set to true to disable backups (e.g. because of limited space on server)
noBackup=false
[Network]
host setting is relevant only for web deployments - set the host on which the server will listen
host=10.1.1.65
port setting is relevant only for web deployments, desktop builds run on a fixed port (changeable with TRILIUM_PORT environment variable)
port=8080
true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
https=false
path to certificate (run "bash bin/generate-cert.sh" to generate self-signed certificate). Relevant only if https=true
certPath=
keyPath=
setting to give trust to reverse proxies, a comma-separated list of trusted rev. proxy IPs can be specified (CIDR notation is permitted),
alternatively 'true' will make use of the leftmost IP in X-Forwarded-For, ultimately an integer can be used to tell about the number of hops between
Trilium (which is hop 0) and the first trusted rev. proxy.
once set, expressjs will use the X-Forwarded-For header set by the rev. proxy to determinate the real IPs of clients.
expressjs shortcuts are supported: loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7)
trustedReverseProxy=false
setting the CORS headers for cross-origin requests
corsAllowOrigin='*'
corsAllowMethods='GET,POST,PUT,DELETE,PATCH'
corsAllowHeaders='Content-Type,Authorization'
[Session]
Use this setting to set a custom value for the "Max-Age" Attribute of the session cookie.
This controls how long your session will be valid, before it expires and you need to log in again, when you use the "Remember Me" option.
Value needs to be entered in Seconds.
Default value is 1814400 Seconds, which is 21 Days.
cookieMaxAge=1814400
[Sync]
syncServerHost=10.1.1.65:8080
#syncServerTimeout=
#syncServerProxy=
[MultiFactorAuthentication]
Set the base URL for OAuth/OpenID authentication
This is the URL of the service that will be used to verify the user's identity
oauthBaseUrl=
Set the client ID for OAuth/OpenID authentication
This is the ID of the client that will be used to verify the user's identity
oauthClientId=
Set the client secret for OAuth/OpenID authentication
This is the secret of the client that will be used to verify the user's identity
oauthClientSecret=
Set the issuer base URL for OAuth/OpenID authentication
This is the base URL of the service that will be used to verify the user's identity
oauthIssuerBaseUrl=
Set the issuer name for OAuth/OpenID authentication
This is the name of the service that will be used to verify the user's identity
oauthIssuerName=
Set the issuer icon for OAuth/OpenID authentication
This is the icon of the service that will be used to verify the user's identity
oauthIssuerIcon=
pi@raspberrypi:~/.local/share/trilium-data $
--> Same SSL and other errors.
What am I doing wrong?
All reactions