.. _installation:

============
Installation
============

.. sidebar:: Searx server setup

   - :ref:`installation nginx`
   - :ref:`installation apache`

   If you do not have any special preferences, it is recommend to use
   :ref:`searx.sh`.

.. contents:: Contents
   :depth: 2
   :local:
   :backlinks: entry

.. _installation basic:

Basic installation
==================

Step by step installation with virtualenv.  For Ubuntu, be sure to have enable
universe repository.

Install packages:

.. tabs::

   .. group-tab:: Ubuntu / debian

      .. code-block:: sh

         $ sudo -H apt-get install -m \
                   git build-essential
                   libxslt-dev python3-dev python3-babel python3-venv \
                   zlib1g-dev libffi-dev libssl-dev

Install searx:

.. code:: sh

    sudo -H useradd searx --system --disabled-password -d /usr/local/searx
    sudo -H usermod -a -G shadow searx
    cd /usr/local/searx
    sudo -H git clone https://github.com/asciimoo/searx.git searx-src
    sudo -H chown searx:searx -R /usr/local/searx

Install virtualenv:

.. code:: sh

    sudo -H -u searx -i
    (searx)$ python3 -m venv searx-pyenv
    (searx)$ echo 'source ~/searx-pyenv/bin/activate' > ~/.profile

Exit the searx bash and restart a new to install the searx dependencies:

.. code:: sh

    sudo -H -u searx -i
    (searx)$ cd searx-src
    (searx)$ ./manage.sh update_packages

Configuration
==============

.. code:: sh

    sudo -H -u searx -i
    (searx)$ cd searx-src
    (searx)$ sed -i -e "s/ultrasecretkey/`openssl rand -hex 16`/g" searx/settings.yml

Edit searx/settings.yml if necessary.

Check
=====

Start searx:

.. code:: sh

    sudo -H -u searx -i
    (searx)$ cd searx-src
    (searx)$ python3 searx/webapp.py

Go to http://localhost:8888

If everything works fine, disable the debug option in settings.yml:

.. code:: sh

    sed -i -e "s/debug : True/debug : False/g" searx/settings.yml

At this point searx is not demonized ; uwsgi allows this.  You can exit the
virtualenv and the searx user bash (enter exit command twice).

uwsgi
=====

Install packages:

.. tabs::

   .. group-tab:: Ubuntu / debian

      .. code-block:: bash

         sudo -H apt-get install uwsgi uwsgi-plugin-python3

Create the configuration file ``/etc/uwsgi/apps-available/searx.ini`` with this
content:

.. code:: ini

   [uwsgi]

   # uWSGI core
   # ----------
   #
   # https://uwsgi-docs.readthedocs.io/en/latest/Options.html#uwsgi-core

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

   # chdir to specified directory before apps loading
   chdir = /usr/local/searx/searx-src/searx

   # disable logging for privacy
   disable-logging = true

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

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

   # enable master process
   master = true

   # load apps in each worker instead of the master
   lazy-apps = true

   # load uWSGI plugins
   plugin = python3,http

   # By default the Python plugin does not initialize the GIL.  This means your
   # app-generated threads will not run.  If you need threads, remember to enable
   # them with enable-threads.  Running uWSGI in multithreading mode (with the
   # threads options) will automatically enable threading support. This *strange*
   # default behaviour is for performance reasons.
   enable-threads = true

   # plugin: python
   # --------------
   #
   # https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-python

   # load a WSGI module
   module = searx.webapp

   # set PYTHONHOME/virtualenv
   virtualenv = /usr/local/searx/searx-pyenv

   # add directory (or glob) to pythonpath
   pythonpath = /usr/local/searx/searx-src


   # plugin http
   # -----------
   #
   # https://uwsgi-docs.readthedocs.io/en/latest/Options.html#plugin-http

   # Native HTTP support: https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html
   http = 127.0.0.1:8888

Activate the uwsgi application and restart:

.. code:: sh

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


How to update
=============

.. code:: sh

    sudo -H -u searx -i
    (searx)$ git stash
    (searx)$ git pull origin master
    (searx)$ git stash apply
    (searx)$ ./manage.sh update_packages

Restart uwsgi:

.. tabs::

   .. group-tab:: Ubuntu / debian

      .. code:: sh

         sudo -H systemctl restart uwsgi

Docker
======

Make sure you have installed Docker. For instance, you can deploy searx like this:

.. code:: sh

    docker pull wonderfall/searx
    docker run -d --name searx -p $PORT:8888 wonderfall/searx

Go to ``http://localhost:$PORT``.

See https://hub.docker.com/r/wonderfall/searx/ for more informations.  It's also
possible to build searx from the embedded Dockerfile.

.. code:: sh

   git clone https://github.com/asciimoo/searx.git
   cd searx
   docker build -t whatever/searx .

References
==========

* https://about.okhin.fr/posts/Searx/ with some additions

* How to: `Setup searx in a couple of hours with a free SSL certificate
  <https://www.reddit.com/r/privacytoolsIO/comments/366kvn/how_to_setup_your_own_privacy_respecting_search/>`__
