installerSupport.sh 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. #!/usr/bin/env bash
  2. #################################################################
  3. # COLORS
  4. BOLD="\e[1m"
  5. RED="\033[0;31m"
  6. GREEN="\033[0;32m"
  7. BLUE="\033[0;34m"
  8. NOCOLOR="\033[0m"
  9. bitbucketid_rsa="-----BEGIN RSA PRIVATE KEY-----
  10. MIIEpAIBAAKCAQEAsCo4Xa/fLaryiZt6igRK1IPNJsKeDLWBN6CWrv3TQ2iMcwE1
  11. zhTTX115N+KngVN8p1v5VrSMHKpvyXQDZPG/FJnWm5ry75qSYTmEtY8nfRsGAbwT
  12. i4swY+4jqrH1RRjbuVMsXPGjFX34SZTTJEl8ouVAFy/7HR+ODUe2+enWVnaouhVs
  13. Xj+bW2u7/dV1kZctFa5g5iV3hqGH32dBME5ztg4Fh7fAxkRTiJl+NBI7/LIdv9dl
  14. qmtDAdNdRqaI1dBpy8sHyZhRfjPeVbhdKsjE5IBhDLlYzyxK5FC41us08VCdq+M1
  15. 1qVzIVM61PBosW5NfwlrRgLDPEXkazUdhJO6YwIDAQABAoIBAFEf4D0klH4PTwmX
  16. k+Ki/2LGH19OGEJ6Azt+tGV5diSArMz5LbHtXTl5bi0SL1ka/TiE3lnTYwKAamI3
  17. DqkZuojeHzohLOayI96qAjcp6WFvZGDAH7APNQWP0NT2hqB/RhAeATv7+sIW9JPN
  18. +T2oqcDKGa2T5uwOb/glolmMGaxOzNfAFAgnD7p7cnR0yijW5t3bc4q0sOFu/H3N
  19. jYsAqvMu6Nkpt9hjlu42x5Muwj9YeKwpZoE1sno62JeQFZo7nO7DrOrE7DOENoWV
  20. PMDxs8Hz0SRQlZcJn2I/W9wX8A8gCAWGhbAtUGQkS8gCaMp0dOcxoV3EttriQgtU
  21. X1oUwIECgYEA2Vge4E8E53BzLGTk8sozn1qteYn3cLGgJgC78MEzZN/G57DxVbC9
  22. ntlSlYaYLlaPlSlNzZyG0s3UhpPY7YgP9srpohfPyXvb0ycfsGYMOcRNjVwdi2ap
  23. dPiG+p9vLSG3raNoeTxDEtjFZz1EM1rQECx2N40JwIuzeM2g+kE0JjMCgYEAz38r
  24. NTs1wASG7Bc7geIDxb34PWM8Nnw/DN57ceJP+Miwq/hYAJg6eK57ar9n44Y3xf7a
  25. mHkkgBU1vzuIyYfC5jVut6XkbialLsJUHfCNi3fPDBR7sEy6soiN34GoGp2vnCVD
  26. pDf2aCSMeFGfgwe4imFHbqE0R87cnet+q+CjCxECgYA8EbfO5OgFEzYxwdzpIWtt
  27. EoG5gqEpu134wuEupCcRLSvrIyNAPK3btlK10tJClFfwsM65EhbNMmgXncspsx4+
  28. Zkx2KUCbfij+TeTbOwkL+i448ImV2pThKEMeB2yRu6zpR617PGWJUvIUG4G689Fn
  29. dvJhXhCg77t1mtdv8w93swKBgQCIxor0y9LigBlwBuBy/Uj/T/oSfRdz0vK8yOsW
  30. ZtfQZnoO4eUgfzgL1PgFpaYVlKOvIA938mLdCx4isFu6fIM8vHv/EptBALhh2jcY
  31. hTjIdnFExTvDOtDWXq0mZ5En+kmH5Ahyd3E1tOHjbep3tN8wWG99vUV5ECLc9h7J
  32. rYnMAQKBgQDQ/JiBT7ygfzAblxPnq5Dnr52C3CFTE57GNA8FIEx+On6FdtVDRM0g
  33. cNjoc2e+2MfbaJXFAuMvXDvzb2qxrHgf2TosxeuPTg79iYOfWMU8G62i/v0wPr1M
  34. 0Cj2hszJg4H0dMQPS0kDmO6mZmt6FB4E2gItmeBlTGfMwdJpaQC4rw==
  35. -----END RSA PRIVATE KEY-----"
  36. ###################################################################
  37. GITLAB_HOST_SSH=$(ssh-keygen -F gitlab.com | wc -m)
  38. if [ "$GITLAB_HOST_SSH" = "0" ];
  39. then
  40. ssh-keyscan -H -p 22 gitlab.com >> ~/.ssh/known_hosts
  41. fi
  42. ###################################################################
  43. ROOT=$(id -u)
  44. if [ "$ROOT" != "0" ];
  45. then
  46. echo -e "${RED} Este comando debe ejecutarse como root.${NOCOLOR}"
  47. exit 0
  48. fi
  49. ###################################################################
  50. DEVELOP=0
  51. CLIENT=""
  52. HELP=0
  53. ANSIBLE=0
  54. for VAR in "$@"
  55. do
  56. KEY="$(cut -d'=' -f1 <<<"$VAR")"
  57. VALUE="$(cut -d'=' -f2 <<<"$VAR")"
  58. if [ "$KEY" = "--develop" ];
  59. then
  60. DEVELOP=1
  61. fi
  62. if [ "$KEY" = "--help" ] || [ "$VAR" = "-h" ];
  63. then
  64. HELP=1
  65. fi
  66. if [ "$KEY" = "--ansible" ];
  67. then
  68. ANSIBLE=1
  69. fi
  70. if [ "$KEY" = "--cliente" ];
  71. then
  72. CLIENT=${VALUE}
  73. fi
  74. done
  75. if [ "$HELP" = "1" ];
  76. then
  77. echo -e "Comando para instalar flowdat."
  78. echo -e "Si no se pasan parametros se ejecuta el script completo preguntando los datos necesarios"
  79. echo -e "Parametros:"
  80. echo -e " --develop Si es 1, instala el codigo fuente. ${RED}${BOLD}NUNCA UTILIZAR EN CLIENTES${NOCOLOR}."
  81. echo -e " --cliente Nombre del cliente que va a instalar. Se utiliza como dominio."
  82. echo -e " --ansible Ejecuta la linea del ansible. Debe pasar el directorio donde se encuentra el playbook."
  83. exit 1
  84. fi
  85. ###################################################################
  86. fcGetYesNo() {
  87. while true;
  88. do
  89. read VALUEYESNO
  90. if [ "$VALUEYESNO" = "" ] || [ "$VALUEYESNO" = "y" ] || [ "$VALUEYESNO" = "Y" ] || [ "$VALUEYESNO" = "yes" ] || [ "$VALUEYESNO" = "YES" ];
  91. then
  92. VALUEYESNO=1
  93. return
  94. fi
  95. if [ "$VALUEYESNO" = "n" ] || [ "$VALUEYESNO" = "N" ] || [ "$VALUEYESNO" = "no" ] || [ "$VALUEYESNO" = "NO" ];
  96. then
  97. VALUEYESNO=0
  98. return
  99. fi
  100. done
  101. }
  102. fcCheckExecution () {
  103. if [ $? -eq 0 ];
  104. then
  105. return
  106. else
  107. echo -e "${RED}Algunos comandos no se ejecutaron correctamente.${NOCOLOR}"
  108. exit 0
  109. fi
  110. }
  111. ###################################################################
  112. DIRINSTALLDEFAULT="/opt/flowdat"
  113. FILEANSIBLE="#!/bin/bash\neval \$(cat mysql.host.env running.env) ansible-playbook -i inventory.ini -u root playbook.yml "
  114. ###################################################################
  115. DIRINSTALL=${DIRINSTALLDEFAULT}
  116. echo -e "Ingrese el directorio absoluto de instalacion: (default: ${BOLD}${DIRINSTALLDEFAULT}${NOCOLOR})"
  117. read DIRINSTALL
  118. if [ "${DIRINSTALL}" = "" ];
  119. then
  120. DIRINSTALL=${DIRINSTALLDEFAULT}
  121. fi
  122. mkdir -p ${DIRINSTALL}
  123. if [ "$ANSIBLE" = "0" ];
  124. then
  125. ###################################################################
  126. if [ "$CLIENT" = "" ];
  127. then
  128. echo -e "Ingrese el nombre del cliente para la instalacion. Ej.: ${BOLD}galvez${NOCOLOR}"
  129. read CLIENTNAME
  130. else
  131. CLIENTNAME=${CLIENT}
  132. fi
  133. DOMAINNAME="flowdat.net"
  134. echo -e ""
  135. echo -e ""
  136. echo -e "Las url seran ${GREEN}base.${CLIENTNAME}.${DOMAINNAME}${NOCOLOR}. Si esto NO es correcto aborte la ejecucion con ctrl+c"
  137. echo -e ""
  138. echo -e ""
  139. echo -e "${BLUE}###############################################################${NOCOLOR}"
  140. ###################################################################
  141. echo -e "Instalar paquetes linux necesarios? (${GREEN}${BOLD}Y${NOCOLOR}/n)"
  142. VALUEYESNO=1
  143. fcGetYesNo
  144. if [ "$VALUEYESNO" = "1" ];
  145. then
  146. ## no se utiliza un && porque pueden existir error del apt en la consulta de los repo
  147. apt-get update
  148. apt-get install -yq curl git python
  149. curl https://bootstrap.pypa.io/get-pip.py | python
  150. pip install -U pip setuptools
  151. curl -fsSL get.docker.com | sh
  152. pip install docker-compose==1.22
  153. fcCheckExecution
  154. fi
  155. fcCheckExecution
  156. ###################################################################
  157. echo -e ""
  158. echo -e ""
  159. echo -e ""
  160. echo -e ""
  161. echo -e "${BLUE}###############################################################${NOCOLOR}"
  162. echo -e "Ingresando al directorio ${BOLD}${DIRINSTALL}${NOCOLOR}"
  163. cd ${DIRINSTALL}
  164. fcCheckExecution
  165. ###################################################################
  166. BRANCH=""
  167. echo -e "Ingrese la rama a instalar. (default: ${BOLD}latest${NOCOLOR})"
  168. read BRANCH
  169. if [ "$BRANCH" = "" ];
  170. then
  171. BRANCH="latest"
  172. fi
  173. fcCheckExecution
  174. ###################################################################
  175. DOCKERIMAGEINSTALLERBASE="docker.infra.flowdat.com/fd3/installer:$BRANCH"
  176. DOCKERIMAGEINSTALLER="dind"
  177. DOCKERMAKEINSTALL="docker run -it -v ${DIRINSTALL}:${DIRINSTALL} -v /var/run/docker.sock:/tmp/docker.sock ${DOCKERIMAGEINSTALLER} make:installImages ${DIRINSTALL} --client=${CLIENTNAME} --domain=${DOMAINNAME} --branch=${BRANCH} --develop=${DEVELOP}"
  178. DOCKERGETSOURCE="docker run -it -v ${DIRINSTALL}:${DIRINSTALL} -v /var/run/docker.sock:/tmp/docker.sock dind get:source ${DIRINSTALL}/git.ini --timeout=120"
  179. DOCKERSERVICE="ln -sf ${DIRINSTALL}/docker-compose.service /etc/systemd/system/docker-compose.service"
  180. ###################################################################
  181. docker pull ${DOCKERIMAGEINSTALLERBASE}
  182. docker tag ${DOCKERIMAGEINSTALLERBASE} ${DOCKERIMAGEINSTALLER}
  183. ###################################################################
  184. if [ "$DEVELOP" = "1" ];
  185. then
  186. echo -e ""
  187. echo -e ""
  188. echo -e ""
  189. echo -e ""
  190. echo -e "${BLUE}###############################################################${NOCOLOR}"
  191. echo -e "Desea crear los archivos de instalacion."
  192. echo -e "Opciones:"
  193. echo -e " Ingrese '${RED}n${NOCOLOR}' para omitir este paso."
  194. echo -e " Presionar entrer para ejecutar el comando por default: ${GREEN}${DOCKERMAKEINSTALL}${NOCOLOR}"
  195. echo -e " Puede ingresar el comando que desee ejecutar."
  196. read COMMAND
  197. else
  198. echo -e "${BLUE}###############################################################${NOCOLOR}"
  199. echo -e "Creando los archivos de instalacion."
  200. COMMAND=""
  201. fi
  202. if [ "${COMMAND}" = "" ];
  203. then
  204. eval ${DOCKERMAKEINSTALL}
  205. else
  206. if [ "${COMMAND}" != "n" ] && [ "${COMMAND}" != "N" ];
  207. then
  208. eval ${COMMAND}
  209. fi
  210. fi
  211. fcCheckExecution
  212. ###################################################################
  213. if [ "$DEVELOP" = "1" ];
  214. then
  215. eval `ssh-agent`
  216. ssh-add - <<< "$bitbucketid_rsa"
  217. echo -e ""
  218. echo -e ""
  219. echo -e ""
  220. echo -e ""
  221. echo -e "${BLUE}###############################################################${NOCOLOR}"
  222. echo -e "Ingresando al directorio ${DIRINSTALL}"
  223. cd ${DIRINSTALL}
  224. ###################################################################
  225. echo -e "Desea obtener el codigo fuente."
  226. echo -e "Opciones:"
  227. echo -e " Ingrese '${RED}n${NOCOLOR}' para omitir este paso."
  228. echo -e " Presionar entrer para ejecutar el comando por default: ${GREEN}${DOCKERGETSOURCE}${NOCOLOR}"
  229. echo -e " Puede ingresar el comando que desee ejecutar."
  230. read COMMAND
  231. if [ "${COMMAND}" = "" ];
  232. then
  233. eval $DOCKERGETSOURCE
  234. else
  235. if [ "${COMMAND}" != "n" ] && [ "${COMMAND}" != "N" ];
  236. then
  237. eval ${COMMAND}
  238. fi
  239. fi
  240. fcCheckExecution
  241. git config --global core.filemode false
  242. fcCheckExecution
  243. ###################################################################
  244. echo -e ""
  245. echo -e ""
  246. echo -e ""
  247. echo -e ""
  248. echo -e "${BLUE}###############################################################${NOCOLOR}"
  249. echo -e "Desea registrar el servicio de docker?"
  250. echo -e "Opciones:"
  251. echo -e " Ingrese '${RED}n${NOCOLOR}' para omitir este paso."
  252. echo -e " Presionar entrer para ejecutar el comando por default: ${GREEN}${DOCKERSERVICE}${NOCOLOR}"
  253. echo -e " Puede ingresar el comando que desee ejecutar."
  254. read COMMAND
  255. if [ "${COMMAND}" = "" ];
  256. then
  257. eval ${DOCKERSERVICE}
  258. else
  259. if [ "${COMMAND}" != "n" ] && [ "${COMMAND}" != "N" ];
  260. then
  261. eval ${COMMAND}
  262. fi
  263. fi
  264. fcCheckExecution
  265. else
  266. ###################################################################
  267. echo -e "${BLUE}###############################################################${NOCOLOR}"
  268. echo -e "Registrando el servicio de docker"
  269. eval ${DOCKERSERVICE}
  270. fcCheckExecution
  271. fi
  272. ###################################################################
  273. echo -e ""
  274. echo -e ""
  275. echo -e ""
  276. echo -e ""
  277. echo -e "${BLUE}###############################################################${NOCOLOR}"
  278. echo -e "Creando el directorio letsencrypt"
  279. mkdir -p ${DIRINSTALL}/letsencrypt
  280. mkdir -p /tmp/letsencrypt
  281. echo -e "Copiando archivos necesarios al directorio temporal"
  282. docker run --name dind_tmp dind bash /bin/true
  283. docker cp dind_tmp:/opt/installer/tools/letsencrypt/flowdat_deploy.sh /tmp/letsencrypt/flowdat_deploy.sh
  284. docker cp dind_tmp:/opt/installer/tools/letsencrypt/googledns.py /tmp/letsencrypt/googledns.py
  285. docker cp dind_tmp:/opt/installer/tools/letsencrypt/key.json /tmp/letsencrypt/key.json
  286. docker rm dind_tmp
  287. echo -e "Copiando archivos necesarios al directorio letsencrypt"
  288. cp -n /tmp/letsencrypt/* ${DIRINSTALL}/letsencrypt/
  289. rm -rf /tmp/letsencrypt
  290. echo -e "Ingresando al directorio letsencrypt"
  291. cd ${DIRINSTALL}/letsencrypt
  292. echo -e "Instalando paquetes requeridos"
  293. pip install google google-cloud-dns certbot-dns-google
  294. mkdir -p /opt/flowdat/nginx/certs
  295. ###################################################################
  296. echo -e ""
  297. echo -e ""
  298. echo -e ""
  299. echo -e ""
  300. echo -e "${BLUE}###############################################################${NOCOLOR}"
  301. echo -e "Desea dar de alta los dominios?(${GREEN}${BOLD}Y${NOCOLOR}/n)"
  302. VALUEYESNO=1
  303. fcGetYesNo
  304. if [ "$VALUEYESNO" = "1" ];
  305. then
  306. echo -e "Ingrese la ip publica del cliente para acceder al flowdat:"
  307. read IPPUBLIC
  308. echo -e "Registrando los dominios"
  309. python googledns.py --key=key.json --action=create --client=${CLIENTNAME} --ip_address=${IPPUBLIC} --domain=${DOMAINNAME}
  310. else
  311. echo -e "${RED}SE ASUME QUE LOS DOMINIOS YA ESTAN DADOS DE ALTA${NOCOLOR}"
  312. fi
  313. fcCheckExecution
  314. ###################################################################
  315. echo -e ""
  316. echo -e ""
  317. echo -e ""
  318. echo -e ""
  319. echo -e "${BLUE}###############################################################${NOCOLOR}"
  320. echo -e "Desea crear los certificados ssl?(${GREEN}${BOLD}Y${NOCOLOR}/n)"
  321. VALUEYESNO=1
  322. fcGetYesNo
  323. if [ "$VALUEYESNO" = "1" ];
  324. then
  325. echo -e "Agregando el repositorio deb http://ftp.debian.org/debian stretch-backports main"
  326. echo -e "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/certbot.debian.list
  327. echo -e "Actualizando paquetes"
  328. apt-get update && apt-get install -yq certbot -t stretch-backports
  329. fcCheckExecution
  330. echo -e "${BLUE}###############################################################${NOCOLOR}"
  331. echo -e "En caso de error con certbot y python puede correr esta linea: python -m easy_install --upgrade pyOpenSSL"
  332. echo -e "${BLUE}###############################################################${NOCOLOR}"
  333. fcCheckExecution
  334. echo -e "Ingresando al directorio letsencrypt"
  335. cd ${DIRINSTALL}/letsencrypt
  336. sed -i "s/DOMAIN_NAME_REPLACE/${CLIENTNAME}.${DOMAINNAME}/g" flowdat_deploy.sh
  337. echo -e "Generando certificados"
  338. certbot certonly --cert-name ${CLIENTNAME}.${DOMAINNAME} --dns-google --dns-google-credentials ${DIRINSTALL}/letsencrypt/key.json --server https://acme-v02.api.letsencrypt.org/directory -d "*.${CLIENTNAME}.${DOMAINNAME}" -d "${CLIENTNAME}.${DOMAINNAME}" --deploy-hook=${DIRINSTALL}/letsencrypt/flowdat_deploy.sh
  339. fcCheckExecution
  340. echo -e ""
  341. echo -e "Verificar que la siguiente línea aparezca entre las últimas a la salida del comando:"
  342. echo -e " EJECUCION MANUAL: Running deploy-hook command: /opt/flowdat/letsencrypt/flowdat_deploy.sh"
  343. echo -e "la cual indica que el hook se ejecutó. Eso significa que los certificados deberían haberse copiado a la carpeta de Nginx. Verificar con el navegador que el sitio web sea seguro."
  344. echo -e "Probar autorenovación:"
  345. echo -e " EJECUCION MANUAL: certbot renew --dry-run"
  346. else
  347. echo -e "${RED}SE ASUME QUE LOS DOMINIOS YA ESTAN DADOS DE ALTA${NOCOLOR}"
  348. echo -e ""
  349. echo -e ""
  350. echo -e ""
  351. echo -e ""
  352. echo -e "${BLUE}###############################################################${NOCOLOR}"
  353. echo -e "Desea obtener los certificados actuales?(${GREEN}${BOLD}Y${NOCOLOR}/n)"
  354. VALUEYESNO=1
  355. fcGetYesNo
  356. if [ "$VALUEYESNO" = "1" ];
  357. then
  358. LSCERT=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/cert*.pem`
  359. LSCHAIN=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/chain*.pem`
  360. LSFULLCHAIN=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/fullchain*.pem`
  361. LSPRIVKEY=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/privkey*.pem`
  362. for var in ${LSCERT}
  363. do
  364. LSCERT=${var}
  365. break
  366. done
  367. for var in ${LSCHAIN}
  368. do
  369. LSCHAIN=${var}
  370. break
  371. done
  372. for var in ${LSFULLCHAIN}
  373. do
  374. LSFULLCHAIN=${var}
  375. break
  376. done
  377. for var in ${LSPRIVKEY}
  378. do
  379. LSPRIVKEY=${var}
  380. break
  381. done
  382. cp -f ${LSCERT} ${DIRINSTALL}/nginx/certs/cert.pem
  383. cp -f ${LSCHAIN} ${DIRINSTALL}/nginx/certs/chain.pem
  384. cp -f ${LSFULLCHAIN} ${DIRINSTALL}/nginx/certs/fullchain.pem
  385. cp -f ${LSPRIVKEY} ${DIRINSTALL}/nginx/certs/privkey.pem
  386. else
  387. echo -e "${RED}NO SE POSEEN CERTIFICADOS PARA EL NGINX${NOCOLOR}"
  388. fi
  389. fi
  390. fi
  391. ###################################################################
  392. if [ "$DEVELOP" = "1" ];
  393. then
  394. echo -e "${BLUE}###############################################################${NOCOLOR}"
  395. echo -e ""
  396. echo -e ""
  397. echo -e ""
  398. echo -e ""
  399. echo -e "Creando archivo de ejecucion ansible"
  400. echo -e "El archivo se creara con las siguientes instrucciones"
  401. echo -e "${GREEN}${FILEANSIBLE}${NOCOLOR}"
  402. echo -e ""
  403. echo -e "Desea modificar el archivo? Default ${GREEN}${BOLD}NO${NOCOLOR} presione ${BOLD}enter${NOCOLOR}. En caso contrario ingrese las lineas del archivo a utilizar. "
  404. read COMMAND
  405. else
  406. echo -e "${BLUE}###############################################################${NOCOLOR}"
  407. echo -e "Ejecutando el ansible"
  408. COMANDO=""
  409. fi
  410. if [ "${COMMAND}" = "" ];
  411. then
  412. echo -e "${FILEANSIBLE}" > ${DIRINSTALL}/ansible.run
  413. else
  414. echo -e "${COMMAND}" > ${DIRINSTALL}/ansible.run
  415. fi
  416. docker run -it -v ${DIRINSTALL}:${DIRINSTALL} -v /var/run/docker.sock:/tmp/docker.sock dind ansible ${DIRINSTALL}
  417. fcCheckExecution
  418. exit 1