utils/morty.sh: add script to install morty result proxy

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
Markus Heiser 2020-02-02 18:14:10 +01:00
parent 709ac51d33
commit a4437c47ac
7 changed files with 506 additions and 49 deletions

View File

@ -1,9 +1,17 @@
# -*- coding: utf-8; mode: sh -*- # -*- coding: utf-8; mode: sh -*-
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# #
# environment used by utils scripts like filtron.sh or searx.sh # This environment is used by ./utils scripts like filtron.sh or searx.sh. The
# # default values are *most flexible* and *best maintained*, you normally not
# need to change them. Before you change any value here you have to uninstall
# any previous installation. It is recommended to backup your changes simply by
# adding them to you local brand (git branch).
# the public URL of the searx instance # The public URL of the searx instance
PUBLIC_URL="${PUBLIC_URL:-http://$(uname -n)/searx}" PUBLIC_URL="${PUBLIC_URL:-http://$(uname -n)/searx}"
PUBLIC_HOST="${PUBLIC_HOST:-$(echo "$PUBLIC_URL" | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/')}" PUBLIC_HOST="${PUBLIC_HOST:-$(echo "$PUBLIC_URL" | sed -e 's/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/')}"
# Run all services by one account, but be aware that removing discrete
# components might conflict! **experimental**
#
# SERVICE_USER=service_account42

View File

