diff options
| author | Gaspard d'Hautefeuille <github@dhautefeuille.eu> | 2025-07-09 07:55:37 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-09 07:55:37 +0200 |
| commit | f798ddd4922d793d5e6ccb7c4111810d549ff4f4 (patch) | |
| tree | 223aa9d26deb176d983cd8e1bed51ff2cff71eff /utils/lib_redis.sh | |
| parent | bd593d0bad2189f57657bbcfa2c5e86f795c680e (diff) | |
[mod] migrate from Redis to Valkey (#4795)
This patch migrates from `redis==5.2.1` [1] to `valkey==6.1.0` [2].
The migration to valkey is necessary because the company behind Redis has decided
to abandon the open source license. After experiencing a drop in user numbers,
they now want to run it under a dual license again. But this move demonstrates
once again how unreliable the company is and how it treats open source
developers.
To review first, read the docs::
$ make docs.live
Follow the instructions to remove redis:
- http://0.0.0.0:8000/admin/settings/settings_redis.html
Config and install a local valkey DB:
- http://0.0.0.0:8000/admin/settings/settings_valkey.html
[1] https://pypi.org/project/redis/
[2] https://pypi.org/project/valkey/
Co-authored-by: HLFH <gaspard@dhautefeuille.eu>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'utils/lib_redis.sh')
| -rwxr-xr-x | utils/lib_redis.sh | 290 |
1 files changed, 0 insertions, 290 deletions
diff --git a/utils/lib_redis.sh b/utils/lib_redis.sh index ba1435a86..3b481dc75 100755 --- a/utils/lib_redis.sh +++ b/utils/lib_redis.sh @@ -1,190 +1,26 @@ #!/usr/bin/env bash # -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*- # SPDX-License-Identifier: AGPL-3.0-or-later -# -# Tools to build and install redis [1] binaries & packages. -# -# [1] https://redis.io/download#installation -# -# 1. redis.devpkg (sudo) -# 2. redis.build -# 3. redis.install (sudo) -# -# systemd commands:: -# -# sudo -H systemctl status searxng-redis -# sudo -H journalctl -u searxng-redis -# sudo -H journalctl --vacuum-size=1M -# -# Test socket connection from client (local user):: -# -# $ sudo -H ./manage redis.addgrp "${USER}" -# # logout & login to get member of group -# $ groups -# ... searxng-redis ... -# $ source /usr/local/searxng-redis/.redis_env -# $ which redis-cli -# /usr/local/searxng-redis/.local/bin/redis-cli -# -# $ redis-cli -s /usr/local/searxng-redis/redis.sock -# redis /usr/local/searxng-redis/redis.sock> set foo bar -# OK -# redis /usr/local/searxng-redis/redis.sock> get foo -# "bar" -# [CTRL-D] - # shellcheck disable=SC2091 # shellcheck source=utils/lib.sh . /dev/null -REDIS_GIT_URL="https://github.com/redis/redis.git" -REDIS_GIT_TAG="${REDIS_GIT_TAG:-6.2.6}" - REDIS_USER="searxng-redis" REDIS_GROUP="searxng-redis" -REDIS_HOME="/usr/local/${REDIS_USER}" -REDIS_HOME_BIN="${REDIS_HOME}/.local/bin" -REDIS_ENV="${REDIS_HOME}/.redis_env" - REDIS_SERVICE_NAME="searxng-redis" REDIS_SYSTEMD_UNIT="${SYSTEMD_UNITS}/${REDIS_SERVICE_NAME}.service" -# binaries to compile & install -REDIS_INSTALL_EXE=(redis-server redis-benchmark redis-cli) -# link names of redis-server binary -REDIS_LINK_EXE=(redis-sentinel redis-check-rdb redis-check-aof) - -REDIS_CONF="${REDIS_HOME}/redis.conf" -REDIS_CONF_TEMPLATE=$(cat <<EOF -# Note that in order to read the configuration file, Redis must be -# started with the file path as first argument: -# -# ./redis-server /path/to/redis.conf - -# bind 127.0.0.1 -::1 -protected-mode yes - -# Accept connections on the specified port, default is 6379 (IANA #815344). -# If port 0 is specified Redis will not listen on a TCP socket. -port 0 - -# Specify the path for the Unix socket that will be used to listen for -# incoming connections. - -unixsocket ${REDIS_HOME}/run/redis.sock -unixsocketperm 770 - -# The working directory. -dir ${REDIS_HOME}/run - -# If you run Redis from upstart or systemd, Redis can interact with your -# supervision tree. -supervised auto - -pidfile ${REDIS_HOME}/run/redis.pid - -# log to the system logger -syslog-enabled yes -EOF -) - redis.help(){ cat <<EOF redis.: - devpkg : install essential packages to compile redis - build : build redis binaries at $(redis._get_dist) - install : create user (${REDIS_USER}) and install systemd service (${REDIS_SERVICE_NAME}) remove : delete user (${REDIS_USER}) and remove service (${REDIS_SERVICE_NAME}) - shell : start bash interpreter from user ${REDIS_USER} - src : clone redis source code to <path> and checkput ${REDIS_GIT_TAG} - useradd : create user (${REDIS_USER}) at ${REDIS_HOME} userdel : delete user (${REDIS_USER}) - addgrp : add <user> to group (${REDIS_USER}) rmgrp : remove <user> from group (${REDIS_USER}) EOF } -redis.devpkg() { - - # Uses OS package manager to install the essential packages to build and - # compile sources - - sudo_or_exit - - case ${DIST_ID} in - ubuntu|debian) - pkg_install git build-essential gawk - ;; - arch) - pkg_install git base-devel - ;; - fedora) - pkg_install git @development-tools - ;; - centos) - pkg_install git - yum groupinstall "Development Tools" -y - ;; - *) - err_msg "$DIST_ID-$DIST_VERS: No rules to install development tools from OS." - return 42 - ;; - esac -} - -redis.build() { - - # usage: redis.build - - rst_title "get redis sources" section - redis.src "${CACHE}/redis" - - if ! required_commands gcc nm make gawk ; then - info_msg "install development tools to get missing command(s) .." - if [[ -n ${SUDO_USER} ]]; then - sudo -H "$0" redis.devpkg - else - redis.devpkg - fi - fi - - rst_title "compile redis sources" section - - pushd "${CACHE}/redis" &>/dev/null - - if ask_yn "Do you run 'make distclean' first'?" Yn; then - $(bash.cmd) -c "make distclean" 2>&1 | prefix_stdout - fi - - $(bash.cmd) -c "make" 2>&1 | prefix_stdout - if ask_yn "Do you run 'make test'?" Ny; then - $(bash.cmd) -c "make test" | prefix_stdout - fi - - popd &>/dev/null - - tee_stderr 0.1 <<EOF | $(bash.cmd) 2>&1 | prefix_stdout -mkdir -p "$(redis._get_dist)" -cd "${CACHE}/redis/src" -cp ${REDIS_INSTALL_EXE[@]} "$(redis._get_dist)" -EOF - info_msg "redis binaries available at $(redis._get_dist)" -} - - -redis.install() { - sudo_or_exit - ( - set -e - redis.useradd - redis._install_bin - redis._install_conf - redis._install_service - ) - dump_return $? -} redis.remove() { sudo_or_exit @@ -200,57 +36,6 @@ redis.shell() { interactive_shell "${REDIS_USER}" } -redis.src() { - - # usage: redis.src "${CACHE}/redis" - - local dest="${1:-${CACHE}/redis}" - - if [ -d "${dest}" ] ; then - info_msg "already cloned: $dest" - tee_stderr 0.1 <<EOF | $(bash.cmd) 2>&1 | prefix_stdout -cd "${dest}" -git fetch --all -git reset --hard tags/${REDIS_GIT_TAG} -EOF - else - tee_stderr 0.1 <<EOF | $(bash.cmd) 2>&1 | prefix_stdout -mkdir -p "$(dirname "$dest")" -cd "$(dirname "$dest")" -git clone "${REDIS_GIT_URL}" "${dest}" -EOF - tee_stderr 0.1 <<EOF | $(bash.cmd) 2>&1 | prefix_stdout -cd "${dest}" -git checkout tags/${REDIS_GIT_TAG} -b "build-branch" -EOF - fi -} - -redis.useradd(){ - - # usage: redis.useradd - - rst_title "add user ${REDIS_USER}" section - echo - sudo_or_exit - - # create user account - tee_stderr 0.5 <<EOF | sudo -H bash | prefix_stdout -useradd --shell /bin/bash --system \ - --home-dir "${REDIS_HOME}" \ - --comment 'user that runs a redis instance' "${REDIS_USER}" -mkdir -p "${REDIS_HOME}" -chown -R "${REDIS_USER}:${REDIS_GROUP}" "${REDIS_HOME}" -groups "${REDIS_USER}" -EOF - - # create App-ENV and add source it in the .profile - tee_stderr 0.5 <<EOF | sudo -H -u "${REDIS_USER}" bash | prefix_stdout -mkdir -p "${REDIS_HOME_BIN}" -echo "export PATH=${REDIS_HOME_BIN}:\\\$PATH" > "${REDIS_ENV}" -grep -qFs -- 'source "${REDIS_ENV}"' ~/.profile || echo 'source "${REDIS_ENV}"' >> ~/.profile -EOF -} redis.userdel() { sudo_or_exit @@ -275,81 +60,6 @@ redis.rmgrp() { } - -# private redis. functions -# ------------------------ - -redis._install_bin() { - local src - src="$(redis._get_dist)" - ( - set -e - for redis_exe in "${REDIS_INSTALL_EXE[@]}"; do - install -v -o "${REDIS_USER}" -g "${REDIS_GROUP}" \ - "${src}/${redis_exe}" "${REDIS_HOME_BIN}" - done - - pushd "${REDIS_HOME_BIN}" &> /dev/null - for redis_exe in "${REDIS_LINK_EXE[@]}"; do - info_msg "link redis-server --> ${redis_exe}" - sudo -H -u "${REDIS_USER}" ln -sf redis-server "${redis_exe}" - done - popd &> /dev/null - - ) -} - -redis._install_conf() { - sudo -H -u "${REDIS_USER}" bash <<EOF -mkdir -p "${REDIS_HOME}/run" -echo '${REDIS_CONF_TEMPLATE}' > "${REDIS_CONF}" -EOF -} - -redis._install_service() { - systemd_install_service "${REDIS_SERVICE_NAME}" "${REDIS_SYSTEMD_UNIT}" -} - redis._remove_service() { systemd_remove_service "${REDIS_SERVICE_NAME}" "${REDIS_SYSTEMD_UNIT}" } - -redis._get_dist() { - if [ -z "${REDIS_DIST}" ]; then - echo "${REPO_ROOT}/dist/redis/${REDIS_GIT_TAG}/$(redis._arch)" - else - echo "${REDIS_DIST}" - fi -} - -redis._arch() { - local ARCH - case "$(command uname -m)" in - "x86_64") ARCH=amd64 ;; - "aarch64") ARCH=arm64 ;; - "armv6" | "armv7l") ARCH=armv6l ;; - "armv8") ARCH=arm64 ;; - .*386.*) ARCH=386 ;; - ppc64*) ARCH=ppc64le ;; - *) die 42 "ARCH is unknown: $(command uname -m)" ;; - esac - echo "${ARCH}" -} - -# TODO: move this to the right place .. - -bash.cmd(){ - - # print cmd to get a bash in a non-root mode, even if we are in a sudo - # context. - - local user="${USER}" - local bash_cmd="bash" - - if [ -n "${SUDO_USER}" ] && [ "root" != "${SUDO_USER}" ] ; then - user="${SUDO_USER}" - bash_cmd="sudo -H -u ${SUDO_USER} bash" - fi - - printf "%s" "${bash_cmd}" -} |