Running Gnome Tracker on a Server
In a passing comment it was suggested to me that it would be really great if the home fileserver offered some type of web-interface to find things. We've been aggregating downloaded files there for a while, and there's been attempts made at categorization but this all really falls apart when you wonder "what does 'productivity' mean? And does this go under 'Linux' or some other thing?"
Since lately I've been wanting to get desktop search working on my actual desktops, via Gnome's Tracker project and it's tie-in to Nautilus and Nemo (possibly the subject of a future blog), it seemed logical to run it on the fileserver as an indexer for our shared directories - and then to tie some kind of web ui to that.
Unfortunately, Tracker is very desktop orientated - there's no easy daemon mode for running it on a headless system out-of-the-box, but with a little tweaking you can make it work for you quite easily.
How to
On my system I keep Tracker running as it's own user under a system account. On Ubuntu you need to create this like so (using a root shell - sudo -i
):
$ adduser --system --shell=/bin/false --disabled-login --home=/var/lib/tracker tracker
$ adduser tracker root
Since tracker uses GSettings for it's configuration these days, you need to su into the user you just created to actually configure the directories which should be indexed. Since this is a server, you probably just have a list of them so set it somewhat like the example below. Note: you must run the dbus-launch commands in order to have a viable session bus for dconf to work with. This will also be a requirement of Tracker later on.
$ su --shell /bin/bash
$ eval `dbus-launch --sh-syntax`
$ dconf write org/freedesktop/tracker/miner/files/index-recursive-directories "['/path/to/my/dir/1', '/path/to/my/dir/2', '/etc/etc']"
$ kill $DBUS_SESSION_BUS_PID
$ exit
Your Tracker user is now ready at this point. To start and stop the service, we use an Upstart script like the one below:
description "gnome tracker system startup script"
author "wrouesnel"
start on (local-filesystems and net-device-up)
stop on shutdown
respawn
respawn limit 5 60
setuid tracker
script
chdir /var/lib/tracker
eval `dbus-launch --sh-syntax`
echo $DBUS_SESSION_BUS_PID > .tracker-sessionbus.pid
echo $DBUS_SESSION_BUS_ADDRESS > .tracker-sessionbus
/usr/lib/tracker/tracker-store
end script
post-start script
chdir /var/lib/tracker
while [ ! -e .tracker-sessionbus ]; do sleep 1; done
DBUS_SESSION_BUS_ADDRESS=$(cat .tracker-sessionbus) /usr/lib/tracker/tracker-miner-fs &
end script
post-stop script
# We need to kill off the DBUS session here
chdir /var/lib/tracker
kill $(cat .tracker-sessionbus.pid)
rm .tracker-sessionbus.pid
rm .tracker-sessionbus
end script
Some things to focus on about the script: we launch and save the DBus session parameters. We'll need these to reconnect to the session to run tracker related commands. The post-stop stanza is to kill off the DBus session.
You do need to explicitely launch tracker-miner-fs
in order for file indexing to work, but you don't need to kill it explicitely - it will be automatically shutdown when Upstart kills tracker-store
.
Also note that since tracker runs as the user tracker
it can only index files and directories which it is allowed to traverse, so check your permissions.
You can now start Tracker as your user with start tracker
. And stop it with stop tracker
. Simple and clean.
Using this
My plan for this setup is to throw together a Node.js app on my server that will forward queries to the tracker command line client - that app will be a future post when it's done.