@ -24,9 +24,11 @@ FILTRON_LISTEN="127.0.0.1:4004"
FILTRON_TARGET="127.0.0.1:8888" FILTRON_TARGET="127.0.0.1:8888"
SERVICE_NAME="filtron" SERVICE_NAME="filtron"
SERVICE_USER="${SERVICE_NAME}" SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}"
SERVICE_HOME="/home/${SERVICE_USER}" SERVICE_HOME="/home/${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 # shellcheck disable=SC2034
SERVICE_GROUP="${SERVICE_USER}" SERVICE_GROUP="${SERVICE_USER}"
@ -52,7 +54,7 @@ usage() {
# shellcheck disable=SC1117 # shellcheck disable=SC1117
cat <<EOF cat <<EOF
usage: usage::
$(basename "$0") shell $(basename "$0") shell
$(basename "$0") install [all|user] $(basename "$0") install [all|user]
@ -64,12 +66,11 @@ usage:
$(basename "$0") option [debug-on|debug-off] $(basename "$0") option [debug-on|debug-off]
$(basename "$0") apache [install|remove] $(basename "$0") apache [install|remove]
shell shell
start interactive shell from user ${SERVICE_USER} start interactive shell from user ${SERVICE_USER}
install / remove install / remove
all: complete setup of filtron service :all: complete setup of filtron service
user: add/remove service user '$SERVICE_USER' at $SERVICE_HOME :user: add/remove service user '$SERVICE_USER' at $SERVICE_HOME
update filtron update filtron
Update filtron installation of user ${SERVICE_USER} Update filtron installation of user ${SERVICE_USER}
activate service activate service
@ -80,12 +81,11 @@ inspect service
show service status and log show service status and log
option option
set one of the available options set one of the available options
apache apache : ${PUBLIC_URL}
install: apache site with a reverse proxy (ProxyPass) :install: apache site with a reverse proxy (ProxyPass)
remove: apache site ${APACHE_FILTRON_SITE} :remove: apache site ${APACHE_FILTRON_SITE}
If needed change the environment variable PUBLIC_URL of your WEB service in the If needed, set PUBLIC_URL of your WEB service in the '${DOT_CONFIG#"$REPO_ROOT/"}' file::
${DOT_CONFIG#"$REPO_ROOT/"} file:
PUBLIC_URL : ${PUBLIC_URL} PUBLIC_URL : ${PUBLIC_URL}
PUBLIC_HOST : ${PUBLIC_HOST} PUBLIC_HOST : ${PUBLIC_HOST}
@ -203,8 +203,9 @@ remove_all() {
It goes without saying that this script can only be used to remove It goes without saying that this script can only be used to remove
installations that were installed with this script." installations that were installed with this script."
systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" if ! systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"; then
wait_key return 42
fi
drop_service_account "${SERVICE_USER}" drop_service_account "${SERVICE_USER}"
rm -r "$FILTRON_ETC" 2>&1 | prefix_stdout rm -r "$FILTRON_ETC" 2>&1 | prefix_stdout
if service_is_available "${PUBLIC_URL}"; then if service_is_available "${PUBLIC_URL}"; then
@ -231,7 +232,7 @@ export PATH=\$PATH:\$HOME/local/go/bin:\$GOPATH/bin
EOF EOF
echo "Environment $GO_ENV has been setup." echo "Environment $GO_ENV has been setup."
tee_stderr <<EOF | sudo -i -u $SERVICE_USER tee_stderr <<EOF | sudo -i -u "$SERVICE_USER"
grep -qFs -- 'source $GO_ENV' ~/.profile || echo 'source $GO_ENV' >> ~/.profile grep -qFs -- 'source $GO_ENV' ~/.profile || echo 'source $GO_ENV' >> ~/.profile
EOF EOF
} }
@ -241,10 +242,12 @@ filtron_is_installed() {
[[ -f $SERVICE_HOME/go-apps/bin/filtron ]] [[ -f $SERVICE_HOME/go-apps/bin/filtron ]]
} }
_svcpr=" |${SERVICE_USER}| "
install_filtron() { install_filtron() {
rst_title "Install filtron in user's ~/go-apps" section rst_title "Install filtron in user's ~/go-apps" section
echo echo
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_service_prefix" tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_svcpr"
go get -v -u github.com/asciimoo/filtron go get -v -u github.com/asciimoo/filtron
EOF EOF
install_template --no-eval "$FILTRON_RULES" root root 644 install_template --no-eval "$FILTRON_RULES" root root 644
@ -253,7 +256,7 @@ EOF
update_filtron() { update_filtron() {
rst_title "Update filtron" section rst_title "Update filtron" section
echo echo
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_service_prefix" tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_svcpr"
go get -v -u github.com/asciimoo/filtron go get -v -u github.com/asciimoo/filtron
EOF EOF
} }
@ -301,12 +304,14 @@ EOF
err_msg "Filtron does not listening on: http://${FILTRON_LISTEN}" err_msg "Filtron does not listening on: http://${FILTRON_LISTEN}"
fi fi
if ! service_is_available ""http://${FILTRON_TARGET}"" ; then if service_is_available ""http://${FILTRON_TARGET}"" ; then
info_msg "Filtron's target is available at: http://${FILTRON_TARGET}" info_msg "Filtron's target is available at: http://${FILTRON_TARGET}"
fi fi
if ! service_is_available "${PUBLIC_URL}"; then if ! service_is_available "${PUBLIC_URL}"; then
err_msg "Public service at ${PUBLIC_URL} is not available!" err_msg "Public service at ${PUBLIC_URL} is not available!"
echo -e "${_Green}stop with [${_BCyan}CTRL-C${_Green}] or .."
wait_key
fi fi
local _debug_on local _debug_on
@ -316,15 +321,17 @@ EOF
fi fi
echo echo
systemctl --no-pager -l status filtron.service systemctl --no-pager -l status "${SERVICE_NAME}"
echo echo
info_msg "public URL --> ${PUBLIC_URL}"
# shellcheck disable=SC2059 # shellcheck disable=SC2059
printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log" printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log"
read -r -s -n1 -t 2 read -r -s -n1 -t 2
echo echo
while true; do while true; do
trap break 2 trap break 2
journalctl -f -u filtron journalctl -f -u "${SERVICE_NAME}"
done done
if [[ $_debug_on == 1 ]]; then if [[ $_debug_on == 1 ]]; then

View File

@ -112,9 +112,9 @@ rst_title() {
# usage: rst_title <header-text> [part|chapter|section] # usage: rst_title <header-text> [part|chapter|section]
case ${2-chapter} in case ${2-chapter} in
part) printf "\n${_BGreen}${1//?/=}\n$1\n${1//?/=}${_creset}\n";; part) printf "\n${_BGreen}${1//?/=}\n${_BCyan}${1}${_BGreen}\n${1//?/=}${_creset}\n";;
chapter) printf "\n${_BGreen}${1}\n${1//?/=}${_creset}\n";; chapter) printf "\n${_BCyan}${1}\n${_BGreen}${1//?/=}${_creset}\n";;
section) printf "\n${_BGreen}${1}\n${1//?/-}${_creset}\n";; section) printf "\n${_BCyan}${1}\n${_BGreen}${1//?/-}${_creset}\n";;
*) *)
err_msg "invalid argument '${2}' in line $(caller)" err_msg "invalid argument '${2}' in line $(caller)"
return 42 return 42
@ -169,7 +169,9 @@ ask_yn() {
local _t=$3 local _t=$3
[[ ! -z $FORCE_TIMEOUT ]] && _t=$FORCE_TIMEOUT [[ ! -z $FORCE_TIMEOUT ]] && _t=$FORCE_TIMEOUT
[[ ! -z $_t ]] && _t="-t $_t" [[ ! -z $_t ]] && _t="-t $_t"
case "${2}" in case "${FORCE_SELECTION:-${2}}" in
Y) return ${EXIT_YES} ;;
N) return ${EXIT_NO} ;;
Yn) Yn)
local exit_val=${EXIT_YES} local exit_val=${EXIT_YES}
local choice="[${_BGreen}YES${_creset}/no]" local choice="[${_BGreen}YES${_creset}/no]"
@ -229,7 +231,7 @@ tee_stderr () {
prefix_stdout () { prefix_stdout () {
# usage: <cmd> | prefix_stdout [prefix] # usage: <cmd> | prefix_stdout [prefix]
local prefix=" | " local prefix="${_BYellow}-->|${_creset}"
if [[ ! -z $1 ]] ; then prefix="${_BYellow}$1${_creset}"; fi if [[ ! -z $1 ]] ; then prefix="${_BYellow}$1${_creset}"; fi
@ -433,7 +435,7 @@ install_template() {
;; ;;
"interactiv shell") "interactiv shell")
echo "// edit ${dst} to your needs" echo "// edit ${dst} to your needs"
echo "// exit with ${_BCyan}CTRL-D${_creset}" echo -e "// exit with [${_BCyan}CTRL-D${_creset}]"
sudo -H -u "${owner}" -i sudo -H -u "${owner}" -i
$DIFF_CMD "${dst}" "${template_file}" $DIFF_CMD "${dst}" "${template_file}"
echo echo
@ -487,14 +489,14 @@ install_go() {
# usage: install_go "${GO_PKG_URL}" "${GO_TAR}" "${SERVICE_USER}" # usage: install_go "${GO_PKG_URL}" "${GO_TAR}" "${SERVICE_USER}"
local _service_prefix=" |${3}| " local _svcpr=" |${3}| "
rst_title "Install Go in user's HOME" section rst_title "Install Go in user's HOME" section
rst_para "download and install go binary .." rst_para "download and install go binary .."
cache_download "${1}" "${2}" cache_download "${1}" "${2}"
tee_stderr 0.1 <<EOF | sudo -i -u "${3}" | prefix_stdout "$_service_prefix" tee_stderr 0.1 <<EOF | sudo -i -u "${3}" | prefix_stdout "$_svcpr"
echo \$PATH echo \$PATH
echo \$GOPATH echo \$GOPATH
mkdir -p \$HOME/local mkdir -p \$HOME/local
@ -533,7 +535,7 @@ interactive_shell(){
# usage: interactive_shell "${SERVICE_USER}" # usage: interactive_shell "${SERVICE_USER}"
echo "// exit with ${_BCyan}CTRL-D${_creset}" echo -e "// exit with [${_BCyan}CTRL-D${_creset}]"
sudo -H -u "${1}" -i sudo -H -u "${1}" -i
} }
@ -558,8 +560,8 @@ systemd_remove_service() {
# usage: systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}" # usage: systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"
if ! ask_yn "Do you really want to deinstall ${1}?"; then if ! ask_yn "Do you really want to deinstall systemd unit ${1}?"; then
return return 42
fi fi
systemd_deactivate_service "${1}" systemd_deactivate_service "${1}"
rm "${2}" 2>&1 | prefix_stdout rm "${2}" 2>&1 | prefix_stdout
@ -845,14 +847,14 @@ git_clone() {
if [[ -d "${dest}" ]] ; then if [[ -d "${dest}" ]] ; then
info_msg "already cloned: $dest" info_msg "already cloned: $dest"
tee_stderr 0.1 <<EOF | $bash_cmd 2>&1 | prefix_stdout " |$user| " tee_stderr 0.1 <<EOF | $bash_cmd 2>&1 | prefix_stdout " |$user| "
cd "${dest}" cd "${dest}"
git checkout -m -B "$branch" --track "$remote/$branch" git checkout -m -B "$branch" --track "$remote/$branch"
git pull --all git pull --all
EOF EOF
else else
info_msg "clone into: $dest" info_msg "clone into: $dest"
tee_stderr 0.1 <<EOF | $bash_cmd 2>&1 | prefix_stdout " |$user| " tee_stderr 0.1 <<EOF | $bash_cmd 2>&1 | prefix_stdout " |$user| "
mkdir -p "$(dirname "$dest")" mkdir -p "$(dirname "$dest")"
cd "$(dirname "$dest")" cd "$(dirname "$dest")"
git clone --branch "$branch" --origin "$remote" "$url" "$(basename "$dest")" git clone --branch "$branch" --origin "$remote" "$url" "$(basename "$dest")"

382
utils/morty.sh Executable file
View File

@ -0,0 +1,382 @@
#!/usr/bin/env bash
# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
# shellcheck source=utils/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
source_dot_config
# ----------------------------------------------------------------------------
# config
# ----------------------------------------------------------------------------
PUBLIC_URL_PATH_MORTY="/morty"
PUBLIC_URL_MORTY="$(dirname ${PUBLIC_URL})${PUBLIC_URL_PATH_MORTY}"
MORTY_LISTEN="${MORTY_LISTEN:-127.0.0.1:3000}"
MORTY_TIMEOUT=5
SERVICE_NAME="morty"
SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}"
SERVICE_HOME="/home/${SERVICE_USER}"
SERVICE_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${SERVICE_NAME}.service"
# shellcheck disable=SC2034
SERVICE_GROUP="${SERVICE_USER}"
SERVICE_ENV_DEBUG=false
GO_ENV="${SERVICE_HOME}/.go_env"
GO_PKG_URL="https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz"
GO_TAR=$(basename "$GO_PKG_URL")
# shellcheck disable=SC2034
CONFIG_FILES=()
# Apache Settings
APACHE_MORTY_SITE="morty.conf"
# ----------------------------------------------------------------------------
usage() {
# ----------------------------------------------------------------------------
# shellcheck disable=SC1117
cat <<EOF
usage::
$(basename "$0") shell
$(basename "$0") install [all|user]
$(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]
$(basename "$0") apache [install|remove]
shell
start interactive shell from user ${SERVICE_USER}
install / remove
all: complete setup of morty service
user: add/remove service user '$SERVICE_USER' at $SERVICE_HOME
update morty
Update morty installation of user ${SERVICE_USER}
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_MORTY}
:install: apache site with a reverse proxy (ProxyPass)
:remove: apache site ${APACHE_MORTY_SITE}
If needed, set the environment variable MORTY_LISTEN in the
${DOT_CONFIG#"$REPO_ROOT/"} file::
MORTY_LISTEN : ${MORTY_LISTEN}
To activate morty in searx, add result_proxy to your settings.yml::
result_proxy:
url : ${PUBLIC_URL_MORTY}
further read: https://asciimoo.github.io/searx/admin/morty.html
EOF
[ ! -z ${1+x} ] && echo -e "$1"
}
main() {
rst_title "$SERVICE_NAME" part
required_commands \
dpkg apt-get install git wget curl \
|| exit
local _usage="ERROR: unknown or missing $1 command $2"
case $1 in
--source-only) ;;
-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 ;;
install)
sudo_or_exit
case $2 in
all) install_all ;;
user) assert_user ;;
*) usage "$_usage"; exit 42;;
esac ;;
update)
sudo_or_exit
case $2 in
morty) update_morty ;;
*) usage "$_usage"; exit 42;;
esac ;;
remove)
sudo_or_exit
case $2 in
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;;
esac ;;
apache)
sudo_or_exit
case $2 in
install) install_apache_site ;;
remove) remove_apache_site ;;
*) usage "$_usage"; exit 42;;
esac ;;
option)
sudo_or_exit
case $2 in
debug-on) enable_debug ;;
debug-off) disable_debug ;;
*) usage "$_usage"; exit 42;;
esac ;;
*) usage "ERROR: unknown or missing command $1"; exit 42;;
esac
}
install_all() {
rst_title "Install $SERVICE_NAME (service)"
assert_user
wait_key
install_go "${GO_PKG_URL}" "${GO_TAR}" "${SERVICE_USER}"
wait_key
install_morty
wait_key
systemd_install_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"
wait_key
echo
if ! service_is_available "http://${MORTY_LISTEN}" ; then
err_msg "Morty does not listening on: http://${MORTY_LISTEN}"
fi
if ask_yn "Do you want to inspect the installation?" Yn; then
inspect_service
fi
}
remove_all() {
rst_title "De-Install $SERVICE_NAME (service)"
rst_para "\
It goes without saying that this script can only be used to remove
installations that were installed with this script."
if systemd_remove_service "${SERVICE_NAME}" "${SERVICE_SYSTEMD_UNIT}"; then
drop_service_account "${SERVICE_USER}"
fi
}
assert_user() {
rst_title "user $SERVICE_USER" section
echo
tee_stderr 1 <<EOF | bash | prefix_stdout
sudo -H adduser --shell /bin/bash --system --home $SERVICE_HOME \
--disabled-password --group --gecos 'Morty' $SERVICE_USER
sudo -H usermod -a -G shadow $SERVICE_USER
groups $SERVICE_USER
EOF
SERVICE_HOME="$(sudo -i -u "$SERVICE_USER" echo \$HOME)"
export SERVICE_HOME
echo "export SERVICE_HOME=$SERVICE_HOME"
cat > "$GO_ENV" <<EOF
export GOPATH=\$HOME/go-apps
export PATH=\$PATH:\$HOME/local/go/bin:\$GOPATH/bin
EOF
echo "Environment $GO_ENV has been setup."
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER"
grep -qFs -- 'source $GO_ENV' ~/.profile || echo 'source $GO_ENV' >> ~/.profile
EOF
}
morty_is_installed() {
[[ -f $SERVICE_HOME/go-apps/bin/morty ]]
}
_svcpr=" |${SERVICE_USER}| "
install_morty() {
rst_title "Install morty in user's ~/go-apps" section
echo
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_svcpr"
go get -v -u github.com/asciimoo/morty
EOF
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_svcpr"
cd \$GOPATH/src/github.com/asciimoo/morty
go test
go test -benchmem -bench .
EOF
}
update_morty() {
rst_title "Update morty" section
echo
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_svcpr"
go get -v -u github.com/asciimoo/morty
EOF
tee_stderr <<EOF | sudo -i -u "$SERVICE_USER" 2>&1 | prefix_stdout "$_svcpr"
cd \$GOPATH/src/github.com/asciimoo/morty
go test
go test -benchmem -bench .
EOF
}
set_service_env_debug() {
# usage: set_service_env_debug [false|true]
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#"$REPO_ROOT/"} :
MORTY_LISTEN : ${MORTY_LISTEN}
EOF
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 does not listening on: http://${MORTY_LISTEN}"
echo -e "${_Green}stop with [${_BCyan}CTRL-C${_Green}] or .."
wait_key
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
# shellcheck disable=SC2059
info_msg "morty URL --> http://${MORTY_LISTEN}"
info_msg "public URL --> ${PUBLIC_URL_MORTY}"
printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log"
read -r -s -n1 -t 2
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 enviroments!!"
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
}
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?"; then
return
fi
a2enmod headers
a2enmod proxy
a2enmod proxy_http
echo
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() {
rst_title "Remove Apache site $APACHE_MORTY_SITE"
rst_para "\
This removes apache site ${APACHE_MORTY_SITE}."
! apache_is_installed && err_msg "Apache is not installed."
if ! ask_yn "Do you really want to continue?"; then
return
fi
apache_remove_site "$APACHE_MORTY_SITE"
}
# ----------------------------------------------------------------------------
main "$@"
# ----------------------------------------------------------------------------

