Skip to content

Apache using Docker

This tutorial assumes that you have created a DNS A record for trilium.yourdomain.com that you want to use for your Trilium server.

Docker setup

Download docker image and create container

 docker pull triliumnext/trilium:[VERSION]
 docker create --name trilium -t -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/trilium:[VERSION]

Configuring the Apache proxy

  1. Enable apache proxy modules

     a2enmod ssl
     a2enmod proxy
     a2enmod proxy_http
     a2enmod proxy_wstunnel
    
    2. Create a new let's encrypt certificate

     sudo certbot certonly -d trilium.mydomain.com
    

    Choose standalone (2) and note the location of the created certificates (typically /etc/letsencrypt/live/...) 3. Create a new virtual host file for apache (you may want to use apachectl -S to determine the server root location, mine is /etc/apache2)

     sudo nano /etc/apache2/sites-available/trilium.yourdomain.com.conf
    

    Paste (and customize) the following text into the configuration file

         ServerName http://trilium.yourdomain.com
         RewriteEngine on
             RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
    
    
         ServerName https://trilium.yourdomain.com
         RewriteEngine On
         RewriteCond %{HTTP:Connection} Upgrade [NC]
         RewriteCond %{HTTP:Upgrade} websocket [NC]
         RewriteRule /(.*) ws://localhost:8080/$1 [P,L]
         AllowEncodedSlashes NoDecode
         ProxyPass / http://localhost:8080/ nocanon
         ProxyPassReverse / http://localhost:8080/
         SSLCertificateFile /etc/letsencrypt/live/trilium.yourdomain.com/fullchain.pem
         SSLCertificateKeyFile /etc/letsencrypt/live/trilium.yourdomain.com/privkey.pem
         Include /etc/letsencrypt/options-ssl-apache.conf
    
    4. Enable the virtual host with sudo a2ensite trilium.yourdomain.com.conf 5. Reload apache2 with sudo systemctl reload apache2

Configuring the trusted proxy

After setting up a reverse proxy, make sure to configure theĀ Trusted proxy.

Setup the systemd service to start up the server

Create and enable a systemd service to start the docker container on boot

  1. Create a new empty file called /lib/systemd/system/trilium.service with the contents

     [Unit]
     Description=Trilium Server
     Requires=docker.service
     After=docker.service
    
     [Service]
     Restart=always
     ExecStart=/usr/bin/docker start -a trilium
     ExecStop=/usr/bin/docker stop -t 2 trilium
    
     [Install]
     WantedBy=local.target
    
    2. Install, enable and start service

     sudo systemctl daemon-reload
     sudo systemctl enable trilium.service
     sudo systemctl start trilium.service