forked from Ponysearch/Ponysearch
[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…
Reference in a new issue