mirror of
https://github.com/searxng/searxng
synced 2024-01-01 18:24:07 +00:00
LXC: improved UX when working with a bunch of containers
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
parent
af6acd3417
commit
37c135f2ce
@ -257,7 +257,7 @@ filtron_is_installed() {
|
||||
[[ -f $SERVICE_HOME/go-apps/bin/filtron ]]
|
||||
}
|
||||
|
||||
_svcpr=" |${SERVICE_USER}| "
|
||||
_svcpr=" ${_Yellow}|${SERVICE_USER}|${_creset} "
|
||||
|
||||
install_filtron() {
|
||||
rst_title "Install filtron in user's ~/go-apps" section
|
||||
|
32
utils/lib.sh
32
utils/lib.sh
@ -117,9 +117,9 @@ rst_title() {
|
||||
# usage: rst_title <header-text> [part|chapter|section]
|
||||
|
||||
case ${2-chapter} in
|
||||
part) printf "\n${_BGreen}${1//?/=}\n${_BCyan}${1}${_BGreen}\n${1//?/=}${_creset}\n";;
|
||||
chapter) printf "\n${_BCyan}${1}\n${_BGreen}${1//?/=}${_creset}\n";;
|
||||
section) printf "\n${_BCyan}${1}\n${_BGreen}${1//?/-}${_creset}\n";;
|
||||
part) printf "\n${_BGreen}${1//?/=}${_creset}\n${_BCyan}${1}${_creset}\n${_BGreen}${1//?/=}${_creset}\n";;
|
||||
chapter) printf "\n${_BCyan}${1}${_creset}\n${_BGreen}${1//?/=}${_creset}\n";;
|
||||
section) printf "\n${_BCyan}${1}${_creset}\n${_BGreen}${1//?/-}${_creset}\n";;
|
||||
*)
|
||||
err_msg "invalid argument '${2}' in line $(caller)"
|
||||
return 42
|
||||
@ -238,7 +238,7 @@ prefix_stdout () {
|
||||
|
||||
local prefix="${_BYellow}-->|${_creset}"
|
||||
|
||||
if [[ -n $1 ]] ; then prefix="${_BYellow}$1${_creset}"; fi
|
||||
if [[ -n $1 ]] ; then prefix="$1"; fi
|
||||
|
||||
# shellcheck disable=SC2162
|
||||
(while IFS= read line; do
|
||||
@ -294,7 +294,8 @@ backup_file() {
|
||||
|
||||
# usage: backup_file /path/to/file.foo
|
||||
|
||||
local stamp=$(date +"_%Y%m%d_%H%M%S")
|
||||
local stamp
|
||||
stamp=$(date +"_%Y%m%d_%H%M%S")
|
||||
info_msg "create backup: ${1}${stamp}"
|
||||
cp -a "${1}" "${1}${stamp}"
|
||||
}
|
||||
@ -503,7 +504,7 @@ install_go() {
|
||||
|
||||
# usage: install_go "${GO_PKG_URL}" "${GO_TAR}" "${SERVICE_USER}"
|
||||
|
||||
local _svcpr=" |${3}| "
|
||||
local _svcpr=" ${_Yellow}|${3}|${_creset} "
|
||||
|
||||
rst_title "Install Go in user's HOME" section
|
||||
|
||||
@ -1034,17 +1035,32 @@ git_clone() {
|
||||
|
||||
if [[ -d "${dest}" ]] ; then
|
||||
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 " ${_Yellow}|$user|${_creset} "
|
||||
cd "${dest}"
|
||||
git checkout -m -B "$branch" --track "$remote/$branch"
|
||||
git pull --all
|
||||
EOF
|
||||
else
|
||||
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 " ${_Yellow}|$user|${_creset} "
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
cd "$(dirname "$dest")"
|
||||
git clone --branch "$branch" --origin "$remote" "$url" "$(basename "$dest")"
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
# containers
|
||||
# ----------
|
||||
|
||||
is_container() {
|
||||
sudo_or_exit
|
||||
|
||||
# usage: is_container && echo "process running inside a LXC container"
|
||||
# is_container || echo "process is not running inside a LXC container"
|
||||
#
|
||||
# hint: Reads init process environment, therefore root access is required!
|
||||
|
||||
# to be safe, take a look at the environment of process 1 (/sbin/init)
|
||||
grep -qa 'container=lxc' /proc/1/environ
|
||||
}
|
||||
|
120
utils/lxc.sh
120
utils/lxc.sh
@ -63,6 +63,12 @@ HOST_USER="${SUDO_USER:-$USER}"
|
||||
HOST_USER_ID=$(id -u "${HOST_USER}")
|
||||
HOST_GROUP_ID=$(id -g "${HOST_USER}")
|
||||
|
||||
searx_suite_set_env() {
|
||||
export FILTRON_API="0.0.0.0:4005"
|
||||
export FILTRON_LISTEN="0.0.0.0:4004"
|
||||
export MORTY_LISTEN="0.0.0.0:3000"
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
usage() {
|
||||
# ----------------------------------------------------------------------------
|
||||
@ -74,8 +80,8 @@ usage::
|
||||
$(basename "$0") build [containers]
|
||||
$(basename "$0") install [searx-suite]
|
||||
$(basename "$0") remove [containers|subordinate]
|
||||
$(basename "$0") [start|stop] [containers]
|
||||
$(basename "$0") inspect [info|config]
|
||||
$(basename "$0") [start|stop] [containers|<container-name>]
|
||||
$(basename "$0") show [info|config|searx-suite]
|
||||
$(basename "$0") cmd ...
|
||||
|
||||
build / remove
|
||||
@ -83,10 +89,11 @@ build / remove
|
||||
add / remove
|
||||
:subordinate: lxd permission to map ${HOST_USER}'s user/group id through
|
||||
start/stop
|
||||
:containers: start/stop of all containers
|
||||
inspect
|
||||
:info: show info of all containers
|
||||
:config: show config of all containers
|
||||
:containers: start/stop of all 'containers' or only <container-name>
|
||||
show
|
||||
:info: show info of all containers
|
||||
:config: show config of all containers
|
||||
:searx-suite: show searx-suite services of all containers
|
||||
cmd ...
|
||||
run commandline ... in all containers
|
||||
install
|
||||
@ -116,22 +123,10 @@ main() {
|
||||
local exit_val
|
||||
local _usage="unknown or missing $1 command $2"
|
||||
|
||||
case $1 in
|
||||
__install)
|
||||
sudo_or_exit
|
||||
case $2 in
|
||||
searx-suite) install_searx_suite ;;
|
||||
esac
|
||||
exit
|
||||
;;
|
||||
*)
|
||||
if ! required_commands lxc; then
|
||||
lxd_info
|
||||
exit 42
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ ! $1 == __* ]] && ! required_commands lxc; then
|
||||
lxd_info
|
||||
exit 42
|
||||
fi
|
||||
case $1 in
|
||||
--source-only) ;;
|
||||
-h|--help) usage; exit 0;;
|
||||
@ -141,20 +136,23 @@ main() {
|
||||
case $2 in
|
||||
containers) build_instances ;;
|
||||
*) usage "$_usage"; exit 42;;
|
||||
esac ;;
|
||||
esac
|
||||
;;
|
||||
remove)
|
||||
sudo_or_exit
|
||||
case $2 in
|
||||
containers) remove_instances ;;
|
||||
subordinate) echo; del_subordinate_ids ;;
|
||||
*) usage "$_usage"; exit 42;;
|
||||
esac ;;
|
||||
esac
|
||||
;;
|
||||
add)
|
||||
sudo_or_exit
|
||||
case $2 in
|
||||
subordinate) echo; add_subordinate_ids ;;
|
||||
*) usage "$_usage"; exit 42;;
|
||||
esac ;;
|
||||
esac
|
||||
;;
|
||||
start|stop)
|
||||
sudo_or_exit
|
||||
case $2 in
|
||||
@ -163,14 +161,27 @@ main() {
|
||||
info_msg "lxc $1 $2"
|
||||
lxc "$1" "$2" | prefix_stdout "[${_BBlue}${i}${_creset}] "
|
||||
;;
|
||||
esac ;;
|
||||
inspect)
|
||||
esac
|
||||
;;
|
||||
show)
|
||||
sudo_or_exit
|
||||
case $2 in
|
||||
config) lxc_cmd config show;;
|
||||
info) lxc_cmd info;;
|
||||
searx-suite)
|
||||
for i in "${LOCAL_IMAGES[@]}"; do
|
||||
info_msg "[${_BBlue}${i}${_creset}] ${_BGreen}${LXC_REPO_ROOT}/utils/lxc.sh install $2${_creset}"
|
||||
lxc exec -t "${i}" -- "${LXC_REPO_ROOT}/utils/lxc.sh" __show "$2" | prefix_stdout "[${i}] "
|
||||
done
|
||||
;;
|
||||
*) usage "$_usage"; exit 42;;
|
||||
esac ;;
|
||||
esac
|
||||
;;
|
||||
__show)
|
||||
case $2 in
|
||||
searx-suite) searx_suite_info ;;
|
||||
esac
|
||||
;;
|
||||
cmd)
|
||||
sudo_or_exit
|
||||
shift
|
||||
@ -192,30 +203,55 @@ main() {
|
||||
searx-suite)
|
||||
for i in "${LOCAL_IMAGES[@]}"; do
|
||||
info_msg "[${_BBlue}${i}${_creset}] ${_BGreen}${LXC_REPO_ROOT}/utils/lxc.sh install $2${_creset}"
|
||||
lxc exec "${i}" -- "${LXC_REPO_ROOT}/utils/lxc.sh" __install "$2"
|
||||
lxc exec -t "${i}" -- "${LXC_REPO_ROOT}/utils/lxc.sh" __install "$2" | prefix_stdout "[${i}] "
|
||||
done
|
||||
;;
|
||||
*) usage "$_usage"; exit 42;;
|
||||
esac ;;
|
||||
esac
|
||||
;;
|
||||
__install)
|
||||
case $2 in
|
||||
searx-suite) searx_suite_install ;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
usage "unknown or missing command $1"; exit 42;;
|
||||
esac
|
||||
}
|
||||
|
||||
install_searx_suite() {
|
||||
export FILTRON_API="0.0.0.0:4005"
|
||||
export FILTRON_LISTEN="0.0.0.0:4004"
|
||||
export MORTY_LISTEN="0.0.0.0:3000"
|
||||
FORCE_TIMEOUT=0 "${LXC_REPO_ROOT}/utils/searx.sh" install all
|
||||
FORCE_TIMEOUT=0 "${LXC_REPO_ROOT}/utils/morty.sh" install all
|
||||
FORCE_TIMEOUT=0 "${LXC_REPO_ROOT}/utils/filtron.sh" install all
|
||||
rst_title "[$(hostname)] searx-suite installation finished" part
|
||||
rst_para "IPs of the container ..."
|
||||
echo
|
||||
ip addr show | grep "inet\s*[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"
|
||||
echo
|
||||
searx_suite_install() {
|
||||
(
|
||||
searx_suite_set_env
|
||||
export FORCE_TIMEOUT=0
|
||||
"${LXC_REPO_ROOT}/utils/searx.sh" install all
|
||||
"${LXC_REPO_ROOT}/utils/morty.sh" install all
|
||||
"${LXC_REPO_ROOT}/utils/filtron.sh" install all
|
||||
|
||||
rst_title "searx-suite installation finished ($(hostname))" part
|
||||
searx_suite_info
|
||||
echo
|
||||
)
|
||||
}
|
||||
|
||||
searx_suite_info() {
|
||||
(
|
||||
searx_suite_set_env
|
||||
rst_para "Services of the container $(hostname)"
|
||||
for ip in $(hostname -I); do
|
||||
echo
|
||||
if [[ $ip =~ .*:.* ]]; then
|
||||
:
|
||||
# IPv6: not yet implemented / tested
|
||||
# echo " searx (filtron) --> http://[$ip]:4004/"
|
||||
# echo " morty --> http://[$ip]:3000/"
|
||||
else
|
||||
# IPv4:
|
||||
echo " searx (filtron) --> http://$ip:4004/"
|
||||
echo " morty --> http://$ip:3000/"
|
||||
fi
|
||||
done
|
||||
)
|
||||
}
|
||||
|
||||
build_instances() {
|
||||
rst_title "Build LXC instances"
|
||||
|
@ -255,7 +255,7 @@ morty_is_installed() {
|
||||
[[ -f $SERVICE_HOME/go-apps/bin/morty ]]
|
||||
}
|
||||
|
||||
_svcpr=" |${SERVICE_USER}| "
|
||||
_svcpr=" ${_Yellow}|${SERVICE_USER}|${_creset} "
|
||||
|
||||
install_morty() {
|
||||
rst_title "Install morty in user's ~/go-apps" section
|
||||
|
@ -210,7 +210,7 @@ main() {
|
||||
esac
|
||||
}
|
||||
|
||||
_service_prefix=" |$SERVICE_USER| "
|
||||
_service_prefix=" ${_Yellow}|$SERVICE_USER|${_creset} "
|
||||
|
||||
install_all() {
|
||||
rst_title "Install $SEARX_INSTANCE_NAME (service)"
|
||||
@ -352,7 +352,7 @@ install_settings() {
|
||||
sudo -H -i
|
||||
rst_para 'Diff between new setting file (-) and current (+):'
|
||||
echo
|
||||
$DIFF_CMD "${SEARX_SRC}/searx/settings.yml" "${SEARX_SETTINGS_PATH}"
|
||||
$DIFF_CMD "${SEARX_SRC}/searx/settings.yml" "${SEARX_SETTINGS_PATH}"
|
||||
wait_key
|
||||
;;
|
||||
esac
|
||||
@ -440,7 +440,7 @@ test_local_searx() {
|
||||
fi
|
||||
sed -i -e "s/debug : False/debug : True/g" "$SEARX_SETTINGS_PATH"
|
||||
tee_stderr 0.1 <<EOF | sudo -H -u "${SERVICE_USER}" -i 2>&1 | prefix_stdout "$_service_prefix"
|
||||
export SEARX_SETTINGS_PATH="${SEARX_SETTINGS_PATH}"
|
||||
export SEARX_SETTINGS_PATH="${SEARX_SETTINGS_PATH}"
|
||||
cd ${SEARX_SRC}
|
||||
timeout 10 python3 searx/webapp.py &
|
||||
sleep 3
|
||||
@ -537,6 +537,18 @@ EOF
|
||||
uWSGI_app_available "$SEARX_UWSGI_APP" \
|
||||
|| err_msg "uWSGI app $SEARX_UWSGI_APP not available!"
|
||||
|
||||
if is_container; then
|
||||
warn_msg "runnning inside container ..."
|
||||
for ip in $(hostname -I); do
|
||||
if [[ $ip =~ .*:.* ]]; then
|
||||
info_msg " public HTTP service (IPv6) --> http://[$ip]"
|
||||
else
|
||||
info_msg " public HTTP service (IPv4) --> http://$ip"
|
||||
fi
|
||||
done
|
||||
warn_msg "SEARX_INTERNAL_URL not available from outside"
|
||||
fi
|
||||
|
||||
if ! service_is_available "http://${SEARX_INTERNAL_URL}"; then
|
||||
err_msg "uWSGI app (service) at http://${SEARX_INTERNAL_URL} is not available!"
|
||||
echo -e "${_Green}stop with [${_BCyan}CTRL-C${_Green}] or .."
|
||||
@ -545,6 +557,9 @@ EOF
|
||||
|
||||
if ! service_is_available "${PUBLIC_URL}"; then
|
||||
warn_msg "Public service at ${PUBLIC_URL} is not available!"
|
||||
if is_container; then
|
||||
warn_msg "Check if public name is correct and routed or use the public IP from above."
|
||||
fi
|
||||
fi
|
||||
|
||||
local _debug_on
|
||||
|
Loading…
Reference in New Issue
Block a user