#!/usr/bin/env bash ################################################################# # COLORS BOLD="\e[1m" RED="\033[0;31m" GREEN="\033[0;32m" BLUE="\033[0;34m" NOCOLOR="\033[0m" bitbucketid_rsa="-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAsCo4Xa/fLaryiZt6igRK1IPNJsKeDLWBN6CWrv3TQ2iMcwE1 zhTTX115N+KngVN8p1v5VrSMHKpvyXQDZPG/FJnWm5ry75qSYTmEtY8nfRsGAbwT i4swY+4jqrH1RRjbuVMsXPGjFX34SZTTJEl8ouVAFy/7HR+ODUe2+enWVnaouhVs Xj+bW2u7/dV1kZctFa5g5iV3hqGH32dBME5ztg4Fh7fAxkRTiJl+NBI7/LIdv9dl qmtDAdNdRqaI1dBpy8sHyZhRfjPeVbhdKsjE5IBhDLlYzyxK5FC41us08VCdq+M1 1qVzIVM61PBosW5NfwlrRgLDPEXkazUdhJO6YwIDAQABAoIBAFEf4D0klH4PTwmX k+Ki/2LGH19OGEJ6Azt+tGV5diSArMz5LbHtXTl5bi0SL1ka/TiE3lnTYwKAamI3 DqkZuojeHzohLOayI96qAjcp6WFvZGDAH7APNQWP0NT2hqB/RhAeATv7+sIW9JPN +T2oqcDKGa2T5uwOb/glolmMGaxOzNfAFAgnD7p7cnR0yijW5t3bc4q0sOFu/H3N jYsAqvMu6Nkpt9hjlu42x5Muwj9YeKwpZoE1sno62JeQFZo7nO7DrOrE7DOENoWV PMDxs8Hz0SRQlZcJn2I/W9wX8A8gCAWGhbAtUGQkS8gCaMp0dOcxoV3EttriQgtU X1oUwIECgYEA2Vge4E8E53BzLGTk8sozn1qteYn3cLGgJgC78MEzZN/G57DxVbC9 ntlSlYaYLlaPlSlNzZyG0s3UhpPY7YgP9srpohfPyXvb0ycfsGYMOcRNjVwdi2ap dPiG+p9vLSG3raNoeTxDEtjFZz1EM1rQECx2N40JwIuzeM2g+kE0JjMCgYEAz38r NTs1wASG7Bc7geIDxb34PWM8Nnw/DN57ceJP+Miwq/hYAJg6eK57ar9n44Y3xf7a mHkkgBU1vzuIyYfC5jVut6XkbialLsJUHfCNi3fPDBR7sEy6soiN34GoGp2vnCVD pDf2aCSMeFGfgwe4imFHbqE0R87cnet+q+CjCxECgYA8EbfO5OgFEzYxwdzpIWtt EoG5gqEpu134wuEupCcRLSvrIyNAPK3btlK10tJClFfwsM65EhbNMmgXncspsx4+ Zkx2KUCbfij+TeTbOwkL+i448ImV2pThKEMeB2yRu6zpR617PGWJUvIUG4G689Fn dvJhXhCg77t1mtdv8w93swKBgQCIxor0y9LigBlwBuBy/Uj/T/oSfRdz0vK8yOsW ZtfQZnoO4eUgfzgL1PgFpaYVlKOvIA938mLdCx4isFu6fIM8vHv/EptBALhh2jcY hTjIdnFExTvDOtDWXq0mZ5En+kmH5Ahyd3E1tOHjbep3tN8wWG99vUV5ECLc9h7J rYnMAQKBgQDQ/JiBT7ygfzAblxPnq5Dnr52C3CFTE57GNA8FIEx+On6FdtVDRM0g cNjoc2e+2MfbaJXFAuMvXDvzb2qxrHgf2TosxeuPTg79iYOfWMU8G62i/v0wPr1M 0Cj2hszJg4H0dMQPS0kDmO6mZmt6FB4E2gItmeBlTGfMwdJpaQC4rw== -----END RSA PRIVATE KEY-----" ################################################################### GITLAB_HOST_SSH=$(ssh-keygen -F gitlab.com | wc -m) if [ "$GITLAB_HOST_SSH" = "0" ]; then ssh-keyscan -H -p 22 gitlab.com >> ~/.ssh/known_hosts fi ################################################################### ROOT=$(id -u) if [ "$ROOT" != "0" ]; then echo -e "${RED} Este comando debe ejecutarse como root.${NOCOLOR}" exit 0 fi ################################################################### DEVELOP=0 CLIENT="" HELP=0 ANSIBLE=0 for VAR in "$@" do KEY="$(cut -d'=' -f1 <<<"$VAR")" VALUE="$(cut -d'=' -f2 <<<"$VAR")" if [ "$KEY" = "--develop" ]; then DEVELOP=1 fi if [ "$KEY" = "--help" ] || [ "$VAR" = "-h" ]; then HELP=1 fi if [ "$KEY" = "--ansible" ]; then ANSIBLE=1 fi if [ "$KEY" = "--cliente" ]; then CLIENT=${VALUE} fi done if [ "$HELP" = "1" ]; then echo -e "Comando para instalar flowdat." echo -e "Si no se pasan parametros se ejecuta el script completo preguntando los datos necesarios" echo -e "Parametros:" echo -e " --develop Si es 1, instala el codigo fuente. ${RED}${BOLD}NUNCA UTILIZAR EN CLIENTES${NOCOLOR}." echo -e " --cliente Nombre del cliente que va a instalar. Se utiliza como dominio." echo -e " --ansible Ejecuta la linea del ansible. Debe pasar el directorio donde se encuentra el playbook." exit 1 fi ################################################################### fcGetYesNo() { while true; do read VALUEYESNO if [ "$VALUEYESNO" = "" ] || [ "$VALUEYESNO" = "y" ] || [ "$VALUEYESNO" = "Y" ] || [ "$VALUEYESNO" = "yes" ] || [ "$VALUEYESNO" = "YES" ]; then VALUEYESNO=1 return fi if [ "$VALUEYESNO" = "n" ] || [ "$VALUEYESNO" = "N" ] || [ "$VALUEYESNO" = "no" ] || [ "$VALUEYESNO" = "NO" ]; then VALUEYESNO=0 return fi done } fcCheckExecution () { if [ $? -eq 0 ]; then return else echo -e "${RED}Algunos comandos no se ejecutaron correctamente.${NOCOLOR}" exit 0 fi } ################################################################### DIRINSTALLDEFAULT="/opt/flowdat" FILEANSIBLE="#!/bin/bash\neval \$(cat mysql.host.env running.env) ansible-playbook -i inventory.ini -u root playbook.yml " ################################################################### DIRINSTALL=${DIRINSTALLDEFAULT} echo -e "Ingrese el directorio absoluto de instalacion: (default: ${BOLD}${DIRINSTALLDEFAULT}${NOCOLOR})" read DIRINSTALL if [ "${DIRINSTALL}" = "" ]; then DIRINSTALL=${DIRINSTALLDEFAULT} fi mkdir -p ${DIRINSTALL} if [ "$ANSIBLE" = "0" ]; then ################################################################### if [ "$CLIENT" = "" ]; then echo -e "Ingrese el nombre del cliente para la instalacion. Ej.: ${BOLD}galvez${NOCOLOR}" read CLIENTNAME else CLIENTNAME=${CLIENT} fi DOMAINNAME="flowdat.net" echo -e "" echo -e "" echo -e "Las url seran ${GREEN}base.${CLIENTNAME}.${DOMAINNAME}${NOCOLOR}. Si esto NO es correcto aborte la ejecucion con ctrl+c" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" ################################################################### echo -e "Instalar paquetes linux necesarios? (${GREEN}${BOLD}Y${NOCOLOR}/n)" VALUEYESNO=1 fcGetYesNo if [ "$VALUEYESNO" = "1" ]; then ## no se utiliza un && porque pueden existir error del apt en la consulta de los repo apt-get update apt-get install -yq curl git python curl https://bootstrap.pypa.io/get-pip.py | python pip install -U pip setuptools curl -fsSL get.docker.com | sh pip install docker-compose==1.22 fcCheckExecution fi fcCheckExecution ################################################################### echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Ingresando al directorio ${BOLD}${DIRINSTALL}${NOCOLOR}" cd ${DIRINSTALL} BRANCH="" echo -e "Ingrese la rama a instalar. (default: ${BOLD}latest${NOCOLOR})" read BRANCH if [ "$BRANCH" = "" ]; then BRANCH="latest" fi fcCheckExecution ################################################################### DOCKERIMAGEINSTALLERBASE="docker.infra.flowdat.com/fd3/installer:$BRANCH" DOCKERIMAGEINSTALLER="dind" 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}" DOCKERGETSOURCE="docker run -it -v ${DIRINSTALL}:${DIRINSTALL} -v /var/run/docker.sock:/tmp/docker.sock dind get:source ${DIRINSTALL}/git.ini --timeout=120" DOCKERSERVICE="ln -sf ${DIRINSTALL}/docker-compose.service /etc/systemd/system/docker-compose.service" ################################################################### docker pull ${DOCKERIMAGEINSTALLERBASE} docker tag ${DOCKERIMAGEINSTALLERBASE} ${DOCKERIMAGEINSTALLER} ################################################################### if [ "$DEVELOP" = "1" ]; then BRANCH="" echo -e "Ingrese la rama a instalar de los modulos. (default: ${BOLD}latest${NOCOLOR})" read BRANCH if [ "$BRANCH" = "" ]; then BRANCH="latest" fi ################################################################### # Solo para desarrollo 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}" DOCKERGETSOURCE="docker run -it -v ${DIRINSTALL}:${DIRINSTALL} -v /var/run/docker.sock:/tmp/docker.sock dind get:source ${DIRINSTALL}/git.ini --timeout=120" DOCKERSERVICE="ln -sf ${DIRINSTALL}/docker-compose.service /etc/systemd/system/docker-compose.service" ################################################################### echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Desea crear los archivos de instalacion." echo -e "Opciones:" echo -e " Ingrese '${RED}n${NOCOLOR}' para omitir este paso." echo -e " Presionar entrer para ejecutar el comando por default: ${GREEN}${DOCKERMAKEINSTALL}${NOCOLOR}" echo -e " Puede ingresar el comando que desee ejecutar." read COMMAND else echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Creando los archivos de instalacion." COMMAND="" fi if [ "${COMMAND}" = "" ]; then eval ${DOCKERMAKEINSTALL} else if [ "${COMMAND}" != "n" ] && [ "${COMMAND}" != "N" ]; then eval ${COMMAND} fi fi fcCheckExecution ################################################################### if [ "$DEVELOP" = "1" ]; then eval `ssh-agent` ssh-add - <<< "$bitbucketid_rsa" echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Ingresando al directorio ${DIRINSTALL}" cd ${DIRINSTALL} ################################################################### echo -e "Desea obtener el codigo fuente." echo -e "Opciones:" echo -e " Ingrese '${RED}n${NOCOLOR}' para omitir este paso." echo -e " Presionar entrer para ejecutar el comando por default: ${GREEN}${DOCKERGETSOURCE}${NOCOLOR}" echo -e " Puede ingresar el comando que desee ejecutar." read COMMAND if [ "${COMMAND}" = "" ]; then eval $DOCKERGETSOURCE else if [ "${COMMAND}" != "n" ] && [ "${COMMAND}" != "N" ]; then eval ${COMMAND} fi fi fcCheckExecution git config --global core.filemode false fcCheckExecution ################################################################### echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Desea registrar el servicio de docker?" echo -e "Opciones:" echo -e " Ingrese '${RED}n${NOCOLOR}' para omitir este paso." echo -e " Presionar entrer para ejecutar el comando por default: ${GREEN}${DOCKERSERVICE}${NOCOLOR}" echo -e " Puede ingresar el comando que desee ejecutar." read COMMAND if [ "${COMMAND}" = "" ]; then eval ${DOCKERSERVICE} else if [ "${COMMAND}" != "n" ] && [ "${COMMAND}" != "N" ]; then eval ${COMMAND} fi fi fcCheckExecution else ################################################################### echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Registrando el servicio de docker" eval ${DOCKERSERVICE} fcCheckExecution fi ################################################################### echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Creando el directorio letsencrypt" mkdir -p ${DIRINSTALL}/letsencrypt mkdir -p /tmp/letsencrypt echo -e "Copiando archivos necesarios al directorio temporal" docker run --name dind_tmp dind bash /bin/true docker cp dind_tmp:/opt/installer/tools/letsencrypt/flowdat_deploy.sh /tmp/letsencrypt/flowdat_deploy.sh docker cp dind_tmp:/opt/installer/tools/letsencrypt/googledns.py /tmp/letsencrypt/googledns.py docker cp dind_tmp:/opt/installer/tools/letsencrypt/key.json /tmp/letsencrypt/key.json docker rm dind_tmp echo -e "Copiando archivos necesarios al directorio letsencrypt" cp -n /tmp/letsencrypt/* ${DIRINSTALL}/letsencrypt/ rm -rf /tmp/letsencrypt echo -e "Ingresando al directorio letsencrypt" cd ${DIRINSTALL}/letsencrypt echo -e "Instalando paquetes requeridos" pip install google google-cloud-dns certbot-dns-google mkdir -p ${DIRINSTALL}/nginx/certs ################################################################### echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Desea dar de alta los dominios?(${GREEN}${BOLD}Y${NOCOLOR}/n)" VALUEYESNO=1 fcGetYesNo if [ "$VALUEYESNO" = "1" ]; then echo -e "Ingrese la ip publica del cliente para acceder al flowdat:" read IPPUBLIC echo -e "Registrando los dominios" python googledns.py --key=key.json --action=create --client=${CLIENTNAME} --ip_address=${IPPUBLIC} --domain=${DOMAINNAME} else echo -e "${RED}SE ASUME QUE LOS DOMINIOS YA ESTAN DADOS DE ALTA${NOCOLOR}" fi fcCheckExecution ################################################################### echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Desea crear los certificados ssl?(${GREEN}${BOLD}Y${NOCOLOR}/n)" VALUEYESNO=1 fcGetYesNo if [ "$VALUEYESNO" = "1" ]; then echo -e "Agregando el repositorio deb http://ftp.debian.org/debian stretch-backports main" echo -e "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/certbot.debian.list echo -e "Actualizando paquetes" apt-get update && apt-get install -yq certbot -t stretch-backports fcCheckExecution echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "En caso de error con certbot y python puede correr esta linea: python -m easy_install --upgrade pyOpenSSL" echo -e "${BLUE}###############################################################${NOCOLOR}" fcCheckExecution echo -e "Ingresando al directorio letsencrypt" cd ${DIRINSTALL}/letsencrypt sed -i "s/DOMAIN_NAME_REPLACE/${CLIENTNAME}.${DOMAINNAME}/g" flowdat_deploy.sh echo -e "Generando certificados" 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 fcCheckExecution echo -e "" echo -e "Verificar que la siguiente línea aparezca entre las últimas a la salida del comando:" echo -e " EJECUCION MANUAL: Running deploy-hook command: /opt/flowdat/letsencrypt/flowdat_deploy.sh" 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." echo -e "Probar autorenovación:" echo -e " EJECUCION MANUAL: certbot renew --dry-run" else echo -e "${RED}SE ASUME QUE LOS DOMINIOS YA ESTAN DADOS DE ALTA${NOCOLOR}" echo -e "" echo -e "" echo -e "" echo -e "" echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Desea obtener los certificados actuales?(${GREEN}${BOLD}Y${NOCOLOR}/n)" VALUEYESNO=1 fcGetYesNo if [ "$VALUEYESNO" = "1" ]; then LSCERT=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/cert*.pem` LSCHAIN=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/chain*.pem` LSFULLCHAIN=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/fullchain*.pem` LSPRIVKEY=`ls -td /etc/letsencrypt/archive/${CLIENTNAME}.${DOMAINNAME}/privkey*.pem` for var in ${LSCERT} do LSCERT=${var} break done for var in ${LSCHAIN} do LSCHAIN=${var} break done for var in ${LSFULLCHAIN} do LSFULLCHAIN=${var} break done for var in ${LSPRIVKEY} do LSPRIVKEY=${var} break done cp -f ${LSCERT} ${DIRINSTALL}/nginx/certs/cert.pem cp -f ${LSCHAIN} ${DIRINSTALL}/nginx/certs/chain.pem cp -f ${LSFULLCHAIN} ${DIRINSTALL}/nginx/certs/fullchain.pem cp -f ${LSPRIVKEY} ${DIRINSTALL}/nginx/certs/privkey.pem else echo -e "${RED}NO SE POSEEN CERTIFICADOS PARA EL NGINX${NOCOLOR}" fi fi fi ################################################################### if [ "$DEVELOP" = "1" ]; then echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "" echo -e "" echo -e "" echo -e "" echo -e "Creando archivo de ejecucion ansible" echo -e "El archivo se creara con las siguientes instrucciones" echo -e "${GREEN}${FILEANSIBLE}${NOCOLOR}" echo -e "" 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. " read COMMAND else echo -e "${BLUE}###############################################################${NOCOLOR}" echo -e "Ejecutando el ansible" COMANDO="" fi if [ "${COMMAND}" = "" ]; then echo -e "${FILEANSIBLE}" > ${DIRINSTALL}/ansible.run else echo -e "${COMMAND}" > ${DIRINSTALL}/ansible.run fi docker run -it -v ${DIRINSTALL}:${DIRINSTALL} -v /var/run/docker.sock:/tmp/docker.sock dind ansible ${DIRINSTALL} fcCheckExecution exit 1