123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #!/bin/sh
- # shellcheck shell=dash
- set -eu
- check_file() {
- local target="$1"
- if [ ! -f "$target" ]; then
- cat <<EOF
- !!!
- !!! ERROR
- !!! "$target" is not a valid file, exiting...
- !!!
- EOF
- exit 127
- fi
- }
- check_directory() {
- local target="$1"
- if [ ! -d "$target" ]; then
- cat <<EOF
- !!!
- !!! ERROR
- !!! "$target" is not a valid directory, exiting...
- !!!
- EOF
- exit 127
- fi
- }
- setup_ownership() {
- local target="$1"
- local type="$2"
- case "$type" in
- file | directory) ;;
- *)
- cat <<EOF
- !!!
- !!! ERROR
- !!! "$type" is not a valid type, exiting...
- !!!
- EOF
- exit 1
- ;;
- esac
- if [ "$(stat -c %U:%G "$target")" != "searxng:searxng" ]; then
- if [ "$(id -u)" -eq 0 ]; then
- chown -R searxng:searxng "$target"
- else
- cat <<EOF
- !!!
- !!! WARNING
- !!! "$target" $type is not owned by "searxng"
- !!! This may cause issues when running SearXNG
- !!!
- !!! Run the container as root to fix this issue automatically
- !!! Alternatively, you can chown the $type manually:
- !!! $ chown -R searxng:searxng "$target"
- !!!
- EOF
- fi
- fi
- }
- # Apply envs to uwsgi.ini
- setup_uwsgi() {
- local timestamp
- timestamp=$(stat -c %Y "$UWSGI_SETTINGS_PATH")
- sed -i \
- -e "s|workers = .*|workers = ${UWSGI_WORKERS:-%k}|g" \
- -e "s|threads = .*|threads = ${UWSGI_THREADS:-4}|g" \
- "$UWSGI_SETTINGS_PATH"
- # Restore timestamp
- touch -c -d "@$timestamp" "$UWSGI_SETTINGS_PATH"
- }
- # Apply envs to settings.yml
- setup_searxng() {
- local timestamp
- timestamp=$(stat -c %Y "$SEARXNG_SETTINGS_PATH")
- # Ensure trailing slash in BASE_URL
- # https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
- export BASE_URL="${BASE_URL%/}/"
- sed -i \
- -e "s|base_url: false|base_url: ${BASE_URL:-false}|g" \
- -e "s/instance_name: \"SearXNG\"/instance_name: \"${INSTANCE_NAME:-SearXNG}\"/g" \
- -e "s/autocomplete: \"\"/autocomplete: \"${AUTOCOMPLETE:-}\"/g" \
- -e "s/ultrasecretkey/$(head -c 24 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9')/g" \
- "$SEARXNG_SETTINGS_PATH"
- # Restore timestamp
- touch -c -d "@$timestamp" "$SEARXNG_SETTINGS_PATH"
- }
- # Handle volume mounts
- volume_handler() {
- local target="$1"
- # Check if it's a valid directory
- check_directory "$target"
- setup_ownership "$target" "directory"
- }
- # Handle configuration file updates
- config_handler() {
- local target="$1"
- local template="$2"
- local new_template_target="$target.new"
- # Create/Update the configuration file
- if [ -f "$target" ]; then
- setup_ownership "$target" "file"
- if [ "$template" -nt "$target" ]; then
- cp -pfT "$template" "$new_template_target"
- cat <<EOF
- ...
- ... INFORMATION
- ... Update available for "$target"
- ... It is recommended to update the configuration file to ensure proper functionality
- ...
- ... New version placed at "$new_template_target"
- ... Please review and merge changes
- ...
- EOF
- fi
- else
- cat <<EOF
- ...
- ... INFORMATION
- ... "$target" does not exist, creating from template...
- ...
- EOF
- cp -pfT "$template" "$target"
- fi
- # Check if it's a valid file
- check_file "$target"
- }
- echo "SearXNG $SEARXNG_VERSION"
- # Check for volume mounts
- volume_handler "$CONFIG_PATH"
- volume_handler "$DATA_PATH"
- # Check for updates in files
- config_handler "$UWSGI_SETTINGS_PATH" "/usr/local/searxng/.template/uwsgi.ini"
- config_handler "$SEARXNG_SETTINGS_PATH" "/usr/local/searxng/searx/settings.yml"
- # Update files
- setup_uwsgi
- setup_searxng
- exec /usr/local/searxng/venv/bin/uwsgi --http-socket "$BIND_ADDRESS" "$UWSGI_SETTINGS_PATH"
|