View File

@ -17,10 +17,11 @@ SEARX_URL_PATH="${SEARX_URL_PATH:-$(echo "${PUBLIC_URL}" \
SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(echo "$PUBLIC_URL" \ SEARX_INSTANCE_NAME="${SEARX_INSTANCE_NAME:-searx@$(echo "$PUBLIC_URL" \
| sed -e 's,^.*://\([^\:/]*\).*,\1,g') }" | sed -e 's,^.*://\([^\:/]*\).*,\1,g') }"
SERVICE_USER="searx" SERVICE_NAME="searx"
SERVICE_USER="${SERVICE_USER:-${SERVICE_NAME}}"
SERVICE_HOME="/home/${SERVICE_USER}"
# shellcheck disable=SC2034 # shellcheck disable=SC2034
SERVICE_GROUP="${SERVICE_USER}" SERVICE_GROUP="${SERVICE_USER}"
SERVICE_HOME="/home/${SERVICE_USER}"
SEARX_INTERNAL_URL="127.0.0.1:8888" SEARX_INTERNAL_URL="127.0.0.1:8888"
SEARX_GIT_URL="https://github.com/asciimoo/searx.git" SEARX_GIT_URL="https://github.com/asciimoo/searx.git"
@ -65,7 +66,7 @@ usage() {
# shellcheck disable=SC1117 # shellcheck disable=SC1117
cat <<EOF cat <<EOF
usage: usage::
$(basename "$0") shell $(basename "$0") shell
$(basename "$0") install [all|user|pyenv|searx-src|apache] $(basename "$0") install [all|user|pyenv|searx-src|apache]
@ -80,10 +81,10 @@ usage:
shell shell
start interactive shell from user ${SERVICE_USER} start interactive shell from user ${SERVICE_USER}
install / remove install / remove
all: complete (de-) installation of searx service :all: complete (de-) installation of searx service
user: add/remove service user '$SERVICE_USER' at $SERVICE_HOME :user: add/remove service user '$SERVICE_USER' at $SERVICE_HOME
searx-src: clone $SEARX_GIT_URL :searx-src: clone $SEARX_GIT_URL
pyenv: create/remove virtualenv (python) in $SEARX_PYENV :pyenv: create/remove virtualenv (python) in $SEARX_PYENV
update searx update searx
Update searx installation of user ${SERVICE_USER} Update searx installation of user ${SERVICE_USER}
activate service activate service
@ -95,11 +96,10 @@ inspect service
option option
set one of the available options set one of the available options
apache apache
install: apache site with the searx uwsgi app :install: apache site with the searx uwsgi app
remove: apache site ${APACHE_FILTRON_SITE} :remove: apache site ${APACHE_FILTRON_SITE}
If needed change the environment variable PUBLIC_URL of your WEB service in the If needed, set PUBLIC_URL of your WEB service in the '${DOT_CONFIG#"$REPO_ROOT/"}' file::
${DOT_CONFIG#"$REPO_ROOT/"} file:
PUBLIC_URL : ${PUBLIC_URL} PUBLIC_URL : ${PUBLIC_URL}
PUBLIC_HOST : ${PUBLIC_HOST} PUBLIC_HOST : ${PUBLIC_HOST}
@ -440,6 +440,7 @@ EOF
} }
enable_debug() { enable_debug() {
warn_msg "Do not enable debug in production enviroments!!"
info_msg "try to enable debug mode ..." info_msg "try to enable debug mode ..."
tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 | prefix_stdout "$_service_prefix" tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 | prefix_stdout "$_service_prefix"
cd ${SEARX_SRC} cd ${SEARX_SRC}
@ -500,8 +501,10 @@ EOF
uWSGI_app_available "$SEARX_UWSGI_APP" \ uWSGI_app_available "$SEARX_UWSGI_APP" \
|| err_msg "uWSGI app $SEARX_UWSGI_APP not available!" || err_msg "uWSGI app $SEARX_UWSGI_APP not available!"
if ! service_is_available "http://$SEARX_INTERNAL_URL"; then if ! service_is_available "http://${SEARX_INTERNAL_URL}"; then
err_msg "uWSGI app (service) at http://$SEARX_INTERNAL_URL is not available!" err_msg "uWSGI app (service) at http://${SEARX_INTERNAL_URL} is not available!"
echo -e "${_Green}stop with [${_BCyan}CTRL-C${_Green}] or .."
wait_key
fi fi
if ! service_is_available "${PUBLIC_URL}"; then if ! service_is_available "${PUBLIC_URL}"; then
@ -514,15 +517,18 @@ EOF
_debug_on=1 _debug_on=1
fi fi
echo echo
systemctl --no-pager -l status uwsgi.service systemctl --no-pager -l status "${SERVICE_NAME}"
echo echo
# shellcheck disable=SC2059 # shellcheck disable=SC2059
info_msg "public URL --> ${PUBLIC_URL}"
info_msg "internal URL --> http://${SEARX_INTERNAL_URL}"
printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log" printf "// use ${_BCyan}CTRL-C${_creset} to stop monitoring the log"
read -r -s -n1 -t 2 read -r -s -n1 -t 2
echo echo
while true; do while true; do
trap break 2 trap break 2
#journalctl -f -u uwsgi.service #journalctl -f -u "${SERVICE_NAME}"
tail -f /var/log/uwsgi/app/searx.log tail -f /var/log/uwsgi/app/searx.log
done done

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8; mode: apache -*-
ProxyPreserveHost On
<Location ${PUBLIC_URL_PATH_MORTY} >
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
ProxyPass http://${MORTY_LISTEN}
RequestHeader set X-Script-Name ${PUBLIC_URL_PATH_MORTY}
# In Apache it seems, that setting HTTP_HOST header direct here does have no
# effect. I needed to set 'ProxyPreserveHost On' (see above). HTTP_HOST is
# needed by searx to render correct *Search URL* in the *Link* box and
# *saved preference*.
# RequestHeader set Host ${PUBLIC_URL_PATH_MORTY}
</Location>

View File

@ -0,0 +1,29 @@
[Unit]
Description=${SERVICE_NAME}
After=syslog.target
After=network.target
[Service]
Type=simple
User=${SERVICE_USER}
Group=${SERVICE_GROUP}
WorkingDirectory=${SERVICE_HOME}
ExecStart=${SERVICE_HOME}/go-apps/bin/morty -key '' -listen '${MORTY_LISTEN}' -timeout ${MORTY_TIMEOUT}
Restart=always
Environment=USER=${SERVICE_USER} HOME=${SERVICE_HOME} DEBUG=${SERVICE_ENV_DEBUG}
# Some distributions may not support these hardening directives. If you cannot
# start the service due to an unknown option, comment out the ones not supported
# by your version of systemd.
ProtectSystem=full
PrivateDevices=yes
PrivateTmp=yes
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target