forked from zaclys/searxng
		
	[clean up] drop obsolete searx, filtron and morty install scripts
Since ./utils/searxng.sh is implemented, the old installation procedures from filtron, morty and searx can be removed. For users who want to upgrade, the procedures for removing old installations have still been retained. Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
		
							parent
							
								
									ed8a169029
								
							
						
					
					
						commit
						692708aa77
					
				
					 16 changed files with 25 additions and 2518 deletions
				
			
		
							
								
								
									
										52
									
								
								.config.sh
									
										
									
									
									
								
							
							
						
						
									
										52
									
								
								.config.sh
									
										
									
									
									
								
							|  | @ -1,52 +0,0 @@ | ||||||
| # -*- coding: utf-8; mode: sh -*- |  | ||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later |  | ||||||
| # shellcheck shell=bash disable=SC2034 |  | ||||||
| # |  | ||||||
| # This file should be edited only ones just before the installation of any |  | ||||||
| # service is done.  After the installation of the searx service a copy of this |  | ||||||
| # file is placed into the $SEARXNG_SRC of the instance, e.g.:: |  | ||||||
| # |  | ||||||
| #     /usr/local/searx/searx-src/.config.sh |  | ||||||
| # |  | ||||||
| # .. hint:: |  | ||||||
| # |  | ||||||
| #    Before you change a value here, You have to fully uninstall any previous |  | ||||||
| #    installation of searx, morty and filtron services! |  | ||||||
| 
 |  | ||||||
| # utils/searx.sh |  | ||||||
| # -------------- |  | ||||||
| 
 |  | ||||||
| # The setup of the SearXNG instance is done in the settings.yml |  | ||||||
| # (SEARXNG_SETTINGS_PATH).  Read the remarks in [1] carefully and don't forget to |  | ||||||
| # rebuild instance's environment (make buildenv) if needed.  The settings.yml |  | ||||||
| # file of an already installed instance is shown by:: |  | ||||||
| # |  | ||||||
| #     $ ./utils/searx.sh --help |  | ||||||
| #     ---- SearXNG instance setup (already installed) |  | ||||||
| #       SEARXNG_SETTINGS_PATH : /etc/searxng/settings.yml |  | ||||||
| #       SEARXNG_SRC           : /usr/local/searx/searx-src |  | ||||||
| # |  | ||||||
| # [1] https://docs.searxng.org/admin/engines/settings.html |  | ||||||
| 
 |  | ||||||
| # utils/filtron.sh |  | ||||||
| # ---------------- |  | ||||||
| 
 |  | ||||||
| # FILTRON_API="127.0.0.1:4005" |  | ||||||
| # FILTRON_LISTEN="127.0.0.1:4004" |  | ||||||
| 
 |  | ||||||
| # utils/morty.sh |  | ||||||
| # -------------- |  | ||||||
| 
 |  | ||||||
| # morty listen address |  | ||||||
| # MORTY_LISTEN="127.0.0.1:3000" |  | ||||||
| # PUBLIC_URL_PATH_MORTY="/morty/" |  | ||||||
| 
 |  | ||||||
| # system services |  | ||||||
| # --------------- |  | ||||||
| 
 |  | ||||||
| # Common $HOME folder of the service accounts |  | ||||||
| # SERVICE_HOME_BASE="/usr/local" |  | ||||||
| 
 |  | ||||||
| # **experimental**: Set SERVICE_USER to run all services by one account, but be |  | ||||||
| # aware that removing discrete components might conflict! |  | ||||||
| # SERVICE_USER=searx |  | ||||||
							
								
								
									
										2
									
								
								.github/workflows/data-update.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/data-update.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -26,7 +26,7 @@ jobs: | ||||||
| 
 | 
 | ||||||
|       - name: Install Ubuntu packages |       - name: Install Ubuntu packages | ||||||
|         run: | |         run: | | ||||||
|           sudo ./utils/searx.sh install packages |           sudo ./utils/searxng.sh install packages | ||||||
| 
 | 
 | ||||||
|       - name: Set up Python |       - name: Set up Python | ||||||
|         uses: actions/setup-python@v2 |         uses: actions/setup-python@v2 | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								.github/workflows/integration.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/integration.yml
									
										
									
									
										vendored
									
									
								
							|  | @ -19,7 +19,7 @@ jobs: | ||||||
|       uses: actions/checkout@v2 |       uses: actions/checkout@v2 | ||||||
|     - name: Install Ubuntu packages |     - name: Install Ubuntu packages | ||||||
|       run: | |       run: | | ||||||
|         sudo ./utils/searx.sh install packages |         sudo ./utils/searxng.sh install packages | ||||||
|         sudo apt install firefox |         sudo apt install firefox | ||||||
|     - name: Set up Python |     - name: Set up Python | ||||||
|       uses: actions/setup-python@v2 |       uses: actions/setup-python@v2 | ||||||
|  | @ -55,7 +55,7 @@ jobs: | ||||||
|     - name: Checkout |     - name: Checkout | ||||||
|       uses: actions/checkout@v2 |       uses: actions/checkout@v2 | ||||||
|     - name: Install Ubuntu packages |     - name: Install Ubuntu packages | ||||||
|       run: sudo ./utils/searx.sh install buildhost |       run: sudo ./utils/searxng.sh install buildhost | ||||||
|     - name: Set up Python |     - name: Set up Python | ||||||
|       uses: actions/setup-python@v2 |       uses: actions/setup-python@v2 | ||||||
|       with: |       with: | ||||||
|  | @ -82,7 +82,7 @@ jobs: | ||||||
|         fetch-depth: '0' |         fetch-depth: '0' | ||||||
|         persist-credentials: false |         persist-credentials: false | ||||||
|     - name: Install Ubuntu packages |     - name: Install Ubuntu packages | ||||||
|       run: sudo ./utils/searx.sh install buildhost |       run: sudo ./utils/searxng.sh install buildhost | ||||||
|     - name: Set up Python |     - name: Set up Python | ||||||
|       uses: actions/setup-python@v2 |       uses: actions/setup-python@v2 | ||||||
|       with: |       with: | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
										
									
									
									
								
							|  | @ -59,7 +59,6 @@ test.shell: | ||||||
| 		utils/brand.env \
 | 		utils/brand.env \
 | ||||||
| 		$(MTOOLS) \
 | 		$(MTOOLS) \
 | ||||||
| 		utils/lib.sh \
 | 		utils/lib.sh \
 | ||||||
| 		utils/lib_install.sh \
 |  | ||||||
| 		utils/lib_nvm.sh \
 | 		utils/lib_nvm.sh \
 | ||||||
| 		utils/lib_static.sh \
 | 		utils/lib_static.sh \
 | ||||||
| 		utils/lib_go.sh \
 | 		utils/lib_go.sh \
 | ||||||
|  | @ -69,8 +68,7 @@ test.shell: | ||||||
| 		utils/searxng.sh \
 | 		utils/searxng.sh \
 | ||||||
| 		utils/morty.sh \
 | 		utils/morty.sh \
 | ||||||
| 		utils/lxc.sh \
 | 		utils/lxc.sh \
 | ||||||
| 		utils/lxc-searxng.env \
 | 		utils/lxc-searxng.env | ||||||
| 		.config.sh |  | ||||||
| 	$(Q)$(MTOOLS) build_msg TEST "$@ OK" | 	$(Q)$(MTOOLS) build_msg TEST "$@ OK" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								manage
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								manage
									
										
									
									
									
								
							|  | @ -417,8 +417,6 @@ docs.prebuild() { | ||||||
|         [ "$VERBOSE" = "1" ] && set -x |         [ "$VERBOSE" = "1" ] && set -x | ||||||
|         mkdir -p "${DOCS_BUILD}/includes" |         mkdir -p "${DOCS_BUILD}/includes" | ||||||
|         ./utils/searxng.sh searxng.doc.rst >  "${DOCS_BUILD}/includes/searxng.rst" |         ./utils/searxng.sh searxng.doc.rst >  "${DOCS_BUILD}/includes/searxng.rst" | ||||||
|         ./utils/filtron.sh doc | cat > "${DOCS_BUILD}/includes/filtron.rst" |  | ||||||
|         ./utils/morty.sh doc   | cat > "${DOCS_BUILD}/includes/morty.rst" |  | ||||||
|         pyenv.cmd searxng_extra/docs_prebuild |         pyenv.cmd searxng_extra/docs_prebuild | ||||||
|     ) |     ) | ||||||
|     dump_return $? |     dump_return $? | ||||||
|  |  | ||||||
							
								
								
									
										527
									
								
								utils/filtron.sh
									
										
									
									
									
								
							
							
						
						
									
										527
									
								
								utils/filtron.sh
									
										
									
									
									
								
							|  | @ -4,56 +4,19 @@ | ||||||
| 
 | 
 | ||||||
| # shellcheck source=utils/lib.sh | # shellcheck source=utils/lib.sh | ||||||
| source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" | source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" | ||||||
| # shellcheck source=utils/lib_go.sh |  | ||||||
| source "${REPO_ROOT}/utils/lib_go.sh" |  | ||||||
| # shellcheck source=utils/lib_install.sh |  | ||||||
| source "${REPO_ROOT}/utils/lib_install.sh" |  | ||||||
| 
 | 
 | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| # config | # config | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| PUBLIC_HOST="${PUBLIC_HOST:-$(echo "$PUBLIC_URL" | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/')}" |  | ||||||
| 
 |  | ||||||
| FILTRON_URL_PATH="${FILTRON_URL_PATH:-$(echo "${PUBLIC_URL}" \ |  | ||||||
| | sed -e 's,^.*://[^/]*\(/.*\),\1,g')}" |  | ||||||
| [[ "${FILTRON_URL_PATH}" == "${PUBLIC_URL}" ]] && FILTRON_URL_PATH=/ |  | ||||||
| 
 |  | ||||||
| FILTRON_ETC="/etc/filtron" | FILTRON_ETC="/etc/filtron" | ||||||
| FILTRON_RULES="$FILTRON_ETC/rules.json" |  | ||||||
| FILTRON_RULES_TEMPLATE="${FILTRON_RULES_TEMPLATE:-${REPO_ROOT}/utils/templates/etc/filtron/rules.json}" |  | ||||||
| 
 |  | ||||||
| FILTRON_API="${FILTRON_API:-127.0.0.1:4005}" |  | ||||||
| FILTRON_LISTEN="${FILTRON_LISTEN:-127.0.0.1:4004}" |  | ||||||
| 
 |  | ||||||
