docker-entrypoint.sh 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #!/bin/sh
  2. help() {
  3. cat <<EOF
  4. Command line:
  5. -h Display this help
  6. -d Dry run to update the configuration files.
  7. -f Always update on the configuration files (existing files are renamed with
  8. the .old suffix). Without this option, the new configuration files are
  9. copied with the .new suffix
  10. Environment variables:
  11. INSTANCE_NAME settings.yml : general.instance_name
  12. AUTOCOMPLETE settings.yml : search.autocomplete
  13. BASE_URL settings.yml : server.base_url
  14. MORTY_URL settings.yml : result_proxy.url
  15. MORTY_KEY settings.yml : result_proxy.key
  16. BIND_ADDRESS uwsgi bind to the specified TCP socket using HTTP protocol.
  17. Default value: ${DEFAULT_BIND_ADDRESS}
  18. Volume:
  19. /etc/searxng the docker entry point copies settings.yml and uwsgi.ini in
  20. this directory (see the -f command line option)"
  21. EOF
  22. }
  23. export DEFAULT_BIND_ADDRESS="0.0.0.0:8080"
  24. export BIND_ADDRESS="${BIND_ADDRESS:-${DEFAULT_BIND_ADDRESS}}"
  25. # Parse command line
  26. FORCE_CONF_UPDATE=0
  27. DRY_RUN=0
  28. while getopts "fdh" option
  29. do
  30. case $option in
  31. f) FORCE_CONF_UPDATE=1 ;;
  32. d) DRY_RUN=1 ;;
  33. h)
  34. help
  35. exit 0
  36. ;;
  37. *)
  38. echo "unknow option ${option}"
  39. exit 42
  40. ;;
  41. esac
  42. done
  43. get_searxng_version(){
  44. su searxng -c \
  45. 'python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)"' \
  46. 2>/dev/null
  47. }
  48. SEARXNG_VERSION="$(get_searxng_version)"
  49. export SEARXNG_VERSION
  50. echo "SearXNG version ${SEARXNG_VERSION}"
  51. # helpers to update the configuration files
  52. patch_uwsgi_settings() {
  53. CONF="$1"
  54. }
  55. patch_searxng_settings() {
  56. CONF="$1"
  57. # Make sure that there is trailing slash at the end of BASE_URL
  58. # see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
  59. export BASE_URL="${BASE_URL%/}/"
  60. # update settings.yml
  61. sed -i \
  62. -e "s|base_url: false|base_url: ${BASE_URL}|g" \
  63. -e "s/instance_name: \"SearXNG\"/instance_name: \"${INSTANCE_NAME}\"/g" \
  64. -e "s/autocomplete: \"\"/autocomplete: \"${AUTOCOMPLETE}\"/g" \
  65. -e "s/ultrasecretkey/$(openssl rand -hex 32)/g" \
  66. "${CONF}"
  67. # Morty configuration
  68. if [ -n "${MORTY_KEY}" ] && [ -n "${MORTY_URL}" ]; then
  69. sed -i -e "s/image_proxy: false/image_proxy: true/g" \
  70. "${CONF}"
  71. cat >> "${CONF}" <<-EOF
  72. # Morty configuration
  73. result_proxy:
  74. url: ${MORTY_URL}
  75. key: !!binary "${MORTY_KEY}"
  76. EOF
  77. fi
  78. }
  79. update_conf() {
  80. FORCE_CONF_UPDATE=$1
  81. CONF="$2"
  82. NEW_CONF="${2}.new"
  83. OLD_CONF="${2}.old"
  84. REF_CONF="$3"
  85. PATCH_REF_CONF="$4"
  86. if [ -f "${CONF}" ]; then
  87. if [ "${REF_CONF}" -nt "${CONF}" ]; then
  88. # There is a new version
  89. if [ "$FORCE_CONF_UPDATE" -ne 0 ]; then
  90. # Replace the current configuration
  91. printf '⚠️ Automaticaly update %s to the new version\n' "${CONF}"
  92. if [ ! -f "${OLD_CONF}" ]; then
  93. printf 'The previous configuration is saved to %s\n' "${OLD_CONF}"
  94. mv "${CONF}" "${OLD_CONF}"
  95. fi
  96. cp "${REF_CONF}" "${CONF}"
  97. $PATCH_REF_CONF "${CONF}"
  98. else
  99. # Keep the current configuration
  100. printf '⚠️ Check new version %s to make sure SearXNG is working properly\n' "${NEW_CONF}"
  101. cp "${REF_CONF}" "${NEW_CONF}"
  102. $PATCH_REF_CONF "${NEW_CONF}"
  103. fi
  104. else
  105. printf 'Use existing %s\n' "${CONF}"
  106. fi
  107. else
  108. printf 'Create %s\n' "${CONF}"
  109. cp "${REF_CONF}" "${CONF}"
  110. $PATCH_REF_CONF "${CONF}"
  111. fi
  112. }
  113. # searx compatibility: copy /etc/searx/* to /etc/searxng/*
  114. SEARX_CONF=0
  115. if [ -f "/etc/searx/settings.yml" ]; then
  116. if [ ! -f "${SEARXNG_SETTINGS_PATH}" ]; then
  117. printf '⚠️ /etc/searx/settings.yml is copied to /etc/searxng\n'
  118. cp "/etc/searx/settings.yml" "${SEARXNG_SETTINGS_PATH}"
  119. fi
  120. SEARX_CONF=1
  121. fi
  122. if [ -f "/etc/searx/uwsgi.ini" ]; then
  123. printf '⚠️ /etc/searx/uwsgi.ini is ignored. Use the volume /etc/searxng\n'
  124. SEARX_CONF=1
  125. fi
  126. if [ "$SEARX_CONF" -eq "1" ]; then
  127. printf '⚠️ The deprecated volume /etc/searx is mounted. Please update your configuration to use /etc/searxng ⚠️\n'
  128. cat << EOF > /etc/searx/deprecated_volume_read_me.txt
  129. This Docker image uses the volume /etc/searxng
  130. Update your configuration:
  131. * remove uwsgi.ini (or very carefully update your existing uwsgi.ini using https://github.com/searxng/searxng/blob/master/dockerfiles/uwsgi.ini )
  132. * mount /etc/searxng instead of /etc/searx
  133. EOF
  134. fi
  135. # end of searx compatibility
  136. # make sure there are uwsgi settings
  137. update_conf "${FORCE_CONF_UPDATE}" "${UWSGI_SETTINGS_PATH}" "/usr/local/searxng/dockerfiles/uwsgi.ini" "patch_uwsgi_settings"
  138. # make sure there are searxng settings
  139. update_conf "${FORCE_CONF_UPDATE}" "${SEARXNG_SETTINGS_PATH}" "/usr/local/searxng/searx/settings.yml" "patch_searxng_settings"
  140. # dry run (to update configuration files, then inspect them)
  141. if [ $DRY_RUN -eq 1 ]; then
  142. printf 'Dry run\n'
  143. exit
  144. fi
  145. touch /var/run/uwsgi-logrotate
  146. chown -R searxng:searxng /var/log/uwsgi /var/run/uwsgi-logrotate
  147. unset MORTY_KEY
  148. # Start uwsgi
  149. printf 'Listen on %s\n' "${BIND_ADDRESS}"
  150. exec su-exec searxng:searxng uwsgi --master --http-socket "${BIND_ADDRESS}" "${UWSGI_SETTINGS_PATH}"