Welcome to searx

You might have noticed some change on my seeks node since it's not a seeks node anymore, but instead it's a searx node.

Searx is a project started by asciimoo after Taziden gave a talk at Camp zer0 about going forward with seeks and opening it up to a wider base of developper.

The idea is that seeks ‑ currently written in hardcore C++ ‑ is a prototype and an exploratory project about search and decentralization of search, and that we can now build almost from scratch a search engine which will implement the concept behind seeks but in a more developper friendly way, for instance in python.

We already had a lot of discussion with people hanging on #seeks@irc.freenode.net about this and, technically, there's two tool to develop. An easily extensible metasearch engine which will feed a DHT of result shared with different nodes.

And then asciimoo wrote searx, a meta search engine, easily extensible. Now, we "just" have to connect it to a DHT. But I'll save that for later.

So, how did I installed it? I've fought a little bit with uwsgi and nginx, but now it works. Here's how:


Getting the code, the dependencies and everything else

Create a searx user for it's a good practice (don't run things as root) and do some git cloning and virtualise you're environment. Oh, before I forgot, I'm running a debian stable and I try to keep the distribution clean (so no pip install outside of virtualenv)

cd /usr/local
git clone https://github.com/asciimoo/searx.git
chown searx:searx -R /usr/local/searx
cd /usr/local/searx
virtualenv searx-ve
. searx-ve/bin/activate/

Now, you have a running virtual environnement in ''/usr/local/searx/searx-ve'' and the code in the parent directory. You need to install some dependencies, so launch that command and go get a cup of coffee.

pip install -r requirements.txt

Now, the code is alive. You can test it by running the flask instance:

python searx/webapp.py

And you can proxy requests to ''http://localhost:8888'' from your favorite webserver. It works.


Since it's not daemonized, and you've got only one worker, I wanted to have something more maintainable. So I needed something like uwsgi (or gunicorn, or whatever) to run the apps right from nginx.

Since debian splitted uwsgi config in a lot of modules, don't forget to install python module (I was stuck with that a lot). So, let's install uwsgi and required dependencies.

apt-get install uwsgi uwsgi-plugin-python

Next step is to create an app. In debian, uwsgi has the same apps-{available,enabled} file structure than on nginx or apache. Here' my config file for searx:

vim /etc/uwsgi/apps-available/searx.ini

# Who will run the code
uid = searx
gid = searx

# Number of workers
workers = 4

# The right granted on the created socket
chmod-socket = 666

# Plugin to use and interpretor config
single-interpreter = true
master = true
plugin = python

# Application base folder
base = /usr/local/searx

# Module to import
module = searx.webapp

# Virtualenv and python path
virtualenv = /usr/local/searx/searx-ve/
pythonpath = /usr/local/searx/
chdir = /usr/local/searx/searx/

# The variable holding flask application
callable = app

Once that's done, symlink this file in apps-enabled and start uwsgi.

cd /etc/uwsgi/apps-enabled
ln -s ../apps-available/searx.ini
/etc/init.d/uwsgi start

By default, the socket used by uwsgi will be in ''/run/uwsgi/ap/searx/socket''. This is where nginx will chat with uwsgi.


Hard part is done, if you already have nginx installed, just use yet another vhost.

vim /etc/nginx/sites-available/searx

server {
    listen 80;
    server_name searx.example.com;
    root /usr/local/searx

    location / {
            include uwsgi_params;
            uwsgi_pass unix:/run/uwsgi/app/searx/socket;

Then activate the newly created sites and restart nginx.

ln -s /etc/nginx/sites-{enabled,available}/searx
/etc/init.d/nginx restart

And go visit searx.example.com or whatever your FQDN is) on port 80, it would works.

I suggest you to install some SSL? but it's beyond the scope of this tutorial.

Have fun.