Installing TiddlyWiki with Node.js on an Ubuntu VPS

Tiddlywiki is a non-linear notebook for storing information. We use it at the place where I work as a wiki for all of our institutional knowledge about complex processes and procedures (our documentation is quite extensive and is part of the reason why the Washington Post has named us one of DC's best-run nonprofits).

When I first started, the wiki was saved as a single html file on a shared fileserver in our copy room. It was only accessible on our local network and used an outdated version of Tiddlywiki—finding and editing the file was a major headache (you could only save edits in Internet Explorer, for example 😱) so staff had almost completely stopped using it.

I upgraded us to TW5 and moved the wiki to a VPS, documenting my steps along the way. The result is that we now have a password-protected wiki on a subdomain on our website, that any of our staff can access from anywhere. Usage has gone way up—and the process of on-boarding new staff members is much easier than it was before.

Here's how to install your own TW5 instance on a VPS of your choosing:

Prerequisites

A VPS with the following:

  • Ubuntu 16.04
  • Apache 2.4.18
  • Recent versions of Node and npm
  • A domain pointed to your server

Make sure updated versions of node and npm are installed

On our server, node and npm are both installed in /usr/bin/ and NOT /usr/local/bin. This might be different for you, but you can check where they're located by running which npm and which node. This will be important later when you specify the root path of the Tiddlywiki server command.

Update npm:

sudo npm i -g npm

Install Tiddlywiki

sudo npm i -g tiddlywiki

Create a new node tiddlywiki folder with server configuration files. I did this in the home directory: /home/ubuntu/wolapedia/.

tiddlywiki /PATH/TO/YOUR/WIKI --init server

Configure Apache:

Add directory options in /etc/apache2/apache2.conf:

<Directory /PATH/TO/YOUR/WIKI>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

Enable mod_proxy so that Apache can route traffic on your domain or subdomain to port 8080: https://www.digitalocean.com/community/tutorials/how-to-use-apache-as-a-reverse-proxy-with-mod_proxy-on-ubuntu-16-04

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 reload

Add a configuration file in /etc/apache2/sites-available/YOURSITE.conf with the following contents:

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.

        ServerName YOURDOMAIN
        ServerAlias www.YOURDOMAIN
        ServerAdmin YOUREMAIL

        AllowEncodedSlashes on

        <Proxy *>
        Order Deny,Allow
        Allow from all
        </Proxy>

        ProxyPreserveHost Off
        ProxyPass / http://127.0.0.1:8080/

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf


</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Now enable it and restart Apache:

sudo a2ensite YOURSITE && sudo service apache2 reload

Getting Tiddlywiki up and running

Let's Encrypt

It's time to make sure Let’s Encrypt is configured to work with your domain/subdomain so that the HTTP basic authentication is sent over an SSL connection. Follow the instructions from the EFF's Certbot to install Let's Encrypt: https://certbot.eff.org/#ubuntuxenial-apache. You'll also probably want to set a cron job on your server to automatically renew the SSL certificates you get from Let's Encrypt (they expire after 90 days).

sudo letsencrypt -d DOMAIN1 -d DOMAIN2

Node

Here’s the basic command to run the node server. If you exit the SSH connection, reboot the server, or kill the command, the app will stop running.

tiddlywiki /PATH/TO/YOUR/WIKI --server 8080 $:/core/save/all text/plain text/html USERNAME PASSWORD

Forever (or a process manager of your choosing)

Instead, we can set up the command with forever so that the app will stay resilient to server changes.

npm install -g forever

forever start --spinSleepTime 10000 /usr/bin/tiddlywiki /PATH/TO/YOUR/WIKI --server 8080 $:/core/save/all text/plain text/html USERNAME PASSWORD

If the server is rebooted, forever won't automatically restart itself. You can set a cronjob set to rerun the forever command if the server is rebooted:

crontab -e

The command to restart forever on server reboot (in cron) is:

@reboot /usr/bin/forever start --spinSleepTime 10000 /PATH/TO/YOUR/WIKI /PATH/TO/YOUR/WIKI --server 8080 $:/core/save/all text/plain text/html USERNAME PASSWORD

The Username and Password fields at the end of the forever command are what you use to set the HTTP Basic Auth. Skip this if you want to allow public access to your wiki.

Cleaning up

You're done! Now you can import an older tiddlywiki file (like the one that we had on our local file server). Take the HTML file from your old wiki and import it into the Node-based wiki with these instructions: http://tiddlywiki.com/static/Importing%2520Tiddlers.html

If the wiki needs upgrading from Tiddlywiki Classic to Tiddlywiki5, use the upgrade tool here: http://tiddlywiki.com/upgrade.html

Once tiddlywiki is installed and working, you might want to do the following:

  • Install the TiddlyWiki Classic parser in the plugins pane of the control panel, otherwise tiddlers will all look weird
  • In the control panel, theme tweaks section, change the sidebar layout to fluid story, fixed sidebar