123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- #!/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
|