filtron.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>How to protect an instance &#8212; Searx Documentation (Searx-1.1.0.tex)</title>
  8. <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
  9. <link rel="stylesheet" type="text/css" href="../_static/searx.css" />
  10. <link rel="stylesheet" type="text/css" href="../_static/tabs.css" />
  11. <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
  12. <script src="../_static/jquery.js"></script>
  13. <script src="../_static/underscore.js"></script>
  14. <script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
  15. <script src="../_static/doctools.js"></script>
  16. <script src="../_static/sphinx_highlight.js"></script>
  17. <link rel="index" title="Index" href="../genindex.html" />
  18. <link rel="search" title="Search" href="../search.html" />
  19. <link rel="next" title="How to setup result proxy" href="morty.html" />
  20. <link rel="prev" title="Architecture" href="architecture.html" />
  21. </head><body>
  22. <div class="related" role="navigation" aria-label="related navigation">
  23. <h3>Navigation</h3>
  24. <ul>
  25. <li class="right" style="margin-right: 10px">
  26. <a href="../genindex.html" title="General Index"
  27. accesskey="I">index</a></li>
  28. <li class="right" >
  29. <a href="../py-modindex.html" title="Python Module Index"
  30. >modules</a> |</li>
  31. <li class="right" >
  32. <a href="morty.html" title="How to setup result proxy"
  33. accesskey="N">next</a> |</li>
  34. <li class="right" >
  35. <a href="architecture.html" title="Architecture"
  36. accesskey="P">previous</a> |</li>
  37. <li class="nav-item nav-item-0"><a href="../index.html">Searx Documentation (Searx-1.1.0.tex)</a> &#187;</li>
  38. <li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Administrator documentation</a> &#187;</li>
  39. <li class="nav-item nav-item-this"><a href="">How to protect an instance</a></li>
  40. </ul>
  41. </div>
  42. <div class="document">
  43. <div class="documentwrapper">
  44. <div class="bodywrapper">
  45. <div class="body" role="main">
  46. <section id="how-to-protect-an-instance">
  47. <span id="searx-filtron"></span><h1>How to protect an instance<a class="headerlink" href="#how-to-protect-an-instance" title="Permalink to this heading">¶</a></h1>
  48. <aside class="sidebar">
  49. <p class="sidebar-title">further reading</p>
  50. <ul class="simple">
  51. <li><p><a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">utils/filtron.sh</span></a></p></li>
  52. <li><p><a class="reference internal" href="installation-nginx.html#nginx-searx-site"><span class="std std-ref">A nginx searx site</span></a></p></li>
  53. </ul>
  54. </aside>
  55. <nav class="contents local" id="contents">
  56. <p class="topic-title">Contents</p>
  57. <ul class="simple">
  58. <li><p><a class="reference internal" href="#filtron-go" id="id2">filtron &amp; go</a></p></li>
  59. <li><p><a class="reference internal" href="#sample-configuration-of-filtron" id="id3">Sample configuration of filtron</a></p></li>
  60. <li><p><a class="reference internal" href="#route-request-through-filtron" id="id4">Route request through filtron</a></p></li>
  61. </ul>
  62. </nav>
  63. <p>Searx depends on external search services. To avoid the abuse of these services
  64. it is advised to limit the number of requests processed by searx.</p>
  65. <p>An application firewall, <a class="reference external" href="https://github.com/asciimoo/filtron">filtron</a> solves exactly this problem. Filtron is just
  66. a middleware between your web server (nginx, apache, …) and searx, we describe
  67. such infratructures in chapter: <a class="reference internal" href="architecture.html#architecture"><span class="std std-ref">Architecture</span></a>.</p>
  68. <section id="filtron-go">
  69. <h2><a class="toc-backref" href="#id2" role="doc-backlink">filtron &amp; go</a><a class="headerlink" href="#filtron-go" title="Permalink to this heading">¶</a></h2>
  70. <p>Filtron needs <a class="reference external" href="https://golang.org/">Go</a> installed. If <a class="reference external" href="https://golang.org/">Go</a> is preinstalled, <a class="reference external" href="https://github.com/asciimoo/filtron">filtron</a> is simply
  71. installed by <code class="docutils literal notranslate"><span class="pre">go</span> <span class="pre">get</span></code> package management (see <a class="reference external" href="https://github.com/asciimoo/filtron/blob/master/README.md">filtron README</a>). If you use
  72. filtron as middleware, a more isolated setup is recommended. To simplify such
  73. an installation and the maintenance of, use our script <a class="reference internal" href="../utils/filtron.sh.html#filtron-sh"><span class="std std-ref">utils/filtron.sh</span></a>.</p>
  74. </section>
  75. <section id="sample-configuration-of-filtron">
  76. <span id="id1"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Sample configuration of filtron</a><a class="headerlink" href="#sample-configuration-of-filtron" title="Permalink to this heading">¶</a></h2>
  77. <aside class="sidebar">
  78. <p class="sidebar-title">Tooling box</p>
  79. <ul class="simple">
  80. <li><p><a class="reference external" href="https://github.com/searx/searx/blob/master/utils/templates/etc/filtron/rules.json">/etc/filtron/rules.json</a></p></li>
  81. </ul>
  82. </aside>
  83. <p>An example configuration can be find below. This configuration limits the access
  84. of:</p>
  85. <ul class="simple">
  86. <li><p>scripts or applications (roboagent limit)</p></li>
  87. <li><p>webcrawlers (botlimit)</p></li>
  88. <li><p>IPs which send too many requests (IP limit)</p></li>
  89. <li><p>too many json, csv, etc. requests (rss/json limit)</p></li>
  90. <li><p>the same UserAgent of if too many requests (useragent limit)</p></li>
  91. </ul>
  92. <div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="w"></span>
  93. <span class="w"> </span><span class="p">{</span><span class="w"></span>
  94. <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;search request&quot;</span><span class="p">,</span><span class="w"></span>
  95. <span class="w"> </span><span class="nt">&quot;filters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  96. <span class="w"> </span><span class="s2">&quot;Param:q&quot;</span><span class="p">,</span><span class="w"></span>
  97. <span class="w"> </span><span class="s2">&quot;Path=^(/|/search)$&quot;</span><span class="w"></span>
  98. <span class="w"> </span><span class="p">],</span><span class="w"></span>
  99. <span class="w"> </span><span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  100. <span class="w"> </span><span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  101. <span class="w"> </span><span class="nt">&quot;subrules&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  102. <span class="w"> </span><span class="p">{</span><span class="w"></span>
  103. <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;missing Accept-Language&quot;</span><span class="p">,</span><span class="w"></span>
  104. <span class="w"> </span><span class="nt">&quot;filters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;!Header:Accept-Language&quot;</span><span class="p">],</span><span class="w"></span>
  105. <span class="w"> </span><span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  106. <span class="w"> </span><span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"></span>
  107. <span class="w"> </span><span class="nt">&quot;actions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  108. <span class="w"> </span><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;log&quot;</span><span class="p">},</span><span class="w"></span>
  109. <span class="w"> </span><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;block&quot;</span><span class="p">,</span><span class="w"></span>
  110. <span class="w"> </span><span class="nt">&quot;params&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Rate limit exceeded&quot;</span><span class="p">}}</span><span class="w"></span>
  111. <span class="w"> </span><span class="p">]</span><span class="w"></span>
  112. <span class="w"> </span><span class="p">},</span><span class="w"></span>
  113. <span class="w"> </span><span class="p">{</span><span class="w"></span>
  114. <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;suspiciously Connection=close header&quot;</span><span class="p">,</span><span class="w"></span>
  115. <span class="w"> </span><span class="nt">&quot;filters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;Header:Connection=close&quot;</span><span class="p">],</span><span class="w"></span>
  116. <span class="w"> </span><span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  117. <span class="w"> </span><span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"></span>
  118. <span class="w"> </span><span class="nt">&quot;actions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  119. <span class="w"> </span><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;log&quot;</span><span class="p">},</span><span class="w"></span>
  120. <span class="w"> </span><span class="p">{</span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;block&quot;</span><span class="p">,</span><span class="w"></span>
  121. <span class="w"> </span><span class="nt">&quot;params&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Rate limit exceeded&quot;</span><span class="p">}}</span><span class="w"></span>
  122. <span class="w"> </span><span class="p">]</span><span class="w"></span>
  123. <span class="w"> </span><span class="p">},</span><span class="w"></span>
  124. <span class="w"> </span><span class="p">{</span><span class="w"></span>
  125. <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;IP limit&quot;</span><span class="p">,</span><span class="w"></span>
  126. <span class="w"> </span><span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  127. <span class="w"> </span><span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  128. <span class="w"> </span><span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"></span>
  129. <span class="w"> </span><span class="nt">&quot;aggregations&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  130. <span class="w"> </span><span class="s2">&quot;Header:X-Forwarded-For&quot;</span><span class="w"></span>
  131. <span class="w"> </span><span class="p">],</span><span class="w"></span>
  132. <span class="w"> </span><span class="nt">&quot;actions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  133. <span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;log&quot;</span><span class="p">},</span><span class="w"></span>
  134. <span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;block&quot;</span><span class="p">,</span><span class="w"></span>
  135. <span class="w"> </span><span class="nt">&quot;params&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
  136. <span class="w"> </span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Rate limit exceeded&quot;</span><span class="w"></span>
  137. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  138. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  139. <span class="w"> </span><span class="p">]</span><span class="w"></span>
  140. <span class="w"> </span><span class="p">},</span><span class="w"></span>
  141. <span class="w"> </span><span class="p">{</span><span class="w"></span>
  142. <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;rss/json limit&quot;</span><span class="p">,</span><span class="w"></span>
  143. <span class="w"> </span><span class="nt">&quot;filters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  144. <span class="w"> </span><span class="s2">&quot;Param:format=(csv|json|rss)&quot;</span><span class="w"></span>
  145. <span class="w"> </span><span class="p">],</span><span class="w"></span>
  146. <span class="w"> </span><span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  147. <span class="w"> </span><span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  148. <span class="w"> </span><span class="nt">&quot;stop&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w"></span>
  149. <span class="w"> </span><span class="nt">&quot;actions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  150. <span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;log&quot;</span><span class="p">},</span><span class="w"></span>
  151. <span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;block&quot;</span><span class="p">,</span><span class="w"></span>
  152. <span class="w"> </span><span class="nt">&quot;params&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
  153. <span class="w"> </span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Rate limit exceeded&quot;</span><span class="w"></span>
  154. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  155. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  156. <span class="w"> </span><span class="p">]</span><span class="w"></span>
  157. <span class="w"> </span><span class="p">},</span><span class="w"></span>
  158. <span class="w"> </span><span class="p">{</span><span class="w"></span>
  159. <span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;useragent limit&quot;</span><span class="p">,</span><span class="w"></span>
  160. <span class="w"> </span><span class="nt">&quot;interval&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;time-interval-in-sec (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  161. <span class="w"> </span><span class="nt">&quot;limit&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&lt;max-request-number-in-interval (int)&gt;&quot;</span><span class="p">,</span><span class="w"></span>
  162. <span class="w"> </span><span class="nt">&quot;aggregations&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  163. <span class="w"> </span><span class="s2">&quot;Header:User-Agent&quot;</span><span class="w"></span>
  164. <span class="w"> </span><span class="p">],</span><span class="w"></span>
  165. <span class="w"> </span><span class="nt">&quot;actions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
  166. <span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;log&quot;</span><span class="p">},</span><span class="w"></span>
  167. <span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;block&quot;</span><span class="p">,</span><span class="w"></span>
  168. <span class="w"> </span><span class="nt">&quot;params&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
  169. <span class="w"> </span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Rate limit exceeded&quot;</span><span class="w"></span>
  170. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  171. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  172. <span class="w"> </span><span class="p">]</span><span class="w"></span>
  173. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  174. <span class="w"> </span><span class="p">]</span><span class="w"></span>
  175. <span class="w"> </span><span class="p">}</span><span class="w"></span>
  176. <span class="p">]</span><span class="w"></span>
  177. </pre></div>
  178. </div>
  179. </section>
  180. <section id="route-request-through-filtron">
  181. <span id="filtron-route-request"></span><h2><a class="toc-backref" href="#id4" role="doc-backlink">Route request through filtron</a><a class="headerlink" href="#route-request-through-filtron" title="Permalink to this heading">¶</a></h2>
  182. <aside class="sidebar">
  183. <p class="sidebar-title">further reading</p>
  184. <ul class="simple">
  185. <li><p><a class="reference internal" href="../utils/filtron.sh.html#filtron-sh-overview"><span class="std std-ref">Overview</span></a></p></li>
  186. <li><p><a class="reference internal" href="installation-nginx.html#installation-nginx"><span class="std std-ref">Install with nginx</span></a></p></li>
  187. <li><p><a class="reference internal" href="installation-apache.html#installation-apache"><span class="std std-ref">Install with apache</span></a></p></li>
  188. </ul>
  189. </aside>
  190. <p>Filtron can be started using the following command:</p>
  191. <div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ filtron -rules rules.json
  192. </pre></div>
  193. </div>
  194. <p>It listens on <code class="docutils literal notranslate"><span class="pre">127.0.0.1:4004</span></code> and forwards filtered requests to
  195. <code class="docutils literal notranslate"><span class="pre">127.0.0.1:8888</span></code> by default.</p>
  196. <p>Use it along with <code class="docutils literal notranslate"><span class="pre">nginx</span></code> with the following example configuration.</p>
  197. <div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="c1"># https://example.org/searx</span>
  198. <span class="k">location</span><span class="w"> </span><span class="s">/searx</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
  199. <span class="w"> </span><span class="kn">proxy_pass</span><span class="w"> </span><span class="s">http://127.0.0.1:4004/</span><span class="p">;</span><span class="w"></span>
  200. <span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Host</span><span class="w"> </span><span class="nv">$host</span><span class="p">;</span><span class="w"></span>
  201. <span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">Connection</span><span class="w"> </span><span class="nv">$http_connection</span><span class="p">;</span><span class="w"></span>
  202. <span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Real-IP</span><span class="w"> </span><span class="nv">$remote_addr</span><span class="p">;</span><span class="w"></span>
  203. <span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Forwarded-For</span><span class="w"> </span><span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span><span class="w"></span>
  204. <span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Scheme</span><span class="w"> </span><span class="nv">$scheme</span><span class="p">;</span><span class="w"></span>
  205. <span class="w"> </span><span class="kn">proxy_set_header</span><span class="w"> </span><span class="s">X-Script-Name</span><span class="w"> </span><span class="s">/searx</span><span class="p">;</span><span class="w"></span>
  206. <span class="p">}</span><span class="w"></span>
  207. <span class="k">location</span><span class="w"> </span><span class="s">/searx/static</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
  208. <span class="w"> </span><span class="kn">/usr/local/searx/searx-src/searx/static</span><span class="p">;</span><span class="w"></span>
  209. <span class="p">}</span><span class="w"></span>
  210. </pre></div>
  211. </div>
  212. <p>Requests are coming from port 4004 going through filtron and then forwarded to
  213. port 8888 where a searx is being run. For a complete setup see: <a class="reference internal" href="installation-nginx.html#nginx-searx-site"><span class="std std-ref">A nginx searx site</span></a>.</p>
  214. </section>
  215. </section>
  216. <div class="clearer"></div>
  217. </div>
  218. </div>
  219. </div>
  220. <span id="sidebar-top"></span>
  221. <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
  222. <div class="sphinxsidebarwrapper">
  223. <p class="logo"><a href="../index.html">
  224. <img class="logo" src="../_static/searx_logo_small.png" alt="Logo"/>
  225. </a></p>
  226. <h3>Project Links</h3>
  227. <ul>
  228. <li><a href="https://searx.github.io/searx/blog/index.html">Blog</a>
  229. <li><a href="https://github.com/searx/searx">Source</a>
  230. <li><a href="https://github.com/searx/searx/wiki">Wiki</a>
  231. <li><a href="https://twitter.com/Searx_engine">Twitter</a>
  232. <li><a href="https://github.com/searx/searx/issues">Issue Tracker</a>
  233. </ul><h3>Navigation</h3>
  234. <ul>
  235. <li><a href="../index.html">Overview</a>
  236. <ul>
  237. <li><a href="index.html">Administrator documentation</a>
  238. <ul>
  239. <li>Previous: <a href="architecture.html" title="previous chapter">Architecture</a>
  240. <li>Next: <a href="morty.html" title="next chapter">How to setup result proxy</a></ul>
  241. </li>
  242. </ul>
  243. </li>
  244. </ul>
  245. <div id="searchbox" style="display: none" role="search">
  246. <h3 id="searchlabel">Quick search</h3>
  247. <div class="searchformwrapper">
  248. <form class="search" action="../search.html" method="get">
  249. <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
  250. <input type="submit" value="Go" />
  251. </form>
  252. </div>
  253. </div>
  254. <script>document.getElementById('searchbox').style.display = "block"</script>
  255. </div>
  256. </div>
  257. <div class="clearer"></div>
  258. </div>
  259. <div class="footer" role="contentinfo">
  260. &#169; Copyright 2015-2022, Adam Tauber, Noémi Ványi.
  261. Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 5.3.0.
  262. </div>
  263. <script src="../_static/version_warning_offset.js"></script>
  264. </body>
  265. </html>