Table of Contents

Silverbullet

Silverbullet is an amazing and powerfull note taking app. It's actually incredibly more than that.

Installation

As usual you need a dedicated user:

useradd -d /data/daemons/silverbullet -m silverbullet -g users

Note that i am adding it to the users group because i want to share the notes (which are plain md files) via Syncthing later on.

Set umask to 0002 in bashrc, so that any md files created by Silverbullet will also be accessible to all users in users group:

echo "umask 0002" >> /data/saemons/silverbullet/.bashrc

Now, just download the latest release from Github releases page and unzip it:

su - silverbullet
wget 'https://github.com/silverbulletmd/silverbullet/releases/download/ [[[X.Y.Z]]] /silverbullet-server-linux-x86_64.zip' 
unzip silverbullet-server-linux-x86_64.zip 

And you are all set! You will need to define a folder to store the notes, i will assume it's /home/notes, but you can pick your path, and a port, i assume will be 8001, for the reverse proxy.

Reverse proxy

Silverbullet requires a dedicated subdomain, it will not work on subpath. I will assume it's notes.mydomain.com. Also, since Silverbullet do not manage authentication, i will show you how to use proxy authentication. Please refer to The Reverse Proxy concept for more details, specially on how to setup dual access: without authentication from inside your home, and authenticated from outside.

Here is the NGINX configuration file:

silverbullet.conf
access_log /var/log/nginx/notes.mydomain.com_access_log main;                                                                                                                                 
error_log /var/log/nginx/notes.mydomain.com_error_log info;                                                                                                                                   

# login protected access from outside
server {
        server_name notes.mydomain.com;
        listen 8443 ssl; 
        http2 on;
        include "com.mydomain/authelia_location.conf";
        
        location / {                                                                                                                                                                                 
             include "com.mydomain/authelia_proxy.conf";                                                                                                                                           
             include "com.mydomain/authelia_authrequest.conf";                                                                                                                                                                                                                                                                                 
             if ($http_origin = ''){                                                                                                                                                              
                 set $http_origin "*";
             }
             proxy_hide_header Access-Control-Allow-Origin;  
             add_header Access-Control-Allow-Origin $http_origin;

             client_max_body_size 512M;
             proxy_pass http://127.0.0.1:8001$uri;
        }
}

# Manage direct request inside home network
# It's identical to the remote one, but it has no authentication
# HTTPS on port 443 for direct local connections
server {
        server_name notes.mydomain.com;
        listen 443 ssl; 
        http2 on;
        
        location / {                                                                                                                                                                 
             if ($http_origin = ''){                                                                                                                                                              
                 set $http_origin "*";
             }
             proxy_hide_header Access-Control-Allow-Origin;
             add_header Access-Control-Allow-Origin $http_origin;
             client_max_body_size 512M;
             proxy_pass http://127.0.0.1:8001$uri;
     }
}                                                                                                                                                                    

Note: do not just copy and paste this file, you need to understand it and adapt where needed.

Startup

Since i use OpenRC, to start silverbullet simply create the following script under /etc/init.d:

/etc/init.d/silverbullet
#!/sbin/openrc-run
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

description="Silverbullet.md - personal note taking app"
pidfile="/run/silverbullet.pid"
command_background=true
command="/data/daemons/silverbullet/silverbullet"
command_args="/home/notes/ --hostname 127.0.0.1 --port 8001"
command_user="silverbullet:users"

depend() {
        need net
}

Make it executable and add the service to the default runlevel:

chmod +x /etc/init.d/silverbullet
rc-update add silverbullet default

Update

Download new binary (see link above) and simply replace old one and restart service.