| # The filtron target is the SearXNG installation, listenning on server.port at |  | ||||||
| # server.bind_address.  The default of FILTRON_TARGET is taken from the YAML |  | ||||||
| # configuration, do not change this value without reinstalling the entire |  | ||||||
| # SearXNG suite including filtron & morty. |  | ||||||
| FILTRON_TARGET="${SEARXNG_BIND_ADDRESS}:${SEARXNG_PORT}" |  | ||||||
| 
 | 
 | ||||||
| SERVICE_NAME="filtron" | SERVICE_NAME="filtron" | ||||||
| SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}" | SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}" | ||||||
| SERVICE_HOME_BASE="${SERVICE_HOME_BASE:-/usr/local}" |  | ||||||
| SERVICE_HOME="${SERVICE_HOME_BASE}/${SERVICE_USER}" |  | ||||||
| SERVICE_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${SERVICE_NAME}.service" | SERVICE_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${SERVICE_NAME}.service" | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| SERVICE_GROUP="${SERVICE_USER}" |  | ||||||
| 
 | 
 | ||||||
| # shellcheck disable=SC2034 | APACHE_FILTRON_SITE="searx.conf" | ||||||
| SERVICE_GROUP="${SERVICE_USER}" | NGINX_FILTRON_SITE="searx.conf" | ||||||
| 
 |  | ||||||
| GO_ENV="${SERVICE_HOME}/.go_env" |  | ||||||
| GO_VERSION="go1.17.2" |  | ||||||
| 
 |  | ||||||
