seafilepro.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #!/usr/bin/env bash
  2. while true;do ls | grep -q dockerbunker.sh;if [[ $? == 0 ]];then BASE_DIR=$PWD;break;else cd ../;fi;done
  3. PROPER_NAME="Seafile Pro"
  4. SERVICE_NAME="$(echo -e "${PROPER_NAME,,}" | tr -d '[:space:]')"
  5. PROMPT_SSL=true
  6. safe_to_keep_volumes_when_reconfiguring=1
  7. declare -a environment=( "data/env/dockerbunker.env" "data/include/init.sh" )
  8. for env in "${environment[@]}";do
  9. [[ -f "${BASE_DIR}"/$env ]] && source "${BASE_DIR}"/$env
  10. done
  11. declare -A WEB_SERVICES
  12. declare -a containers=( "${SERVICE_NAME}-db-dockerbunker" "${SERVICE_NAME}-service-dockerbunker" "${SERVICE_NAME}-elasticsearch-dockerbunker" "${SERVICE_NAME}-memcached-dockerbunker" )
  13. declare -a add_to_network=( "${SERVICE_NAME}-service-dockerbunker" )
  14. declare -A volumes=( [${SERVICE_NAME}-data-vol-3]="/opt/seafile" [${SERVICE_NAME}-data-vol-2]="/shared" [${SERVICE_NAME}-elasticsearch-vol-1]="/usr/share/elasticsearch/data" [${SERVICE_NAME}-data-vol-1]="/seafile" [${SERVICE_NAME}-db-vol-1]="/var/lib/mysql" )
  15. declare -a networks=( "dockerbunker-${SERVICE_NAME}" )
  16. declare -A IMAGES=( [db]="mariadb:10.3" [service]="chaosbunker/seafile-pro" [memcached]="memcached:1.5.6" [elasticsearch]="seafileltd/elasticsearch-with-ik:5.6.16" )
  17. previous_version="6.3.14"
  18. current_version="7.0.7"
  19. [[ -z $1 ]] && options_menu
  20. upgrade() {
  21. echo ""
  22. prompt_confirm "Migrate from Seafile Pro 6.x.x to 7.x.x?"
  23. if [[ $? == 0 ]];then
  24. if [[ -z ${SEAFILE_ADMIN_EMAIL} ]] || [[ -z ${SEAFILE_ADMIN_PASSWORD} ]];then
  25. ! grep -q SEAFILE_ADMIN_EMAIL ${SERVICE_ENV} \
  26. && echo SEAFILE_ADMIN_EMAIL= >> ${SERVICE_ENV}
  27. ! grep -q SEAFILE_ADMIN_PASSWORD ${SERVICE_ENV} \
  28. && echo SEAFILE_ADMIN_PASSWORD= >> ${SERVICE_ENV}
  29. echo -e "\nPlease enter your Admin Email and Password in ${SERVICE_ENV} before upgrading"
  30. exit 0
  31. fi
  32. if [ -z "${TIME_ZONE}" ]; then
  33. read -p "Time Zone: " TIME_ZONE
  34. echo "TIME_ZONE=${TIME_ZONE}" >> ${SERVICE_ENV}
  35. fi
  36. stop_containers
  37. if [[ -f /var/lib/docker/volumes/seafilepro-data-vol-1/_data/ccnet/seafile.ini ]] && ! grep -q "/shared/seafile/seafile-data" /var/lib/docker/volumes/seafilepro-data-vol-1/_data/ccnet/seafile.ini;then
  38. echo -e "\n------------------------"
  39. echo -e "\nSet the new path for seafile-data dir by executing\n"
  40. echo -e "\techo \"/shared/seafile/seafile-data\" > /var/lib/docker/volumes/seafilepro-data-vol-1/_data/ccnet/seafile.ini"
  41. exit=1
  42. fi
  43. if [[ -f /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seafevents.conf ]] && ! grep -q "es_host = elasticsearch" /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seafevents.conf;then
  44. echo -e "\n------------------------"
  45. echo -e "\nopen /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seafevents.conf and add the following configuration in the [INDEX FILES] section:\n"
  46. echo -e "\texternal_es_server = true"
  47. echo -e "\tes_host = elasticsearch"
  48. echo -e "\tes_port = 9200"
  49. exit=1
  50. fi
  51. if [[ -f /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seafevents.conf ]] && ! grep -q "path = /opt/seafile/pro-data/seafevents.db" /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seafevents.conf;then
  52. echo -e "\n------------------------"
  53. echo -e "\nopen /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seafevents.conf and change the 'path' value in the [DATABASE] configuration to:\n"
  54. echo -e "\tpath = /opt/seafile/pro-data/seafevents.db\n"
  55. exit=1
  56. fi
  57. if [[ -f /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seahub_settings.py ]] && ! grep -q "'LOCATION': 'memcached:11211'" /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seahub_settings.py;then
  58. echo -e "\n------------------------"
  59. echo -e "\nopen /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf/seahub_settings.py and change the 'LOCATION' value to 'memcached:11211' in the CACHES dict:\n"
  60. echo -e "CACHES = {
  61. 'default': {
  62. 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
  63. 'LOCATION': 'memcached:11211',
  64. },
  65. 'locmem': {
  66. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
  67. },
  68. }
  69. COMPRESS_CACHE_BACKEND = 'locmem'"
  70. exit=1
  71. fi
  72. [[ $exit ]] && echo -e "\n------------------------" && echo -e "\n\033[1;32mPlease take care of the above and re-run upgrade\033[0m" && exit 0
  73. create_volumes
  74. echo
  75. ! [[ -d /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile ]] && \
  76. mkdir /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile
  77. ! [[ -d /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile/seafile-data ]] && \
  78. echo "Moving seafile-data dir into seafilepro-data-vol-2:/shared/seafile/seafile-data" && \
  79. mv /var/lib/docker/volumes/seafilepro-data-vol-1/_data/seafile-data /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile
  80. ! [[ -d /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile/seahub-data ]] && \
  81. echo "Moving seahub-data dir into seafilepro-data-vol-2:/shared/seafile/seahub-data" && \
  82. mv /var/lib/docker/volumes/seafilepro-data-vol-1/_data/seahub-data /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile
  83. ! [[ -d /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile/conf ]] && \
  84. echo "Moving conf dir into seafilepro-data-vol-2:/shared/seafile/conf" && \
  85. mv /var/lib/docker/volumes/seafilepro-data-vol-1/_data/conf /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile
  86. ! [[ -d /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile/ccnet ]] && \
  87. echo "Movingccnet dir into seafilepro-data-vol-2:/shared/seafile/ccnet" && \
  88. mv /var/lib/docker/volumes/seafilepro-data-vol-1/_data/ccnet /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile
  89. ! [[ -d /var/lib/docker/volumes/seafilepro-elasticsearch-vol-1/_data/nodes ]] && \
  90. echo "Moving elasticsearch data into seafilepro-elasticsearch-vol-1:/usr/share/elasticsearch/data" && \
  91. mv /var/lib/docker/volumes/seafilepro-data-vol-1/_data/pro-data/search/data/elasticsearch/nodes /var/lib/docker/volumes/seafilepro-elasticsearch-vol-1/_data
  92. echo ${previous_version} > /var/lib/docker/volumes/seafilepro-data-vol-2/_data/seafile/seafile-data/current_version
  93. echo SEAFILE_SERVER_HOSTNAME=${SERVICE_DOMAIN} >> ${SERVICE_ENV}
  94. pull_and_compare
  95. remove_containers
  96. docker_run seafilepro_db_dockerbunker
  97. docker exec -it seafilepro-db-dockerbunker /usr/bin/mysql -u root -p${DBROOT} -e "grant all on *.* to 'root'@'%.%.%.%' identified by '${DBROOT}';"
  98. for database in {ccnet_db,seafile_db,seahub_db}; do sudo docker exec -it seafilepro-db-dockerbunker /usr/bin/mysql -u root -p${DBROOT} -e "grant all on ${database}.* to 'seafile'@'%.%.%.%' identified by '${DBPASS}';"; done
  99. docker exec -it seafilepro-db-dockerbunker mysql_upgrade -u root -p${DBROOT}
  100. docker_run_all
  101. docker exec -it seafilepro-service-dockerbunker /scripts/upgrade.py
  102. remove_from_STOPPED_SERVICES
  103. delete_old_images
  104. activate_nginx_conf
  105. restart_nginx
  106. else
  107. pull_and_compare
  108. stop_containers
  109. remove_containers
  110. docker_run seafilepro_db_dockerbunker
  111. seafilepro_setup_dockerbunker "upgrade ${current_version}"
  112. docker_run_all
  113. [[ -z ${FILE_COMMENT_MIGRATED} ]] \
  114. && echo -e "\n\e[1mMigrate database table for file comments\e[0m" \
  115. && docker exec -it seafilepro-service-dockerbunker ./seahub.sh python-env seahub/manage.py migrate_file_comment \
  116. && exit_response \
  117. && echo "FILE_COMMENT_MIGRATED=1" >> "${ENV_DIR}"/${SERVICE_NAME}.env
  118. echo -e "\n\e[1mRunning mysql_upgrade on all databases\e[0m"
  119. docker exec -it seafilepro-db-dockerbunker mysql_upgrade -u root -p${DBROOT}
  120. fi
  121. }
  122. configure() {
  123. pre_configure_routine
  124. echo -e "# \e[4mSeafile Pro Settings\e[0m"
  125. set_domain
  126. if [ "${SEAFILE_ADMIN_EMAIL}" ]; then
  127. read -p "Admin E-Mail: " -ei "${SEAFILE_ADMIN_EMAIL}" SEAFILE_ADMIN_EMAIL
  128. else
  129. read -p "Admin E-Mail: " SEAFILE_ADMIN_EMAIL
  130. fi
  131. unset SEAFILE_ADMIN_PASSWORD
  132. while [[ "${#SEAFILE_ADMIN_PASSWORD}" -le 6 || "${SEAFILE_ADMIN_PASSWORD}" != *[A-Z]* || "${SEAFILE_ADMIN_PASSWORD}" != *[a-z]* || "${SEAFILE_ADMIN_PASSWORD}" != *[0-9]* ]];do
  133. if [ ${VALIDATE} ];then
  134. echo -e "\n\e[31m Password does not meet requirements\e[0m"
  135. fi
  136. stty_orig="$(stty -g)"
  137. stty -echo
  138. read -p " $(printf "\n \e[4mPassword requirements\e[0m\n Minimum Length 6,Uppercase, Lowercase, Integer\n\n Enter Password:") " -ei "" SEAFILE_ADMIN_PASSWORD
  139. stty "${stty_orig}"
  140. echo ""
  141. VALIDATE=1
  142. done
  143. unset VALIDATE
  144. echo ""
  145. if [ "${TIME_ZONE}" ]; then
  146. read -p "Time Zone: " -ei "${TIME_ZONE}" TIME_ZONE
  147. else
  148. read -p "Time Zone: " TIME_ZONE
  149. fi
  150. # avoid tr illegal byte sequence in macOS when generating random strings
  151. if [[ $OSTYPE =~ "darwin" ]];then
  152. if [[ $LC_ALL ]];then
  153. oldLC_ALL=$LC_ALL
  154. export LC_ALL=C
  155. else
  156. export LC_ALL=C
  157. fi
  158. fi
  159. cat <<-EOF >> "${SERVICE_ENV}"
  160. # ------------------------------
  161. # General Settings
  162. # ------------------------------
  163. PROPER_NAME="${PROPER_NAME}"
  164. SERVICE_NAME=${SERVICE_NAME}
  165. SSL_CHOICE=${SSL_CHOICE}
  166. LE_EMAIL=${LE_EMAIL}
  167. SERVICE_DOMAIN=${SERVICE_DOMAIN}
  168. TIME_ZONE=${TIME_ZONE}
  169. # ------------------------------
  170. # SQL database configuration
  171. # ------------------------------
  172. # Please use long, random alphanumeric strings (A-Za-z0-9)
  173. DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
  174. DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
  175. DB_HOST=db
  176. DBUSER=seafile
  177. SEAFILE_ADMIN_EMAIL=${SEAFILE_ADMIN_EMAIL}
  178. SEAFILE_ADMIN_PASSWORD=${SEAFILE_ADMIN_PASSWORD}
  179. EOF
  180. if [[ $OSTYPE =~ "darwin" ]];then
  181. unset LC_ALL
  182. fi
  183. post_configure_routine
  184. }
  185. setup() {
  186. initial_setup_routine
  187. SUBSTITUTE=( "\${SERVICE_DOMAIN}" )
  188. basic_nginx
  189. [[ $keep_volumes ]] \
  190. && echo -en "\n\e[1mStarting up ${PROPER_NAME} database container\e[0m" \
  191. && seafilepro_db_dockerbunker \
  192. && exit_response
  193. if [[ -z $keep_volumes ]];then
  194. echo "Starting interactive Seafile Pro setup"
  195. echo ""
  196. echo "MySQL Server: db"
  197. echo "Port: 3306"
  198. echo "MySQL User: seafile"
  199. prompt_confirm "Display MySQL root and user passwords"
  200. [[ $? == 0 ]] && echo -e "MySQL root password: ${DBROOT}\nMySQL user password: ${DBPASS}" || echo -e "\e[33mPlease obtain the MySQL root password from ${SERVICE_ENV}\e[0m\n"
  201. echo ""
  202. echo -e "\n\e[1mStarting up ${PROPER_NAME} setup container\e[0m" \
  203. && docker_run seafilepro_db_dockerbunker \
  204. && seafilepro_setup_dockerbunker setup \
  205. && exit_response
  206. fi
  207. docker_run_all
  208. post_setup_routine
  209. }
  210. if [[ $1 == "letsencrypt" ]];then
  211. $1 $*
  212. else
  213. $1
  214. fi