dockerbunker.sh 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #!/usr/bin/env bash
  2. if [[ -r /etc/redhat-release ]];then
  3. if ! dnf list installed docker-ce &>/dev/null;then
  4. docker_missing=1
  5. fi
  6. elif [[ -r /etc/debian_version ]];then
  7. if ! dpkg -l docker &>/dev/null;then
  8. docker_missing=1
  9. fi
  10. fi
  11. [[ $docker_missing ]] \
  12. && echo -e "\n\e[3m\xe2\x86\x92 \e[1mCould not find docker.\e[3m\n\nMost systems can install Docker by running:\n\nwget -qO- https://get.docker.com/ | sh\n";
  13. # Find base dir
  14. BASE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  15. source "${BASE_DIR}"/data/include/init.sh
  16. [[ -f "data/env/dockerbunker.env" ]] && source "data/env/dockerbunker.env" || init_dockerbunker
  17. unset AVAILABLE_SERVICES count
  18. # All available services
  19. declare -a ALL_SERVICES=( \
  20. "Static HTML Site" \
  21. "Bitbucket" \
  22. "Cryptpad" \
  23. "CS50 IDE" \
  24. "Dillinger" \
  25. "Drone CI" \
  26. "Firefly III" \
  27. "Firefox Sync" \
  28. "Ghost" \
  29. "GitBucket" \
  30. "Gitea" \
  31. "Gitlab CE" \
  32. "Gogs" \
  33. "Hastebin" \
  34. "IPsec VPN Server" \
  35. "json-server" \
  36. "Kanboard" \
  37. "Koken" \
  38. "Mailcow (Dockerized)" \
  39. "Mailpile" \
  40. "Mastodon" \
  41. "Matomo" \
  42. "Nextcloud" \
  43. "Open Project" \
  44. "Padlock Cloud" \
  45. "Piwik" \
  46. "Rocket.Chat" \
  47. "Seafile Pro" \
  48. "Searx" \
  49. "Send" \
  50. "sFTP Server" \
  51. "Wekan" \
  52. "Wordpress" \
  53. )
  54. [[ -f "${ENV_DIR}"/custom.env ]] \
  55. && . "${ENV_DIR}"/custom.env
  56. IFS=$'\n' sorted=($(printf '%s\n' "${ALL_SERVICES[@]}"|sort))
  57. # style menu according to what status service has
  58. declare -A SERVICES_ARR
  59. for service in "${sorted[@]}";do
  60. service_name="$(echo -e "${service,,}" | tr -cd '[:alnum:]')"
  61. if [[ "${INSTALLED_SERVICES[@]}" =~ "$service" ]];then
  62. [[ "${STOPPED_SERVICES[@]}" =~ "$service" ]] && service_status="$(printf "\e[32m${service}\e[0m \e[31m(Stopped)\e[0m")" || service_status="$(printf "\e[32m${service}\e[0m")"
  63. SERVICES_ARR+=( ["$service_status"]="${service_name}" )
  64. AVAILABLE_SERVICES+=( "$service_status" )
  65. elif [[ "${CONFIGURED_SERVICES[@]}" =~ "$service" ]];then
  66. service_status="$(printf "\e[33m${service}\e[0m")"
  67. SERVICES_ARR+=( ["$service_status"]="${service_name}" )
  68. AVAILABLE_SERVICES+=( "$service_status" )
  69. else
  70. service_status="$(printf "${service}")"
  71. SERVICES_ARR+=( ["$service_status"]="${service_name}" )
  72. AVAILABLE_SERVICES+=( "$service_status" )
  73. fi
  74. done
  75. startall=$(printf "\e[1;4;33mStart all stopped containers\e[0m")
  76. stopall=$(printf "\e[1;4;33mStop all running containers\e[0m")
  77. startnginx=$(printf "\e[1;4;33mStart nginx container\e[0m")
  78. stopnginx=$(printf "\e[1;4;33mStop nginx container\e[0m")
  79. restartnginx=$(printf "\e[1;4;33mRestart nginx container\e[0m")
  80. renewcerts=$(printf "\e[1;4;33mRenew Let's Encrypt certificates\e[0m")
  81. restartall=$(printf "\e[1;4;33mRestart all containers\e[0m")
  82. destroyall=$(printf "\e[1;4;33mDestroy everything\e[0m")
  83. exitmenu=$(printf "\e[1;4;33mExit\e[0m")
  84. count=$((${#AVAILABLE_SERVICES[@]}+1))
  85. [[ ${STOPPED_SERVICES[0]} ]] \
  86. && AVAILABLE_SERVICES+=( "$startall" )
  87. [[ $(docker ps -q --filter "status=running" --filter name=^/nginx-dockerbunker$) ]] \
  88. && AVAILABLE_SERVICES+=( "$stopnginx" ) \
  89. && AVAILABLE_SERVICES+=( "$restartnginx") \
  90. && count=$(($count+2))
  91. [[ -d "${CONF_DIR}"/nginx/ssl/letsencrypt/live ]] \
  92. && [[ $(ls -A "${CONF_DIR}"/nginx/ssl/letsencrypt/live) ]] \
  93. && AVAILABLE_SERVICES+=( "$renewcerts" ) && cound=$(($count+1))
  94. [[ ${#INSTALLED_SERVICES[@]} > 0 \
  95. || ${#STATIC_SITES[@]} > 0 \
  96. || ${#CONFIGURED_SERVICES[@]} > 0 \
  97. || -f "${BASE_DIR}"/data/env/dockerbunker.env ]] \
  98. && AVAILABLE_SERVICES+=( "$destroyall" ) \
  99. && count=$(($count+1))
  100. [[ $(docker ps -q --filter "status=exited" --filter name=^/nginx-dockerbunker$) ]] \
  101. && AVAILABLE_SERVICES+=( "$startnginx" )
  102. [[ $(docker ps -q --filter "status=running" --filter name=dockerbunker) \
  103. && ${#INSTALLED_SERVICES[@]} > 1 ]] \
  104. && AVAILABLE_SERVICES+=( "$stopall" ) \
  105. && count=$(($count+1))
  106. [[ $(docker ps -q --filter "status=exited" --filter name=dockerbunker) \
  107. && ${#STOPPED_SERVICES[@]} > 1 ]] \
  108. && AVAILABLE_SERVICES+=( "$startall" ) \
  109. && count=$(($count+1))
  110. [[ ${#INSTALLED_SERVICES[@]} > 1 ]] \
  111. && AVAILABLE_SERVICES+=( "$restartall" ) \
  112. && count=$(($count+1))
  113. echo ""
  114. echo "Please select the service you want to manage"
  115. echo ""
  116. [[ ${INSTALLED_SERVICES[@]} ]] && echo -e " \e[32mGreen\e[0m: Installed"
  117. [[ ${CONFIGURED_SERVICES[@]} ]] && echo -e " \e[33mOrange\e[0m: Configured"
  118. echo ""
  119. COLUMNS=12
  120. select choice in "${AVAILABLE_SERVICES[@]}" "$exitmenu"
  121. do
  122. case $choice in
  123. "$exitmenu")
  124. exit 0
  125. ;;
  126. "$startnginx")
  127. echo ""
  128. start_nginx
  129. say_done
  130. sleep 1
  131. break
  132. ;;
  133. "$stopnginx")
  134. echo ""
  135. stop_nginx
  136. say_done
  137. sleep 1
  138. break
  139. ;;
  140. "$restartnginx")
  141. prevent_nginx_restart=1
  142. echo ""
  143. restart_nginx
  144. say_done
  145. sleep 1
  146. break
  147. ;;
  148. "$renewcerts")
  149. echo -e "\n\e[3m\xe2\x86\x92 Renew Let's Encrypt certificates\e[0m\n"
  150. "${BASE_DIR}"/certbot.sh
  151. restart_nginx
  152. say_done
  153. sleep 1
  154. break
  155. ;;
  156. "$startall")
  157. prevent_nginx_restart=1
  158. start_all
  159. say_done
  160. sleep 1
  161. break
  162. ;;
  163. "$stopall")
  164. prevent_nginx_restart=1
  165. stop_all
  166. say_done
  167. sleep 1
  168. break
  169. ;;
  170. "$destroyall")
  171. echo -e "\n\e[3m\xe2\x86\x92 Destroy everything\e[0m"
  172. echo ""
  173. echo -e "\e[1mReset dockerbunker to its initial state\e[0m"
  174. echo ""
  175. echo "The following will be removed:"
  176. echo ""
  177. echo "- All dockerbunker container(s)"
  178. echo "- All dockerbunker volume(s)"
  179. echo "- All environment file(s)"
  180. echo "- All nginx configuration files"
  181. echo "- All self-signed certificates (Let's Encrypt certificates will be retained)"
  182. echo ""
  183. prompt_confirm "Continue?" \
  184. && destroy_all=1 destroy_all
  185. say_done
  186. exit 0
  187. ;;
  188. $choice)
  189. if [[ -z $choice ]];then
  190. echo "Please choose a number from 1 to $count"
  191. else
  192. service="$(echo -e "${choice,,}" | tr -d '[:space:]')"
  193. echo ""
  194. echo -e "\n\e[3m\xe2\x86\x92 Checking service status"
  195. echo ""
  196. source "${BASE_DIR}"/data/services/${SERVICES_ARR[$choice]}/${SERVICES_ARR[$choice]}.sh
  197. break
  198. fi
  199. ;;
  200. esac
  201. done