| APACHE_FILTRON_SITE="searxng.conf" |  | ||||||
| NGINX_FILTRON_SITE="searxng.conf" |  | ||||||
| 
 |  | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| CONFIG_FILES=( |  | ||||||
|     "${FILTRON_RULES}" |  | ||||||
|     "${SERVICE_SYSTEMD_UNIT}" |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| usage() { | usage() { | ||||||
|  | @ -62,248 +25,45 @@ usage() { | ||||||
|     # shellcheck disable=SC1117 |     # shellcheck disable=SC1117 | ||||||
|     cat <<EOF |     cat <<EOF | ||||||
| usage:: | usage:: | ||||||
|   $(basename "$0") shell |   $(basename "$0") remove all] | ||||||
|   $(basename "$0") install    [all|user|rules] |   $(basename "$0") apache remove | ||||||
|   $(basename "$0") reinstall  all |   $(basename "$0") nginx  remove | ||||||
|   $(basename "$0") update     [filtron] |  | ||||||
|   $(basename "$0") remove     [all] |  | ||||||
|   $(basename "$0") activate   [service] |  | ||||||
|   $(basename "$0") deactivate [service] |  | ||||||
|   $(basename "$0") inspect    [service] |  | ||||||
|   $(basename "$0") option     [debug-on|debug-off] |  | ||||||
|   $(basename "$0") apache     [install|remove] |  | ||||||
|   $(basename "$0") nginx      [install|remove] |  | ||||||
| 
 | 
 | ||||||
| shell | remove all     : drop all components of the filtron service | ||||||
|   start interactive shell from user ${SERVICE_USER} | apache remove  : drop apache site ${APACHE_FILTRON_SITE} | ||||||
| install / remove | nginx  remove  : drop nginx site ${NGINX_FILTRON_SITE} | ||||||
|   :all:        complete setup of filtron service |  | ||||||
|   :user:       add/remove service user '$SERVICE_USER' ($SERVICE_HOME) |  | ||||||
|   :rules:      reinstall filtron rules $FILTRON_RULES |  | ||||||
| install |  | ||||||
|   :check:      check the filtron installation |  | ||||||
| reinstall: |  | ||||||
|   :all:        runs 'install/remove all' |  | ||||||
| update filtron |  | ||||||
|   Update filtron installation ($SERVICE_HOME) |  | ||||||
| activate service |  | ||||||
|   activate and start service daemon (systemd unit) |  | ||||||
| deactivate service |  | ||||||
|   stop and deactivate service daemon (systemd unit) |  | ||||||
| inspect service |  | ||||||
|   show service status and log |  | ||||||
| option |  | ||||||
|   set one of the available options |  | ||||||
| apache (${PUBLIC_URL}) |  | ||||||
|   :install: apache site with a reverse proxy (ProxyPass) |  | ||||||
|   :remove:  apache site ${APACHE_FILTRON_SITE} |  | ||||||
| nginx (${PUBLIC_URL}) |  | ||||||
|   :install: nginx site with a reverse proxy (ProxyPass) |  | ||||||
|   :remove:  nginx site ${NGINX_FILTRON_SITE} |  | ||||||
| filtron rules: ${FILTRON_RULES_TEMPLATE} |  | ||||||
| ---- sourced ${DOT_CONFIG} : |  | ||||||
|   SERVICE_USER        : ${SERVICE_USER} |  | ||||||
|   SERVICE_HOME        : ${SERVICE_HOME} |  | ||||||
|   FILTRON_TARGET      : ${FILTRON_TARGET} |  | ||||||
|   FILTRON_API         : ${FILTRON_API} |  | ||||||
|   FILTRON_LISTEN      : ${FILTRON_LISTEN} |  | ||||||
|   FILTRON_URL_PATH    : ${FILTRON_URL_PATH} |  | ||||||
| EOF | EOF | ||||||
| 
 | 
 | ||||||
|     install_log_searx_instance |  | ||||||
|     [[ -n ${1} ]] &&  err_msg "$1" |     [[ -n ${1} ]] &&  err_msg "$1" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| main() { | main() { | ||||||
|     required_commands \ |  | ||||||
|         sudo install git wget curl \ |  | ||||||
|         || exit |  | ||||||
| 
 |  | ||||||
|     local _usage="unknown or missing $1 command $2" |     local _usage="unknown or missing $1 command $2" | ||||||
| 
 | 
 | ||||||
|     case $1 in |     case $1 in | ||||||
|         --getenv)  var="$2"; echo "${!var}"; exit 0;; |  | ||||||
|         -h|--help) usage; exit 0;; |         -h|--help) usage; exit 0;; | ||||||
| 
 |  | ||||||
|         shell) |  | ||||||
|             sudo_or_exit |  | ||||||
|             interactive_shell "${SERVICE_USER}" |  | ||||||
|             ;; |  | ||||||
|         inspect) |  | ||||||
|             case $2 in |  | ||||||
|                 service) |  | ||||||
|                     sudo_or_exit |  | ||||||
|                     inspect_service |  | ||||||
|                     ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         reinstall) |  | ||||||
|             rst_title "re-install $SERVICE_NAME" part |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 all) |  | ||||||
|                     remove_all |  | ||||||
|                     install_all |  | ||||||
|                     ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         install) |  | ||||||
|             rst_title "$SERVICE_NAME" part |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 check) |  | ||||||
|                     rst_title "Check filtron installation" part |  | ||||||
|                     install_check |  | ||||||
|                     ;; |  | ||||||
|                 all) install_all ;; |  | ||||||
|                 user) assert_user ;; |  | ||||||
|                 rules) |  | ||||||
|                     install_rules |  | ||||||
|                     systemd_restart_service "${SERVICE_NAME}" |  | ||||||
|                     ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         update) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 filtron) update_filtron ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         remove) |         remove) | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 all) remove_all;; |                 all) remove_all;; | ||||||
|                 user) drop_service_account "${SERVICE_USER}" ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         activate) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 service)  systemd_activate_service "${SERVICE_NAME}" ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         deactivate) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 service)  systemd_deactivate_service "${SERVICE_NAME}" ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         apache) |         apache) | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 install) install_apache_site ;; |  | ||||||
|                 remove) remove_apache_site ;; |                 remove) remove_apache_site ;; | ||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         nginx) |         nginx) | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 install) install_nginx_site ;; |  | ||||||
|                 remove) remove_nginx_site ;; |                 remove) remove_nginx_site ;; | ||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         option) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 debug-on)  echo; enable_debug ;; |  | ||||||
|                 debug-off)  echo; disable_debug ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         doc) rst-doc ;; |  | ||||||
|         *) usage "unknown or missing command $1"; exit 42;; |         *) usage "unknown or missing command $1"; exit 42;; | ||||||
|     esac |     esac | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| install_all() { |  | ||||||
|     rst_title "Install $SERVICE_NAME (service)" |  | ||||||
|     assert_user |  | ||||||
|     wait_key |  | ||||||
|     go.golang "${GO_VERSION}" "${SERVICE_USER}" |  | ||||||
|     wait_key |  | ||||||
|     install_filtron |  | ||||||
|     install_rules |  | ||||||
|     wait_key |  | ||||||
|     systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" |  | ||||||
|     wait_key |  | ||||||
|     echo |  | ||||||
|     if ! service_is_available "http://${FILTRON_LISTEN}" ; then |  | ||||||
|         err_msg "Filtron is not listening on: http://${FILTRON_LISTEN}" |  | ||||||
|     fi |  | ||||||
|     if apache_is_installed; then |  | ||||||
|         info_msg "Apache is installed on this host." |  | ||||||
|         if ask_yn "Do you want to install a reverse proxy (ProxyPass)" Yn; then |  | ||||||
|             install_apache_site |  | ||||||
|         fi |  | ||||||
|     elif nginx_is_installed; then |  | ||||||
|         info_msg "nginx is installed on this host." |  | ||||||
|         if ask_yn "Do you want to install a reverse proxy (ProxyPass)" Yn; then |  | ||||||
|             install_nginx_site |  | ||||||
|         fi |  | ||||||
|     fi |  | ||||||
|     if ask_yn "Do you want to inspect the installation?" Ny; then |  | ||||||
|         inspect_service |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_check() { |  | ||||||
| 
 |  | ||||||
|     if service_account_is_available "$SERVICE_USER"; then |  | ||||||
|         info_msg "service account $SERVICE_USER available." |  | ||||||
|     else |  | ||||||
|         err_msg "service account $SERVICE_USER not available!" |  | ||||||
|     fi |  | ||||||
|     if go_is_available "$SERVICE_USER"; then |  | ||||||
|         info_msg "~$SERVICE_USER: go is installed" |  | ||||||
|     else |  | ||||||
|         err_msg "~$SERVICE_USER: go is not installed" |  | ||||||
|     fi |  | ||||||
|     if filtron_is_installed; then |  | ||||||
|         info_msg "~$SERVICE_USER: filtron app is installed" |  | ||||||
|     else |  | ||||||
|         err_msg "~$SERVICE_USER: filtron app is not installed!" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ! service_is_available "http://${FILTRON_API}"; then |  | ||||||
|         err_msg "API not available at: http://${FILTRON_API}" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ! service_is_available "http://${FILTRON_LISTEN}" ; then |  | ||||||
|         err_msg "Filtron is not listening on: http://${FILTRON_LISTEN}" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if service_is_available "http://${FILTRON_TARGET}" ; then |  | ||||||
|         info_msg "Filtron's target is available at: http://${FILTRON_TARGET}" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ! service_is_available "${PUBLIC_URL}"; then |  | ||||||
|         warn_msg "Public service at ${PUBLIC_URL} is not available!" |  | ||||||
|         if ! in_container; then |  | ||||||
|             warn_msg "Check if public name is correct and routed or use the public IP from above." |  | ||||||
|         fi |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if [[ "${GO_VERSION}" > "$(go_version)" ]]; then |  | ||||||
|         warn_msg "golang ($(go_version)) needs to be $GO_VERSION at least" |  | ||||||
|         warn_msg "you need to reinstall $SERVICE_USER --> $0 reinstall all" |  | ||||||
|     else |  | ||||||
|         info_msg "golang $(go_version) is installed (min needed is: $GO_VERSION)" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if [ -f "${APACHE_SITES_AVAILABLE}/searx.conf" ]; then |  | ||||||
|         warn_msg "old searx.conf apache site exists" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if [ -f "${NGINX_APPS_AVAILABLE}/searx.conf" ]; then |  | ||||||
|         warn_msg "old searx.conf nginx site exists" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| go_version(){ |  | ||||||
|     go.version "${SERVICE_USER}" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| remove_all() { | remove_all() { | ||||||
|     rst_title "De-Install $SERVICE_NAME (service)" |     rst_title "De-Install $SERVICE_NAME (service)" | ||||||
| 
 | 
 | ||||||
|  | @ -321,219 +81,6 @@ installations that were installed with this script." | ||||||
|     fi |     fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| assert_user() { |  | ||||||
|     rst_title "user $SERVICE_USER" section |  | ||||||
|     echo |  | ||||||
|     tee_stderr 1 <<EOF | bash | prefix_stdout |  | ||||||
| useradd --shell /bin/bash --system \ |  | ||||||
|  --home-dir "$SERVICE_HOME" \ |  | ||||||
|  --comment 'Reverse HTTP proxy to filter requests' $SERVICE_USER |  | ||||||
| mkdir "$SERVICE_HOME" |  | ||||||
| chown -R "$SERVICE_GROUP:$SERVICE_GROUP" "$SERVICE_HOME" |  | ||||||
| groups $SERVICE_USER |  | ||||||
| EOF |  | ||||||
|     SERVICE_HOME="$(sudo -i -u "$SERVICE_USER" echo \$HOME)" |  | ||||||
|     export SERVICE_HOME |  | ||||||
|     echo "export SERVICE_HOME=$SERVICE_HOME" |  | ||||||
| 
 |  | ||||||
|     tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" |  | ||||||
| touch "$GO_ENV" |  | ||||||
| grep -qFs -- 'source "$GO_ENV"' ~/.profile || echo 'source "$GO_ENV"' >> ~/.profile |  | ||||||
| EOF |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| filtron_is_installed() { |  | ||||||
|     [[ -f $SERVICE_HOME/go-apps/bin/filtron ]] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_filtron() { |  | ||||||
|     rst_title "Install filtron in user's ~/go-apps" section |  | ||||||
|     echo |  | ||||||
|     go.install github.com/searxng/filtron@latest "${SERVICE_USER}" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| update_filtron() { |  | ||||||
|     rst_title "Update filtron" section |  | ||||||
|     echo |  | ||||||
|     go.install github.com/searxng/filtron@latest "${SERVICE_USER}" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_rules() { |  | ||||||
|     rst_title "Install filtron rules" |  | ||||||
|     echo |  | ||||||
|     if [[ ! -f "${FILTRON_RULES}" ]]; then |  | ||||||
|         info_msg "install rules ${FILTRON_RULES_TEMPLATE}" |  | ||||||
|         info_msg "  --> ${FILTRON_RULES}" |  | ||||||
|         mkdir -p "$(dirname "${FILTRON_RULES}")" |  | ||||||
|         cp "${FILTRON_RULES_TEMPLATE}" "${FILTRON_RULES}" |  | ||||||
|         return |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if cmp --silent "${FILTRON_RULES}" "${FILTRON_RULES_TEMPLATE}"; then |  | ||||||
|         info_msg "${FILTRON_RULES} is up to date with" |  | ||||||
|         info_msg "${FILTRON_RULES_TEMPLATE}" |  | ||||||
|         return |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     rst_para "Diff between origin's rules file (+) and current (-):" |  | ||||||
|     echo "${FILTRON_RULES}" "${FILTRON_RULES_TEMPLATE}" |  | ||||||
|     $DIFF_CMD "${FILTRON_RULES}" "${FILTRON_RULES_TEMPLATE}" |  | ||||||
| 
 |  | ||||||
|     local action |  | ||||||
|     choose_one action "What should happen to the rules file? " \ |  | ||||||
|            "keep configuration unchanged" \ |  | ||||||
|            "use origin rules" \ |  | ||||||
|            "start interactive shell" |  | ||||||
|     case $action in |  | ||||||
|         "keep configuration unchanged") |  | ||||||
|             info_msg "leave rules file unchanged" |  | ||||||
|             ;; |  | ||||||
|         "use origin rules") |  | ||||||
|             backup_file "${FILTRON_RULES}" |  | ||||||
|             info_msg "install origin rules" |  | ||||||
|             cp "${FILTRON_RULES_TEMPLATE}" "${FILTRON_RULES}" |  | ||||||
|             ;; |  | ||||||
|         "start interactive shell") |  | ||||||
|             backup_file "${FILTRON_RULES}" |  | ||||||
|             echo -e "// exit with [${_BCyan}CTRL-D${_creset}]" |  | ||||||
|             sudo -H -i |  | ||||||
|             rst_para 'Diff between new rules file (-) and current (+):' |  | ||||||
|             echo |  | ||||||
|             $DIFF_CMD "${FILTRON_RULES_TEMPLATE}" "${FILTRON_RULES}" |  | ||||||
|             wait_key |  | ||||||
|             ;; |  | ||||||
|     esac |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| inspect_service() { |  | ||||||
| 
 |  | ||||||
|     rst_title "service status & log" |  | ||||||
| 
 |  | ||||||
|     cat <<EOF |  | ||||||
| 
 |  | ||||||
| sourced ${DOT_CONFIG} : |  | ||||||
|   SERVICE_USER        : ${SERVICE_USER} |  | ||||||
|   SERVICE_HOME        : ${SERVICE_HOME} |  | ||||||
|   FILTRON_TARGET      : ${FILTRON_TARGET} |  | ||||||
|   FILTRON_API         : ${FILTRON_API} |  | ||||||
|   FILTRON_LISTEN      : ${FILTRON_LISTEN} |  | ||||||
|   FILTRON_URL_PATH    : ${FILTRON_URL_PATH} |  | ||||||
| EOF |  | ||||||
|     install_log_searx_instance |  | ||||||
| 
 |  | ||||||
|     install_check |  | ||||||
| 
 |  | ||||||
|     if in_container; then |  | ||||||
|         lxc_suite_info |  | ||||||
|     else |  | ||||||
|         info_msg "public URL   --> ${PUBLIC_URL}" |  | ||||||
|         info_msg "internal URL --> http://${FILTRON_LISTEN}" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     local _debug_on |  | ||||||
|     if ask_yn "Enable filtron debug mode?"; then |  | ||||||
|         enable_debug |  | ||||||
|         _debug_on=1 |  | ||||||
|     fi |  | ||||||
|     echo |  | ||||||
|     systemctl --no-pager -l status "${SERVICE_NAME}" |  | ||||||
|     echo |  | ||||||
| 
 |  | ||||||
|     info_msg "public URL --> ${PUBLIC_URL}" |  | ||||||
|     # shellcheck disable=SC2059 |  | ||||||
|     printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log" |  | ||||||
|     read -r -s -n1 -t 5 |  | ||||||
|     echo |  | ||||||
|     while true;  do |  | ||||||
|         trap break 2 |  | ||||||
|         journalctl -f -u "${SERVICE_NAME}" |  | ||||||
|     done |  | ||||||
| 
 |  | ||||||
|     if [[ $_debug_on == 1 ]]; then |  | ||||||
|         disable_debug |  | ||||||
|     fi |  | ||||||
|     return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| enable_debug() { |  | ||||||
|     info_msg "try to enable debug mode ..." |  | ||||||
|     python <<EOF |  | ||||||
| import sys, json |  | ||||||
| 
 |  | ||||||
| debug = { |  | ||||||
|     u'name': u'debug request' |  | ||||||
|     , u'filters': [] |  | ||||||
|     , u'interval': 0 |  | ||||||
|     , u'limit': 0 |  | ||||||
|     , u'actions': [{u'name': u'log'}] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| with open('$FILTRON_RULES') as rules: |  | ||||||
|     j = json.load(rules) |  | ||||||
| 
 |  | ||||||
| pos = None |  | ||||||
| for i in range(len(j)): |  | ||||||
|     if j[i].get('name') == 'debug request': |  | ||||||
|         pos = i |  | ||||||
|         break |  | ||||||
| if pos is not None: |  | ||||||
|     j[pos] = debug |  | ||||||
| else: |  | ||||||
|     j.append(debug) |  | ||||||
| with open('$FILTRON_RULES', 'w') as rules: |  | ||||||
|     json.dump(j, rules, indent=2, sort_keys=True) |  | ||||||
| 
 |  | ||||||
| EOF |  | ||||||
|     systemctl restart "${SERVICE_NAME}.service" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| disable_debug() { |  | ||||||
|     info_msg "try to disable debug mode ..." |  | ||||||
|     python <<EOF |  | ||||||
| import sys, json |  | ||||||
| with open('$FILTRON_RULES') as rules: |  | ||||||
|     j = json.load(rules) |  | ||||||
| 
 |  | ||||||
| pos = None |  | ||||||
| for i in range(len(j)): |  | ||||||
|     if j[i].get('name') == 'debug request': |  | ||||||
|         pos = i |  | ||||||
|         break |  | ||||||
| if pos is not None: |  | ||||||
|     del j[pos] |  | ||||||
|     with open('$FILTRON_RULES', 'w') as rules: |  | ||||||
|          json.dump(j, rules, indent=2, sort_keys=True) |  | ||||||
| EOF |  | ||||||
|     systemctl restart "${SERVICE_NAME}.service" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_apache_site() { |  | ||||||
| 
 |  | ||||||
|     rst_title "Install Apache site $APACHE_FILTRON_SITE" |  | ||||||
| 
 |  | ||||||
|     rst_para "\ |  | ||||||
| This installs a reverse proxy (ProxyPass) into apache site (${APACHE_FILTRON_SITE})" |  | ||||||
| 
 |  | ||||||
|     ! apache_is_installed && info_msg "Apache is not installed." |  | ||||||
| 
 |  | ||||||
|     if ! ask_yn "Do you really want to continue?" Yn; then |  | ||||||
|         return |  | ||||||
|     else |  | ||||||
|         install_apache |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     "${REPO_ROOT}/utils/searx.sh" install uwsgi |  | ||||||
| 
 |  | ||||||
|     apache_install_site --variant=filtron "${APACHE_FILTRON_SITE}" |  | ||||||
| 
 |  | ||||||
|     info_msg "testing public url .." |  | ||||||
|     if ! service_is_available "${PUBLIC_URL}"; then |  | ||||||
|         err_msg "Public service at ${PUBLIC_URL} is not available!" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| remove_apache_site() { | remove_apache_site() { | ||||||
| 
 | 
 | ||||||
|     rst_title "Remove Apache site $APACHE_FILTRON_SITE" |     rst_title "Remove Apache site $APACHE_FILTRON_SITE" | ||||||
|  | @ -551,35 +98,6 @@ This removes apache site ${APACHE_FILTRON_SITE}." | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| install_nginx_site() { |  | ||||||
| 
 |  | ||||||
|     rst_title "Install nginx site $NGINX_FILTRON_SITE" |  | ||||||
| 
 |  | ||||||
|     rst_para "\ |  | ||||||
| This installs a reverse proxy (ProxyPass) into nginx site (${NGINX_FILTRON_SITE})" |  | ||||||
| 
 |  | ||||||
|     ! nginx_is_installed && info_msg "nginx is not installed." |  | ||||||
| 
 |  | ||||||
|     if ! ask_yn "Do you really want to continue?" Yn; then |  | ||||||
|         return |  | ||||||
|     else |  | ||||||
|         install_nginx |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     "${REPO_ROOT}/utils/searx.sh" install uwsgi |  | ||||||
| 
 |  | ||||||
|     # shellcheck disable=SC2034 |  | ||||||
|     SEARXNG_SRC=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_SRC) |  | ||||||
|     # shellcheck disable=SC2034 |  | ||||||
|     SEARXNG_URL_PATH=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_URL_PATH) |  | ||||||
|     nginx_install_app --variant=filtron "${NGINX_FILTRON_SITE}" |  | ||||||
| 
 |  | ||||||
|     info_msg "testing public url .." |  | ||||||
|     if ! service_is_available "${PUBLIC_URL}"; then |  | ||||||
|         err_msg "Public service at ${PUBLIC_URL} is not available!" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| remove_nginx_site() { | remove_nginx_site() { | ||||||
| 
 | 
 | ||||||
|     rst_title "Remove nginx site $NGINX_FILTRON_SITE" |     rst_title "Remove nginx site $NGINX_FILTRON_SITE" | ||||||
|  | @ -593,37 +111,10 @@ This removes nginx site ${NGINX_FILTRON_SITE}." | ||||||
|         return |         return | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     nginx_remove_site "$FILTRON_FILTRON_SITE" |     nginx_remove_app "$FILTRON_FILTRON_SITE" | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| rst-doc() { |  | ||||||
| 
 |  | ||||||
|     eval "echo \"$(< "${REPO_ROOT}/docs/build-templates/filtron.rst")\"" |  | ||||||
| 
 |  | ||||||
|     echo -e "\n.. START install systemd unit" |  | ||||||
|     cat <<EOF |  | ||||||
| .. tabs:: |  | ||||||
| 
 |  | ||||||
|    .. group-tab:: systemd |  | ||||||
| 
 |  | ||||||
|       .. code:: bash |  | ||||||
| 
 |  | ||||||
| EOF |  | ||||||
|     eval "echo \"$(< "${TEMPLATES}/${SERVICE_SYSTEMD_UNIT}")\"" | prefix_stdout "         " |  | ||||||
|     echo -e "\n.. END install systemd unit" |  | ||||||
| 
 |  | ||||||
|     # for DIST_NAME in ubuntu-20.04 arch fedora centos; do |  | ||||||
|     #     ( |  | ||||||
|     #         DIST_ID=${DIST_NAME%-*} |  | ||||||
|     #         DIST_VERS=${DIST_NAME#*-} |  | ||||||
|     #         [[ $DIST_VERS =~ $DIST_ID ]] && DIST_VERS= |  | ||||||
|     #         # ... |  | ||||||
|     #     ) |  | ||||||
|     # done |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| main "$@" | main "$@" | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | @ -1,208 +0,0 @@ | ||||||
| #!/usr/bin/env bash |  | ||||||
| # SPDX-License-Identifier: AGPL-3.0-or-later |  | ||||||
| 
 |  | ||||||
| # https://github.com/koalaman/shellcheck/issues/356#issuecomment-853515285 |  | ||||||
| # shellcheck source=utils/lib.sh |  | ||||||
| . /dev/null |  | ||||||
| 
 |  | ||||||
| # Initialize installation procedures: |  | ||||||
| # |  | ||||||
| # - Modified source_dot_config function that |  | ||||||
| #   - loads .config.sh from an existing installation (at SEARXNG_SRC). |  | ||||||
| #   - initialize **SEARX_SRC_INIT_FILES** |  | ||||||
| # - functions like: |  | ||||||
| #   - install_log_searx_instance() |  | ||||||
| #   - install_searx_get_state() |  | ||||||
| # |  | ||||||
| # usage: |  | ||||||
| #   source lib_install.sh |  | ||||||
| # |  | ||||||
| # **Installation scripts** |  | ||||||
| # |  | ||||||
| # The utils/lib_install.sh is sourced by the installations scripts: |  | ||||||
| # |  | ||||||
| # - utils/searx.sh |  | ||||||
| # - utils/morty.sh |  | ||||||
| # - utils/filtron.sh |  | ||||||
| # |  | ||||||
| # If '${SEARXNG_SRC}/.config.sh' exists, the modified source_dot_config() function |  | ||||||
| # loads this configuration (instead of './.config.sh'). |  | ||||||
| 
 |  | ||||||
| # **SEARX_SRC_INIT_FILES** |  | ||||||
| # |  | ||||||
| # Array of file names to sync into a installation at $SEARXNG_SRC.  The file names |  | ||||||
| # are relative to the $REPO_ROOT.  Set by function init_SEARXNG_SRC_INIT_FILES(). |  | ||||||
| # Most often theses are files like: |  | ||||||
| # - .config.sh |  | ||||||
| # - searx/settings.yml |  | ||||||
| # - utils/brand.env |  | ||||||
| # - ... |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| SEARX_SRC_INIT_FILES=() |  | ||||||
| 
 |  | ||||||
| eval orig_"$(declare -f source_dot_config)" |  | ||||||
| 
 |  | ||||||
| source_dot_config() { |  | ||||||
| 
 |  | ||||||
|     # Modified source_dot_config function that |  | ||||||
|     # - loads .config.sh from an existing installation (at SEARXNG_SRC). |  | ||||||
|     # - initialize SEARX_SRC_INIT_FILES |  | ||||||
| 
 |  | ||||||
|     if [ -z "$eval_SEARXNG_SRC" ]; then |  | ||||||
|         export eval_SEARXNG_SRC='true' |  | ||||||
|         SEARXNG_SRC=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_SRC) |  | ||||||
|         SEARXNG_PYENV=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_PYENV) |  | ||||||
|         SEARXNG_SETTINGS_PATH=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_SETTINGS_PATH) |  | ||||||
|         if [ ! -r "${SEARXNG_SRC}" ]; then |  | ||||||
|             info_msg "not yet cloned: ${SEARXNG_SRC}" |  | ||||||
|             orig_source_dot_config |  | ||||||
|             return 0 |  | ||||||
|         fi |  | ||||||
|         info_msg "using instance at: ${SEARXNG_SRC}" |  | ||||||
| 
 |  | ||||||
|         # set and log DOT_CONFIG |  | ||||||
|         if [ -r "${SEARXNG_SRC}/.config.sh" ]; then |  | ||||||
|             info_msg "switching to ${SEARXNG_SRC}/.config.sh" |  | ||||||
|             DOT_CONFIG="${SEARXNG_SRC}/.config.sh" |  | ||||||
|         else |  | ||||||
|             info_msg "using local config: ${DOT_CONFIG}" |  | ||||||
|         fi |  | ||||||
|         init_SEARX_SRC_INIT_FILES |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| init_SEARX_SRC_INIT_FILES(){ |  | ||||||
|     # init environment SEARX_SRC_INIT_FILES |  | ||||||
| 
 |  | ||||||
|     # Monitor modified files in the working-tree from the local repository, only |  | ||||||
|     # if the local file differs to the corresponding file in the instance.  Most |  | ||||||
|     # often theses are files like: |  | ||||||
|     # |  | ||||||
|     #  - .config.sh |  | ||||||
|     #  - searx/settings.yml |  | ||||||
|     #  - utils/brand.env |  | ||||||
|     #  - ... |  | ||||||
| 
 |  | ||||||
|     # keep list empty if there is no installation |  | ||||||
|     SEARX_SRC_INIT_FILES=() |  | ||||||
|     if [ ! -r "$SEARXNG_SRC" ]; then |  | ||||||
|         return 0 |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     local fname |  | ||||||
|     local msg="" |  | ||||||
|     local _prefix="" |  | ||||||
|     if [[ -n ${SUDO_USER} ]]; then |  | ||||||
|         _prefix="sudo -u ${SUDO_USER}" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     # Monitor local modified files from the repository, only if the local file |  | ||||||
|     # differs to the corresponding file in the instance |  | ||||||
| 
 |  | ||||||
|     while IFS= read -r fname; do |  | ||||||
|         if [ -z "$fname" ]; then |  | ||||||
|             continue |  | ||||||
|         fi |  | ||||||
|         if [ -r "${SEARXNG_SRC}/${fname}" ]; then |  | ||||||
|             # diff  "${REPO_ROOT}/${fname}" "${SEARXNG_SRC}/${fname}" |  | ||||||
|             if ! cmp --silent "${REPO_ROOT}/${fname}" "${SEARXNG_SRC}/${fname}"; then |  | ||||||
|                 SEARX_SRC_INIT_FILES+=("${fname}") |  | ||||||
|                 info_msg "local clone (workingtree), modified file: ./$fname" |  | ||||||
|                 msg="to update use:  sudo -H ./utils/searx.sh install init-src" |  | ||||||
|             fi |  | ||||||
|         fi |  | ||||||
|     done <<< "$($_prefix git diff --name-only)" |  | ||||||
|     [ -n "$msg" ] &&  info_msg "$msg" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_log_searx_instance() { |  | ||||||
| 
 |  | ||||||
|     echo -e "---- SearXNG instance setup ${_BBlue}(status: $(install_searx_get_state))${_creset}" |  | ||||||
|     echo -e "  SEARXNG_SETTINGS_PATH : ${_BBlue}${SEARXNG_SETTINGS_PATH}${_creset}" |  | ||||||
|     echo -e "  SEARXNG_PYENV         : ${_BBlue}${SEARXNG_PYENV}${_creset}" |  | ||||||
|     echo -e "  SEARXNG_SRC           : ${_BBlue}${SEARXNG_SRC:-none}${_creset}" |  | ||||||
|     echo -e "  SEARXNG_URL         : ${_BBlue}${SEARXNG_URL:-none}${_creset}" |  | ||||||
| 
 |  | ||||||
|     if in_container; then |  | ||||||
|         # SearXNG is listening on 127.0.0.1 and not available from outside container |  | ||||||
|         # in containers the service is listening on 0.0.0.0 (see lxc-searxng.env) |  | ||||||
|         echo -e "---- container setup" |  | ||||||
|         echo -e "  ${_BBlack}HINT:${_creset} SearXNG only listen on loopback device" \ |  | ||||||
|              "${_BBlack}inside${_creset} the container." |  | ||||||
|         for ip in $(global_IPs) ; do |  | ||||||
|             if [[ $ip =~ .*:.* ]]; then |  | ||||||
|                 echo "  container (IPv6): [${ip#*|}]" |  | ||||||
|             else |  | ||||||
|                 # IPv4: |  | ||||||
|                 echo "  container (IPv4): ${ip#*|}" |  | ||||||
|             fi |  | ||||||
|         done |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_searx_get_state(){ |  | ||||||
| 
 |  | ||||||
|     # usage: install_searx_get_state |  | ||||||
|     # |  | ||||||
|     # Prompts a string indicating the status of the installation procedure |  | ||||||
|     # |  | ||||||
|     # missing-searx-clone: |  | ||||||
|     #    There is no clone at ${SEARXNG_SRC} |  | ||||||
|     # missing-searx-pyenv: |  | ||||||
|     #    There is no pyenv in ${SEARXNG_PYENV} |  | ||||||
|     # installer-modified: |  | ||||||
|     #    There are files modified locally in the installer (clone), |  | ||||||
|     #    see ${SEARX_SRC_INIT_FILES} description. |  | ||||||
|     # python-installed: |  | ||||||
|     #    Scripts can be executed in instance's environment |  | ||||||
|     #    - user:  ${SERVICE_USER} |  | ||||||
|     #    - pyenv: ${SEARXNG_PYENV} |  | ||||||
| 
 |  | ||||||
|     if [ -f /etc/searx/settings.yml ]; then |  | ||||||
|         err_msg "settings.yml in /etc/searx/ is deprecated, move file to folder /etc/searxng/" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ! [ -r "${SEARXNG_SRC}" ]; then |  | ||||||
|         echo "missing-searx-clone" |  | ||||||
|         return |  | ||||||
|     fi |  | ||||||
|     if ! [ -f "${SEARXNG_PYENV}/bin/activate" ]; then |  | ||||||
|         echo "missing-searx-pyenv" |  | ||||||
|         return |  | ||||||
|     fi |  | ||||||
|     if ! [ -r "${SEARXNG_SETTINGS_PATH}" ]; then |  | ||||||
|         echo "missing-settings" |  | ||||||
|         return |  | ||||||
|     fi |  | ||||||
|     if ! [ ${#SEARX_SRC_INIT_FILES[*]} -eq 0 ]; then |  | ||||||
|         echo "installer-modified" |  | ||||||
|         return |  | ||||||
|     fi |  | ||||||
|     echo "python-installed" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Initialization of the installation procedure |  | ||||||
| # -------------------------------------------- |  | ||||||
| 
 |  | ||||||
| # shellcheck source=utils/brand.env |  | ||||||
| source "${REPO_ROOT}/utils/brand.env" |  | ||||||
| 
 |  | ||||||
| # SEARXNG_URL aka PUBLIC_URL: the public URL of the instance (e.g. |  | ||||||
| # "https://example.org/searx").  The value is taken from environment $SEARXNG_URL |  | ||||||
| # in ./utils/brand.env.  This variable is a empty string if server.base_url in |  | ||||||
| # the settings.yml is set to 'false'. |  | ||||||
| 
 |  | ||||||
| SEARXNG_URL="${SEARXNG_URL:-http://$(uname -n)}" |  | ||||||
| if in_container; then |  | ||||||
|     # hint: Linux containers do not have DNS entries, lets use IPs |  | ||||||
|     SEARXNG_URL="http://$(primary_ip)" |  | ||||||
| fi |  | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| PUBLIC_URL="${SEARXNG_URL}" |  | ||||||
| 
 |  | ||||||
| source_dot_config |  | ||||||
| 
 |  | ||||||
| # shellcheck source=utils/lxc-searxng.env |  | ||||||
| source "${REPO_ROOT}/utils/lxc-searxng.env" |  | ||||||
| in_container && lxc_set_suite_env |  | ||||||
|  | @ -4,7 +4,6 @@ | ||||||
| 
 | 
 | ||||||
| # shellcheck source=utils/lib.sh | # shellcheck source=utils/lib.sh | ||||||
| source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" | source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" | ||||||
| source_dot_config |  | ||||||
| # shellcheck source=utils/brand.env | # shellcheck source=utils/brand.env | ||||||
| source "${REPO_ROOT}/utils/brand.env" | source "${REPO_ROOT}/utils/brand.env" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										457
									
								
								utils/morty.sh
									
										
									
									
									
								
							
							
						
						
									
										457
									
								
								utils/morty.sh
									
										
									
									
									
								
							|  | @ -3,10 +3,6 @@ | ||||||
| 
 | 
 | ||||||
| # shellcheck source=utils/lib.sh | # shellcheck source=utils/lib.sh | ||||||
| source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" | source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" | ||||||
| # shellcheck source=utils/lib_go.sh |  | ||||||
| source "${REPO_ROOT}/utils/lib_go.sh" |  | ||||||
| # shellcheck source=utils/lib_install.sh |  | ||||||
| source "${REPO_ROOT}/utils/lib_install.sh" |  | ||||||
| 
 | 
 | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| # config | # config | ||||||
|  | @ -16,24 +12,9 @@ MORTY_LISTEN="${MORTY_LISTEN:-127.0.0.1:3000}" | ||||||
| PUBLIC_URL_PATH_MORTY="${PUBLIC_URL_PATH_MORTY:-/morty/}" | PUBLIC_URL_PATH_MORTY="${PUBLIC_URL_PATH_MORTY:-/morty/}" | ||||||
| PUBLIC_URL_MORTY="${PUBLIC_URL_MORTY:-$(echo "$PUBLIC_URL" |  sed -e's,^\(.*://[^/]*\).*,\1,g')${PUBLIC_URL_PATH_MORTY}}" | PUBLIC_URL_MORTY="${PUBLIC_URL_MORTY:-$(echo "$PUBLIC_URL" |  sed -e's,^\(.*://[^/]*\).*,\1,g')${PUBLIC_URL_PATH_MORTY}}" | ||||||
| 
 | 
 | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| MORTY_TIMEOUT=5 |  | ||||||
| 
 |  | ||||||
| SERVICE_NAME="morty" | SERVICE_NAME="morty" | ||||||
| SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}" | SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}" | ||||||
| SERVICE_HOME_BASE="${SERVICE_HOME_BASE:-/usr/local}" |  | ||||||
| SERVICE_HOME="${SERVICE_HOME_BASE}/${SERVICE_USER}" |  | ||||||
| SERVICE_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${SERVICE_NAME}.service" | SERVICE_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${SERVICE_NAME}.service" | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| SERVICE_GROUP="${SERVICE_USER}" |  | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| SERVICE_ENV_DEBUG=false |  | ||||||
| 
 |  | ||||||
| GO_ENV="${SERVICE_HOME}/.go_env" |  | ||||||
| GO_VERSION="go1.17.2" |  | ||||||
| 
 |  | ||||||
| # shellcheck disable=SC2034 |  | ||||||
| CONFIG_FILES=() |  | ||||||
| 
 | 
 | ||||||
| # Apache Settings | # Apache Settings | ||||||
| 
 | 
 | ||||||
|  | @ -47,267 +28,45 @@ usage() { | ||||||
|     # shellcheck disable=SC1117 |     # shellcheck disable=SC1117 | ||||||
|     cat <<EOF |     cat <<EOF | ||||||
| usage:: | usage:: | ||||||
|   $(basename "$0") shell |   $(basename "$0") remove all | ||||||
|   $(basename "$0") install    [all|check|user] |   $(basename "$0") apache remove | ||||||
|   $(basename "$0") reinstall  all |   $(basename "$0") nginx  remove | ||||||
|   $(basename "$0") update     [morty] |  | ||||||
|   $(basename "$0") remove     [all] |  | ||||||
|   $(basename "$0") activate   [service] |  | ||||||
|   $(basename "$0") deactivate [service] |  | ||||||
|   $(basename "$0") inspect    [service] |  | ||||||
|   $(basename "$0") option     [debug-on|debug-off|new-key] |  | ||||||
|   $(basename "$0") apache     [install|remove] |  | ||||||
|   $(basename "$0") nginx      [install|remove] |  | ||||||
|   $(basename "$0") info       [searx] |  | ||||||
| 
 | 
 | ||||||
| shell | remove all     : drop all components of the morty service | ||||||
|   start interactive shell from user ${SERVICE_USER} | apache remove  : drop apache site ${APACHE_MORTY_SITE} | ||||||
| install / remove | nginx  remove  : drop nginx site ${NGINX_MORTY_SITE} | ||||||
|   :all:        complete setup of morty service |  | ||||||
|   :user:       add/remove service user '$SERVICE_USER' ($SERVICE_HOME) |  | ||||||
| install |  | ||||||
|   :check:      check the morty installation |  | ||||||
| reinstall: |  | ||||||
|   :all:        runs 'install/remove all' |  | ||||||
| update morty |  | ||||||
|   Update morty installation ($SERVICE_HOME) |  | ||||||
| activate service |  | ||||||
|   activate and start service daemon (systemd unit) |  | ||||||
| deactivate service |  | ||||||
|   stop and deactivate service daemon (systemd unit) |  | ||||||
| inspect service |  | ||||||
|   show service status and log |  | ||||||
| option |  | ||||||
|   set one of the available options |  | ||||||
|   :new-key:   set new morty key |  | ||||||
| apache : ${PUBLIC_URL_MORTY} |  | ||||||
|   :install: apache site with a reverse proxy (ProxyPass) |  | ||||||
|   :remove:  apache site ${APACHE_MORTY_SITE} |  | ||||||
| nginx (${PUBLIC_URL_MORTY}) |  | ||||||
|   :install: nginx site with a reverse proxy (ProxyPass) |  | ||||||
|   :remove:  nginx site ${NGINX_MORTY_SITE} |  | ||||||
| ---- |  | ||||||
| sourced ${DOT_CONFIG} : |  | ||||||
|   SERVICE_USER        : ${SERVICE_USER} |  | ||||||
|   SERVICE_HOME        : ${SERVICE_HOME} |  | ||||||
|   PUBLIC_URL_MORTY:   : ${PUBLIC_URL_MORTY} |  | ||||||
|   MORTY_LISTEN:       : ${MORTY_LISTEN} |  | ||||||
| EOF | EOF | ||||||
| 
 | 
 | ||||||
|     install_log_searx_instance |  | ||||||
|     if in_container; then |  | ||||||
|         # in containers the service is listening on 0.0.0.0 (see lxc-searxng.env) |  | ||||||
|         for ip in $(global_IPs) ; do |  | ||||||
|             if [[ $ip =~ .*:.* ]]; then |  | ||||||
|                 echo "  container URL (IPv6): http://[${ip#*|}]:3000/" |  | ||||||
|             else |  | ||||||
|                 # IPv4: |  | ||||||
|                 echo "  container URL (IPv4): http://${ip#*|}:3000/" |  | ||||||
|             fi |  | ||||||
|         done |  | ||||||
|     fi |  | ||||||
|     echo |  | ||||||
|     info_searx |  | ||||||
| 
 |  | ||||||
|     [[ -n ${1} ]] &&  err_msg "$1" |     [[ -n ${1} ]] &&  err_msg "$1" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| info_searx() { |  | ||||||
|     # shellcheck disable=SC1117 |  | ||||||
|     cat <<EOF |  | ||||||
| To activate result and image proxy in SearXNG read: |  | ||||||
|   https://docs.searxng.org/admin/morty.html |  | ||||||
| Check settings in file ${SEARXNG_SETTINGS_PATH} ... |  | ||||||
|   result_proxy: |  | ||||||
|       url : ${PUBLIC_URL_MORTY} |  | ||||||
|   server: |  | ||||||
|       image_proxy : True |  | ||||||
| EOF |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| main() { | main() { | ||||||
|     required_commands \ |  | ||||||
|         sudo install git wget curl \ |  | ||||||
|         || exit |  | ||||||
| 
 |  | ||||||
|     local _usage="ERROR: unknown or missing $1 command $2" |     local _usage="ERROR: unknown or missing $1 command $2" | ||||||
| 
 | 
 | ||||||
|     case $1 in |     case $1 in | ||||||
|         --getenv)  var="$2"; echo "${!var}"; exit 0;; |  | ||||||
|         -h|--help) usage; exit 0;; |         -h|--help) usage; exit 0;; | ||||||
| 
 |  | ||||||
|         shell) |  | ||||||
|             sudo_or_exit |  | ||||||
|             interactive_shell "${SERVICE_USER}" |  | ||||||
|             ;; |  | ||||||
|         inspect) |  | ||||||
|             case $2 in |  | ||||||
|                 service) |  | ||||||
|                     sudo_or_exit |  | ||||||
|                     inspect_service |  | ||||||
|                     ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         reinstall) |  | ||||||
|             rst_title "re-install $SERVICE_NAME" part |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 all) |  | ||||||
|                     remove_all |  | ||||||
|                     install_all |  | ||||||
|                     ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         install) |  | ||||||
|             rst_title "$SERVICE_NAME" part |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 all) install_all ;; |  | ||||||
|                 check) |  | ||||||
|                     rst_title "Check morty installation" part |  | ||||||
|                     install_check |  | ||||||
|                     ;; |  | ||||||
|                 user) assert_user ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         update) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 morty) update_morty ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         remove) |         remove) | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 all) remove_all;; |                 all) remove_all;; | ||||||
|                 user) drop_service_account "${SERVICE_USER}" ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         activate) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 service)  systemd_activate_service "${SERVICE_NAME}" ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         deactivate) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 service)  systemd_deactivate_service "${SERVICE_NAME}" ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         apache) |         apache) | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 install) install_apache_site ;; |  | ||||||
|                 remove) remove_apache_site ;; |                 remove) remove_apache_site ;; | ||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         nginx) |         nginx) | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 install) install_nginx_site ;; |  | ||||||
|                 remove) remove_nginx_site ;; |                 remove) remove_nginx_site ;; | ||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         info) |  | ||||||
|             case $2 in |  | ||||||
|                 searx) info_searx ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         option) |  | ||||||
|             sudo_or_exit |  | ||||||
|             case $2 in |  | ||||||
|                 new-key) set_new_key ;; |  | ||||||
|                 debug-on)  enable_debug ;; |  | ||||||
|                 debug-off)  disable_debug ;; |  | ||||||
|                 *) usage "$_usage"; exit 42;; |  | ||||||
|             esac ;; |  | ||||||
|         doc) rst-doc ;; |  | ||||||
|         *) usage "ERROR: unknown or missing command $1"; exit 42;; |         *) usage "ERROR: unknown or missing command $1"; exit 42;; | ||||||
|     esac |     esac | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| install_all() { |  | ||||||
| 
 |  | ||||||
|     MORTY_KEY="$(head -c 32 /dev/urandom | base64)" |  | ||||||
| 
 |  | ||||||
|     rst_title "Install $SERVICE_NAME (service)" |  | ||||||
|     assert_user |  | ||||||
|     wait_key |  | ||||||
|     go.golang "${GO_VERSION}" "${SERVICE_USER}" |  | ||||||
|     wait_key |  | ||||||
|     install_morty |  | ||||||
|     wait_key |  | ||||||
|     systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" |  | ||||||
|     wait_key |  | ||||||
|     if ! service_is_available "http://${MORTY_LISTEN}" ; then |  | ||||||
|         err_msg "Morty is not listening on: http://${MORTY_LISTEN}" |  | ||||||
|     fi |  | ||||||
|     if apache_is_installed; then |  | ||||||
|         info_msg "Apache is installed on this host." |  | ||||||
|         if ask_yn "Do you want to install a reverse proxy (ProxyPass)" Yn; then |  | ||||||
|             install_apache_site |  | ||||||
|         fi |  | ||||||
|     elif nginx_is_installed; then |  | ||||||
|         info_msg "nginx is installed on this host." |  | ||||||
|         if ask_yn "Do you want to install a reverse proxy (ProxyPass)" Yn; then |  | ||||||
|             install_nginx_site |  | ||||||
|         fi |  | ||||||
|     fi |  | ||||||
|     info_searx |  | ||||||
|     if ask_yn "Add image and result proxy to SearXNG settings.yml?" Yn; then |  | ||||||
|         "${REPO_ROOT}/utils/searx.sh" option result-proxy "${PUBLIC_URL_MORTY}" "${MORTY_KEY}" |  | ||||||
|         "${REPO_ROOT}/utils/searx.sh" option image-proxy-on |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ask_yn "Do you want to inspect the installation?" Ny; then |  | ||||||
|         inspect_service |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_check() { |  | ||||||
| 
 |  | ||||||
|     if service_account_is_available "$SERVICE_USER"; then |  | ||||||
|         info_msg "service account $SERVICE_USER available." |  | ||||||
|     else |  | ||||||
|         err_msg "service account $SERVICE_USER not available!" |  | ||||||
|     fi |  | ||||||
|     if go_is_available "$SERVICE_USER"; then |  | ||||||
|         info_msg "~$SERVICE_USER: go is installed" |  | ||||||
|     else |  | ||||||
|         err_msg "~$SERVICE_USER: go is not installed" |  | ||||||
|     fi |  | ||||||
|     if morty_is_installed; then |  | ||||||
|         info_msg "~$SERVICE_USER: morty app is installed" |  | ||||||
|     else |  | ||||||
|         err_msg "~$SERVICE_USER: morty app is not installed!" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ! service_is_available "http://${MORTY_LISTEN}" ; then |  | ||||||
|         err_msg "Morty is not listening on: http://${MORTY_LISTEN}" |  | ||||||
|         echo -e "${_Green}stop with [${_BCyan}CTRL-C${_Green}] or .." |  | ||||||
|         wait_key |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if ! service_is_available "${PUBLIC_URL_MORTY}"; then |  | ||||||
|         warn_msg "Public service at ${PUBLIC_URL_MORTY} is not available!" |  | ||||||
|         if ! in_container; then |  | ||||||
|             warn_msg "Check if public name is correct and routed or use the public IP from above." |  | ||||||
|         fi |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if [[ "${GO_VERSION}" > "$(go_version)" ]]; then |  | ||||||
|         warn_msg "golang ($(go_version)) needs to be $GO_VERSION at least" |  | ||||||
|         warn_msg "you need to reinstall $SERVICE_USER --> $0 reinstall all" |  | ||||||
|     else |  | ||||||
|         info_msg "golang $(go_version) is installed (min needed is: $GO_VERSION)" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| go_version(){ |  | ||||||
|     go.version "${SERVICE_USER}" |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| remove_all() { | remove_all() { | ||||||
|     rst_title "De-Install $SERVICE_NAME (service)" |     rst_title "De-Install $SERVICE_NAME (service)" | ||||||
|  | @ -321,152 +80,6 @@ installations that were installed with this script." | ||||||
|     fi |     fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| assert_user() { |  | ||||||
|     rst_title "user $SERVICE_USER" section |  | ||||||
|     echo |  | ||||||
|     tee_stderr 1 <<EOF | bash | prefix_stdout |  | ||||||
| useradd --shell /bin/bash --system \ |  | ||||||
|  --home-dir "$SERVICE_HOME" \ |  | ||||||
|  --comment 'Web content sanitizer proxy' $SERVICE_USER |  | ||||||
| mkdir "$SERVICE_HOME" |  | ||||||
| chown -R "$SERVICE_GROUP:$SERVICE_GROUP" "$SERVICE_HOME" |  | ||||||
| groups $SERVICE_USER |  | ||||||
| EOF |  | ||||||
|     SERVICE_HOME="$(sudo -i -u "$SERVICE_USER" echo \$HOME)" |  | ||||||
|     export SERVICE_HOME |  | ||||||
|     echo "export SERVICE_HOME=$SERVICE_HOME" |  | ||||||
| 
 |  | ||||||
|     tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" |  | ||||||
| touch $GO_ENV |  | ||||||
| grep -qFs -- 'source "$GO_ENV"' ~/.profile || echo 'source "$GO_ENV"' >> ~/.profile |  | ||||||
| EOF |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| morty_is_installed() { |  | ||||||
|     [[ -f $SERVICE_HOME/go-apps/bin/morty ]] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| install_morty() { |  | ||||||
|     rst_title "Install morty in user's ~/go-apps" section |  | ||||||
|     echo |  | ||||||
|     go.install github.com/asciimoo/morty@latest "${SERVICE_USER}" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| update_morty() { |  | ||||||
|     rst_title "Update morty" section |  | ||||||
|     echo |  | ||||||
|     go.install github.com/asciimoo/morty@latest "${SERVICE_USER}" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| set_service_env_debug() { |  | ||||||
| 
 |  | ||||||
|     # usage:  set_service_env_debug [false|true] |  | ||||||
| 
 |  | ||||||
|     # shellcheck disable=SC2034 |  | ||||||
|     local SERVICE_ENV_DEBUG="${1:-false}" |  | ||||||
|     if systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"; then |  | ||||||
|         systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| inspect_service() { |  | ||||||
| 
 |  | ||||||
|     rst_title "service status & log" |  | ||||||
| 
 |  | ||||||
|     cat <<EOF |  | ||||||
| 
 |  | ||||||
| sourced ${DOT_CONFIG} : |  | ||||||
|   SERVICE_USER        : ${SERVICE_USER} |  | ||||||
|   SERVICE_HOME        : ${SERVICE_HOME} |  | ||||||
|   PUBLIC_URL_MORTY:   : ${PUBLIC_URL_MORTY} |  | ||||||
|   MORTY_LISTEN:       : ${MORTY_LISTEN} |  | ||||||
| 
 |  | ||||||
| EOF |  | ||||||
|     install_log_searx_instance |  | ||||||
| 
 |  | ||||||
|     install_check |  | ||||||
| 
 |  | ||||||
|     if in_container; then |  | ||||||
|         lxc_suite_info |  | ||||||
|     else |  | ||||||
|         info_msg "public URL --> ${PUBLIC_URL_MORTY}" |  | ||||||
|         info_msg "morty URL --> http://${MORTY_LISTEN}" |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     local _debug_on |  | ||||||
|     if ask_yn "Enable morty debug mode (needs reinstall of systemd service)?"; then |  | ||||||
|         enable_debug |  | ||||||
|         _debug_on=1 |  | ||||||
|     else |  | ||||||
|         systemctl --no-pager -l status "${SERVICE_NAME}" |  | ||||||
|     fi |  | ||||||
|     echo |  | ||||||
| 
 |  | ||||||
|     # shellcheck disable=SC2059 |  | ||||||
|     printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log" |  | ||||||
|     read -r -s -n1 -t 5 |  | ||||||
|     echo |  | ||||||
|     while true;  do |  | ||||||
|         trap break 2 |  | ||||||
|         journalctl -f -u "${SERVICE_NAME}" |  | ||||||
|     done |  | ||||||
| 
 |  | ||||||
|     if [[ $_debug_on == 1 ]]; then |  | ||||||
|         FORCE_SELECTION=Y disable_debug |  | ||||||
|     fi |  | ||||||
|     return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| enable_debug() { |  | ||||||
|     warn_msg "Do not enable debug in production environments!!" |  | ||||||
|     info_msg "Enabling debug option needs to reinstall systemd service!" |  | ||||||
|     set_service_env_debug true |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| disable_debug() { |  | ||||||
|     info_msg "Disabling debug option needs to reinstall systemd service!" |  | ||||||
|     set_service_env_debug false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| set_new_key() { |  | ||||||
|     rst_title "Set morty key" |  | ||||||
|     echo |  | ||||||
| 
 |  | ||||||
|     MORTY_KEY="$(head -c 32 /dev/urandom | base64)" |  | ||||||
|     info_msg "morty key: '${MORTY_KEY}'" |  | ||||||
| 
 |  | ||||||
|     warn_msg "this will need to reinstall services .." |  | ||||||
|     MSG="${_Green}press any [${_BCyan}KEY${_Green}] to continue // stop with [${_BCyan}CTRL-C${_creset}]" wait_key |  | ||||||
| 
 |  | ||||||
|     systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" |  | ||||||
|     "${REPO_ROOT}/utils/searx.sh" option result-proxy "${PUBLIC_URL_MORTY}" "${MORTY_KEY}" |  | ||||||
|     "${REPO_ROOT}/utils/searx.sh" option image-proxy-on |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| install_apache_site() { |  | ||||||
| 
 |  | ||||||
|     rst_title "Install Apache site $APACHE_MORTY_SITE" |  | ||||||
| 
 |  | ||||||
|     rst_para "\ |  | ||||||
| This installs a reverse proxy (ProxyPass) into apache site (${APACHE_MORTY_SITE})" |  | ||||||
| 
 |  | ||||||
|     ! apache_is_installed && err_msg "Apache is not installed." |  | ||||||
| 
 |  | ||||||
|     if ! ask_yn "Do you really want to continue?" Yn; then |  | ||||||
|         return |  | ||||||
|     else |  | ||||||
|         install_apache |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     apache_install_site "${APACHE_MORTY_SITE}" |  | ||||||
| 
 |  | ||||||
|     info_msg "testing public url .." |  | ||||||
|     if ! service_is_available "${PUBLIC_URL_MORTY}"; then |  | ||||||
|         err_msg "Public service at ${PUBLIC_URL_MORTY} is not available!" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| remove_apache_site() { | remove_apache_site() { | ||||||
| 
 | 
 | ||||||
|  | @ -484,35 +97,6 @@ This removes apache site ${APACHE_MORTY_SITE}." | ||||||
|     apache_remove_site "$APACHE_MORTY_SITE" |     apache_remove_site "$APACHE_MORTY_SITE" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| install_nginx_site() { |  | ||||||
| 
 |  | ||||||
|     rst_title "Install nginx site $NGINX_MORTY_SITE" |  | ||||||
| 
 |  | ||||||
|     rst_para "\ |  | ||||||
| This installs a reverse proxy (ProxyPass) into nginx site (${NGINX_MORTY_SITE})" |  | ||||||
| 
 |  | ||||||
|     ! nginx_is_installed && err_msg "nginx is not installed." |  | ||||||
| 
 |  | ||||||
|     if ! ask_yn "Do you really want to continue?" Yn; then |  | ||||||
|         return |  | ||||||
|     else |  | ||||||
|         install_nginx |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     "${REPO_ROOT}/utils/searx.sh" install uwsgi |  | ||||||
| 
 |  | ||||||
|     # shellcheck disable=SC2034 |  | ||||||
|     SEARXNG_SRC=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_SRC) |  | ||||||
|     # shellcheck disable=SC2034 |  | ||||||
|     SEARXNG_URL_PATH=$("${REPO_ROOT}/utils/searx.sh" --getenv SEARXNG_URL_PATH) |  | ||||||
|     nginx_install_app "${NGINX_MORTY_SITE}" |  | ||||||
| 
 |  | ||||||
|     info_msg "testing public url .." |  | ||||||
|     if ! service_is_available "${PUBLIC_URL_MORTY}"; then |  | ||||||
|         err_msg "Public service at ${PUBLIC_URL_MORTY} is not available!" |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| remove_nginx_site() { | remove_nginx_site() { | ||||||
| 
 | 
 | ||||||
|     rst_title "Remove nginx site $NGINX_MORTY_SITE" |     rst_title "Remove nginx site $NGINX_MORTY_SITE" | ||||||
|  | @ -526,37 +110,10 @@ This removes nginx site ${NGINX_MORTY_SITE}." | ||||||
|         return |         return | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     nginx_remove_site "$NGINX_MORTY_SITE" |     nginx_remove_app "$NGINX_MORTY_SITE" | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| rst-doc() { |  | ||||||
| 
 |  | ||||||
|     eval "echo \"$(< "${REPO_ROOT}/docs/build-templates/morty.rst")\"" |  | ||||||
| 
 |  | ||||||
|     echo -e "\n.. START install systemd unit" |  | ||||||
|     cat <<EOF |  | ||||||
| .. tabs:: |  | ||||||
| 
 |  | ||||||
|    .. group-tab:: systemd |  | ||||||
| 
 |  | ||||||
|       .. code:: bash |  | ||||||
| 
 |  | ||||||
| EOF |  | ||||||
|     eval "echo \"$(< "${TEMPLATES}/${SERVICE_SYSTEMD_UNIT}")\"" | prefix_stdout "         " |  | ||||||
|     echo -e "\n.. END install systemd unit" |  | ||||||
| 
 |  | ||||||
|     # for DIST_NAME in ubuntu-20.04 arch fedora centos; do |  | ||||||
|     #     ( |  | ||||||
|     #         DIST_ID=${DIST_NAME%-*} |  | ||||||
|     #         DIST_VERS=${DIST_NAME#*-} |  | ||||||
|     #         [[ $DIST_VERS =~ $DIST_ID ]] && DIST_VERS= |  | ||||||
|     #         # ... |  | ||||||
|     #     ) |  | ||||||
|     # done |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
| main "$@" | main "$@" | ||||||
| # ---------------------------------------------------------------------------- | # ---------------------------------------------------------------------------- | ||||||
|  |  | ||||||
							
								
								
									
										1033
									
								
								utils/searx.sh
									
										
									
									
									
								
							
							
						
						
									
										1033
									
								
								utils/searx.sh
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,129 +0,0 @@ | ||||||
| [ |  | ||||||
|     { |  | ||||||
|         "name": "roboagent limit", |  | ||||||
|         "filters": [ |  | ||||||
|             "Header:User-Agent=(curl|cURL|Wget|python-requests|Scrapy|FeedFetcher|Go-http-client|Ruby|UniversalFeedParser)" |  | ||||||
|         ], |  | ||||||
|         "limit": 0, |  | ||||||
|         "stop": true, |  | ||||||
|         "actions": [ |  | ||||||
|             { "name": "log"}, |  | ||||||
|             { "name": "block", |  | ||||||
|               "params": { |  | ||||||
|                   "message": "Rate limit exceeded" |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|         ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "name": "botlimit", |  | ||||||
|         "filters": [ |  | ||||||
|             "Header:User-Agent=(Googlebot|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo! Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James BOT)" |  | ||||||
|         ], |  | ||||||
|         "limit": 0, |  | ||||||
|         "stop": true, |  | ||||||
|         "actions": [ |  | ||||||
|             { "name": "log"}, |  | ||||||
|             { "name": "block", |  | ||||||
|               "params": { |  | ||||||
|                   "message": "Rate limit exceeded" |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|         ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "name": "suspiciously frequent IP", |  | ||||||
|         "filters": [], |  | ||||||
|         "interval": 600, |  | ||||||
|         "limit": 30, |  | ||||||
|         "aggregations": [ |  | ||||||
|             "Header:X-Forwarded-For" |  | ||||||
|       ], |  | ||||||
|         "actions":[ |  | ||||||
|             {"name":"log"} |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|         "name": "search request", |  | ||||||
|         "filters": [ |  | ||||||
|             "Param:q", |  | ||||||
|             "Path=^(/|/search)$" |  | ||||||
|         ], |  | ||||||
|         "interval": 61, |  | ||||||
|         "limit": 999, |  | ||||||
|         "subrules": [ |  | ||||||
|             { |  | ||||||
|                 "name": "missing Accept-Language", |  | ||||||
|                 "filters": ["!Header:Accept-Language"], |  | ||||||
|                 "limit": 0, |  | ||||||
|                 "stop": true, |  | ||||||
|                 "actions": [ |  | ||||||
|                     {"name":"log"}, |  | ||||||
|                     {"name": "block", |  | ||||||
|                      "params": {"message": "Rate limit exceeded"}} |  | ||||||
|                 ] |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 "name": "suspiciously Connection=close header", |  | ||||||
|                 "filters": ["Header:Connection=close"], |  | ||||||
|                 "limit": 0, |  | ||||||
|                 "stop": true, |  | ||||||
|                 "actions": [ |  | ||||||
|                     {"name":"log"}, |  | ||||||
|                     {"name": "block", |  | ||||||
|                      "params": {"message": "Rate limit exceeded"}} |  | ||||||
|                 ] |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 "name": "IP limit", |  | ||||||
|                 "interval": 61, |  | ||||||
|                 "limit": 9, |  | ||||||
|                 "stop": true, |  | ||||||
|                 "aggregations": [ |  | ||||||
|                     "Header:X-Forwarded-For" |  | ||||||
|                 ], |  | ||||||
|                 "actions": [ |  | ||||||
|                     { "name": "log"}, |  | ||||||
|                     { "name": "block", |  | ||||||
|                       "params": { |  | ||||||
|                           "message": "Rate limit exceeded" |  | ||||||
|                       } |  | ||||||
|                     } |  | ||||||
|                 ] |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 "name": "rss/json limit", |  | ||||||
|                 "filters": [ |  | ||||||
|                     "Param:format=(csv|json|rss)" |  | ||||||
|                 ], |  | ||||||
|                 "interval": 121, |  | ||||||
|                 "limit": 2, |  | ||||||
|                 "stop": true, |  | ||||||
|                 "actions": [ |  | ||||||
|                     { "name": "log"}, |  | ||||||
|                     { "name": "block", |  | ||||||
|                       "params": { |  | ||||||
|                           "message": "Rate limit exceeded" |  | ||||||
|                       } |  | ||||||
|                     } |  | ||||||
|                 ] |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 "name": "useragent limit", |  | ||||||
|                 "interval": 61, |  | ||||||
|                 "limit": 199, |  | ||||||
|                 "aggregations": [ |  | ||||||
|                     "Header:User-Agent" |  | ||||||
|                 ], |  | ||||||
|                 "actions": [ |  | ||||||
|                     { "name": "log"}, |  | ||||||
|                     { "name": "block", |  | ||||||
|                       "params": { |  | ||||||
|                           "message": "Rate limit exceeded" |  | ||||||
|                       } |  | ||||||
|                     } |  | ||||||
|                 ] |  | ||||||
|             } |  | ||||||
|         ] |  | ||||||
|     } |  | ||||||
| ] |  | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| # -*- coding: utf-8; mode: apache -*- |  | ||||||
| 
 |  | ||||||
| LoadModule headers_module       ${APACHE_MODULES}/mod_headers.so |  | ||||||
| LoadModule proxy_module         ${APACHE_MODULES}/mod_proxy.so |  | ||||||
| LoadModule proxy_http_module    ${APACHE_MODULES}/mod_proxy_http.so |  | ||||||
| #LoadModule setenvif_module      ${APACHE_MODULES}/mod_setenvif.so |  | ||||||
| 
 |  | ||||||
| # SetEnvIf Request_URI "${PUBLIC_URL_PATH_MORTY}" dontlog |  | ||||||
| # CustomLog /dev/null combined env=dontlog |  | ||||||
| 
 |  | ||||||
| <Location ${PUBLIC_URL_PATH_MORTY} > |  | ||||||
| 
 |  | ||||||
|     <IfModule mod_security2.c> |  | ||||||
|         SecRuleEngine Off |  | ||||||
|     </IfModule> |  | ||||||
| 
 |  | ||||||
|     Require all granted |  | ||||||
| 
 |  | ||||||
|     Order deny,allow |  | ||||||
|     Deny from all |  | ||||||
|     #Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1 |  | ||||||
|     Allow from all |  | ||||||
| 
 |  | ||||||
|     ProxyPreserveHost On |  | ||||||
|     ProxyPass http://${MORTY_LISTEN} |  | ||||||
|     RequestHeader set X-Script-Name ${PUBLIC_URL_PATH_MORTY} |  | ||||||
| 
 |  | ||||||
| </Location> |  | ||||||
|  | @ -1,33 +0,0 @@ | ||||||
| # -*- coding: utf-8; mode: apache -*- |  | ||||||
| 
 |  | ||||||
| LoadModule headers_module       ${APACHE_MODULES}/mod_headers.so |  | ||||||
| LoadModule proxy_module         ${APACHE_MODULES}/mod_proxy.so |  | ||||||
| LoadModule proxy_http_module    ${APACHE_MODULES}/mod_proxy_http.so |  | ||||||
| #LoadModule setenvif_module      ${APACHE_MODULES}/mod_setenvif.so |  | ||||||
| 
 |  | ||||||
| # SetEnvIf Request_URI "${FILTRON_URL_PATH}" dontlog |  | ||||||
| # CustomLog /dev/null combined env=dontlog |  | ||||||
| 
 |  | ||||||
| # SecRuleRemoveById 981054 |  | ||||||
| # SecRuleRemoveById 981059 |  | ||||||
| # SecRuleRemoveById 981060 |  | ||||||
| # SecRuleRemoveById 950907 |  | ||||||
| 
 |  | ||||||
| <Location ${FILTRON_URL_PATH} > |  | ||||||
| 
 |  | ||||||
|     <IfModule mod_security2.c> |  | ||||||
|         SecRuleEngine Off |  | ||||||
|     </IfModule> |  | ||||||
| 
 |  | ||||||
|     Require all granted |  | ||||||
| 
 |  | ||||||
|     Order deny,allow |  | ||||||
|     Deny from all |  | ||||||
|     #Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1 |  | ||||||
|     Allow from all |  | ||||||
| 
 |  | ||||||
|     ProxyPreserveHost On |  | ||||||
|     ProxyPass http://${FILTRON_LISTEN} |  | ||||||
|     RequestHeader set X-Script-Name ${FILTRON_URL_PATH} |  | ||||||
| 
 |  | ||||||
| </Location> |  | ||||||
|  | @ -1,34 +0,0 @@ | ||||||
| # -*- coding: utf-8; mode: apache -*- |  | ||||||
| 
 |  | ||||||
| LoadModule headers_module       ${APACHE_MODULES}/mod_headers.so |  | ||||||
| LoadModule proxy_module         ${APACHE_MODULES}/mod_proxy.so |  | ||||||
| LoadModule proxy_uwsgi_module   ${APACHE_MODULES}/mod_proxy_uwsgi.so |  | ||||||
| # LoadModule setenvif_module      ${APACHE_MODULES}/mod_setenvif.so |  | ||||||
| # |  | ||||||
| # SetEnvIf Request_URI "${SEARXNG_URL_PATH}" dontlog |  | ||||||
| # CustomLog /dev/null combined env=dontlog |  | ||||||
| 
 |  | ||||||
| <Location ${SEARXNG_URL_PATH}> |  | ||||||
| 
 |  | ||||||
|     <IfModule mod_security2.c> |  | ||||||
|         SecRuleEngine Off |  | ||||||
|     </IfModule> |  | ||||||
| 
 |  | ||||||
|     Require all granted |  | ||||||
| 
 |  | ||||||
|     Order deny,allow |  | ||||||
|     Deny from all |  | ||||||
|     # Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1 |  | ||||||
|     Allow from all |  | ||||||
| 
 |  | ||||||
|     ProxyPreserveHost On |  | ||||||
|     ProxyPass unix:${SEARXNG_UWSGI_SOCKET}|uwsgi://uwsgi-uds-searx/ |  | ||||||
| 
 |  | ||||||
| </Location> |  | ||||||
| 
 |  | ||||||
| # uWSGI serves the static files and in settings.yml we use:: |  | ||||||
| # |  | ||||||
| #   ui: |  | ||||||
| #     static_use_hash: true |  | ||||||
| # |  | ||||||
| # Alias ${SEARXNG_URL_PATH}/static/ ${SEARXNG_STATIC}/ |  | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| # https://example.org/morty |  | ||||||
| 
 |  | ||||||
| location /morty { |  | ||||||
|     proxy_pass         http://127.0.0.1:3000/; |  | ||||||
| 
 |  | ||||||
|     proxy_set_header   Host             \$host; |  | ||||||
|     proxy_set_header   Connection       \$http_connection; |  | ||||||
|     proxy_set_header   X-Real-IP        \$remote_addr; |  | ||||||
|     proxy_set_header   X-Forwarded-For  \$proxy_add_x_forwarded_for; |  | ||||||
|     proxy_set_header   X-Scheme         \$scheme; |  | ||||||
| } |  | ||||||
|  | @ -1,16 +0,0 @@ | ||||||
| # https://example.org/searx |  | ||||||
| 
 |  | ||||||
| location ${SEARXNG_URL_PATH} { |  | ||||||
|     proxy_pass         http://127.0.0.1:4004/; |  | ||||||
| 
 |  | ||||||
|     proxy_set_header   Host             \$host; |  | ||||||
|     proxy_set_header   Connection       \$http_connection; |  | ||||||
|     proxy_set_header   X-Real-IP        \$remote_addr; |  | ||||||
|     proxy_set_header   X-Forwarded-For  \$proxy_add_x_forwarded_for; |  | ||||||
|     proxy_set_header   X-Scheme         \$scheme; |  | ||||||
|     proxy_set_header   X-Script-Name    ${SEARXNG_URL_PATH}; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| location ${SEARXNG_URL_PATH}/static/ { |  | ||||||
|     alias ${SEARXNG_STATIC}/; |  | ||||||
| } |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Markus Heiser
						Markus Heiser