Created
July 10, 2025 21:50
-
-
Save Santosl2/be7f694ccfd7df9598b0ba64087d7f7a to your computer and use it in GitHub Desktop.
Download evolution e etc
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| versao() { | |
| echo -e " \e[97mVersión de Socios Digitales: \e[32mv. 1.0.0\e[0m " | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Cores do Setup | |
| amarelo="\e[33m" | |
| verde="\e[32m" | |
| branco="\e[97m" | |
| bege="\e[93m" | |
| vermelho="\e[91m" | |
| reset="\e[0m" | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| menu_instalador="1" | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| home_directory="$HOME" | |
| dados_vps="${home_directory}/dados_vps/dados_vps" | |
| dados() { | |
| nome_servidor=$(grep "Nombre del Servidor:" "$dados_vps" | awk -F': ' '{print $2}') | |
| nome_rede_interna=$(grep "Red interna:" "$dados_vps" | awk -F': ' '{print $2}') | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Licença do Setup | |
| ## copia | |
| direitos_setup() { | |
| echo -e "$amarelo============================================================================================================================\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo= $branco Este auto instalador fue desarrollado para auxiliar en la instalación de las principales aplicaciones $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco disponibles en el mercado open source. Ya dejo todos los créditos a los desarrolladores de cada $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco aplicación disponible aquí. Este Setup está licenciado bajo la Licencia MIT (MIT). Usted puede usar, $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco copiar, modificar, integrar, publicar, distribuir y/o vender copias de los productos finales, $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco pero siempre debe declarar que Socios Digitales es el autor original $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco de estos códigos y atribuir un enlace a https://sociosdigitales.pro/setup-socios/ $amarelo =\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo============================================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| direitos_instalador() { | |
| echo -e "$amarelo==================================================================================================================\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo= $branco Este auto instalador fue desarrollado para auxiliar en la instalación de las principales aplicaciones $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco disponibles en el mercado open source. Ya dejo todos los créditos a los desarrolladores de cada $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco aplicación disponible aquí. Este Setup está licenciado bajo la Licencia MIT (MIT). Usted puede usar, $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco copiar, modificar, integrar, publicar, distribuir y/o vender copias de los productos finales, $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco pero siempre debe declarar que Socios Digitales es el autor original $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco de estos códigos y atribuir un enlace a https://sociosdigitales.pro/setup-socios/ $amarelo=\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo==================================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| read -p "Al escribir (Y) usted acepta y está de acuerdo con las orientaciones presentadas arriba (Y/N): " choice | |
| while true; do | |
| case $choice in | |
| Y|y) | |
| return | |
| ;; | |
| N|n) | |
| clear | |
| nome_finalizado | |
| echo "Qué pena que no está de acuerdo, así que estaré cerrando el instalador. Hasta luego." | |
| sleep 2 | |
| clear | |
| exit 1 | |
| ;; | |
| *) | |
| clear | |
| erro_msg | |
| echo "" | |
| echo "" | |
| echo "Por favor, escriba solo Y o N." | |
| sleep 2 | |
| clear | |
| nome_instalador | |
| direitos_setup | |
| ;; | |
| esac | |
| read -p "Al escribir (Y) usted acepta y está de acuerdo con las orientaciones presentadas arriba (Y/N): " choice | |
| done | |
| } | |
| ## Credenciais Portainerv2.5.0+ | |
| info_credenciais(){ | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo= $branco A partir de la versión 1.0.0 de este Setup se implementó una función para realizar deploy dentro $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco del propio portainer a través de una solicitud API. Para que esta nueva función funcione en $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco sus próximas instalaciones, usted deberá proporcionar las credenciales de acceso de su portainer $amarelo =\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Credito do Setup | |
| creditos_msg() { | |
| echo "" | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco ¿Te gustaría contribuir para que sigamos desarrollando este proyecto? $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco Nuestra comunidad:$amarelo https://sociosdigitales.pro/ $amarelo=\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Mensagens gerais | |
| ## Mensagem pedindo para preencher as informações | |
| preencha_as_info() { | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco Complete la información solicitada a continuación $amarelo=\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Mensagem pedindo para verificar se as informações estão certas | |
| conferindo_as_info() { | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco Verifique que los datos a continuación estén correctos $amarelo=\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Mensagem de Guarde os dados | |
| guarde_os_dados_msg() { | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco Guarde todos los datos a continuación para evitar problemas futuros $amarelo=\e[0m" | |
| echo -e "$amarelo= $amarelo=\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Mensagem de Instalando | |
| instalando_msg() { | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo= $branco ██ ███ ██ ███████ ████████ █████ ██ █████ ███ ██ ██████ ██████ $amarelo = \e[0m" | |
| echo -e "$amarelo= $branco ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco ██ ██ ██ ██ ███████ ██ ███████ ██ ███████ ██ ██ ██ ██ ██ ██ ██ $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ $amarelo =\e[0m" | |
| echo -e "$amarelo= $branco ██ ██ ████ ███████ ██ ██ ██ ███████ ██ ██ ██ ████ ██████ ██████ $amarelo =\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Mensagem de Erro | |
| erro_msg() { | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo= $branco ███████ ██████ ██████ ██████ ██████ $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco ██ ██ ██ ██ ██ ██ ██ ██ ██ $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco █████ ██████ ██████ ██ ██ ██████ $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco ██ ██ ██ ██ ██ ██ ██ ██ ██ $amarelo=\e[0m" | |
| echo -e "$amarelo= $branco ███████ ██ ██ ██ ██ ██████ ██ ██ $amarelo=\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| } | |
| ## Mensagem de Instalado | |
| instalado_msg() { | |
| clear | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo -e "$branco ██ ██ ███ ██ ███████ ████████ █████ ██ █████ ██████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ███████ ██ ███████ ██ ███████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ███████ ██ ██ ██ ███████ ██ ██ ██████ ██████ ██ \e[0m" | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Mensagem de Testando | |
| nome_testando() { | |
| clear | |
| echo "" | |
| echo -e "$branco ████████ ███████ ███████ ████████ ███████ █████ ███ ██ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ █████ ███████ ██ █████ ███████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ███████ ██ ███████ ██ ██ ██ ████ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| nome_credenciais() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ███████ ██████ ███████ ███ ██ ██████ ██ █████ ██ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ █████ ██ ██ █████ ██ ██ ██ ██ ██ ███████ ██ █████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ███████ ██████ ███████ ██ ████ ██████ ██ ██ ██ ███████ ███████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██████ ███████ ██████ ██████ ██████ ████████ █████ ██ ███ ██ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ █████ ██████ ██ ██ ██████ ██ ███████ ██ ██ ██ ██ █████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ██ ██████ ██ ██ ██ ██ ██ ██ ██ ████ ███████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| info_credenciais | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Titulos | |
| ## Nome do instalador | |
| nome_instalador() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ███████ ████████ ██ ██ ██████ ███████ ██████ ██████ ██ ██████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ █████ ██ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ███████ ██ ██████ ██ ███████ ██████ ██████ ██ ██████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██ ██████ ██████ \e[0m" | |
| echo -e "$branco ███ ██ ████ ██ ████ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ████ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██████ ██ ██████ \e[0m" | |
| echo "" | |
| } | |
| ## Menu de ferramentas | |
| nome_menu() { | |
| clear | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo -e "$branco ███ ███ ███████ ███ ██ ██ ██ ██████ ███████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ █████ ██ ██ ██ ██ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██ ████ ██████ ██████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██████ ██████ █████ ███ ███ ██ ███████ ███ ██ ████████ █████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ █████ ██████ ██████ ███████ ██ ████ ██ ██ █████ ██ ██ ██ ██ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ████ ██ ██ ██ ███████ \e[0m" | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| versao | |
| echo "" | |
| } | |
| ## Titulo Teste de Email [0] | |
| nome_testeemail() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██ ██ ███████ ██████ █████ ██████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██ ██ █████ ██████ ███████ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██████ ███████ ██████ ██ ██ ██████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ███████ ███ ███ █████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ████ ██ ███████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ██ ██ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Traefik e Portainer [1] | |
| nome_traefik_e_portainer() { | |
| clear | |
| echo "" | |
| echo -e "$branco ████████ ██████ █████ ███████ ███████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ███████ █████ █████ ██ █████ ████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██████ ██████ ██████ ████████ █████ ██ ███ ██ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██████ ██ ███████ ██ ██ ██ ██ █████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ██ ██ ██ ██ ██ ██ ██ ████ ███████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Chatwoot [2] | |
| nome_chatwoot(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ █████ ████████ ██ ██ ██████ ██████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ███████ ██ ██ █ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██ ███ ███ ██████ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Evolution [3] | |
| nome_evolution() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ██████ ██ ██ ██ ████████ ██ ██████ ███ ██ █████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ████ ██████ ███████ ██████ ██ ██ ██████ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| nome_evolution_lite() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ██████ ██ ██ ██ ████████ ██ ██████ ███ ██ █████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ████ ██████ ███████ ██████ ██ ██ ██████ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██ ██ ████████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Evolution [2.beta] | |
| nome_evolution_v2() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ██████ ██ ██ ██ ████████ ██ ██████ ███ ██ █████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ████ ██████ ███████ ██████ ██ ██ ██████ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██ ██ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ████ \e[0m" | |
| echo -e "$branco ██ ██ █████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ██ \e[0m" | |
| echo -e "$branco ████ ███████ ██ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo= $branco Esta es una versión Alfa y no está destinada para uso en producción. $amarel=\e[0m" | |
| echo -e "$amarelo= =\e[0m" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Minio [4] | |
| nome_minio() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ███ ██ ███ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ████ ██ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Typebot [5] | |
| nome_typebot() { | |
| clear | |
| echo "" | |
| echo -e "$branco ████████ ██ ██ ██████ ███████ ██████ ██████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██████ █████ ██████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ███████ ██████ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo N8N [6] | |
| nome_n8n() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ██ █████ ███ ██ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ █████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ █████ ██ ████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Flowise [7] | |
| nome_flowise() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██ ██████ ██ ██ ██ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ █ ██ ██ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ██████ ███ ███ ██ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo PgAdmin [8] | |
| nome_pgAdmin_4() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ █████ ██████ ███ ███ ██ ███ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ███ ███████ ██ ██ ██ ████ ██ ██ ██ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ██ ██ ██████ ██ ██ ██ ██ ████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Nocobase [9] | |
| nome_nocobase() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ██ ██████ ██████ ██████ ██████ █████ ███████ ███████ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██████ ███████ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██████ ██████ ██████ ██████ ██ ██ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Botpress [10] | |
| nome_botpress() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ████████ ██████ ██████ ███████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██████ ██████ █████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██ ██ ██ ██ ███████ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Wordpress [11] | |
| nome_wordpress() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ ██████ ██████ ██████ ██████ ██████ ███████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ █ ██ ██ ██ ██████ ██ ██ ██████ ██████ █████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ ███ ██████ ██ ██ ██████ ██ ██ ██ ███████ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Baserow [12] | |
| nome_baserow() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ █████ ███████ ███████ ██████ ██████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ███████ █████ ██████ ██ ██ ██ █ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ███████ ███████ ██ ██ ██████ ███ ███ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo MongoDB [13] | |
| nome_mongodb() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ███ ██████ ███ ██ ██████ ██████ ██████ ██████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██████ ██ ████ ██████ ██████ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo RabbitMQ [14] | |
| nome_rabbitmq() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ █████ ██████ ██████ ██ ████████ ███ ███ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ██████ ██████ ██ ██ ██ ████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▄▄ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██████ ██████ ██ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ▀▀ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo UptimeKuma [15] | |
| nome_uptimekuma() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ ██████ ████████ ██ ███ ███ ███████ ██ ██ ██ ██ ███ ███ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ████ ████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██████ ██ ██ ██ ████ ██ █████ █████ ██ ██ ██ ████ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██ ███████ ██ ██ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Calcom [16] | |
| nome_calcom() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ █████ ██ ██████ ██████ ███ ███ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ████ \e[0m" | |
| echo -e "$branco ██ ███████ ██ ██ ██ ██ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ███████ ██ ██████ ██████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Mautic [17] | |
| nome_mautic(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ███ █████ ██ ██ ████████ ██ ██████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ ███████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██████ ██ ██ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Appsmith [18] | |
| nome_appsmith() { | |
| clear | |
| echo "" | |
| echo -e "$branco █████ ██████ ██████ ███████ ███ ███ ██ ████████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██████ ██████ ███████ ██ ████ ██ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Qdrant [19] | |
| nome_qdrant() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██████ █████ ███ ██ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██████ ███████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██ ██ ██ ██ ██ ████ ██ \e[0m" | |
| echo -e "$branco ▀▀ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo WoofedCRM [20] | |
| nome_woofedcrm() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ ██████ ██████ ███████ ███████ ██████ ██████ ██████ ███ ███ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ \e[0m" | |
| echo -e "$branco ██ █ ██ ██ ██ ██ ██ █████ █████ ██ ██ ██ ██████ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ ███ ██████ ██████ ██ ███████ ██████ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Formbricks [21] | |
| nome_formbricks() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██████ ██████ ███ ███ ██████ ██████ ██ ██████ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██████ ██ ████ ██ ██████ ██████ ██ ██ █████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ██ ██ ██ ██ ██████ ██ ██ ██ ██████ ██ ██ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo NocoDB [22] | |
| nome_nocodb() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ██ ██████ ██████ ██████ ██████ ██████ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██████ ██████ ██████ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Langfuse [23] | |
| nome_langfuse() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ █████ ███ ██ ██████ ███████ ██ ██ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ██ ██ ██ ██ ███ █████ ██ ██ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ████ ██████ ██ ██████ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Metabase [24] | |
| nome_metabase() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ███ ███████ ████████ █████ ██████ █████ ███████ ███████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ █████ ██ ███████ ██████ ███████ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██ ██ ██ ██████ ██ ██ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Odoo [25] | |
| nome_odoo() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Chatwoot Nestor [26] | |
| nome_chatwoot_nestor(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ █████ ████████ ██ ██ ██████ ██████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ███████ ██ ██ █ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██ ███ ███ ██████ ██████ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ███ ██ ███████ ███████ ████████ ██████ ██████ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ █████ ███████ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ███████ ███████ ██ ██████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| nome_unoapi() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ ███ ██ ██████ █████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ████ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Uno API [27] | |
| nome_n8n_quepasa(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ██ █████ ███ ██ ███ ██ ██████ ██████ ███████ ███████ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ████ ██ ████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ █████ ██ ████ ██ ████ ██████ ██████ ███████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██████ ██ ██ ███████ ██████ █████ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ █████ ██████ ███████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ███████ ██ ██ ██ ███████ ██ ██ \e[0m" | |
| echo -e "$branco ▀▀ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Quepasa API [29] | |
| nome_quepasa() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ ███████ ██████ █████ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ █████ ██████ ███████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ▄▄ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ███████ ██ ██ ██ ███████ ██ ██ \e[0m" | |
| echo -e "$branco ▀▀ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Docuseal [30] | |
| nome_docuseal(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██████ ██ ██ ███████ ███████ █████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███████ █████ ███████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██████ ██████ ███████ ███████ ██ ██ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Grafana + Prometheus + cAdvisor [31] | |
| nome_monitor() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ █████ ███████ █████ ███ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███ ██████ ███████ █████ ███████ ██ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Dify AI [32] | |
| nome_dify() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ███████ ██ ██ █████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ █████ ████ ███████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Ollama [33] | |
| nome_ollama() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ █████ ███ ███ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ███████ ██ ████ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ███████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Affine [34] | |
| nome_affine(){ | |
| clear | |
| echo "" | |
| echo -e "$branco █████ ███████ ███████ ██ ███ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ████ ██ ██ \e[0m" | |
| echo -e "$branco ███████ █████ █████ ██ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Directus [35] | |
| nome_directus(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██████ ███████ ██████ ████████ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██████ █████ ██ ██ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ███████ ██████ ██ ██████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo VaultWarden [36] | |
| nome_vaultwarden() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ █████ ██ ██ ██ ████████ ██ ██ █████ ██████ ██████ ███████ ███ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██ ██ ██ ██ ██ █ ██ ███████ ██████ ██ ██ █████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██████ ███████ ██ ███ ███ ██ ██ ██ ██ ██████ ███████ ██ ████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo NextCloud [37] | |
| nome_nextcloud() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ██ ███████ ██ ██ ████████ ██████ ██ ██████ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ █████ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ███████ ██ ██ ██ ██████ ███████ ██████ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Strapi [38] | |
| nome_strapi() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ████████ ██████ █████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██████ ███████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo PhpMyAdmin [39] | |
| nome_phpmyadmin(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ ██████ ███ ███ ██ ██ █████ ██████ ███ ███ ██ ███ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ████ ████ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ██████ ██ ████ ██ ████ ███████ ██ ██ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ██ ██ ████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Supabase [40] | |
| nome_supabase(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ██████ █████ ██████ █████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██████ ███████ ██████ ███████ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██████ ██ ██ ██ ██████ ██ ██ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Ntfy [41] | |
| nome_ntfy(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ██ ████████ ███████ ██ ██ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ █████ ████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Lowcoder [42] | |
| nome_lowcoder(){ | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██████ ██ ██ ██████ ██████ ██████ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ █ ██ ██ ██ ██ ██ ██ █████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██████ ███ ███ ██████ ██████ ██████ ███████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Langflow [43] | |
| nome_langflow() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ █████ ███ ██ ██████ ███████ ██ ██████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ██ ██ ██ ██ ███ █████ ██ ██ ██ ██ █ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ████ ██████ ██ ███████ ██████ ███ ███ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo OpenProject [44] | |
| nome_openproject() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██████ ███████ ███ ██ ██████ ██████ ██████ ██ ███████ ██████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██████ █████ ██ ██ ██ ██████ ██████ ██ ██ ██ █████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ███████ ██ ████ ██ ██ ██ ██████ █████ ███████ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Zep [45] | |
| nome_zep() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ███████ ██████ \e[0m" | |
| echo -e "$branco ███ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ █████ ██████ \e[0m" | |
| echo -e "$branco ███ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ███████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo HumHub [46] | |
| nome_humhub() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ ██ ██ ███ ███ ██ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ████ ██ ███████ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██████ ██ ██ ██ ██ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Yourls [47] | |
| nome_yourls() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██ ██ ██████ ██ ██ ██████ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ████ ██ ██ ██ ██ ██████ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ██████ ██ ██ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo TwentyCRM [48] | |
| nome_twentycrm() { | |
| clear | |
| echo "" | |
| echo -e "$branco ████████ ██ ██ ███████ ███ ██ ████████ ██ ██ ██████ ██████ ███ ███ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ████ ████ \e[0m" | |
| echo -e "$branco ██ ██ █ ██ █████ ██ ██ ██ ██ ████ ██ ██████ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███ ███ ███████ ██ ████ ██ ██ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Mattermost [49] | |
| nome_mattermost() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███ ███ █████ ████████ ████████ ███████ ██████ ███ ███ ██████ ███████ ████████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ ███████ ██ ██ █████ ██████ ██ ████ ██ ██ ██ ███████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██████ ███████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Outline [50] | |
| nome_outline() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ ████████ ██ ██ ███ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██ ███████ ██ ██ ████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo FocalBoard [51] | |
| nome_focalboard() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██████ ██████ █████ ██ ██████ ██████ █████ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ███████ ██ ██████ ██ ██ ███████ ██████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ██████ ██ ██ ███████ ██████ ██████ ██ ██ ██ ██ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo GLPI [52] | |
| nome_glpi() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ ██ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███ ██ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Anything LLM [53] | |
| nome_anythingllm() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco █████ ███ ██ ██ ██ ████████ ██ ██ ██ ███ ██ ██████ ██ ██ ███ ███ \e[0m" | |
| echo -e "$branco ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ████ ████ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ████ ██ ███████ ██ ██ ██ ██ ██ ███ ██ ██ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ████ ██████ ███████ ███████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Excalidraw [54] | |
| nome_excalidraw() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ██████ █████ ██ ██ ██████ ██████ █████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ███ ██ ███████ ██ ██ ██ ██ ██████ ███████ ██ █ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██████ ██ ██ ███████ ██ ██████ ██ ██ ██ ██ ███ ███ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Excalidraw [55] | |
| nome_easyappointments() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ █████ ███████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ███████ ███████ ████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ███████ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco █████ ██████ ██████ ██████ ██ ███ ██ ████████ ███ ███ ███████ ███ ██ ████████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ████ ██ ████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ █████ ██ ██ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██████ ██ ██ ████ ██ ██ ██ ███████ ██ ████ ██ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Documenso [56] | |
| nome_documenso() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██████ ██ ██ ███ ███ ███████ ███ ██ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ █████ ██ ██ ██ ███████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██████ ██████ ██ ██ ███████ ██ ████ ███████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Moodle [57] | |
| nome_moodle() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███ ███ ██████ ██████ ██████ ██ ███████ \e[0m" | |
| echo -e "$branco ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██████ ██████ ██████ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo ToolJet [58] | |
| nome_tooljet() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ████████ ██████ ██████ ██ ██ ███████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ █████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ██████ ███████ █████ ███████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Stirling PDF [59] | |
| nome_stirlingpdf() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ████████ ██ ██████ ██ ██ ███ ██ ██████ ██████ ██████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██████ ██ ██ ██ ██ ██ ██ ███ ██████ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ██ ███████ ██ ██ ████ ██████ ██ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo ClickHouse [60] | |
| nome_clickhouse() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ██ ██ ██████ ██ ██ ██ ██ ██████ ██ ██ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ █████ ███████ ██ ██ ██ ██ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ██ ██████ ██ ██ ██ ██ ██████ ██████ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo RedisInsight [61] | |
| nome_redisinsight() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ███████ ██████ ██ ███████ ██ ███ ██ ███████ ██ ██████ ██ ██ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ █████ ██ ██ ██ ███████ ██ ██ ██ ██ ███████ ██ ██ ███ ███████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██████ ██ ███████ ██ ██ ████ ███████ ██ ██████ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Traccar [62] | |
| nome_traccar() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ████████ ██████ █████ ██████ ██████ █████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ███████ ██ ██ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██████ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Firecrawl [63] | |
| nome_firecrawl() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ██ ██████ ███████ ██████ ██████ █████ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██████ █████ ██ ██████ ███████ ██ █ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ███████ ██████ ██ ██ ██ ██ ███ ███ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Wuzapi [64] | |
| nome_wuzapi() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██ ██ ██ ██ ███████ █████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ █ ██ ██ ██ ███ ███████ ██████ ██ \e[0m" | |
| echo -e "$branco ██ ███ ██ ██ ██ ███ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ ███ ██████ ███████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Krayin CRM [65] | |
| nome_krayincrm() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██ ██ ██████ █████ ██ ██ ██ ███ ██ ██████ ██████ ███ ███ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ████ ████ \e[0m" | |
| echo -e "$branco █████ ██████ ███████ ████ ██ ██ ██ ██ ██ ██████ ██ ████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Planka [66] | |
| nome_planka() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ██ █████ ███ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ███████ ██ ██ ██ █████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ██ ██ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo WppConnect [67] | |
| nome_wppconnect() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██ ██ ██████ ██████ ██████ ██████ ███ ██ ███ ██ ███████ ██████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ █ ██ ██████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ██ █████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ ███ ██ ██ ██████ ██████ ██ ████ ██ ████ ███████ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Browserless [68] | |
| nome_browserless() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██████ ██ ██ ███████ ███████ ██████ ██ ███████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ██ ██ ██ █ ██ ███████ █████ ██████ ██ █████ ███████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██████ ███ ███ ███████ ███████ ██ ██ ███████ ███████ ███████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Frappe [69] | |
| nome_frappe() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ██████ █████ ██████ ██████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██████ ███████ ██████ ██████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Bolt [70] | |
| nome_bolt() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ██████ ██ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██████ ███████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo WiseMapping [71] | |
| nome_wisemapping() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██ ██ ██ ███████ ███████ ███ ███ █████ ██████ ██████ ██ ███ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ \e[0m" | |
| echo -e "$branco ██ █ ██ ██ ███████ █████ ██ ████ ██ ███████ ██████ ██████ ██ ██ ██ ██ ██ ███ \e[0m" | |
| echo -e "$branco ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ ███ ██ ███████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Evo AI [72] | |
| nome_evoai() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ██████ █████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ ███████ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ████ ██████ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Evo AI [73] | |
| nome_keycloak(){ | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██ ██ ███████ ██ ██ ██████ ██ ██████ █████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ █████ ████ ██ ██ ██ ██ ███████ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██ ██████ ███████ ██████ ██ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Passbolt [74] | |
| nome_passbolt(){ | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ █████ ███████ ███████ ██████ ██████ ██ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ███████ ███████ ██████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ███████ ███████ ██████ ██████ ███████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| nome_transcrevezap(){ | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ████████ ██████ █████ ███ ██ ███████ ██████ ██████ ███████ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██████ ███████ ██ ██ ██ ███████ ██ ██████ █████ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ████ ███████ ██████ ██ ██ ███████ ████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ███████ █████ ██████ \e[0m" | |
| echo -e "$branco ███ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███ ███████ ██████ \e[0m" | |
| echo -e "$branco ███ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| # =================================================================================================== | |
| ## Titulo Saindo do setup | |
| nome_saindo() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ █████ ██ ██ ███████ ███ ██ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ███████ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ███████ ██ ███████ ██ ████ ██████ ██████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██████ ███████ ██ ███████ ███████ ████████ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ █████ ██ ███████ █████ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ███████ ███████ ███████ ██ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## Titulo Remover Stack | |
| nome_remover_stack() { | |
| clear | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ██ ██ ███ ███ ██ ███ ██ █████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ████ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ████ ██ ██ ██ ██ ██ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ███████ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ███████ ████████ █████ ██████ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ███████ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ██████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| } | |
| nome_portainer.reset() { | |
| clear | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██████ ███████ ███████ ████████ █████ ██████ ██ ███████ ██████ ███████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ █████ ███████ ██ ███████ ██████ ██ █████ ██ █████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ███████ ██ ██ ██ ██████ ███████ ███████ ██████ ███████ ██ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██████ ██ █████ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ███████ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ███████ ██ ██ ████ ███████ \e[0m" | |
| echo "" | |
| echo "" | |
| echo -e "$amarelo===================================================================================================\e[0m" | |
| } | |
| nome_verificar_stack() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ███████ ████████ █████ ██████ ██ ██ ██ ██ █████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ███████ ██ █████ ████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ██████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██ ███ ██ ███████ ████████ █████ ██ █████ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ███████ ██ ███████ ██ ███████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ████ ███████ ██ ██ ██ ███████ ██ ██ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| nome_expurgando() { | |
| clear | |
| echo "" | |
| echo "" | |
| echo -e "$branco ██ ██ ███ ███ ██████ ██ █████ ███ ██ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ████ ████ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ██ ██████ ██ ███████ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██████ ██████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ███████ ███████ ██████ ██ ██ ██ ██████ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ █████ ██████ ██ ██ ██ ██ ██ ██ ██ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ███████ ███████ ██ ██ ████ ██ ██████ ██████ ██ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Defasados | |
| nome_trocar_logos() { | |
| clear | |
| echo "" | |
| echo -e "$branco ██████ █████ ███ ███ ██████ ██ █████ ██████ ██ ██████ ██████ ██████ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ██ ████ ██ ██████ ██ ███████ ██████ ██ ██ ██ ██ ███ ██ ██ ███████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██████ ██ ██ ██ ██ ██ ███████ ██████ ██████ ██████ ███████ \e[0m" | |
| echo -e "$branco \e[0m" | |
| echo -e "$branco ██████ ██ ██ █████ ████████ ██ ██ ██████ ██████ ████████ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ███████ ███████ ██ ██ █ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██████ ██ ██ ██ ██ ██ ███ ███ ██████ ██████ ██ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| nome_finalizado() { | |
| clear | |
| echo "" | |
| echo -e "$branco ███████ ██ ███ ██ █████ ██ ██ ███████ █████ ██████ ██████ \e[0m" | |
| echo -e "$branco ██ ██ ████ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco █████ ██ ██ ██ ██ ███████ ██ ██ ███ ███████ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ \e[0m" | |
| echo -e "$branco ██ ██ ██ ████ ██ ██ ███████ ██ ███████ ██ ██ ██████ ██████ \e[0m" | |
| echo "" | |
| echo "" | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Menu de opções | |
| #menu_instalador(){ | |
| # echo -e "${amarelo}[ 00 ]${reset} - ${branco}Testar SMTP ${verde}| ${reset} ${amarelo}[ 21 ]${reset} - ${branco}Formbricks${reset}" | |
| # echo -e "${amarelo}[ 01 ]${reset} - ${branco}Traefik & Portainer ${verde}| ${reset} ${amarelo}[ 22 ]${reset} - ${branco}NocoDB${reset}" | |
| # echo -e "${amarelo}[ 02 ]${reset} - ${branco}Chatwoot ${verde}| ${reset} ${amarelo}[ 23 ]${reset} - ${branco}Langfuse${reset}" | |
| # echo -e "${branco} '-->${amarelo}[ 2.1 ]${reset} - ${branco}Chatwoot (ARM) ${verde}| ${reset} ${amarelo}[ 24 ]${reset} - ${branco}Metabase${reset}" | |
| # echo -e "${amarelo}[ 03 ]${reset} - ${branco}Evolution API ${verde}| ${reset} ${amarelo}[ 25 ]${reset} - ${branco}Odoo${reset}" | |
| # echo -e "${branco} '-->${amarelo}[ 3.1 ]${reset} - ${branco}Evolution API (ARM) ${verde}| ${reset} ${amarelo}[ 26 ]${reset} - ${branco}Chatwoot Nestor${reset}" | |
| # echo -e "${amarelo}[ 04 ]${reset} - ${branco}MinIO ${verde}| ${reset} ${amarelo}[ 27 ]${reset} - ${branco}Uno API${reset}" | |
| # echo -e "${amarelo}[ 05 ]${reset} - ${branco}Typebot ${verde}| ${reset} ${amarelo}[ 28 ]${reset} - ${branco}N8N + Nodes Quepasa $vermelho[OFF]${reset}" | |
| # echo -e "${amarelo}[ 06 ]${reset} - ${branco}N8N ${verde}| ${reset} ${amarelo}[ 29 ]${reset} - ${branco}Quepasa API $vermelho[OFF]${reset}" | |
| # echo -e "${amarelo}[ 07 ]${reset} - ${branco}Flowise ${verde}| ${reset} ${amarelo}[ 30 ]${reset} - ${branco}Docuseal${reset}" | |
| # echo -e "${amarelo}[ 08 ]${reset} - ${branco}PgAdmin 4 ${verde}| ${reset} ${amarelo}[ 31 ]${reset} - ${branco}Grafana + Prometheus + cAdvisor${reset}" | |
| # echo -e "${amarelo}[ 09 ]${reset} - ${branco}Nocobase ${verde}| ${reset} ${amarelo}[ 32 ]${reset} - ${branco}Dify AI${reset}" | |
| # echo -e "${amarelo}[ 10 ]${reset} - ${branco}Botpress ${verde}| ${reset} ${amarelo}[ 33 ]${reset} - ${branco}Ollama${reset}" | |
| # echo -e "${amarelo}[ 11 ]${reset} - ${branco}Wordpress ${verde}| ${reset} ${amarelo}[ 34 ]${reset} - ${branco}Affine${reset}" | |
| # echo -e "${amarelo}[ 12 ]${reset} - ${branco}Baserow ${verde}| ${reset} ${amarelo}[ 35 ]${reset} - ${branco}Directus${reset}" | |
| # echo -e "${amarelo}[ 13 ]${reset} - ${branco}MongoDB ${verde}| ${reset} ${amarelo}[ 36 ]${reset} - ${branco}VaultWarden${reset}" | |
| # echo -e "${amarelo}[ 14 ]${reset} - ${branco}RabbitMQ ${verde}| ${reset} ${amarelo}[ 37 ]${reset} - ${branco}NextCloud${reset}" | |
| # echo -e "${amarelo}[ 15 ]${reset} - ${branco}Uptime Kuma ${verde}| ${reset} ${amarelo}[ 38 ]${reset} - ${branco}Strapi${reset}" | |
| # echo -e "${amarelo}[ 16 ]${reset} - ${branco}Cal.com ${verde}| ${reset} ${amarelo}[ 39 ]${reset} - ${branco}PhpMyAdmin${reset}" | |
| # echo -e "${amarelo}[ 17 ]${reset} - ${branco}Mautic ${verde}| ${reset} ${amarelo}[ 40 ]${reset} - ${branco}Supabase${reset}" | |
| # echo -e "${amarelo}[ 18 ]${reset} - ${branco}Appsmith ${verde}| ${reset} ${amarelo}[ 41 ]${reset} - ${branco}Ntfy ${verde}[NOVO]${reset}" | |
| # echo -e "${amarelo}[ 19 ]${reset} - ${branco}Qdrant ${verde}| ${reset} ${amarelo}[ 42 ]${reset} - ${branco}REMOVER STACK${reset}" | |
| # echo -e "${amarelo}[ 20 ]${reset} - ${branco}Woofed CRM ${verde}| ${reset} ${amarelo}[ 43 ]${reset} - ${branco}Sair do instalador${reset}" | |
| # echo "" | |
| #} | |
| menu_instalador() { | |
| case $menu_instalador in | |
| 1) menu_instalador_pg_1 ;; | |
| 2) menu_comandos ;; | |
| *) echo "Error al listar menú..." ;; | |
| esac | |
| } | |
| menu_instalador_pg_1(){ | |
| echo -e "${amarelo}[ 00 ]${reset} - ${branco}Traefik & Portainer ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 12 ]${reset} - ${branco}MongoDB ${verde}[1/2]${reset}" | |
| echo -e "${amarelo}[ 01 ]${reset} - ${branco}Chatwoot ${verde}[2/2]${reset} ${verde}| ${reset} ${amarelo}[ 13 ]${reset} - ${branco}RabbitMQ ${verde}[1/1]${reset}" | |
| echo -e "${amarelo}[ 02 ]${reset} - ${branco}Evolution API ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 14 ]${reset} - ${branco}Cal.com ${verde}[1/1]${reset}" | |
| echo -e "${amarelo}[ 03 ]${reset} - ${branco}MinIO ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 15 ]${reset} - ${branco}Mautic ${verde}[2/2]${reset}" | |
| echo -e "${amarelo}[ 04 ]${reset} - ${branco}Typebot ${verde}[2/2]${reset} ${verde}| ${reset} ${amarelo}[ 16 ]${reset} - ${branco}NocoDB ${verde}[1/1]${reset}" | |
| echo -e "${amarelo}[ 05 ]${reset} - ${branco}N8N ${verde}[2/2]${reset} ${verde}| ${reset} ${amarelo}[ 17 ]${reset} - ${branco}Dify AI ${verde}[2/4]${reset}" | |
| echo -e "${amarelo}[ 06 ]${reset} - ${branco}Flowise ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 18 ]${reset} - ${branco}PhpMyAdmin ${verde}[1/2]${reset}" | |
| echo -e "${amarelo}[ 07 ]${reset} - ${branco}PgAdmin 4 ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 19 ]${reset} - ${branco}Supabase ${verde}[2/4]${reset}" | |
| echo -e "${amarelo}[ 08 ]${reset} - ${branco}Nocobase ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 20 ]${reset} - ${branco}Yourls ${verde}[1/1]${reset}" | |
| echo -e "${amarelo}[ 09 ]${reset} - ${branco}Botpress ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 21 ]${reset} - ${branco}krayin CRM ${verde}[1/1]${reset}" | |
| echo -e "${amarelo}[ 10 ]${reset} - ${branco}Wordpress ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 22 ]${reset} - ${branco}Bolt ${verde}[2/4]${reset}" | |
| echo -e "${amarelo}[ 11 ]${reset} - ${branco}Baserow ${verde}[1/1]${reset} ${verde}| ${reset} ${amarelo}[ 23 ]${reset} - ${branco}Evo AI ${verde}[1/1]${reset} ${verde}[RECIENTE]${reset}" | |
| echo -e "" | |
| echo -e "" | |
| } | |
| menu_comandos(){ | |
| ## Portainer | |
| echo -e "> ${verde}Comandos de Portainer:${reset}" | |
| echo -e "${branco} • ${amarelo}portainer.restart${reset} - ${branco}Reinicia el Portainer${reset}" | |
| echo -e "${branco} • ${amarelo}portainer.reset${reset} - ${branco}Resetea la contraseña del Portainer${reset}" | |
| echo -e "${branco} • ${amarelo}portainer.update${reset} - ${branco}Actualiza el Portainer${reset}" | |
| echo "" | |
| ## Monitoramento | |
| echo -e "> ${verde}Comandos de Monitoreo:${reset}" | |
| echo -e "${branco} • ${amarelo}ctop${reset} - ${branco}Instala CTOP${reset}" | |
| echo -e "${branco} • ${amarelo}htop${reset} - ${branco}Instala HTOP${reset}" | |
| echo "" | |
| ## Chatwoot | |
| echo -e "> ${verde}Comandos de Chatwoot:${reset}" | |
| echo -e "${branco} • ${amarelo}chatwoot.mail${reset} - ${branco}Cambia los Emails de Chatwoot a la versión de Socios${reset}" | |
| echo -e "${branco} • ${amarelo}chatwoot.n.mail${reset} - ${branco}Cambia los Emails de Chatwoot Mega a la versión de Socios${reset}" | |
| echo "" | |
| ## Ferramentas | |
| echo -e "> ${verde}Comandos de Herramientas:${reset}" | |
| echo -e "${branco} • ${amarelo}evolution.v1${reset} - ${branco}Instala Evolution v1.8+${reset}" | |
| echo -e "${branco} • ${amarelo}evolution.lite${reset} - ${branco}Instala Evolution Lite${reset}" | |
| echo -e "${branco} • ${amarelo}transcrevezap${reset} - ${branco}Instala Transcreve Zap${reset}" | |
| echo "" | |
| ## Quepasa | |
| echo -e "> ${verde}Comandos de Quepasa:${reset}" | |
| echo -e "${branco} • ${amarelo}quepasa.setup.off${reset} - ${branco}Desactiva el Setup de Quepasa${reset}" | |
| echo -e "${branco} • ${amarelo}quepasa.setup.on${reset} - ${branco}Activa el Setup de Quepasa${reset}" | |
| echo "" | |
| ## Manutenção | |
| echo -e "> ${verde}Comandos de Mantenimiento:${reset}" | |
| echo -e "${branco} • ${amarelo}limpar${reset} - ${branco}Limpia Logs, volúmenes e imágenes de Docker no usadas${reset}" | |
| echo -e "" | |
| echo -e "${branco}<-- Escriba ${amarelo}P1 ${branco}para ir al menú -->${reset}" | |
| echo -e "" | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Verificar se stack já existe | |
| verificar_stack() { | |
| clear | |
| local nome_stack="$1" | |
| if docker stack ls --format "{{.Name}}" | grep -q "^${nome_stack}$"; then | |
| nome_verificar_stack | |
| echo -e "La stack '$amarelo${nome_stack}\e[0m' existe." | |
| echo -e "Si desea reinstalarla, por favor elimine la stack $amarelo${nome_stack}\e[0m de" | |
| echo -e "su Portainer e intente nuevamente..." | |
| echo -e "" | |
| echo -e "Volviendo al menú principal en 10 segundos" | |
| sleep 10 | |
| clear | |
| return 0 | |
| else | |
| return 1 | |
| fi | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| # Função para verificar recursos | |
| recursos() { | |
| # Parâmetros de entrada: vCPU e GbRam | |
| vcpu_requerido=$1 | |
| ram_requerido=$2 | |
| # Obtendo a quantidade de vCPUs e GB de RAM disponíveis | |
| vcpu_disponivel=$(neofetch --stdout | grep "CPU" | grep -oP '\(\d+\)' | tr -d '()') | |
| ram_disponivel=$(neofetch --stdout | grep "Memory" | awk '{print $4}' | tr -d 'MiB' | awk '{print int($1/1024 + 0.5)}') | |
| # Comparando os recursos | |
| if [[ $vcpu_disponivel -ge $vcpu_requerido && $ram_disponivel -ge $ram_requerido ]]; then | |
| echo "ok" | |
| clear | |
| return 0 | |
| else | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que o seu servidor não atende os requisitos mínimos dessa aplicação." | |
| echo -e "Esse serviço precisa de \e[32m$vcpu_requerido vCPU${reset} e \e[32m$ram_requerido Gb RAM${reset}." | |
| echo -e "Atualmente, seu servidor possui apenas: \e[32m$vcpu_disponivel vCPU${reset} com \e[32m$ram_disponivel Gb RAM${reset}." | |
| echo -e "Você pode ter problemas de desempenho, falhas na execução ou problemas na instalação." | |
| echo "" | |
| read -p "Deseja continuar mesmo assim? (y/n): " escolha | |
| if [[ "$escolha" =~ ^[Yy]$ ]]; then | |
| return 0 | |
| else | |
| echo "" | |
| echo "Voltando ao menu em 10 segundos." | |
| sleep 10 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| fi | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| stack_editavel(){ | |
| ## Instalar jq | |
| sudo apt install jq -y > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "2/10 - [ OK ] - Instalando JQ Método 1/2" | |
| else | |
| echo "2/10 - [ OFF ] - Error al instalar JQ Método 1/2" | |
| fi | |
| sudo apt-get install -y jq > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "3/10 - [ OK ] - Instalando JQ Método 2/2" | |
| else | |
| echo "3/10 - [ OFF ] - Error al instalar JQ Método 2/2" | |
| fi | |
| ## Definindo o diretório do arquivo dados_portainer | |
| arquivo="/root/dados_vps/dados_portainer" | |
| ## Verifica se o arquivo existe | |
| if [ ! -f "$arquivo" ]; then | |
| echo "Archivo no encontrado: $arquivo" | |
| sleep 2 | |
| ## Cria o arquivo caso não exista | |
| criar_arquivo | |
| fi | |
| ## Remove o https:// caso existir | |
| sed -i 's/Dominio do portainer: https:\/\/\(.*\)/Dominio do portainer: \1/' "$arquivo" | |
| ## Pega o usuario do portainer | |
| USUARIO=$(grep "Usuario: " /root/dados_vps/dados_portainer | awk -F "Usuario: " '{print $2}') | |
| if [ $? -eq 0 ]; then | |
| echo -e "4/10 - [ OK ] - Obteniendo usuario del portainer: $bege$USUARIO$reset" | |
| else | |
| echo "4/10 - [ OFF ] - Error al obtener usuario del portainer" | |
| fi | |
| ## Pega a senha do portainer | |
| SENHA=$(grep "Senha: " /root/dados_vps/dados_portainer | awk -F "Senha: " '{print $2}') | |
| esconder_senha "$SENHA" | |
| if [ $? -eq 0 ]; then | |
| echo -e "5/10 - [ OK ] - Obteniendo contraseña del portainer: $bege$SENHAOCULTA$reset" | |
| else | |
| echo "5/10 - [ OFF ] - Error al obtener contraseña del portainer" | |
| fi | |
| ## Pega a URL do portainer | |
| PORTAINER_URL=$(grep "Dominio do portainer: " /root/dados_vps/dados_portainer | awk -F "Dominio do portainer: " '{print $2}') | |
| if [ $? -eq 0 ]; then | |
| echo -e "6/10 - [ OK ] - Obteniendo dominio del Portainer: $bege$PORTAINER_URL$reset" | |
| else | |
| echo "6/10 - [ OFF ] - Error al obtener dominio del Portainer" | |
| fi | |
| ## Usa o token do portainer | |
| #TOKEN=$(grep "Token: " /root/dados_vps/dados_portainer | awk -F "Token: " '{print $2}') | |
| ## Pega um token do portainer | |
| #TOKEN=$(curl -k -X POST -H "Content-Type: application/json" -d "{\"username\":\"$USUARIO\",\"password\":\"$SENHA\"}" https://$PORTAINER_URL/api/auth | jq -r .jwt) | |
| TOKEN="" | |
| Tentativa_atual=0 | |
| Maximo_de_tentativas=6 | |
| while [ -z "$TOKEN" ] || [ "$TOKEN" == "null" ]; do | |
| TOKEN=$(curl -k -s -X POST -H "Content-Type: application/json" -d "{\"username\":\"$USUARIO\",\"password\":\"$SENHA\"}" https://$PORTAINER_URL/api/auth | jq -r .jwt) | |
| Tentativa_atual=$((Tentativa_atual + 1)) | |
| ## Verifica se atingiu o número máximo de tentativas | |
| if [ "$Tentativa_atual" -ge "$Maximo_de_tentativas" ]; then | |
| clear | |
| erro_msg | |
| echo "7/10 - [ OFF ] - Error: Fallo al obtener token después de $Maximo_de_tentativas intentos." | |
| echo "Verifique sus credenciales del Portainer para que podamos realizar el deploy." | |
| sleep 5 | |
| criar_arquivo | |
| return | |
| #exit 1 | |
| fi | |
| ## Se o token foi obtido com sucesso, sair do loop | |
| if [ -n "$TOKEN" ] && [ "$TOKEN" != "null" ]; then | |
| break | |
| fi | |
| ## Aguarda alguns segundos antes de tentar novamente | |
| echo -e "Intentando generar token del portainer. Intento actual $bege$Tentativa_atual/5$reset" | |
| sleep 5 | |
| done | |
| if [ $? -eq 0 ]; then | |
| esconder_senha "$TOKEN" | |
| echo -e "7/10 - [ OK ] - Obteniendo token del Portainer: $bege$SENHAOCULTA$reset" | |
| fi | |
| ### Verifica se o token veio vazio | |
| #if [ -z "$TOKEN" ] || [ "$TOKEN" == "null" ]; then | |
| # echo "Error: Fallo al obtener token. Complete con sus credenciales del portainer a continuación." | |
| # sleep 5 | |
| # criar_arquivo | |
| # #exit 1 | |
| #fi | |
| ## Salva dados no arquivo do portainer | |
| echo -e "[ PORTAINER ]\nDominio do portainer: $PORTAINER_URL\n\nUsuario: $USUARIO\n\nSenha: $SENHA\n\nToken: $TOKEN" > "/root/dados_vps/dados_portainer" | |
| ## Pegando o id do portainer | |
| ENDPOINT_ID=$(curl -k -s -X GET -H "Authorization: Bearer $TOKEN" https://$PORTAINER_URL/api/endpoints | jq -r '.[] | select(.Name == "primary") | .Id') | |
| if [ $? -eq 0 ]; then | |
| echo -e "8/10 - [ OK ] - Obteniendo ID del Portainer: $bege$ENDPOINT_ID$reset" | |
| else | |
| echo "8/10 - [ OFF ] - Error al obtener ID del Portainer" | |
| fi | |
| ## Definindo id 1 do Portainer | |
| #ENDPOINT_ID=1 | |
| ## Pegando o ID do Swarm | |
| SWARM_ID=$(curl -k -s -X GET -H "Authorization: Bearer $TOKEN" "https://$PORTAINER_URL/api/endpoints/$ENDPOINT_ID/docker/swarm" | jq -r .ID) | |
| if [ $? -eq 0 ]; then | |
| echo -e "9/10 - [ OK ] - Obteniendo ID del Swarm: $bege$SWARM_ID$reset" | |
| else | |
| echo "9/10 - [ OFF ] - Error al obtener ID del Swarm" | |
| fi | |
| ## Testa o Swarm | |
| SWARM_STATUS=$(docker info --format '{{.Swarm.LocalNodeState}}') | |
| if [ "$SWARM_STATUS" != "active" ]; then | |
| echo "Error: Docker Swarm no está activo." | |
| exit 1 | |
| fi | |
| # Arquivo temporário para capturar a saída de erro e a resposta | |
| erro_output=$(mktemp) | |
| response_output=$(mktemp) | |
| ## Fazendo deploy da stack pelo portainer | |
| http_code=$(curl -s -o "$response_output" -w "%{http_code}" -k -X POST \ | |
| -H "Authorization: Bearer $TOKEN" \ | |
| -F "Name=$STACK_NAME" \ | |
| -F "file=@$(pwd)/$STACK_NAME.yaml" \ | |
| -F "SwarmID=$SWARM_ID" \ | |
| -F "endpointId=$ENDPOINT_ID" \ | |
| "https://$PORTAINER_URL/api/stacks/create/swarm/file" 2> "$erro_output") | |
| response_body=$(cat "$response_output") | |
| if [ "$http_code" -eq 200 ]; then | |
| # Verifica o conteúdo da resposta para garantir que o deploy foi bem-sucedido | |
| if echo "$response_body" | grep -q "\"Id\""; then | |
| echo -e "10/10 - [ OK ] - Deploy de la stack $bege$STACK_NAME$reset realizado con éxito!" | |
| else | |
| echo -e "10/10 - [ OFF ] - Error, respuesta inesperada del servidor al intentar realizar deploy de la stack $bege$STACK_NAME$reset." | |
| echo "Respuesta del servidor: $(echo "$response_body" | jq .)" | |
| fi | |
| else | |
| echo "10/10 - [ OFF ] - Error al realizar deploy. Respuesta HTTP: $http_code" | |
| echo "Mensaje de error: $(cat "$erro_output")" | |
| echo "Detalles: $(echo "$response_body" | jq .)" | |
| fi | |
| echo "" | |
| # Remove os arquivos temporários | |
| rm "$erro_output" | |
| rm "$response_output" | |
| } | |
| ## Função para verificar se o arquivo de dados do Portainer existe | |
| verificar_arquivo() { | |
| sudo apt install jq -y > /dev/null 2>&1 | |
| if [ ! -f "/root/dados_vps/dados_portainer" ]; then | |
| nome_credenciais | |
| criar_arquivo | |
| else | |
| verificar_campos | |
| fi | |
| } | |
| ## Função para criar o arquivo de dados do Portainer | |
| criar_arquivo() { | |
| if [ -f "/root/dados_vps/dados_portainer" ]; then | |
| rm "/root/dados_vps/dados_portainer" | |
| echo "Archivo existente eliminado." | |
| fi | |
| ## Caso não exista o arquivo ele vai pedir os dados para criar. | |
| nome_credenciais | |
| echo -e "\e[97mPaso$amarelo 1/3\e[0m" | |
| #echo -e "\e[97mObs: Coloque o https:// antes do link do portainer\e[0m" | |
| read -p "Ingrese la URL de Portainer (ej: portainer.sociosdigitales.pro): " PORTAINER_URL | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 2/3\e[0m" | |
| read -p "Ingrese su Usuario (ej: admin): " USUARIO | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 3/3\e[0m" | |
| echo -e "\e[97mNota: La contraseña no se mostrará al escribir\e[0m" | |
| read -s -p "Ingrese la Contraseña (ej: @Contraseña123_): " SENHA | |
| echo "" | |
| verificar_token "$PORTAINER_URL" "$USUARIO" "$SENHA" true | |
| } | |
| ## Função para verificar os campos do arquivo de dados do Portainer | |
| verificar_campos() { | |
| PORTAINER_URL=$(grep -oP '(?<=Dominio do portainer: ).*' /root/dados_vps/dados_portainer) | |
| USUARIO=$(grep -oP '(?<=Usuario: ).*' /root/dados_vps/dados_portainer) | |
| SENHA=$(grep -oP '(?<=Senha: ).*' /root/dados_vps/dados_portainer) | |
| ## Si no hay usuario o contraseña | |
| if [ -z "$USUARIO" ] || [ -z "$SENHA" ]; then | |
| nome_credenciais | |
| echo -e "\e[97mPaso$amarelo 1/3\e[0m" | |
| #echo -e "\e[97mNota: Coloque https:// antes del enlace de Portainer\e[0m" | |
| read -p "Ingrese la URL de Portainer (ej: portainer.sociosdigitales.pro): " PORTAINER_URL | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 2/3\e[0m" | |
| read -p "Ingrese su Usuario (ej: admin): " USUARIO | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 3/3\e[0m" | |
| echo -e "\e[97mNota: La contraseña no se mostrará al escribir\e[0m" | |
| read -s -p "Ingrese la Contraseña (ej: @Contraseña123_): " SENHA | |
| echo "" | |
| ATUALIZAR="true" ## Verificar si ya existe TOKEN en el archivo | |
| verificar_token "$PORTAINER_URL" "$USUARIO" "$SENHA" true | |
| ## Si el usuario o contraseña es "Precisa criar dentro do portainer" | |
| elif [ "$USUARIO" == "Precisa criar dentro do portainer" ] || [ "$SENHA" == "Precisa criar dentro do portainer" ]; then | |
| nome_credenciais | |
| echo -e "\e[97mPaso$amarelo 1/3\e[0m" | |
| #echo -e "\e[97mNota: Coloque https:// antes del enlace de Portainer\e[0m" | |
| read -p "Ingrese la URL de Portainer (ej: portainer.sociosdigitales.pro): " PORTAINER_URL | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 2/3\e[0m" | |
| read -p "Ingrese su Usuario (ej: admin): " USUARIO | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 3/3\e[0m" | |
| echo -e "\e[97mNota: La contraseña no se mostrará al escribir\e[0m" | |
| read -s -p "Ingrese la Contraseña (ej: @Contraseña123_): " NOVA_SENHA | |
| echo "" | |
| verificar_token "$PORTAINER_URL" "$NOVO_USUARIO" "$NOVA_SENHA" true | |
| else | |
| verificar_token "$PORTAINER_URL" "$USUARIO" "$SENHA" false | |
| fi | |
| } | |
| ## Função para verificar se o token é válido | |
| verificar_token() { | |
| PORTAINER_URL="$1" | |
| USUARIO="$2" | |
| SENHA="$3" | |
| ATUALIZAR="$4" | |
| TENTATIVAS=0 | |
| MAX_TENTATIVAS=5 | |
| while [ $TENTATIVAS -lt $MAX_TENTATIVAS ]; do | |
| TENTATIVAS=$((TENTATIVAS+1)) | |
| #echo -e "Dados a serem testados:" | |
| #echo "Link do Portainer: $PORTAINER_URL" | |
| #echo "Usuário: $USUARIO" | |
| #echo "Senha: $SENHA" | |
| RESPONSE=$(curl -s -w "\n%{http_code}" -k -X POST -H "Content-Type: application/json" -d "{\"username\":\"$USUARIO\",\"password\":\"$SENHA\"}" "https://$PORTAINER_URL/api/auth") | |
| TOKEN=$(echo "$RESPONSE" | sed '$d' | jq -r '.jwt') | |
| HTTP_STATUS=$(echo "$RESPONSE" | tail -n1) | |
| if [ "$HTTP_STATUS" -eq 200 ] && [ ! -z "$TOKEN" ]; then | |
| if [ "$ATUALIZAR" == true ]; then | |
| atualizar_arquivo | |
| fi | |
| $APP_ORION | |
| break | |
| else | |
| if [ $TENTATIVAS -gt 1 ]; then | |
| clear | |
| erro_msg | |
| echo "" | |
| echo "" | |
| echo " Não foi possivel autenticar suas credenciais. Por favor tente novamente" | |
| echo " Tentativa: $TENTATIVAS/$MAX_TENTATIVAS" | |
| sleep 3 | |
| else | |
| clear | |
| nome_credenciais | |
| fi | |
| if [ $TENTATIVAS -lt $MAX_TENTATIVAS ]; then | |
| nome_credenciais | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| #echo -e "\e[97mObs: Coloque o https:// antes do link do portainer\e[0m" | |
| read -p "Digite a Url do Portainer (ex: portainer.sociosdigitales.pro): " PORTAINER_URL | |
| echo "" | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| read -p "Digite seu Usuario (ex: admin): " USUARIO | |
| echo "" | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -e "\e[97mObs: A Senha não aparecera ao digitar\e[0m" | |
| read -s -p "Digite a Senha (ex: @Senha123_): " SENHA | |
| echo "" | |
| ATUALIZAR="true" | |
| else | |
| clear | |
| erro_msg | |
| echo "" | |
| echo "" | |
| echo " Você atingiu o limite maximo de tentativas ($TENTATIVAS/$MAX_TENTATIVAS)." | |
| echo " Tente novamente quando lembrar da sua credencial!" | |
| echo 5 | |
| clear | |
| break | |
| fi | |
| fi | |
| done | |
| } | |
| ## Função para atualizar o arquivo de dados do Portainer com o novo usuário e senha | |
| atualizar_arquivo() { | |
| echo -e "[ PORTAINER ]\nDominio do portainer: $PORTAINER_URL\n\nUsuario: $USUARIO\n\nSenha: $SENHA\n\nToken: $TOKEN" > "/root/dados_vps/dados_portainer" | |
| echo -e "\nArquivo de dados do Portainer atualizado com sucesso!" | |
| } | |
| telemetria() { | |
| ## Pega o IP da máquina | |
| read -r ip _ <<< "$(hostname -I)" | |
| ip="$ip" | |
| ferramenta="$1" | |
| status="$2" | |
| curl --max-time 30 -X POST 'https://telemetria.sociosdigitales.pro/api/telemetria' \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "ip": "'"$ip"'", | |
| "ferramenta": "'"$ferramenta"'", | |
| "status": "'"$status"'" | |
| }' > /dev/null 2>&1 | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Verificadores | |
| ## Verifica se existe Docker, Portainer e Traefik na VPS | |
| verificar_docker_e_portainer_traefik() { | |
| ## Verifica si Docker está instalado | |
| if ! command -v docker &> /dev/null; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que no has instalado la opción \e[32m[1] Traefik y Portainer${reset} ${branco}de nuestro instalador.${reset}" | |
| echo "Instálalo antes de intentar instalar esta aplicación." | |
| echo "" | |
| echo "Volviendo al menú en 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| ## Verifica si Portainer está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "portainer"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que no has instalado la opción \e[32m[1] Traefik y Portainer${reset} ${branco}de nuestro instalador.${reset}" | |
| echo "Instálalo antes de intentar instalar esta aplicación." | |
| echo "" | |
| echo "Volviendo al menú en 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| ## Verifica si Traefik está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "traefik"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que no has instalado la opción \e[32m[1] Traefik y Portainer${reset} ${branco}de nuestro instalador.${reset}" | |
| echo "Instálalo antes de intentar instalar esta aplicación." | |
| echo "" | |
| echo "Volviendo al menú en 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verifica se existe Minio | |
| verificar_antes_se_tem_minio() { | |
| ## Verifica se o Portainer está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "minio"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 4 ] - MinIO${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| verificar_antes_se_tem_clickhouse() { | |
| ## Verifica se o Portainer está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "clickhouse"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 60 ] - ClickHouse${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verifica se existe rabbitMQ | |
| verificar_antes_se_tem_rabbitmq() { | |
| ## Verifica se o Portainer está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "rabbitmq"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 14 ] - RabbitMQ${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verifica se existe Minio RabbitMQ e Chatwoot | |
| verificar_antes_se_tem_minio_e_rabbitmq_e_chatwoot() { | |
| ## Verifica se o minio está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "minio"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 4 ] - MinIO${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| ## Verifica se o rabbitmq está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "rabbitmq"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 14 ] - RabbitMQ${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| ## Verificar se o chatwoot está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "chatwoot"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 2 ] - Chatwoot${reset} ou \e[32m[ 26 ] - Chatwoot Nestor (ft. Francis) ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verifica se existe Minio e Qdrant | |
| verificar_antes_se_tem_minio_e_qdrant() { | |
| ## Verifica se o minio está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "minio"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 4 ] - MinIO${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| ## Verifica se o rabbitmq está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "qdrant"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 19 ] - Qdrant${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verifica se existe Minio | |
| verificar_antes_se_tem_mongo() { | |
| ## Verifica se o Portainer está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "mongodb"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 13 ] - MongoDB${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verifica se existe Qdrant | |
| verificar_antes_se_tem_qdrant() { | |
| ## Verifica se o Portainer está instalado | |
| if ! docker ps -a --format "{{.Names}}" | grep -q "qdrant"; then | |
| clear | |
| erro_msg | |
| echo -e "Ops, parece que você não instalou a opção \e[32m[ 19 ] - Qdrant${reset} ${branco}do nosso instalador.${reset}" | |
| echo "Instale antes de tentar instalar esta aplicação." | |
| echo "" | |
| echo "Voltando ao menu em 5 segundos." | |
| sleep 5 | |
| nome_menu | |
| menu_instalador | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## Verificar Container Postgres | |
| verificar_container_postgres() { | |
| if docker ps -q --filter "name=postgres_postgres" | grep -q .; then | |
| return 0 | |
| else | |
| return 1 | |
| fi | |
| } | |
| ## Verificar Container PgVector | |
| verificar_container_pgvector() { | |
| if docker ps -q --filter "name=pgvector_pgvector" | grep -q .; then | |
| return 0 | |
| else | |
| return 1 | |
| fi | |
| } | |
| ## Verificar Container Mysql | |
| verificar_container_mysql() { | |
| if docker ps -q --filter "name=mysql_mysql" | grep -q .; then | |
| return 0 | |
| else | |
| return 1 | |
| fi | |
| } | |
| ## Verificar Container Redis | |
| verificar_container_redis() { | |
| if docker ps -q --filter "name=redis_redis" | grep -q .; then | |
| return 0 | |
| else | |
| return 1 | |
| fi | |
| } | |
| ## Verificar Container Minio | |
| verificar_container_minio() { | |
| if docker ps -q --filter "name=minio_minio" | grep -q .; then | |
| return 0 | |
| else | |
| return 1 | |
| fi | |
| } | |
| ## Esperar Postgres estar pronto | |
| wait_for_postgres() { | |
| dados | |
| local container_name="postgres_postgres" | |
| while true; do | |
| CONTAINER_ID=$(docker ps -q --filter "name=.*$container_name.*") | |
| if [ -n "$CONTAINER_ID" ]; then | |
| break | |
| fi | |
| sleep 5 | |
| done | |
| } | |
| wait_for_pgvector() { | |
| dados | |
| local container_name="pgvector_pgvector" | |
| while true; do | |
| CONTAINER_ID=$(docker ps -q --filter "name=.*$container_name.*") | |
| if [ -n "$CONTAINER_ID" ]; then | |
| break | |
| fi | |
| sleep 5 | |
| done | |
| } | |
| ## Verificar se o Traefik esta online | |
| wait_30_sec() { | |
| sleep 30 | |
| } | |
| #wait_stack() { | |
| # echo "Este processo pode demorar um pouco. Se levar mais de 5 minutos, cancele, pois algo deu errado." | |
| # while true; do | |
| # # Verifica se o serviço trarik está ativo | |
| # if docker service ls --filter "name=$1" | grep "1/1"; then | |
| # sleep 10 | |
| # echo "" | |
| # break | |
| # fi | |
| # | |
| # sleep 5 | |
| # done | |
| #} | |
| wait_stack() { | |
| echo "Este proceso puede tardar un poco. Si lleva más de 5 minutos, cancélelo, pues algo salió mal." | |
| declare -A services_status | |
| # Inicializa o status de todos os serviços como "pendente" | |
| for service in "$@"; do | |
| services_status["$service"]="pendente" | |
| done | |
| while true; do | |
| all_active=true | |
| for service in "${!services_status[@]}"; do | |
| if docker service ls --filter "name=$service" | grep -q "1/1"; then | |
| if [ "${services_status["$service"]}" != "ativo" ]; then | |
| echo -e "🟢 El servicio \e[32m$service\e[0m está online." | |
| services_status["$service"]="ativo" | |
| fi | |
| else | |
| if [ "${services_status["$service"]}" != "pendente" ]; then | |
| services_status["$service"]="pendente" | |
| fi | |
| all_active=false | |
| fi | |
| done | |
| # Sai do loop quando todos os serviços estiverem ativos | |
| if $all_active; then | |
| sleep 1 | |
| break | |
| fi | |
| sleep 30 | |
| echo "" | |
| done | |
| } | |
| #pull() { | |
| # | |
| # for image in "$@"; do | |
| # if docker pull "$image" > /dev/null 2>&1; then | |
| # sleep 1 | |
| # else | |
| # echo "*" | |
| # sleep 1 | |
| # fi | |
| # done | |
| #} | |
| pull() { | |
| for image in "$@"; do | |
| while true; do | |
| if docker pull "$image" > /dev/null 2>&1; then | |
| sleep 1 | |
| break | |
| else | |
| echo "Erro ao baixar $image. Tentando novamente..." | |
| # Verifica se o erro é relacionado a limite de taxa | |
| if docker pull "$image" 2>&1 | grep -q "toomanyrequests"; then | |
| echo "Limite de taxa atingido no Docker Hub. Faça login para continuar." | |
| docker login | |
| else | |
| echo "Erro desconhecido. Tentando novamente em 5s..." | |
| sleep 5 | |
| fi | |
| fi | |
| done | |
| done | |
| } | |
| requisitar_outra_instalacao(){ | |
| read -p "¿Desea instalar otra aplicación? (Y/N): " choice | |
| if [ "$choice" = "Y" ] || [ "$choice" = "y" ]; then | |
| return | |
| else | |
| cd | |
| cd | |
| clear | |
| exit 1 | |
| fi | |
| } | |
| esconder_senha() { | |
| local senha="$1" | |
| local tamanho=${#senha} | |
| if (( tamanho > 55 )); then | |
| SENHAOCULTA=$(printf '%*s' 55 '' | tr ' ' '*') | |
| else | |
| SENHAOCULTA=$(printf '%*s' "$tamanho" '' | tr ' ' '*') | |
| fi | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Pegar informações | |
| ## Pegar senha Postgres | |
| pegar_senha_postgres() { | |
| while :; do | |
| if [ -f /root/postgres.yaml ]; then | |
| senha_postgres=$(grep "POSTGRES_PASSWORD" /root/postgres.yaml | awk -F '=' '{print $2}') | |
| break | |
| else | |
| sleep 5 | |
| fi | |
| done | |
| } | |
| pegar_senha_pgvector() { | |
| while :; do | |
| if [ -f /root/pgvector.yaml ]; then | |
| senha_pgvector=$(grep "POSTGRES_PASSWORD" /root/pgvector.yaml | awk -F '=' '{print $2}') | |
| break | |
| else | |
| sleep 5 | |
| fi | |
| done | |
| } | |
| pegar_user_senha_rabbitmq() { | |
| while :; do | |
| if [ -f /root/rabbitmq.yaml ]; then | |
| user_rabbit_mqs=$(grep "RABBITMQ_DEFAULT_USER" /root/rabbitmq.yaml | awk -F ': ' '{print $2}') | |
| senha_rabbit_mqs=$(grep "RABBITMQ_DEFAULT_PASS" /root/rabbitmq.yaml | awk -F ': ' '{print $2}') | |
| break | |
| else | |
| sleep 5 | |
| echo "erro" | |
| fi | |
| done | |
| } | |
| ## Pegar senha Mysql | |
| pegar_senha_mysql() { | |
| while :; do | |
| if [ -f /root/mysql.yaml ]; then | |
| senha_mysql=$(grep "MYSQL_ROOT_PASSWORD" /root/mysql.yaml | awk -F '=' '{print $2}') | |
| break | |
| else | |
| sleep 5 | |
| fi | |
| done | |
| } | |
| ## Pegar senha Minio | |
| pegar_senha_minio() { | |
| user_minio=$(grep "MINIO_ROOT_USER" /root/minio.yaml | awk -F '=' '{print $2}') | |
| senha_minio=$(grep "MINIO_ROOT_PASSWORD" /root/minio.yaml | awk -F '=' '{print $2}') | |
| url_minio=$(grep "MINIO_BROWSER_REDIRECT_URL" /root/minio.yaml | awk -F '=' '{print $2}' | sed 's/https:\/\///') | |
| url_s3=$(grep "MINIO_SERVER_URL" /root/minio.yaml | awk -F '=' '{print $2}' | sed 's/https:\/\///') | |
| } | |
| ## Pegar link S3 | |
| pegar_link_s3() { | |
| url_s3=$(grep "MINIO_SERVER_URL" /root/minio.yaml | awk -F '=' '{print $2}' | sed 's/https:\/\///') | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Criadores de banco de dados Postgres | |
| criar_banco_postgres_da_stack() { | |
| while :; do | |
| if docker ps -q --filter "name=^postgres_postgres" | grep -q .; then | |
| CONTAINER_ID=$(docker ps -q --filter "name=^postgres_postgres") | |
| # Verificar se o banco de dados já existe | |
| docker exec "$CONTAINER_ID" psql -U postgres -lqt | cut -d \| -f 1 | grep -qw "$1" | |
| if [ $? -eq 0 ]; then | |
| ## echo "" | |
| read -p "O banco de dados $1 já existe. Deseja apagar e criar um novo banco de dados? (Y/N): " resposta | |
| if [ "$resposta" == "Y" ] || [ "$resposta" == "y" ]; then | |
| # Apagar o banco de dados | |
| docker exec "$CONTAINER_ID" psql -U postgres -c "DROP DATABASE IF EXISTS $1(force);" > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "" ## Sucesso | |
| else | |
| echo "" ## Erro | |
| fi | |
| # Criar o banco de dados novamente | |
| docker exec "$CONTAINER_ID" psql -U postgres -c "CREATE DATABASE $1;" > /dev/null 2>&1 | |
| else | |
| echo "" | |
| fi | |
| break | |
| else | |
| # Criar o banco de dados | |
| docker exec "$CONTAINER_ID" psql -U postgres -c "CREATE DATABASE $1;" > /dev/null 2>&1 | |
| # Verificar novamente se o banco de dados foi criado com sucesso | |
| docker exec "$CONTAINER_ID" psql -U postgres -lqt | cut -d \| -f 1 | grep -qw "$1" | |
| if [ $? -eq 0 ]; then | |
| nada="nada" | |
| break | |
| else | |
| echo "Erro ao criar o banco de dados. Tentando novamente..." | |
| echo "" | |
| fi | |
| fi | |
| else | |
| sleep 5 | |
| fi | |
| done | |
| } | |
| ## Criar banco PgVector | |
| criar_banco_pgvector_da_stack() { | |
| while :; do | |
| if docker ps -q --filter "name=^pgvector_pgvector" | grep -q .; then | |
| CONTAINER_PGVECTOR_ID=$(docker ps -q --filter "name=^pgvector_pgvector") | |
| # Verificar se o banco de dados já existe | |
| docker exec "$CONTAINER_PGVECTOR_ID" psql -U postgres -lqt | cut -d \| -f 1 | grep -qw "$1" | |
| if [ $? -eq 0 ]; then | |
| echo "" | |
| read -p "O banco de dados $1 já existe. Deseja apagar e criar um novo banco de dados? (Y/N): " resposta | |
| if [ "$resposta" == "Y" ] || [ "$resposta" == "y" ]; then | |
| # Apagar o banco de dados | |
| docker exec "$CONTAINER_PGVECTOR_ID" psql -U postgres -c "DROP DATABASE IF EXISTS $1(force);" > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "" ## Sucesso | |
| else | |
| echo "" ## Erro | |
| fi | |
| # Criar o banco de dados novamente | |
| docker exec "$CONTAINER_PGVECTOR_ID" psql -U postgres -c "CREATE DATABASE $1;" > /dev/null 2>&1 | |
| else | |
| echo "" | |
| fi | |
| break | |
| else | |
| # Criar o banco de dados | |
| docker exec "$CONTAINER_PGVECTOR_ID" psql -U postgres -c "CREATE DATABASE $1;" > /dev/null 2>&1 | |
| # Verificar novamente se o banco de dados foi criado com sucesso | |
| docker exec "$CONTAINER_PGVECTOR_ID" psql -U postgres -lqt | cut -d \| -f 1 | grep -qw "$1" | |
| if [ $? -eq 0 ]; then | |
| nada="nada" | |
| break | |
| else | |
| echo "Erro ao criar o banco de dados. Tentando novamente..." | |
| echo "" | |
| fi | |
| fi | |
| else | |
| sleep 5 | |
| fi | |
| done | |
| } | |
| ## Criar banco MySQL | |
| criar_banco_mysql_da_stack() { | |
| while :; do | |
| if docker ps -q --filter "name=^mysql_mysql" | grep -q .; then | |
| CONTAINER_ID=$(docker ps -q --filter "name=^mysql_mysql") | |
| # Verificar se o banco de dados já existe | |
| docker exec -e MYSQL_PWD="$senha_mysql" "$CONTAINER_ID" mysql -u root \ | |
| -e "SHOW DATABASES LIKE '$1';" | grep -qw "$1" | |
| if [ $? -eq 0 ]; then | |
| echo "" | |
| read -p "O banco de dados $1 já existe. Deseja apagar e criar \ | |
| um novo banco de dados? (Y/N): " resposta | |
| if [ "$resposta" == "Y" ] || [ "$resposta" == "y" ]; then | |
| # Apagar o banco de dados | |
| docker exec -e MYSQL_PWD="$senha_mysql" "$CONTAINER_ID" mysql -u root \ | |
| -e "DROP DATABASE IF EXISTS $1;" > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "" ## Sucesso | |
| else | |
| echo "" ## Erro | |
| fi | |
| # Criar o banco de dados novamente | |
| docker exec -e MYSQL_PWD="$senha_mysql" "$CONTAINER_ID" mysql -u root \ | |
| -e "CREATE DATABASE $1;" > /dev/null 2>&1 | |
| else | |
| echo "" | |
| fi | |
| break | |
| else | |
| # Criar o banco de dados | |
| docker exec -e MYSQL_PWD="$senha_mysql" "$CONTAINER_ID" mysql -u root \ | |
| -e "CREATE DATABASE $1;" > /dev/null 2>&1 | |
| # Verificar se o banco foi criado com sucesso | |
| docker exec -e MYSQL_PWD="$senha_mysql" "$CONTAINER_ID" mysql -u root \ | |
| -e "SHOW DATABASES LIKE '$1';" | grep -qw "$1" | |
| if [ $? -eq 0 ]; then | |
| nada="nada" | |
| break | |
| else | |
| echo "Erro ao criar o banco de dados. Tentando novamente..." | |
| echo "" | |
| fi | |
| fi | |
| else | |
| echo "Container MySQL não encontrado. Tentando novamente..." | |
| echo "" | |
| sleep 5 | |
| fi | |
| done | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| validar_senha() { | |
| senha=$1 | |
| tamanho_minimo=$2 | |
| tem_erro=0 | |
| mensagem_erro="" | |
| # Verifica comprimento mínimo | |
| if [ ${#senha} -lt $tamanho_minimo ]; then | |
| mensagem_erro+="\n- Senha precisa ter no mínimo $tamanho_minimo caracteres" | |
| tem_erro=1 | |
| fi | |
| # Verifica letra maiúscula | |
| if ! [[ $senha =~ [A-Z] ]]; then | |
| mensagem_erro+="\n- Falta pelo menos uma letra maiúscula" | |
| tem_erro=1 | |
| fi | |
| # Verifica letra minúscula | |
| if ! [[ $senha =~ [a-z] ]]; then | |
| mensagem_erro+="\n- Falta pelo menos uma letra minúscula" | |
| tem_erro=1 | |
| fi | |
| # Verifica número | |
| if ! [[ $senha =~ [0-9] ]]; then | |
| mensagem_erro+="\n- Falta pelo menos um número" | |
| tem_erro=1 | |
| fi | |
| # Verifica caracteres especiais permitidos | |
| if ! [[ $senha =~ [@_] ]]; then | |
| mensagem_erro+="\n- Falta pelo menos um caractere especial (@ ou _)" | |
| tem_erro=1 | |
| fi | |
| # Verifica caracteres não permitidos | |
| if [[ $senha =~ [^A-Za-z0-9@_] ]]; then | |
| mensagem_erro+="\n- Contém caracteres especiais não permitidos (use apenas @ ou _)" | |
| tem_erro=1 | |
| fi | |
| # Se houver erro, mostra as mensagens | |
| if [ $tem_erro -eq 1 ]; then | |
| echo -e "Senha inválida! Corrija os seguintes problemas:$mensagem_erro" | |
| return 1 | |
| fi | |
| return 0 | |
| } | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## SOCIOS DIGITALES PRO ## | |
| ## // ## // ## // ## // ## // ## // ## // ## //## // ## // ## // ## // ## // ## // ## // ## // ## | |
| ## Instalação das Ferramentas | |
| ## ████████╗███████╗███████╗████████╗███████╗ ███████╗███╗ ███╗████████╗██████╗ | |
| ## ╚══██╔══╝██╔════╝██╔════╝╚══██╔══╝██╔════╝ ██╔════╝████╗ ████║╚══██╔══╝██╔══██╗ | |
| ## ██║ █████╗ ███████╗ ██║ █████╗ ███████╗██╔████╔██║ ██║ ██████╔╝ | |
| ## ██║ ██╔══╝ ╚════██║ ██║ ██╔══╝ ╚════██║██║╚██╔╝██║ ██║ ██╔═══╝ | |
| ## ██║ ███████╗███████║ ██║ ███████╗ ███████║██║ ╚═╝ ██║ ██║ ██║ | |
| ## ╚═╝ ╚══════╝╚══════╝ ╚═╝ ╚══════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ | |
| ferramenta_testeemail() { | |
| clear | |
| dados | |
| nome_testeemail | |
| preencha_as_info | |
| while true; do | |
| echo -e "\e[97mPasso$amarelo 1/5\e[0m" | |
| echo -en "\e[33mDigite o endereço de Email (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_teste | |
| echo "" | |
| echo -e "\e[97mPasso$amarelo 2/5\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o usuário de Email (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_teste | |
| echo "" | |
| echo -e "\e[97mPasso$amarelo 3/5\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha do email (ex: @Senha123_): \e[0m" && read -r senha_teste | |
| echo "" | |
| echo -e "\e[97mPasso$amarelo 4/5\e[0m" | |
| echo -en "\e[33mDigite o Host Smtp (ex: smtp.hostinger.com): \e[0m" && read -r host_teste | |
| echo "" | |
| echo -e "\e[97mPasso$amarelo 5/5\e[0m" | |
| echo -en "\e[33mDigite a Porta Smtp (ex: 465): \e[0m" && read -r porta_teste | |
| echo "" | |
| clear | |
| nome_testeemail | |
| conferindo_as_info | |
| echo -e "\e[33mEmail:\e[97m $email_teste\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuário:\e[97m $user_teste\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $senha_teste\e[0m" | |
| echo "" | |
| echo -e "\e[33mHost:\e[97m $host_teste\e[0m" | |
| echo "" | |
| echo -e "\e[33mPorta:\e[97m $porta_teste\e[0m" | |
| echo "" | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| clear | |
| nome_testando | |
| break | |
| else | |
| clear | |
| nome_testeemail | |
| preencha_as_info | |
| fi | |
| done | |
| #MENSAGEM DE INICIANDO (PASSOS) | |
| echo -e "\e[97m• INICIANDO VERIFICAÇÃO \e[33m[1/3]\e[0m" | |
| echo "" | |
| sudo apt-get update > /dev/null 2>&1 | |
| sudo apt-get install swaks -y > /dev/null 2>&1 | |
| msg="Si usted esta leyendo esto, su SMPT está funcionando =D. | |
| By: SociosPro" | |
| if swaks --to "$email_teste" --from "$email_teste" --server "$host_teste" --port "$porta_teste" --auth LOGIN --auth-user "$user_teste" --auth-password "$senha_teste" --tls --body "$msg"; then | |
| sleep 2 | |
| clear | |
| nome_testeemail | |
| echo -e "\e[32m[Resultado do Teste SMTP]\e[0m" | |
| echo "" | |
| echo -e "\e[33mOs dados informados\e[92m estão funcionando corretamente\e[33m.\e[0m" | |
| else | |
| sleep 2 | |
| clear | |
| nome_testeemail | |
| echo -e "\e[32m[Resultado do Teste SMTP]\e[0m" | |
| echo "" | |
| echo -e "\e[33mOs dados informados\e[91m NÃO estão funcionando corretamente.\e[33m Por favor, verifique os dados e tente novamente.\e[0m" | |
| fi | |
| creditos_msg | |
| read -p "¿Desea instalar otra aplicación? (Y/N): " choice | |
| if [ "$choice" = "Y" ] || [ "$choice" = "y" ]; then | |
| return | |
| else | |
| cd | |
| cd | |
| clear | |
| exit 1 | |
| fi | |
| } | |
| ## ████████╗██████╗ █████╗ ███████╗███████╗██╗██╗ ██╗ ███████╗ | |
| ## ╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██╔════╝██║██║ ██╔╝ ██╔════╝ | |
| ## ██║ ██████╔╝███████║█████╗ █████╗ ██║█████╔╝ █████╗ | |
| ## ██║ ██╔══██╗██╔══██║██╔══╝ ██╔══╝ ██║██╔═██╗ ██╔══╝ | |
| ## ██║ ██║ ██║██║ ██║███████╗██║ ██║██║ ██╗ ███████╗ | |
| ## ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝ | |
| ## | |
| ## ██████╗ ██████╗ ██████╗ ████████╗ █████╗ ██╗███╗ ██╗███████╗██████╗ | |
| ## ██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝██╔══██╗██║████╗ ██║██╔════╝██╔══██╗ | |
| ## ██████╔╝██║ ██║██████╔╝ ██║ ███████║██║██╔██╗ ██║█████╗ ██████╔╝ | |
| ## ██╔═══╝ ██║ ██║██╔══██╗ ██║ ██╔══██║██║██║╚██╗██║██╔══╝ ██╔══██╗ | |
| ## ██║ ╚██████╔╝██║ ██║ ██║ ██║ ██║██║██║ ╚████║███████╗██║ ██║ | |
| ## ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝ | |
| ferramenta_traefik_e_portainer() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_traefik_e_portainer | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPaso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Portainer (ej: portainer.sociosdigitales.pro): \e[0m" && read -r url_portainer | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPaso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mIngrese un usuario para Portainer (ej: admin): \e[0m" && read -r user_portainer | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| while true; do | |
| echo -e "\e[97mPaso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Mínimo 12 caracteres. Use letras MAYÚSCULAS y minúsculas, números y un carácter especial @ o _" | |
| echo -e "$amarelo--> Evite caracteres especiales como: \!#$" | |
| echo -en "\e[33mIngrese una contraseña para Portainer (ej: @Contraseña123456_): \e[0m" && read -r pass_portainer | |
| echo "" | |
| if validar_senha "$pass_portainer" 12; then | |
| break | |
| fi | |
| echo "" | |
| done | |
| ## Pergunta o Nome do Servidor | |
| echo -e "\e[97mPaso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> No puede contener espacios y/o caracteres especiales" | |
| echo -en "\e[33mElija un nombre para su servidor (ej: SociosPro): \e[0m" && read -r nome_servidor | |
| echo "" | |
| ## Pergunta o nome da Rede Interna | |
| echo -e "\e[97mPaso$amarelo 5/6\e[0m" | |
| echo -e "$amarelo--> No puede contener espacios y/o caracteres especiales." | |
| echo -en "\e[33mIngrese un nombre para su red interna (ej: SociosNet): \e[0m" && read -r nome_rede_interna | |
| echo "" | |
| ## Pergunta o Email para informações sobre o certificado | |
| echo -e "\e[97mPaso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mIngrese una dirección de correo válida (ej: contacto@sociosdigitales.pro): \e[0m" && read -r email_ssl | |
| echo "" | |
| ## Limpa o termianl | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_traefik_e_portainer | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mEnlace de Portainer:\e[97m $url_portainer\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mUsuario de Portainer:\e[97m $user_portainer\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mContraseña de Portainer:\e[97m $pass_portainer\e[0m" | |
| echo "" | |
| ## Informação sobre Nome do Servidor | |
| echo -e "\e[33mNombre del Servidor:\e[97m $nome_servidor\e[0m" | |
| echo "" | |
| ## Informação sobre Nome da Rede interna | |
| echo -e "\e[33mRed interna:\e[97m $nome_rede_interna\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mCorreo electrónico:\e[97m $email_ssl\e[0m" | |
| echo "" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_traefik_e_portainer | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE TRAEFIK \e[33m[1/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Neste passo vamos estar salvando os dados preenchidos anteriormente para que o instalador possa usar posteriormente na instalação de qualquer ferramenta. | |
| ## Garante que o usuario esteja no /root/ | |
| cd | |
| cd | |
| ## Verifica se já não existe uma pasta chamada "dados_vps", se existir ele ignora e se não existir ele cria uma | |
| ## Esta foi uma PR que veio do usuario Fabio => https://github.com/hipnologo | |
| if [ ! -d "dados_vps" ]; then | |
| mkdir dados_vps | |
| fi | |
| ## Fim da PR | |
| ## Abre a pasta dados_vps | |
| cd dados_vps | |
| ## Cria um arquivo chamado "dados_vps" com: "nome do servidor", "nome da rede interna", "email", "link do portainer" | |
| cat > dados_vps << EOL | |
| [DADOS DA VPS] | |
| Estos datos fueron ingresados cuando instaló Traefik y Portainer y | |
| serán utilizados para realizar las instalaciones en el SetupOrion v.2 | |
| Nombre del Servidor: $nome_servidor | |
| Red interna: $nome_rede_interna | |
| Correo para SSL: $email_ssl | |
| Enlace de Portainer: $url_portainer | |
| EOL | |
| ## Volta para /root/ | |
| cd | |
| cd | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• ACTUALIZANDO Y CONFIGURANDO LA VPS \e[33m[2/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Neste passo vamos estar Atualizando e configurando a vps para conseguir rodar nosso setup | |
| ## Todos os passo que estão com "> /dev/null 2>&1" São para não mostrar os logs. | |
| ## Fiz isso com o intuito de melhorar a visualização deixando o terminal apenas com os passos pré descritos | |
| ## Vou adicionar uma verificação com echo e o passo caso der algum problema para verificar. | |
| sudo apt-get update > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/9 - [ OK ] - Actualización" | |
| else | |
| echo "1/9 - [ OFF ] - Actualización" | |
| fi | |
| sudo apt upgrade -y > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "2/9 - [ OK ] - Actualización de paquetes" | |
| else | |
| echo "2/9 - [ OFF ] - Actualización de paquetes" | |
| fi | |
| sudo timedatectl set-timezone America/Sao_Paulo > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "3/9 - [ OK ] - Zona horaria" | |
| else | |
| echo "3/9 - [ OFF ] - Zona horaria" | |
| fi | |
| sudo apt-get install -y apt-utils > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "4/9 - [ OK ] - Apt-Utils" | |
| else | |
| echo "4/9 - [ OFF ] - Apt-Utils" | |
| fi | |
| sudo apt-get update > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "5/9 - [ OK ] - Actualización" | |
| else | |
| echo "5/9 - [ OFF ] - Actualización" | |
| fi | |
| hostnamectl set-hostname $nome_servidor > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "6/9 - [ OK ] - Configurar nombre del host" | |
| else | |
| echo "6/9 - [ OFF ] - Configurar nombre del host" | |
| fi | |
| sudo sed -i "s/127.0.0.1[[:space:]]localhost/127.0.0.1 $nome_servidor/g" /etc/hosts > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "7/9 - [ OK ] - Agregando nombre del servidor en etc/hosts" | |
| else | |
| echo "7/9 - [ OFF ] - Agregando nombre del servidor en etc/hosts" | |
| fi | |
| sudo apt-get update > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "8/9 - [ OK ] - Actualización" | |
| else | |
| echo "8/9 - [ OFF ] - Actualización" | |
| fi | |
| sudo apt-get install -y apparmor-utils > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "9/9 - [ OK ] - Apparmor-Utils" | |
| else | |
| echo "9/9 - [ OFF ] - Apparmor-Utils" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO DOCKER SWARM \e[33m[3/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Docker iniciado | |
| ## Nesse passo vamos estar instalando docker no modo swarm | |
| #ip=$(curl -s ifconfig.me) | |
| read -r ip _ <<<$(hostname -I | tr ' ' '\n' | grep -v '^127\.0\.0\.1' | grep -v '^10\.0\.0\.' | tr '\n' ' ') | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Obteniendo IP $ip" | |
| else | |
| echo "1/3 - [ OFF ] - Obteniendo IP $ip" | |
| fi | |
| curl -fsSL https://get.docker.com | bash > /dev/null 2>&1 | |
| systemctl enable docker > /dev/null 2>&1 | |
| systemctl start docker > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "2/3 - [ OK ] - Descargando e instalando Docker" | |
| else | |
| echo "2/3 - [ OFF ] - Descargando e instalando Docker" | |
| fi | |
| sleep 5 | |
| max_attempts=3 | |
| attempt=0 | |
| while [ $attempt -le $max_attempts ]; do | |
| docker swarm init --advertise-addr $ip > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "3/3 - [ OK ] - Iniciando Swarm" | |
| break | |
| else | |
| echo "3/3 - [ OFF ] - Iniciando Swarm" | |
| echo "No fue posible iniciar el swarm, intento $attempt de $max_attempts" | |
| attempt=$((attempt + 1)) | |
| sleep 5 | |
| fi | |
| done | |
| if [ $attempt -gt $max_attempts ]; then | |
| echo "No se pudo iniciar el Swarm después de $max_attempts intentos..." | |
| echo "Se recomienda formatear la VPS e intentar nuevamente" | |
| echo "Recuerde que el primer requisito es usar una VPS vacía." | |
| sleep 10 | |
| exit 1 | |
| fi | |
| echo "" | |
| telemetria Docker finalizado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• CREANDO RED INTERNA \e[33m[4/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Neste passo vamos criar a rede interna para utilizar nas demais aplicações | |
| docker network create --driver=overlay $nome_rede_interna > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Red Interna" | |
| else | |
| echo "1/1 - [ OFF ] - Red Interna" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO TRAEFIK \e[33m[5/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Traefik iniciado | |
| ## Neste passo vamos estar criando a Stack yaml do traefik na pasta /root/ | |
| ## Isso possibilitará que o usuario consiga edita-lo posteriormente | |
| ## Depois vamos instalar o traefik e verificar se esta tudo certo. | |
| ## Criando a stack traefik.yaml | |
| cat > traefik.yaml << EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| traefik: | |
| image: traefik:v2.11.2 | |
| command: | |
| - "--api.dashboard=true" | |
| - "--providers.docker.swarmMode=true" | |
| - "--providers.docker.endpoint=unix:///var/run/docker.sock" | |
| - "--providers.docker.exposedbydefault=false" | |
| - "--providers.docker.network=$nome_rede_interna" ## Nome da rede interna | |
| - "--entrypoints.web.address=:80" | |
| - "--entrypoints.web.http.redirections.entryPoint.to=websecure" | |
| - "--entrypoints.web.http.redirections.entryPoint.scheme=https" | |
| - "--entrypoints.web.http.redirections.entrypoint.permanent=true" | |
| - "--entrypoints.websecure.address=:443" | |
| - "--entrypoints.web.transport.respondingTimeouts.idleTimeout=3600" | |
| - "--certificatesresolvers.letsencryptresolver.acme.httpchallenge=true" | |
| - "--certificatesresolvers.letsencryptresolver.acme.httpchallenge.entrypoint=web" | |
| - "--certificatesresolvers.letsencryptresolver.acme.storage=/etc/traefik/letsencrypt/acme.json" | |
| - "--certificatesresolvers.letsencryptresolver.acme.email=$email_ssl" ## Email para receber as notificações | |
| - "--log.level=DEBUG" | |
| - "--log.format=common" | |
| - "--log.filePath=/var/log/traefik/traefik.log" | |
| - "--accesslog=true" | |
| - "--accesslog.filepath=/var/log/traefik/access-log" | |
| volumes: | |
| - "vol_certificates:/etc/traefik/letsencrypt" | |
| - "/var/run/docker.sock:/var/run/docker.sock:ro" | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ports: | |
| - target: 80 | |
| published: 80 | |
| mode: host | |
| - target: 443 | |
| published: 443 | |
| mode: host | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https" | |
| - "traefik.http.middlewares.redirect-https.redirectscheme.permanent=true" | |
| - "traefik.http.routers.http-catchall.rule=Host(\`{host:.+}\`)" | |
| - "traefik.http.routers.http-catchall.entrypoints=web" | |
| - "traefik.http.routers.http-catchall.middlewares=redirect-https@docker" | |
| - "traefik.http.routers.http-catchall.priority=1" | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| vol_shared: | |
| external: true | |
| name: volume_swarm_shared | |
| vol_certificates: | |
| external: true | |
| name: volume_swarm_certificates | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| attachable: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/2 - [ OFF ] - Creando Stack" | |
| echo "Error: No se pudo crear la stack de Traefik" | |
| fi | |
| docker stack deploy --prune --resolve-image always -c traefik.yaml traefik > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Desplegando Stack" | |
| else | |
| echo "2/2 - [ OFF ] - Desplegando Stack" | |
| echo "Error: No se pudo iniciar Traefik." | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• ESPERANDO QUE TRAEFIK ESTÉ EN LÍNEA \e[33m[6/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Usa o serviço wait_stack "traefik" para verificar se o serviço esta online | |
| wait_stack "traefik" | |
| telemetria Traefik finalizado | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO PORTAINER \e[33m[7/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Portainer iniciado | |
| ## Neste passo vamos estar criando a Stack yaml do Portainer na pasta /root/ | |
| ## Isso possibilitará que o usuario consiga edita-lo posteriormente | |
| ## Depois vamos instalar o Portainer e verificar se esta tudo certo. | |
| ## Criando a stack portainer.yaml | |
| cat > portainer.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| agent: | |
| image: portainer/agent:latest ## Versão Agent do Portainer | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock | |
| - /var/lib/docker/volumes:/var/lib/docker/volumes | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| deploy: | |
| mode: global | |
| placement: | |
| constraints: [node.platform.os == linux] | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| portainer: | |
| image: portainer/portainer-ce:latest ## Versão do Portainer | |
| command: -H tcp://tasks.agent:9001 --tlsskipverify | |
| volumes: | |
| - /var/run/docker.sock:/var/run/docker.sock | |
| - portainer_data:/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: [node.role == manager] | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.http.routers.portainer.rule=Host(\`$url_portainer\`)" ## Dominio do Portainer | |
| - "traefik.http.services.portainer.loadbalancer.server.port=9000" | |
| - "traefik.http.routers.portainer.tls.certresolver=letsencryptresolver" | |
| - "traefik.http.routers.portainer.service=portainer" | |
| - "traefik.docker.network=$nome_rede_interna" ## Nome da rede interna | |
| - "traefik.http.routers.portainer.entrypoints=websecure" | |
| - "traefik.http.routers.portainer.priority=1" | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| portainer_data: | |
| external: true | |
| name: portainer_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| attachable: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/2 - [ OFF ] - Creando Stack" | |
| echo "Error: No se pudo crear la stack de Portainer" | |
| fi | |
| docker stack deploy --prune --resolve-image always -c portainer.yaml portainer > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Desplegando Stack" | |
| else | |
| echo "2/2 - [ OFF ] - Desplegando Stack" | |
| echo "Error: No se pudo iniciar la stack de Portainer" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• ESPERANDO QUE PORTAINER ESTÉ EN LÍNEA \e[33m[8/9]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Usa o serviço wait_portainer para verificar se o serviço esta online | |
| wait_stack "portainer" | |
| sleep 5 | |
| telemetria Portainer finalizado | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• CREANDO CUENTA EN PORTAINER \e[33m[9/9]\e[0m" | |
| echo "" | |
| sleep 30 | |
| ## Tenta criar usuário no Portainer até 4 vezes | |
| MAX_RETRIES=4 | |
| DELAY=15 # Delay de 15 segundos entre as tentativas | |
| CONTA_CRIADA=false | |
| for i in $(seq 1 $MAX_RETRIES); do | |
| RESPONSE=$(curl -k -s -X POST "https://$url_portainer/api/users/admin/init" \ | |
| -H "Content-Type: application/json" \ | |
| -d "{\"Username\": \"$user_portainer\", \"Password\": \"$pass_portainer\"}") | |
| # Verificar se o campo "Username" existe na resposta | |
| if echo "$RESPONSE" | grep -q "\"Username\":\"$user_portainer\""; then | |
| echo "1/2 - [ OK ] - ¡Cuenta de administrador creada con éxito!" | |
| CONTA_CRIADA=true | |
| break | |
| else | |
| echo "Intentando crear cuenta en Portainer $i/4." | |
| # Se for a última tentativa, exibe mensagem de erro final | |
| if [ $i -eq $MAX_RETRIES ]; then | |
| echo "1/2 - [ OFF ] - No se pudo crear la cuenta de administrador después de $MAX_RETRIES intentos." | |
| echo "Error devuelto: $RESPONSE" | |
| echo -e "\e[33mDespués de completar la instalación, por favor, cree una cuenta accediendo al enlace de su Portainer" | |
| CONTA_CRIADA=false | |
| sleep 10 | |
| fi | |
| sleep $DELAY | |
| fi | |
| done | |
| # Só tenta criar o token se a conta foi criada com sucesso | |
| if [ "$CONTA_CRIADA" = true ]; then | |
| sleep 5 | |
| ## Cria primeiro token do Portainer | |
| token=$(curl -k -s -X POST "https://$url_portainer/api/auth" \ | |
| -H "Content-Type: application/json" \ | |
| -d "{\"username\":\"$user_portainer\",\"password\":\"$pass_portainer\"}" | jq -r .jwt) | |
| # Verifica se o token foi gerado com sucesso | |
| if [ -n "$token" ] && [ "$token" != "null" ]; then | |
| echo "2/2 - [ OK ] - Generando primer token" | |
| else | |
| echo "2/2 - [ OFF ] - Error al generar el token" | |
| exit 1 | |
| fi | |
| fi | |
| sleep 5 | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| if [ "$CONTA_CRIADA" = true ]; then | |
| cat > dados_portainer <<EOL | |
| [ PORTAINER ] | |
| Enlace de Portainer: https://$url_portainer | |
| Usuario: $user_portainer | |
| Contraseña: $pass_portainer | |
| Token: $token | |
| EOL | |
| else | |
| cat > dados_portainer <<EOL | |
| [ PORTAINER ] | |
| Enlace de Portainer: https://$url_portainer | |
| Usuario: Debe crearse dentro de Portainer | |
| Contraseña: Debe crearse dentro de Portainer | |
| EOL | |
| fi | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ PORTAINER ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mEnlace de Portainer:\e[33m https://$url_portainer\e[0m" | |
| echo "" | |
| if [ "$CONTA_CRIADA" = true ]; then | |
| echo -e "\e[97mUsuario:\e[33m $user_portainer\e[0m" | |
| echo "" | |
| echo -e "\e[97mContraseña:\e[33m $pass_portainer\e[0m" | |
| else | |
| echo -e "\e[97mUsuario:\e[33m Debe crearse dentro de Portainer\e[0m" | |
| echo "" | |
| echo -e "\e[97mContraseña:\e[33m Debe crearse dentro de Portainer\e[0m" | |
| echo "" | |
| echo -e "\e[97mObservación:\e[33m Tiene menos de 5 minutos para crear una cuenta en Portainer, si\e[0m" | |
| echo -e "\e[33mexcede este tiempo, deberá volver al menú anterior (escribiendo: Y)\e[0m" | |
| echo -e "\e[33my en el menú de herramientas escribir: \e[97mportainer.restart\e[0m" | |
| fi | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗███████╗ | |
| ## ██╔══██╗██╔═══██╗██╔════╝╚══██╔══╝██╔════╝ ██╔══██╗██╔════╝██╔════╝ | |
| ## ██████╔╝██║ ██║███████╗ ██║ ██║ ███╗██████╔╝█████╗ ███████╗ | |
| ## ██╔═══╝ ██║ ██║╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ ╚════██║ | |
| ## ██║ ╚██████╔╝███████║ ██║ ╚██████╔╝██║ ██║███████╗███████║ | |
| ## ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
| ferramenta_postgres() { | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| telemetria Postgres iniciado | |
| ## Gerando uma senha aleatória para o Postgres | |
| senha_postgres=$(openssl rand -hex 16) | |
| ## Criando a stack postgres.yaml | |
| cat > postgres.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| postgres: | |
| image: postgres:14 ## Versão do postgres | |
| volumes: | |
| - postgres_data:/var/lib/postgresql/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 5432:5432 | |
| environment: | |
| ## Senha do postgres | |
| - POSTGRES_PASSWORD=$senha_postgres | |
| - PG_MAX_CONNECTIONS=500 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| postgres_data: | |
| external: true | |
| name: postgres_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Postgres" | |
| fi | |
| STACK_NAME="postgres" | |
| stack_editavel #> /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c postgres.yaml postgres > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do Postgres." | |
| #fi | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_postgres <<EOL | |
| [ POSTGRES ] | |
| Dominio do postgres: postgres://postgres:5432 | |
| Usuario: postgres | |
| Senha: $senha_postgres | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_stack "postgres_postgres" | |
| telemetria Postgres finalizado | |
| echo "" | |
| } | |
| ## ██████╗ ██████╗ ███████╗████████╗ ██████╗ ██████╗ ███████╗███████╗ | |
| ## ██╔══██╗██╔═══██╗██╔════╝╚══██╔══╝██╔════╝ ██╔══██╗██╔════╝██╔════╝ | |
| ## ██████╔╝██║ ██║███████╗ ██║ ██║ ███╗██████╔╝█████╗ ███████╗ | |
| ## ██╔═══╝ ██║ ██║╚════██║ ██║ ██║ ██║██╔══██╗██╔══╝ ╚════██║ | |
| ## ██║ ╚██████╔╝███████║ ██║ ╚██████╔╝██║ ██║███████╗███████║ | |
| ## ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
| ## | |
| ## ███████╗███████╗████████╗██╗ ██╗██████╗ | |
| ## ██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔══██╗ | |
| ## ███████╗█████╗ ██║ ██║ ██║██████╔╝ | |
| ## ╚════██║██╔══╝ ██║ ██║ ██║██╔═══╝ | |
| ## ███████║███████╗ ██║ ╚██████╔╝██║ | |
| ## ╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ | |
| ferramenta_postgres_setup() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE POSTGRES \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Postgres iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO POSTGRES \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Gerando uma senha aleatória para o Postgres | |
| senha_postgres=$(openssl rand -hex 16) | |
| ## Criando a stack postgres.yaml | |
| cat > postgres${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| postgres${1:+_$1}: | |
| image: postgres:14 ## Versão do postgres | |
| volumes: | |
| - postgres${1:+_$1}_data:/var/lib/postgresql/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 2587:5432 | |
| environment: | |
| ## Senha do postgres | |
| - POSTGRES_PASSWORD=$senha_postgres | |
| #- PG_MAX_CONNECTIONS=500 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| postgres${1:+_$1}_data: | |
| external: true | |
| name: postgres${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Postgres" | |
| fi | |
| STACK_NAME="postgres${1:+_$1}" | |
| stack_editavel #> /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| wait_stack "postgres${1:+_$1}_postgres${1:+_$1}" | |
| telemetria Postgres finalizado | |
| #docker stack deploy --prune --resolve-image always -c postgres.yaml postgres > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, no fue posible levantar la stack de Postgres." | |
| #fi | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_postgres${1:+_$1} <<EOL | |
| [ POSTGRES ] | |
| Dominio de postgres: postgres://postgres${1:+_$1}:5432 | |
| Usuario: postgres | |
| Contraseña: $senha_postgres | |
| EOL | |
| cd | |
| cd | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ POSTGRES ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio de postgres:\e[33m postgres://postgres${1:+_$1}:5432\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m postgres\e[0m" | |
| echo "" | |
| echo -e "\e[97mContraseña:\e[33m $senha_postgres\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ██╗ ██╗███████╗ ██████╗████████╗ ██████╗ ██████╗ | |
| ## ██╔══██╗██╔════╝ ██║ ██║██╔════╝██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗ | |
| ## ██████╔╝██║ ███╗ ██║ ██║█████╗ ██║ ██║ ██║ ██║██████╔╝ | |
| ## ██╔═══╝ ██║ ██║ ╚██╗ ██╔╝██╔══╝ ██║ ██║ ██║ ██║██╔══██╗ | |
| ## ██║ ╚██████╔╝ ╚████╔╝ ███████╗╚██████╗ ██║ ╚██████╔╝██║ ██║ | |
| ## ╚═╝ ╚═════╝ ╚═══╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ | |
| ferramenta_pgvector() { | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| telemetria PgVector iniciado | |
| ## Gerando uma senha aleatória para o Postgres | |
| senha_pgvector=$(openssl rand -hex 16) | |
| ## Criando a stack pgvector.yaml | |
| cat > pgvector.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| pgvector: | |
| image: pgvector/pgvector:pg16 ## Versão do PgVector | |
| volumes: | |
| - pgvector:/var/lib/postgresql/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 5433:5432 | |
| environment: | |
| ## Senha do postgres | |
| - POSTGRES_PASSWORD=$senha_pgvector | |
| ## Maximo de Conexões | |
| #- PG_MAX_CONNECTIONS=500 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| pgvector: | |
| external: true | |
| name: pgvector | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do PgVector" | |
| fi | |
| STACK_NAME="pgvector" | |
| stack_editavel #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do PgVector." | |
| #fi | |
| #docker stack deploy --prune --resolve-image always -c pgvector.yaml pgvector > /dev/null 2>&1 | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_pgvector <<EOL | |
| [ PGVECTOR ] | |
| Dominio do pgvector: postgres://pgvector:5432 | |
| Usuario: postgres | |
| Senha: $senha_pgvector | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_stack "pgvector_pgvector" | |
| sleep 20 | |
| telemetria PgVector finalizado | |
| echo "" | |
| } | |
| ## ██████╗ ██████╗ ██╗ ██╗███████╗ ██████╗████████╗ ██████╗ ██████╗ | |
| ## ██╔══██╗██╔════╝ ██║ ██║██╔════╝██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗ | |
| ## ██████╔╝██║ ███╗ ██║ ██║█████╗ ██║ ██║ ██║ ██║██████╔╝ | |
| ## ██╔═══╝ ██║ ██║ ╚██╗ ██╔╝██╔══╝ ██║ ██║ ██║ ██║██╔══██╗ | |
| ## ██║ ╚██████╔╝ ╚████╔╝ ███████╗╚██████╗ ██║ ╚██████╔╝██║ ██║ | |
| ## ╚═╝ ╚═════╝ ╚═══╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ | |
| ## | |
| ## ███████╗███████╗████████╗██╗ ██╗██████╗ | |
| ## ██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔══██╗ | |
| ## ███████╗█████╗ ██║ ██║ ██║██████╔╝ | |
| ## ╚════██║██╔══╝ ██║ ██║ ██║██╔═══╝ | |
| ## ███████║███████╗ ██║ ╚██████╔╝██║ | |
| ## ╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ | |
| ferramenta_pgvector_setup() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE PGVECTOR \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria PgVector iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO PGVECTOR \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Gerando uma senha aleatória para o Postgres | |
| senha_pgvector=$(openssl rand -hex 16) | |
| ## Criando a stack do pgvector.yaml | |
| cat > pgvector${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| pgvector${1:+_$1}: | |
| image: pgvector/pgvector:pg16 ## Versão do PgVector | |
| volumes: | |
| - pgvector${1:+_$1}:/var/lib/postgresql/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 5433:5432 | |
| environment: | |
| ## Senha do postgres | |
| - POSTGRES_PASSWORD=$senha_pgvector | |
| ## Maximo de Conexões | |
| #- PG_MAX_CONNECTIONS=500 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| pgvector${1:+_$1}: | |
| external: true | |
| name: pgvector${1:+_$1} | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de PgVector" | |
| fi | |
| STACK_NAME="pgvector${1:+_$1}" | |
| stack_editavel #> /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| wait_stack "pgvector${1:+_$1}_pgvector${1:+_$1}" | |
| telemetria PgVector finalizado | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do PgVector." | |
| #fi | |
| #docker stack deploy --prune --resolve-image always -c pgvector.yaml pgvector > /dev/null 2>&1 | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_pgvector${1:+_$1} <<EOL | |
| [ PGVECTOR ] | |
| Dominio do pgvector: postgres://pgvector${1:+_$1}:5432 | |
| Usuario: postgres | |
| Senha: $senha_pgvector | |
| EOL | |
| cd | |
| cd | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ PGVECTOR ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio del PgVector:\e[33m postgres://pgvector${1:+_$1}:5432\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m postgres\e[0m" | |
| echo "" | |
| echo -e "\e[97mContraseña:\e[33m $senha_pgvector\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| cd | |
| cd | |
| } | |
| ## ██████╗ ███████╗██████╗ ██╗███████╗ | |
| ## ██╔══██╗██╔════╝██╔══██╗██║██╔════╝ | |
| ## ██████╔╝█████╗ ██║ ██║██║███████╗ | |
| ## ██╔══██╗██╔══╝ ██║ ██║██║╚════██║ | |
| ## ██║ ██║███████╗██████╔╝██║███████║ | |
| ## ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚══════╝ | |
| ferramenta_redis() { | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| telemetria Redis iniciado | |
| ## Criando a stack do redis.yaml | |
| cat > redis.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| redis: | |
| image: redis:latest ## Versão do Redis | |
| command: [ | |
| "redis-server", | |
| "--appendonly", | |
| "yes", | |
| "--port", | |
| "6379" | |
| ] | |
| volumes: | |
| - redis_data:/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 6379:6379 | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 2048M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| redis_data: | |
| external: true | |
| name: redis_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Redis" | |
| fi | |
| STACK_NAME="redis" | |
| stack_editavel #> /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c redis.yaml redis | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do Redis." | |
| #fi | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_redis <<EOL | |
| [ REDIS ] | |
| Dominio do Redis: redis://redis:6379 | |
| Usuario: redis | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_stack "redis_redis" | |
| telemetria Redis finalizado | |
| echo "" | |
| } | |
| ## ██████╗ ███████╗██████╗ ██╗███████╗ | |
| ## ██╔══██╗██╔════╝██╔══██╗██║██╔════╝ | |
| ## ██████╔╝█████╗ ██║ ██║██║███████╗ | |
| ## ██╔══██╗██╔══╝ ██║ ██║██║╚════██║ | |
| ## ██║ ██║███████╗██████╔╝██║███████║ | |
| ## ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚══════╝ | |
| ## | |
| ## ███████╗███████╗████████╗██╗ ██╗██████╗ | |
| ## ██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔══██╗ | |
| ## ███████╗█████╗ ██║ ██║ ██║██████╔╝ | |
| ## ╚════██║██╔══╝ ██║ ██║ ██║██╔═══╝ | |
| ## ███████║███████╗ ██║ ╚██████╔╝██║ | |
| ## ╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ | |
| ferramenta_redis_setup() { | |
| ## Verifica os recursos | |
| recursos 1 2 && continue || return | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE REDIS \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Redis iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO REDIS \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack do redis.yaml | |
| cat > redis${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| redis${1:+_$1}: | |
| image: redis:latest ## Versão do Redis | |
| command: [ | |
| "redis-server", | |
| "--appendonly", | |
| "yes", | |
| "--port", | |
| "6379" | |
| ] | |
| volumes: | |
| - redis${1:+_$1}_data:/data | |
| ## Descomente as linhas abaixo para uso externo | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| #ports: | |
| # - 6379:6379 | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 2048M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| redis${1:+_$1}_data: | |
| external: true | |
| name: redis${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "Ops, no se pudo crear la stack de Redis." | |
| fi | |
| sleep 1 | |
| STACK_NAME="redis${1:+_$1}" | |
| stack_editavel | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| wait_stack "redis${1:+_$1}_redis${1:+_$1}" | |
| telemetria Redis finalizado | |
| #stack_editavel > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c redis.yaml redis | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do Redis." | |
| #fi | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_redis${1:+_$1} <<EOL | |
| [ REDIS ] | |
| Dominio de Redis: redis://redis${1:+_$1}:6379 | |
| Usuario: redis | |
| EOL | |
| cd | |
| cd | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ REDIS ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mHost:\e[33m redis${1:+_$1}\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m redis\e[0m" | |
| echo "" | |
| echo -e "\e[97mPuerto:\e[33m 6379\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| cd | |
| cd | |
| } | |
| ## ███╗ ███╗██╗ ██╗███████╗ ██████╗ ██╗ | |
| ## ████╗ ████║╚██╗ ██╔╝██╔════╝██╔═══██╗██║ | |
| ## ██╔████╔██║ ╚████╔╝ ███████╗██║ ██║██║ | |
| ## ██║╚██╔╝██║ ╚██╔╝ ╚════██║██║▄▄ ██║██║ | |
| ## ██║ ╚═╝ ██║ ██║ ███████║╚██████╔╝███████╗ | |
| ## ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚══▀▀═╝ ╚══════╝ | |
| ferramenta_mysql() { | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| telemetria MySQL iniciado | |
| ## Gerando uma senha aleatória para o Mysql | |
| senha_mysql=$(openssl rand -hex 16) | |
| ## Criando a stack do mysql.yaml | |
| cat > mysql.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mysql: | |
| image: percona/percona-server:8.0 ## Versão do MySQL | |
| command: | |
| [ | |
| "--character-set-server=utf8mb4", | |
| "--collation-server=utf8mb4_general_ci", | |
| "--sql-mode=", | |
| "--default-authentication-plugin=caching_sha2_password", | |
| "--max-allowed-packet=512MB", | |
| ] | |
| volumes: | |
| - mysql_data:/var/lib/mysql | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 3306:3306 | |
| environment: | |
| ## Senha do MYSQL | |
| - MYSQL_ROOT_PASSWORD=$senha_mysql | |
| ## TimeZone | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| mysql_data: | |
| external: true | |
| name: mysql_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do MySQL" | |
| fi | |
| STACK_NAME="mysql" | |
| stack_editavel #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do Postgres." | |
| #fi | |
| wait_stack "mysql${1:+_$1}_mysql${1:+_$1}" | |
| #docker stack deploy --prune --resolve-image always -c mysql.yaml mysql #> /dev/null 2>&1 | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_mysql <<EOL | |
| [ MYSQL ] | |
| Dominio do mysql: mysql | |
| Usuario: root | |
| Senha: $senha_mysql | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| telemetria MySQL finalizado | |
| echo "" | |
| } | |
| ## ███╗ ███╗██╗ ██╗███████╗ ██████╗ ██╗ | |
| ## ████╗ ████║╚██╗ ██╔╝██╔════╝██╔═══██╗██║ | |
| ## ██╔████╔██║ ╚████╔╝ ███████╗██║ ██║██║ | |
| ## ██║╚██╔╝██║ ╚██╔╝ ╚════██║██║▄▄ ██║██║ | |
| ## ██║ ╚═╝ ██║ ██║ ███████║╚██████╔╝███████╗ | |
| ## ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚══▀▀═╝ ╚══════╝ | |
| ## | |
| ## ███████╗███████╗████████╗██╗ ██╗██████╗ | |
| ## ██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔══██╗ | |
| ## ███████╗█████╗ ██║ ██║ ██║██████╔╝ | |
| ## ╚════██║██╔══╝ ██║ ██║ ██║██╔═══╝ | |
| ## ███████║███████╗ ██║ ╚██████╔╝██║ | |
| ## ╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ | |
| ferramenta_mysql_setup() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE MYSQL \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria MySQL iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO MYSQL \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Gerando uma senha aleatória para o Mysql | |
| senha_mysql=$(openssl rand -hex 16) | |
| ## Criando a stack do mysql.yaml | |
| cat > mysql${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mysql${1:+_$1}: | |
| image: percona/percona-server:8.0 ## Versão do MySQL | |
| command: | |
| [ | |
| "--character-set-server=utf8mb4", | |
| "--collation-server=utf8mb4_general_ci", | |
| "--sql-mode=", | |
| "--default-authentication-plugin=caching_sha2_password", | |
| "--max-allowed-packet=512MB", | |
| ] | |
| volumes: | |
| - mysql${1:+_$1}_data:/var/lib/mysql | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| ## Descomente as linhas abaixo para uso externo | |
| #ports: | |
| # - 3306:3306 | |
| environment: | |
| ## Senha do MYSQL | |
| - MYSQL_ROOT_PASSWORD=$senha_mysql | |
| ## TimeZone | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| mysql${1:+_$1}_data: | |
| external: true | |
| name: mysql${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "Vaya, no se pudo crear la stack de Mysql." | |
| fi | |
| STACK_NAME="mysql${1:+_$1}" | |
| stack_editavel | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| wait_stack "mysql${1:+_$1}_mysql${1:+_$1}" > /dev/null 2>&1 | |
| telemetria MySQL finalizado | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Ops, não foi possivel subir a stack do Postgres." | |
| #fi | |
| #docker stack deploy --prune --resolve-image always -c mysql.yaml mysql #> /dev/null 2>&1 | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_mysql${1:+_$1} <<EOL | |
| [ MYSQL ] | |
| Dominio do mysql: mysql${1:+_$1} | |
| Usuario: mysql ou root | |
| Contraseña: $senha_mysql | |
| EOL | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ MYSQL ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mHost:\e[33m mysql${1:+_$1}\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m root\e[0m" | |
| echo "" | |
| echo -e "\e[97mContraseña:\e[33m $senha_mysql\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗██╗ ██╗ █████╗ ████████╗██╗ ██╗ ██████╗ ██████╗ ████████╗ | |
| ## ██╔════╝██║ ██║██╔══██╗╚══██╔══╝██║ ██║██╔═══██╗██╔═══██╗╚══██╔══╝ | |
| ## ██║ ███████║███████║ ██║ ██║ █╗ ██║██║ ██║██║ ██║ ██║ | |
| ## ██║ ██╔══██║██╔══██║ ██║ ██║███╗██║██║ ██║██║ ██║ ██║ | |
| ## ╚██████╗██║ ██║██║ ██║ ██║ ╚███╔███╔╝╚██████╔╝╚██████╔╝ ██║ | |
| ## ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═╝ | |
| ferramenta_chatwoot() { | |
| ## Verifica los recursos | |
| recursos 2 2 && continue || return | |
| ## Limpia el terminal | |
| clear | |
| ## Activa la función datos para obtener los datos de la VPS | |
| dados | |
| ## Muestra el nombre de la aplicación | |
| nome_chatwoot | |
| ## Muestra mensaje para completar información | |
| preencha_as_info | |
| ## Inicia un bucle hasta que los datos estén correctos | |
| while true; do | |
| ## Pregunta el Dominio para la aplicación | |
| echo -e "\e[97mPaso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para Chatwoot (ej: chatwoot.sociosdigitales.pro): \e[0m" && read -r url_chatwoot | |
| echo "" | |
| ## Obtiene el nombre del dominio para ser el nombre de la empresa | |
| nome_empresa_chatwoot="$nome_servidor" | |
| ## Pregunta el email SMTP | |
| echo -e "\e[97mPaso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mIngrese el Email para SMTP (ej: contacto@sociosdigitales.pro): \e[0m" && read -r email_admin_chatwoot | |
| echo "" | |
| ## Define el dominio SMTP con el dominio del email | |
| dominio_smtp_chatwoot=$(echo "$email_admin_chatwoot" | cut -d "@" -f 2) | |
| ## Pregunta el usuario del Email SMTP | |
| echo -e "\e[97mPaso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Si no tiene un usuario de email, use el mismo email" | |
| echo -en "\e[33mIngrese el Usuario para SMTP (ej: sociosdigitales o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_chatwoot | |
| echo "" | |
| ## Pregunta la contraseña del SMTP | |
| echo -e "\e[97mPaso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si usa gmail, use la contraseña de app" | |
| echo -en "\e[33mIngrese la Contraseña SMTP del Email (ej: @Contraseña123_): \e[0m" && read -r senha_email_chatwoot | |
| echo "" | |
| ## Pregunta el Host SMTP del email | |
| echo -e "\e[97mPaso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mIngrese el Host SMTP del Email (ej: smtp.hostinger.com): \e[0m" && read -r smtp_email_chatwoot | |
| echo "" | |
| ## Pregunta el puerto SMTP del email | |
| echo -e "\e[97mPaso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del Email (ej: 465): \e[0m" && read -r porta_smtp_chatwoot | |
| ## Verifica si el puerto es 465, si es así deja SSL true, si no, false | |
| if [ "$porta_smtp_chatwoot" -eq 465 ]; then | |
| sobre_ssl=true | |
| else | |
| sobre_ssl=false | |
| fi | |
| ## Limpia el terminal | |
| clear | |
| ## Muestra el nombre de la aplicación | |
| nome_chatwoot | |
| ## Muestra mensaje para verificar la información | |
| conferindo_as_info | |
| ## Información sobre URL | |
| echo -e "\e[33mDominio de Chatwoot:\e[97m $url_chatwoot\e[0m" | |
| echo "" | |
| ## Información sobre Nombre de la Empresa | |
| echo -e "\e[33mNombre de la Empresa:\e[97m $nome_empresa_chatwoot\e[0m" | |
| echo "" | |
| ## Información sobre Email de SMTP | |
| echo -e "\e[33mEmail del SMTP:\e[97m $email_admin_chatwoot\e[0m" | |
| echo "" | |
| ## Información sobre Usuario del SMTP | |
| echo -e "\e[33mUsuario del SMTP:\e[97m $user_smtp_chatwoot\e[0m" | |
| echo "" | |
| ## Información sobre Contraseña de SMTP | |
| echo -e "\e[33mContraseña del SMTP:\e[97m $senha_email_chatwoot\e[0m" | |
| echo "" | |
| ## Información sobre Host SMTP | |
| echo -e "\e[33mHost SMTP:\e[97m $smtp_email_chatwoot\e[0m" | |
| echo "" | |
| ## Información sobre Puerto SMTP | |
| echo -e "\e[33mPuerto SMTP:\e[97m $porta_smtp_chatwoot\e[0m" | |
| echo "" | |
| echo "" | |
| ## Pregunta si las respuestas son correctas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Se ingresó Y para confirmar que la información es correcta | |
| ## Limpiar el terminal | |
| clear | |
| ## Mostrar mensaje de Instalando | |
| instalando_msg | |
| ## Sale del bucle | |
| break | |
| else | |
| ## Se ingresó N para indicar que la información no es correcta | |
| ## Limpiar el terminal | |
| clear | |
| ## Muestra el nombre de la herramienta | |
| nome_chatwoot | |
| ## Muestra mensaje para completar información | |
| preencha_as_info | |
| ## Vuelve al inicio del bucle con las preguntas | |
| fi | |
| done | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE CHATWOOT \e[33m[1/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Chatwoot iniciado | |
| ## Activa la función datos para obtener los datos de la VPS | |
| dados | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO PGVECTOR \e[33m[2/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aquí verificamos si ya existe Postgres y redis instalado | |
| ## Si existe, creará una base de datos en postgres o preguntará si desea borrar la existente y crear otra | |
| ## Verifica contenedor postgres y crea base de datos | |
| verificar_container_pgvector | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_pgvector_da_stack "chatwoot${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_pgvector | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| criar_banco_pgvector_da_stack "chatwoot${1:+_$1}" | |
| fi | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• INSTALANDO CHATWOOT \e[33m[4/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## En este paso crearemos el archivo Stack yaml de Chatwoot en la carpeta /root/ | |
| ## Esto permitirá que el usuario pueda editarlo posteriormente | |
| ## Luego instalaremos Chatwoot y verificaremos que todo esté correcto | |
| ## Creando clave aleatoria | |
| encryption_key=$(openssl rand -hex 16) | |
| ## Creando el stack chatwoot.yaml | |
| cat > chatwoot${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| chatwoot${1:+_$1}_app: | |
| image: chatwoot/chatwoot:v4.1.0 ## Versão do Chatwoot | |
| command: bundle exec rails s -p 3000 -b 0.0.0.0 | |
| volumes: | |
| - chatwoot${1:+_$1}_storage:/app/storage ## Arquivos de conversa | |
| - chatwoot${1:+_$1}_public:/app/public ## Arquivos de logos | |
| - chatwoot${1:+_$1}_mailer:/app/app/views/devise/mailer ## Arquivos de email | |
| - chatwoot${1:+_$1}_mailers:/app/app/views/mailers ## Arquivos de emails | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## 🌐 Qualquer Url com # no final | |
| #- CHATWOOT_HUB_URL=https://sociosdigitales.pro/setup# | |
| ## 🏢 Nome da Empresa | |
| - INSTALLATION_NAME=$nome_empresa_chatwoot | |
| ## 🔐 Secret key | |
| - SECRET_KEY_BASE=$encryption_key | |
| ## 💬 Url Chatwoot | |
| - FRONTEND_URL=https://$url_chatwoot | |
| - FORCE_SSL=true | |
| ## 🌍 Idioma/Localização padrão | |
| - DEFAULT_LOCALE=pt_BR | |
| - TZ=America/Sao_Paulo | |
| ## ☁️ Google Cloud - Modifique de acordo com os seus dados | |
| #- GOOGLE_OAUTH_CLIENT_ID=369777777777-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com | |
| #- GOOGLE_OAUTH_CLIENT_SECRET=ABCDEF-GHijklmnoPqrstuvwX-yz1234567 | |
| #- GOOGLE_OAUTH_CALLBACK_URL=https://<your-server-domain>/omniauth/google_oauth2/callback | |
| ## 🧑💻 Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| ## 🗄️ Dados do Postgres | |
| - POSTGRES_HOST=pgvector | |
| - POSTGRES_USERNAME=postgres | |
| - POSTGRES_PASSWORD=$senha_pgvector ## Senha do postgres | |
| - POSTGRES_DATABASE=chatwoot${1:+_$1} | |
| ## 🏠 Armazenamento | |
| - ACTIVE_STORAGE_SERVICE=local ## use s3_compatible para MinIO | |
| #- STORAGE_BUCKET_NAME=chatwoot${1:+_$1} | |
| #- STORAGE_ACCESS_KEY_ID=ACCESS_KEY_MINIO | |
| #- STORAGE_SECRET_ACCESS_KEY=SECRET_KEY_MINIO | |
| #- STORAGE_REGION=eu-south | |
| #- STORAGE_ENDPOINT=https://s3.DOMINIO.COM | |
| #- STORAGE_FORCE_PATH_STYLE=true | |
| ## 📧 Dados do SMTP | |
| - MAILER_SENDER_EMAIL=$email_admin_chatwoot <$email_admin_chatwoot> ## Email SMTP | |
| - SMTP_DOMAIN=$dominio_smtp_chatwoot ## Dominio do email | |
| - SMTP_ADDRESS=$smtp_email_chatwoot ## Host SMTP | |
| - SMTP_PORT=$porta_smtp_chatwoot ## Porta SMTP | |
| - SMTP_SSL=$sobre_ssl ## Se a porta for 465 = true | Se a porta for 587 = false | |
| - SMTP_USERNAME=$user_smtp_chatwoot ## Usuario SMTP | |
| - SMTP_PASSWORD=$senha_email_chatwoot ## Senha do SMTP | |
| - SMTP_AUTHENTICATION=login | |
| - SMTP_ENABLE_STARTTLS_AUTO=true | |
| - SMTP_OPENSSL_VERIFY_MODE=peer | |
| - MAILER_INBOUND_EMAIL_DOMAIN=$email_admin_chatwoot ## Email SMTP | |
| ## ⚙️ Melhorias | |
| - SIDEKIQ_CONCURRENCY=10 | |
| - RACK_TIMEOUT_SERVICE_TIMEOUT=0 | |
| - RAILS_MAX_THREADS=5 | |
| - WEB_CONCURRENCY=2 | |
| - ENABLE_RACK_ATTACK=false | |
| ## ⚡ Outras configurações | |
| - NODE_ENV=production | |
| - RAILS_ENV=production | |
| - INSTALLATION_ENV=docker | |
| - RAILS_LOG_TO_STDOUT=true | |
| - USE_INBOX_AVATAR_FOR_BOT=true | |
| - ENABLE_ACCOUNT_SIGNUP=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.chatwoot${1:+_$1}_app.rule=Host(\`$url_chatwoot\`) | |
| - traefik.http.routers.chatwoot${1:+_$1}_app.entrypoints=websecure | |
| - traefik.http.routers.chatwoot${1:+_$1}_app.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.chatwoot${1:+_$1}_app.priority=1 | |
| - traefik.http.routers.chatwoot${1:+_$1}_app.service=chatwoot${1:+_$1}_app | |
| - traefik.http.services.chatwoot${1:+_$1}_app.loadbalancer.server.port=3000 | |
| - traefik.http.services.chatwoot${1:+_$1}_app.loadbalancer.passhostheader=true | |
| - traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https | |
| - traefik.http.routers.chatwoot${1:+_$1}_app.middlewares=sslheader@docker | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| chatwoot${1:+_$1}_sidekiq: | |
| image: chatwoot/chatwoot:v4.1.0 ## Versão do Chatwoot | |
| command: bundle exec sidekiq -C config/sidekiq.yml | |
| volumes: | |
| - chatwoot${1:+_$1}_storage:/app/storage ## Arquivos de conversa | |
| - chatwoot${1:+_$1}_public:/app/public ## Arquivos de logos | |
| - chatwoot${1:+_$1}_mailer:/app/app/views/devise/mailer ## Arquivos de email | |
| - chatwoot${1:+_$1}_mailers:/app/app/views/mailers ## Arquivos de emails | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## 🌐 Qualquer Url com # no final | |
| #- CHATWOOT_HUB_URL=https://sociosdigitales.pro/setup# | |
| ## 🏢 Nome da Empresa | |
| - INSTALLATION_NAME=$nome_empresa_chatwoot | |
| ## 🔐 Secret key | |
| - SECRET_KEY_BASE=$encryption_key | |
| ## 💬 Url Chatwoot | |
| - FRONTEND_URL=https://$url_chatwoot | |
| - FORCE_SSL=true | |
| ## 🌍 Idioma/Localização padrão | |
| - DEFAULT_LOCALE=pt_BR | |
| - TZ=America/Sao_Paulo | |
| ## ☁️ Google Cloud - Modifique de acordo com os seus dados | |
| #- GOOGLE_OAUTH_CLIENT_ID=369777777777-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com | |
| #- GOOGLE_OAUTH_CLIENT_SECRET=ABCDEF-GHijklmnoPqrstuvwX-yz1234567 | |
| #- GOOGLE_OAUTH_CALLBACK_URL=https://<your-server-domain>/omniauth/google_oauth2/callback | |
| ## 🧑💻 Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| ## 🗄️ Dados do Postgres | |
| - POSTGRES_HOST=pgvector | |
| - POSTGRES_USERNAME=postgres | |
| - POSTGRES_PASSWORD=$senha_pgvector ## Senha do postgres | |
| - POSTGRES_DATABASE=chatwoot${1:+_$1} | |
| ## 🏠 Armazenamento | |
| - ACTIVE_STORAGE_SERVICE=local ## use s3_compatible para MinIO | |
| #- STORAGE_BUCKET_NAME=chatwoot${1:+_$1} | |
| #- STORAGE_ACCESS_KEY_ID=ACCESS_KEY_MINIO | |
| #- STORAGE_SECRET_ACCESS_KEY=SECRET_KEY_MINIO | |
| #- STORAGE_REGION=eu-south | |
| #- STORAGE_ENDPOINT=https://s3.DOMINIO.COM | |
| #- STORAGE_FORCE_PATH_STYLE=true | |
| ## 📧 Dados do SMTP | |
| - MAILER_SENDER_EMAIL=$email_admin_chatwoot <$email_admin_chatwoot> ## Email SMTP | |
| - SMTP_DOMAIN=$dominio_smtp_chatwoot ## Dominio do email | |
| - SMTP_ADDRESS=$smtp_email_chatwoot ## Host SMTP | |
| - SMTP_PORT=$porta_smtp_chatwoot ## Porta SMTP | |
| - SMTP_SSL=$sobre_ssl ## Se a porta for 465 = true | Se a porta for 587 = false | |
| - SMTP_USERNAME=$user_smtp_chatwoot ## Usuario SMTP | |
| - SMTP_PASSWORD=$senha_email_chatwoot ## Senha do SMTP | |
| - SMTP_AUTHENTICATION=login | |
| - SMTP_ENABLE_STARTTLS_AUTO=true | |
| - SMTP_OPENSSL_VERIFY_MODE=peer | |
| - MAILER_INBOUND_EMAIL_DOMAIN=$email_admin_chatwoot ## Email SMTP | |
| ## ⚙️ Melhorias | |
| - SIDEKIQ_CONCURRENCY=10 | |
| - RACK_TIMEOUT_SERVICE_TIMEOUT=0 | |
| - RAILS_MAX_THREADS=5 | |
| - WEB_CONCURRENCY=2 | |
| - ENABLE_RACK_ATTACK=false | |
| ## ⚡ Outras configurações | |
| - NODE_ENV=production | |
| - RAILS_ENV=production | |
| - INSTALLATION_ENV=docker | |
| - RAILS_LOG_TO_STDOUT=true | |
| - USE_INBOX_AVATAR_FOR_BOT=true | |
| - ENABLE_ACCOUNT_SIGNUP=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| chatwoot${1:+_$1}_storage: | |
| external: true | |
| name: chatwoot${1:+_$1}_storage | |
| chatwoot${1:+_$1}_public: | |
| external: true | |
| name: chatwoot${1:+_$1}_public | |
| chatwoot${1:+_$1}_mailer: | |
| external: true | |
| name: chatwoot${1:+_$1}_mailer | |
| chatwoot${1:+_$1}_mailers: | |
| external: true | |
| name: chatwoot${1:+_$1}_mailers | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear el stack de Chatwoot" | |
| fi | |
| STACK_NAME="chatwoot${1:+_$1}" | |
| stack_editavel #> /dev/null 2>&1 | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Descargando imágenes: | |
| pull chatwoot/chatwoot:latest | |
| ## Usa el servicio wait_chatwoot para verificar si el servicio está online | |
| wait_stack chatwoot${1:+_$1}_chatwoot${1:+_$1}_app chatwoot${1:+_$1}_chatwoot${1:+_$1}_sidekiq | |
| telemetria Chatwoot finalizado | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• MIGRANDO BASE DE DATOS \e[33m[6/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aquí migraremos la base de datos usando el comando "bundle exec rails db:chatwoot_prepare" | |
| container_name="chatwoot${1:+_$1}_chatwoot${1:+_$1}_app" | |
| max_wait_time=1200 | |
| wait_interval=60 | |
| elapsed_time=0 | |
| while [ $elapsed_time -lt $max_wait_time ]; do | |
| CONTAINER_ID=$(docker ps -q --filter "name=$container_name") | |
| if [ -n "$CONTAINER_ID" ]; then | |
| break | |
| fi | |
| sleep $wait_interval | |
| elapsed_time=$((elapsed_time + wait_interval)) | |
| done | |
| if [ -z "$CONTAINER_ID" ]; then | |
| echo "El contenedor no se encontró después de $max_wait_time segundos." | |
| exit 1 | |
| fi | |
| docker exec -it "$CONTAINER_ID" bundle exec rails db:chatwoot_prepare > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Ejecutando en el contenedor: bundle exec rails db:chatwoot_prepare" | |
| else | |
| echo "1/1 - [ OFF ] - Ejecutando en el contenedor: bundle exec rails db:chatwoot_prepare" | |
| echo "No se pudo migrar la base de datos" | |
| fi | |
| echo "" | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• ACTIVANDO FUNCIONES DE SUPER ADMIN \e[33m[7/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aquí modificaremos un dato en postgres para liberar algunas funciones ocultas en el panel de super admin | |
| wait_for_pgvector | |
| docker exec -i $CONTAINER_ID psql -U postgres <<EOF > /dev/null 2>&1 | |
| \c chatwoot${1:+_$1}; | |
| update installation_configs set locked = false; | |
| \q | |
| EOF | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Desbloqueando tabla installation_configs en pgvector" | |
| else | |
| echo "1/1 - [ OFF ] - Desbloqueando tabla installation_configs en pgvector" | |
| echo "No se pudieron liberar las funciones de super_admin" | |
| fi | |
| echo "" | |
| ## Guardando información de la instalación en /dados_vps/ | |
| cd dados_vps | |
| cat > dados_chatwoot${1:+_$1} <<EOL | |
| [ CHATWOOT ] | |
| Dominio de Chatwoot: https://$url_chatwoot | |
| Usuario: Debe crearse dentro de Chatwoot | |
| Contraseña: Debe crearse dentro de Chatwoot | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensaje de finalizado | |
| instalado_msg | |
| ## Mensaje de Guardar los Datos | |
| guarde_os_dados_msg | |
| ## Datos de la Aplicación: | |
| echo -e "\e[32m[ CHATWOOT ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio:\e[33m https://$url_chatwoot\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m Debe crearse dentro de Chatwoot\e[0m" | |
| echo "" | |
| echo -e "\e[97mContraseña:\e[33m Debe crearse dentro de Chatwoot\e[0m" | |
| ## Créditos del instalador | |
| creditos_msg | |
| ## Pregunta si desea instalar otra aplicación | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██╗ ██████╗ ██╗ ██╗ ██╗████████╗██╗ ██████╗ ███╗ ██╗ █████╗ ██████╗ ██╗ | |
| ## ██╔════╝██║ ██║██╔═══██╗██║ ██║ ██║╚══██╔══╝██║██╔═══██╗████╗ ██║ ██╔══██╗██╔══██╗██║ | |
| ## █████╗ ██║ ██║██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██╔██╗ ██║ ███████║██████╔╝██║ | |
| ## ██╔══╝ ╚██╗ ██╔╝██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██║╚██╗██║ ██╔══██║██╔═══╝ ██║ | |
| ## ███████╗ ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝ ██║ ██║╚██████╔╝██║ ╚████║ ██║ ██║██║ ██║ | |
| ## ╚══════╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_evolution() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_evolution | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para la Evolution API (ej: api.sociosdigitales.pro): \e[0m" && read -r url_evolution | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_evolution | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio de la Evolution API:\e[97m $url_evolution\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_evolution | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE EVOLUTION API \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Evolution API" "iniciado" | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres Instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "evolution${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "evolution${1:+_$1}" | |
| fi | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO EVOLUTION API \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui de fato vamos iniciar a instalação da Evolution API | |
| ## Criando uma Global Key Aleatória | |
| apikeyglobal=$(openssl rand -hex 16) | |
| ## Criando a stack evolution.yaml | |
| cat > evolution${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| evolution${1:+_$1}: | |
| image: evoapicloud/evolution-api:latest ## Versão da Evolution API | |
| volumes: | |
| - evolution${1:+_$1}_instances:/evolution/instances | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## ⚙️ Configurações Gerais | |
| - SERVER_URL=https://$url_evolution | |
| - AUTHENTICATION_API_KEY=$apikeyglobal | |
| - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true | |
| - DEL_INSTANCE=false | |
| - QRCODE_LIMIT=1902 | |
| - LANGUAGE=pt-BR | |
| ## 📱 Configuração do Cliente | |
| ## Pegue a versão em: https://wppconnect.io/pt-BR/whatsapp-versions/ | |
| - CONFIG_SESSION_PHONE_VERSION=2.3000.1022594794 | |
| - CONFIG_SESSION_PHONE_CLIENT=SociosDigitales | |
| - CONFIG_SESSION_PHONE_NAME=Chrome | |
| ## 🗄️ Configuração do Banco de Dados | |
| - DATABASE_ENABLED=true | |
| - DATABASE_PROVIDER=postgresql | |
| - DATABASE_CONNECTION_URI=postgresql://postgres:$senha_postgres@postgres:5432/evolution${1:+_$1} | |
| - DATABASE_CONNECTION_CLIENT_NAME=evolution${1:+_$1} | |
| - DATABASE_SAVE_DATA_INSTANCE=true | |
| - DATABASE_SAVE_DATA_NEW_MESSAGE=true | |
| - DATABASE_SAVE_MESSAGE_UPDATE=true | |
| - DATABASE_SAVE_DATA_CONTACTS=true | |
| - DATABASE_SAVE_DATA_CHATS=true | |
| - DATABASE_SAVE_DATA_LABELS=true | |
| - DATABASE_SAVE_DATA_HISTORIC=true | |
| ## 🤖 Integração com OpenAI | |
| - OPENAI_ENABLED=true | |
| ## 🌐 Integração com Dify | |
| - DIFY_ENABLED=true | |
| ## 💬 Integração com Typebot | |
| - TYPEBOT_ENABLED=true | |
| - TYPEBOT_API_VERSION=latest | |
| ## 🗣️ Integração com Chatwoot | |
| - CHATWOOT_ENABLED=true | |
| - CHATWOOT_MESSAGE_READ=true | |
| - CHATWOOT_MESSAGE_DELETE=true | |
| - CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://postgres:${senha_pgvector:-SENHA_DO_PGVECTOR}@pgvector:5432/chatwoot?sslmode=disable | |
| - CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=false | |
| ## 🧊 Configuração do Cache | |
| - CACHE_REDIS_ENABLED=true | |
| - CACHE_REDIS_URI=redis://redis:6379/8 | |
| - CACHE_REDIS_PREFIX_KEY=evolution | |
| - CACHE_REDIS_SAVE_INSTANCES=false | |
| - CACHE_LOCAL_ENABLED=false | |
| ## ☁️ Configuração do S3 | |
| - S3_ENABLED=false | |
| - S3_ACCESS_KEY= | |
| - S3_SECRET_KEY= | |
| - S3_BUCKET=evolution | |
| - S3_PORT=443 | |
| - S3_ENDPOINT= | |
| - S3_USE_SSL=true | |
| #- S3_REGION=eu-south | |
| ## 💼 Configuração do WhatsApp Business | |
| - WA_BUSINESS_TOKEN_WEBHOOK=evolution | |
| - WA_BUSINESS_URL=https://graph.facebook.com | |
| - WA_BUSINESS_VERSION=v20.0 | |
| - WA_BUSINESS_LANGUAGE=pt_BR | |
| ## 📊 Telemetria | |
| - TELEMETRY=false | |
| - TELEMETRY_URL= | |
| ## 🌐 Configuração do WebSocket | |
| - WEBSOCKET_ENABLED=false | |
| - WEBSOCKET_GLOBAL_EVENTS=false | |
| ## 📨 Configuração do SQS | |
| - SQS_ENABLED=false | |
| - SQS_ACCESS_KEY_ID= | |
| - SQS_SECRET_ACCESS_KEY= | |
| - SQS_ACCOUNT_ID= | |
| - SQS_REGION= | |
| ## 🐇 Configuração do RabbitMQ | |
| - RABBITMQ_ENABLED=false | |
| - RABBITMQ_URI=amqp://USER:PASS@rabbitmq:5672/evolution${1:+_$1} | |
| - RABBITMQ_EXCHANGE_NAME=evolution | |
| - RABBITMQ_GLOBAL_ENABLED=false | |
| - RABBITMQ_EVENTS_APPLICATION_STARTUP=false | |
| - RABBITMQ_EVENTS_INSTANCE_CREATE=false | |
| - RABBITMQ_EVENTS_INSTANCE_DELETE=false | |
| - RABBITMQ_EVENTS_QRCODE_UPDATED=false | |
| - RABBITMQ_EVENTS_MESSAGES_SET=false | |
| - RABBITMQ_EVENTS_MESSAGES_UPSERT=true | |
| - RABBITMQ_EVENTS_MESSAGES_EDITED=false | |
| - RABBITMQ_EVENTS_MESSAGES_UPDATE=false | |
| - RABBITMQ_EVENTS_MESSAGES_DELETE=false | |
| - RABBITMQ_EVENTS_SEND_MESSAGE=false | |
| - RABBITMQ_EVENTS_CONTACTS_SET=false | |
| - RABBITMQ_EVENTS_CONTACTS_UPSERT=false | |
| - RABBITMQ_EVENTS_CONTACTS_UPDATE=false | |
| - RABBITMQ_EVENTS_PRESENCE_UPDATE=false | |
| - RABBITMQ_EVENTS_CHATS_SET=false | |
| - RABBITMQ_EVENTS_CHATS_UPSERT=false | |
| - RABBITMQ_EVENTS_CHATS_UPDATE=false | |
| - RABBITMQ_EVENTS_CHATS_DELETE=false | |
| - RABBITMQ_EVENTS_GROUPS_UPSERT=false | |
| - RABBITMQ_EVENTS_GROUP_UPDATE=false | |
| - RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE=false | |
| - RABBITMQ_EVENTS_CONNECTION_UPDATE=true | |
| - RABBITMQ_EVENTS_CALL=false | |
| - RABBITMQ_EVENTS_TYPEBOT_START=false | |
| - RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS=false | |
| ## 🌐 Configuração do Webhook | |
| - WEBHOOK_GLOBAL_ENABLED=false | |
| - WEBHOOK_GLOBAL_URL= | |
| - WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false | |
| - WEBHOOK_EVENTS_APPLICATION_STARTUP=false | |
| - WEBHOOK_EVENTS_QRCODE_UPDATED=false | |
| - WEBHOOK_EVENTS_MESSAGES_SET=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPSERT=false | |
| - WEBHOOK_EVENTS_MESSAGES_EDITED=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPDATE=false | |
| - WEBHOOK_EVENTS_MESSAGES_DELETE=false | |
| - WEBHOOK_EVENTS_SEND_MESSAGE=false | |
| - WEBHOOK_EVENTS_CONTACTS_SET=false | |
| - WEBHOOK_EVENTS_CONTACTS_UPSERT=false | |
| - WEBHOOK_EVENTS_CONTACTS_UPDATE=false | |
| - WEBHOOK_EVENTS_PRESENCE_UPDATE=false | |
| - WEBHOOK_EVENTS_CHATS_SET=false | |
| - WEBHOOK_EVENTS_CHATS_UPSERT=false | |
| - WEBHOOK_EVENTS_CHATS_UPDATE=false | |
| - WEBHOOK_EVENTS_CHATS_DELETE=false | |
| - WEBHOOK_EVENTS_GROUPS_UPSERT=false | |
| - WEBHOOK_EVENTS_GROUPS_UPDATE=false | |
| - WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE=false | |
| - WEBHOOK_EVENTS_CONNECTION_UPDATE=false | |
| - WEBHOOK_EVENTS_LABELS_EDIT=false | |
| - WEBHOOK_EVENTS_LABELS_ASSOCIATION=false | |
| - WEBHOOK_EVENTS_CALL=false | |
| - WEBHOOK_EVENTS_TYPEBOT_START=false | |
| - WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false | |
| - WEBHOOK_EVENTS_ERRORS=false | |
| - WEBHOOK_EVENTS_ERRORS_WEBHOOK= | |
| ## 🔌 Configuração do Provider | |
| - PROVIDER_ENABLED=false | |
| - PROVIDER_HOST=127.0.0.1 | |
| - PROVIDER_PORT=5656 | |
| - PROVIDER_PREFIX=evolution${1:+_$1} | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=1 | |
| - traefik.http.routers.evolution${1:+_$1}.rule=Host(\`$url_evolution\`) ## Url da Evolution API | |
| - traefik.http.routers.evolution${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.evolution${1:+_$1}.priority=1 | |
| - traefik.http.routers.evolution${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.evolution${1:+_$1}.service=evolution${1:+_$1} | |
| - traefik.http.services.evolution${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.services.evolution${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| evolution${1:+_$1}_instances: | |
| external: true | |
| name: evolution${1:+_$1}_instances | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Evolution API" | |
| fi | |
| STACK_NAME="evolution${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull evoapicloud/evolution-api:latest | |
| ## Usa o serviço wait_evolution para verificar se o serviço esta online | |
| wait_stack "evolution${1:+_$1}_evolution${1:+_$1}" | |
| telemetria "Evolution API" "finalizado" | |
| cd dados_vps | |
| cat > dados_evolution${1:+_$1} <<EOL | |
| [ EVOLUTION API ] | |
| Manager Evolution: https://$url_evolution/manager | |
| URL: https://$url_evolution | |
| Global API Key: $apikeyglobal | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ EVOLUTION API ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mEnlace del Manager:\e[33m https://$url_evolution/manager\e[0m" | |
| echo "" | |
| echo -e "\e[97mAPI URL:\e[33m https://$url_evolution\e[0m" | |
| echo "" | |
| echo -e "\e[97mGLOBAL API KEY:\e[33m $apikeyglobal\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██╗ ██████╗ ██╗ ██╗ ██╗████████╗██╗ ██████╗ ███╗ ██╗ █████╗ ██████╗ ██╗ | |
| ## ██╔════╝██║ ██║██╔═══██╗██║ ██║ ██║╚══██╔══╝██║██╔═══██╗████╗ ██║ ██╔══██╗██╔══██╗██║ | |
| ## █████╗ ██║ ██║██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██╔██╗ ██║ ███████║██████╔╝██║ | |
| ## ██╔══╝ ╚██╗ ██╔╝██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██║╚██╗██║ ██╔══██║██╔═══╝ ██║ | |
| ## ███████╗ ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝ ██║ ██║╚██████╔╝██║ ╚████║ ██║ ██║██║ ██║ | |
| ## ╚══════╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ## | |
| ## ██╗ ██╗████████╗███████╗ | |
| ## ██║ ██║╚══██╔══╝██╔════╝ | |
| ## ██║ ██║ ██║ █████╗ | |
| ## ██║ ██║ ██║ ██╔══╝ | |
| ## ███████╗██║ ██║ ███████╗ | |
| ## ╚══════╝╚═╝ ╚═╝ ╚══════╝ | |
| ferramenta_evolution_lite() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_evolution_lite | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mIngrese el dominio para la Evolution API Lite (ej: api.sociosdigitales.pro): \e[0m" && read -r url_evolution | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_evolution_lite | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio de la Evolution API:\e[97m $url_evolution\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_evolution_lite | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE EVOLUTION API LITE \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Evolution API" "iniciado" | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres Instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "evolution${1:+_$1}_lite" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "evolution${1:+_$1}_lite" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO LA EVOLUTION API \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui de fato vamos iniciar a instalação da Evolution API | |
| ## Criando uma Global Key Aleatória | |
| apikeyglobal=$(openssl rand -hex 16) | |
| ## Criando a stack evolution.yaml | |
| cat > evolution${1:+_$1}_lite.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| evolution${1:+_$1}_lite: | |
| image: atendai/evolution-api-lite:latest ## Versão da Evolution API | |
| entrypoint: ["/bin/bash", "-c", ". ./Docker/scripts/deploy_database.sh && npm run start:prod" ] | |
| volumes: | |
| - evolution${1:+_$1}_lite_instances:/evolution/instances | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## ⚙️ Configurações Gerais | |
| - SERVER_URL=https://$url_evolution | |
| - AUTHENTICATION_API_KEY=$apikeyglobal | |
| - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true | |
| - DEL_INSTANCE=false | |
| - QRCODE_LIMIT=1902 | |
| - LANGUAGE=pt-BR | |
| ## 📱 Configuração do Cliente | |
| ## Pegue a versão em: https://wppconnect.io/pt-BR/whatsapp-versions/ | |
| - CONFIG_SESSION_PHONE_VERSION=2.3000.1022594794 | |
| - CONFIG_SESSION_PHONE_CLIENT=SociosPro | |
| - CONFIG_SESSION_PHONE_NAME=Chrome | |
| ## 🗄️ Configuração do Banco de Dados | |
| - DATABASE_ENABLED=true | |
| - DATABASE_PROVIDER=postgresql | |
| - DATABASE_CONNECTION_URI=postgresql://postgres:$senha_postgres@postgres:5432/evolution${1:+_$1}_lite | |
| - DATABASE_CONNECTION_CLIENT_NAME=evolution${1:+_$1}_lite | |
| - DATABASE_SAVE_DATA_INSTANCE=true | |
| - DATABASE_SAVE_DATA_NEW_MESSAGE=true | |
| - DATABASE_SAVE_MESSAGE_UPDATE=true | |
| - DATABASE_SAVE_DATA_CONTACTS=true | |
| - DATABASE_SAVE_DATA_CHATS=true | |
| - DATABASE_SAVE_DATA_LABELS=true | |
| - DATABASE_SAVE_DATA_HISTORIC=true | |
| ## 🧊 Configuração do Cache | |
| - CACHE_REDIS_ENABLED=true | |
| - CACHE_REDIS_URI=redis://redis:6379/8 | |
| - CACHE_REDIS_PREFIX_KEY=evolution | |
| - CACHE_REDIS_SAVE_INSTANCES=false | |
| - CACHE_LOCAL_ENABLED=false | |
| ## ☁️ Configuração do S3 | |
| - S3_ENABLED=false | |
| - S3_ACCESS_KEY= | |
| - S3_SECRET_KEY= | |
| - S3_BUCKET=evolution | |
| - S3_PORT=443 | |
| - S3_ENDPOINT= | |
| - S3_USE_SSL=true | |
| #- S3_REGION=eu-south | |
| ## 💼 Configuração do WhatsApp Business | |
| - WA_BUSINESS_TOKEN_WEBHOOK=evolution | |
| - WA_BUSINESS_URL=https://graph.facebook.com | |
| - WA_BUSINESS_VERSION=v20.0 | |
| - WA_BUSINESS_LANGUAGE=pt_BR | |
| ## 📊 Telemetria | |
| - TELEMETRY=false | |
| - TELEMETRY_URL= | |
| ## 🌐 Configuração do WebSocket | |
| - WEBSOCKET_ENABLED=false | |
| - WEBSOCKET_GLOBAL_EVENTS=false | |
| ## 📨 Configuração do SQS | |
| - SQS_ENABLED=false | |
| - SQS_ACCESS_KEY_ID= | |
| - SQS_SECRET_ACCESS_KEY= | |
| - SQS_ACCOUNT_ID= | |
| - SQS_REGION= | |
| ## 🐇 Configuração do RabbitMQ | |
| - RABBITMQ_ENABLED=false | |
| - RABBITMQ_URI=amqp://USER:PASS@rabbitmq:5672/evolution${1:+_$1} | |
| - RABBITMQ_EXCHANGE_NAME=evolution | |
| - RABBITMQ_GLOBAL_ENABLED=false | |
| - RABBITMQ_EVENTS_APPLICATION_STARTUP=false | |
| - RABBITMQ_EVENTS_INSTANCE_CREATE=false | |
| - RABBITMQ_EVENTS_INSTANCE_DELETE=false | |
| - RABBITMQ_EVENTS_QRCODE_UPDATED=false | |
| - RABBITMQ_EVENTS_MESSAGES_SET=false | |
| - RABBITMQ_EVENTS_MESSAGES_UPSERT=true | |
| - RABBITMQ_EVENTS_MESSAGES_EDITED=false | |
| - RABBITMQ_EVENTS_MESSAGES_UPDATE=false | |
| - RABBITMQ_EVENTS_MESSAGES_DELETE=false | |
| - RABBITMQ_EVENTS_SEND_MESSAGE=false | |
| - RABBITMQ_EVENTS_CONTACTS_SET=false | |
| - RABBITMQ_EVENTS_CONTACTS_UPSERT=false | |
| - RABBITMQ_EVENTS_CONTACTS_UPDATE=false | |
| - RABBITMQ_EVENTS_PRESENCE_UPDATE=false | |
| - RABBITMQ_EVENTS_CHATS_SET=false | |
| - RABBITMQ_EVENTS_CHATS_UPSERT=false | |
| - RABBITMQ_EVENTS_CHATS_UPDATE=false | |
| - RABBITMQ_EVENTS_CHATS_DELETE=false | |
| - RABBITMQ_EVENTS_GROUPS_UPSERT=false | |
| - RABBITMQ_EVENTS_GROUP_UPDATE=false | |
| - RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE=false | |
| - RABBITMQ_EVENTS_CONNECTION_UPDATE=true | |
| - RABBITMQ_EVENTS_CALL=false | |
| - RABBITMQ_EVENTS_TYPEBOT_START=false | |
| - RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS=false | |
| ## 🌐 Configuração do Webhook | |
| - WEBHOOK_GLOBAL_ENABLED=false | |
| - WEBHOOK_GLOBAL_URL= | |
| - WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false | |
| - WEBHOOK_EVENTS_APPLICATION_STARTUP=false | |
| - WEBHOOK_EVENTS_QRCODE_UPDATED=false | |
| - WEBHOOK_EVENTS_MESSAGES_SET=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPSERT=false | |
| - WEBHOOK_EVENTS_MESSAGES_EDITED=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPDATE=false | |
| - WEBHOOK_EVENTS_MESSAGES_DELETE=false | |
| - WEBHOOK_EVENTS_SEND_MESSAGE=false | |
| - WEBHOOK_EVENTS_CONTACTS_SET=false | |
| - WEBHOOK_EVENTS_CONTACTS_UPSERT=false | |
| - WEBHOOK_EVENTS_CONTACTS_UPDATE=false | |
| - WEBHOOK_EVENTS_PRESENCE_UPDATE=false | |
| - WEBHOOK_EVENTS_CHATS_SET=false | |
| - WEBHOOK_EVENTS_CHATS_UPSERT=false | |
| - WEBHOOK_EVENTS_CHATS_UPDATE=false | |
| - WEBHOOK_EVENTS_CHATS_DELETE=false | |
| - WEBHOOK_EVENTS_GROUPS_UPSERT=false | |
| - WEBHOOK_EVENTS_GROUPS_UPDATE=false | |
| - WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE=false | |
| - WEBHOOK_EVENTS_CONNECTION_UPDATE=false | |
| - WEBHOOK_EVENTS_LABELS_EDIT=false | |
| - WEBHOOK_EVENTS_LABELS_ASSOCIATION=false | |
| - WEBHOOK_EVENTS_CALL=false | |
| - WEBHOOK_EVENTS_TYPEBOT_START=false | |
| - WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false | |
| - WEBHOOK_EVENTS_ERRORS=false | |
| - WEBHOOK_EVENTS_ERRORS_WEBHOOK= | |
| ## 🔌 Configuração do Provider | |
| - PROVIDER_ENABLED=false | |
| - PROVIDER_HOST=127.0.0.1 | |
| - PROVIDER_PORT=5656 | |
| - PROVIDER_PREFIX=evolution${1:+_$1} | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=1 | |
| - traefik.http.routers.evolution${1:+_$1}_lite.rule=Host(\`$url_evolution\`) ## Url da Evolution API | |
| - traefik.http.routers.evolution${1:+_$1}_lite.entrypoints=websecure | |
| - traefik.http.routers.evolution${1:+_$1}_lite.priority=1 | |
| - traefik.http.routers.evolution${1:+_$1}_lite.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.evolution${1:+_$1}_lite.service=evolution${1:+_$1}_lite | |
| - traefik.http.services.evolution${1:+_$1}_lite.loadbalancer.server.port=8080 | |
| - traefik.http.services.evolution${1:+_$1}_lite.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| evolution${1:+_$1}_lite_instances: | |
| external: true | |
| name: evolution${1:+_$1}_lite_instances | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando stack" | |
| echo "No fue posible crear la stack de Evolution API" | |
| fi | |
| STACK_NAME="evolution${1:+_$1}_lite" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c evolution.yaml evolution > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack da Evolution API" | |
| #fi | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull atendai/evolution-api-lite:latest | |
| ## Usa o serviço wait_evolution para verificar se o serviço esta online | |
| wait_stack "evolution${1:+_$1}_lite_evolution${1:+_$1}_lite" | |
| telemetria "Evolution API" "finalizado" | |
| cd dados_vps | |
| cat > dados_evolution${1:+_$1}_lite <<EOL | |
| [ EVOLUTION API LITE ] | |
| Manager Evolution: https://$url_evolution/manager | |
| URL: https://$url_evolution | |
| Global API Key: $apikeyglobal | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ EVOLUTION API LITE ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mAPI URL:\e[33m https://$url_evolution\e[0m" | |
| echo "" | |
| echo -e "\e[97mGLOBAL API KEY:\e[33m $apikeyglobal\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██╗ ██████╗ ██╗ ██╗ ██╗████████╗██╗ ██████╗ ███╗ ██╗ ██╗ ██╗ ██╗ | |
| ## ██╔════╝██║ ██║██╔═══██╗██║ ██║ ██║╚══██╔══╝██║██╔═══██╗████╗ ██║ ██║ ██║███║ | |
| ## █████╗ ██║ ██║██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██╔██╗ ██║ ██║ ██║╚██║ | |
| ## ██╔══╝ ╚██╗ ██╔╝██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██║╚██╗██║ ╚██╗ ██╔╝ ██║ | |
| ## ███████╗ ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝ ██║ ██║╚██████╔╝██║ ╚████║ ╚████╔╝ ██║ | |
| ## ╚══════╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═══╝ ╚═╝ | |
| ferramenta_evolution_v1() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_evolution | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mIngrese el dominio para la Evolution API (ej: api.sociosdigitales.pro): \e[0m" && read -r url_evolution | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_evolution | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio de la Evolution API:\e[97m $url_evolution\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_evolution | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE EVOLUTION API \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Evolution API (v1)" "iniciado" | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO EVOLUTION API \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica se existe postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| senha_do_postgres=$senha_postgres | |
| else | |
| senha_do_postgres=SENHA_DO_POSTGRES_AQUI | |
| fi | |
| ## Aqui de fato vamos iniciar a instalação da Evolution API | |
| ## Criando uma Global Key Aleatória | |
| apikeyglobal=$(openssl rand -hex 16) | |
| ## Criando a stack | |
| cat > evolution_v1${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| evolution_oriondesign${1:+_$1}: | |
| image: atendai/evolution-api:v1.8.3 ## Versão da Evolution API | |
| command: ["node", "./dist/src/main.js"] | |
| volumes: | |
| - evolution_oriondesign${1:+_$1}_instances:/evolution/instances | |
| - evolution_oriondesign${1:+_$1}_store:/evolution/store | |
| - evolution_oriondesign${1:+_$1}_views:/evolution/views | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## 🌐 Url da Evolution API | |
| - SERVER_URL=https://$url_evolution ## Url da aplicação | |
| ## 🔐 Dados de Autenticação | |
| - AUTHENTICATION_TYPE=apikey | |
| - AUTHENTICATION_API_KEY=$apikeyglobal ## GLOBAL API KEY | |
| - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true | |
| ## ⚙️ Configurações | |
| - CONFIG_SESSION_PHONE_CLIENT=SociosPro ## Nome que aparece no celular | |
| - CONFIG_SESSION_PHONE_NAME=chrome | |
| ## 📱 Definir versão do Whatsapp Web | |
| ## pegue a versão em: https://web.whatsapp.com/check-update?version=0&platform=web | |
| - CONFIG_SESSION_PHONE_VERSION=2,3000,1015901307 | |
| ## 🖼️ Sobre os QR-Codes | |
| - QRCODE_LIMIT=1902 | |
| - QRCODE_COLOR=#000000 | |
| ## 🐰 Ativar o RabbitMQ | |
| - RABBITMQ_ENABLED=false ## Colocar true se quiser usar | Recomendado | Necessário instalar RabbitMQ antes | |
| - RABBITMQ_URI=amqp://USER:PASS@rabbitmq:5672 | |
| ## 🗄️ Ativar Banco de Dados MongoDB | |
| - DATABASE_ENABLED=false ## Colocar true se quiser usar | Necessário instalar MongoDB antes | |
| - DATABASE_CONNECTION_URI=mongodb://USUARIO:SENHA@IP_VPS:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true ## Colocar a URL do MongoDB | |
| - DATABASE_CONNECTION_DB_PREFIX_NAME=evolution${1:+_$1} | |
| - DATABASE_SAVE_DATA_INSTANCE=true | |
| - DATABASE_SAVE_DATA_NEW_MESSAGE=true | |
| - DATABASE_SAVE_MESSAGE_UPDATE=true | |
| - DATABASE_SAVE_DATA_CONTACTS=true | |
| - DATABASE_SAVE_DATA_CHATS=true | |
| ## 🧑💻 Ativar o Redis | |
| - REDIS_ENABLED=false ## Colocar true se quiser usar | Não recomendado | |
| - REDIS_URI=redis://redis:6379 | |
| ## 💾 Ativar o Cache Redis (Em testes) | |
| - CACHE_REDIS_ENABLED=false | |
| - CACHE_REDIS_URI=redis://redis:6379 | |
| - CACHE_REDIS_PREFIX_KEY=evolution${1:+_$1} | |
| - CACHE_REDIS_TTL=604800 | |
| - CACHE_REDIS_SAVE_INSTANCES=false | |
| - CACHE_LOCAL_ENABLED=false | |
| - CACHE_LOCAL_TTL=604800 | |
| ## 🤖 Novas variáveis para o Typebot | |
| - TYPEBOT_KEEP_OPEN=true | |
| - TYPEBOT_API_VERSION=latest | |
| ## 💬 Novas variáveis para o Chatwoot | |
| - CHATWOOT_MESSAGE_DELETE=true | |
| - CHATWOOT_MESSAGE_READ=true | |
| ## 📨 Importar mensagens para o Chatwoot | Descomente para usar | |
| ## Se estiver usando Chatwoot do Nestor mude o a parte "chatwoot" para "chatwoot_nestor" | |
| #- CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://postgres:$senha_do_postgres@postgres:5432/chatwoot?sslmode=disable | |
| #- CHATWOOT_IMPORT_DATABASE_PLACEHOLDER_MEDIA_MESSAGE=false ## true = Importar mídia | false = Não importar mídia | |
| ## 🔔 Informações do Webhook | |
| - WEBHOOK_GLOBAL_ENABLED=false | |
| - WEBHOOK_GLOBAL_URL= | |
| - WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false | |
| - WEBHOOK_EVENTS_APPLICATION_STARTUP=false | |
| - WEBHOOK_EVENTS_QRCODE_UPDATED=true | |
| - WEBHOOK_EVENTS_MESSAGES_SET=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPSERT=true | |
| - WEBHOOK_EVENTS_MESSAGES_UPDATE=true | |
| - WEBHOOK_EVENTS_CONTACTS_SET=true | |
| - WEBHOOK_EVENTS_CONTACTS_UPSERT=true | |
| - WEBHOOK_EVENTS_CONTACTS_UPDATE=true | |
| - WEBHOOK_EVENTS_PRESENCE_UPDATE=true | |
| - WEBHOOK_EVENTS_CHATS_SET=true | |
| - WEBHOOK_EVENTS_CHATS_UPSERT=true | |
| - WEBHOOK_EVENTS_CHATS_UPDATE=true | |
| - WEBHOOK_EVENTS_CHATS_DELETE=true | |
| - WEBHOOK_EVENTS_GROUPS_UPSERT=true | |
| - WEBHOOK_EVENTS_GROUPS_UPDATE=true | |
| - WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE=true | |
| - WEBHOOK_EVENTS_CONNECTION_UPDATE=true | |
| ## ⚙️ Sobre as instâncias | |
| - DEL_INSTANCE=false | |
| - DEL_TEMP_INSTANCES=false | |
| - STORE_MESSAGES=true | |
| - STORE_MESSAGE_UP=true | |
| - STORE_CONTACTS=true | |
| - STORE_CHATS=true | |
| - CLEAN_STORE_CLEANING_INTERVAL=7200 # seconds === 2h | |
| - CLEAN_STORE_MESSAGES=true | |
| - CLEAN_STORE_MESSAGE_UP=true | |
| - CLEAN_STORE_CONTACTS=true | |
| - CLEAN_STORE_CHATS=true | |
| ## 🗃️ Outros dados | |
| - DOCKER_ENV=true | |
| - LOG_LEVEL=ERROR | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=1 | |
| - traefik.http.routers.evolution_oriondesign${1:+_$1}.rule=Host(\`$url_evolution\`) ## Url da Evolution API | |
| - traefik.http.routers.evolution_oriondesign${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.evolution_oriondesign${1:+_$1}.priority=1 | |
| - traefik.http.routers.evolution_oriondesign${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.evolution_oriondesign${1:+_$1}.service=evolution_oriondesign${1:+_$1} | |
| - traefik.http.services.evolution_oriondesign${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.services.evolution_oriondesign${1:+_$1}.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| evolution_oriondesign${1:+_$1}_instances: | |
| external: true | |
| name: evolution_oriondesign${1:+_$1}_instances | |
| evolution_oriondesign${1:+_$1}_store: | |
| external: true | |
| name: evolution_oriondesign${1:+_$1}_store | |
| evolution_oriondesign${1:+_$1}_views: | |
| external: true | |
| name: evolution_oriondesign${1:+_$1}_views | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando stack" | |
| echo "No se pudo crear la stack de Evolution API" | |
| fi | |
| STACK_NAME="evolution_v1${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c evolution_v1.yaml evolution > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "No se pudo desplegar la stack de Evolution API" | |
| #fi | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| pull atendai/evolution-api:v1.8.3 | |
| ## Usa o serviço wait_evolution para verificar se o serviço esta online | |
| wait_stack "evolution_v1${1:+_$1}_evolution_oriondesign${1:+_$1}" | |
| telemetria "Evolution API (v1)" "finalizado" | |
| cd datos_vps | |
| cat > datos_evolution_v1${1:+_$1} <<EOL | |
| [ EVOLUTION API ] | |
| Manager Evolution: https://$url_evolution/manager | |
| URL: https://$url_evolution | |
| Global API Key: $apikeyglobal | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ Evolution API ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mEnlace del Manager:\e[33m https://$url_evolution/manager\e[0m" | |
| echo "" | |
| echo -e "\e[97mURL API:\e[33m https://$url_evolution\e[0m" | |
| echo "" | |
| echo -e "\e[97mCLAVE API GLOBAL:\e[33m $apikeyglobal\e[0m" | |
| echo "" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██╗ ██████╗ ██╗ ██╗ ██╗████████╗██╗ ██████╗ ███╗ ██╗ ██╗ ██╗██████╗ | |
| ## ██╔════╝██║ ██║██╔═══██╗██║ ██║ ██║╚══██╔══╝██║██╔═══██╗████╗ ██║ ██║ ██║╚════██╗ | |
| ## █████╗ ██║ ██║██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██╔██╗ ██║ ██║ ██║ █████╔╝ | |
| ## ██╔══╝ ╚██╗ ██╔╝██║ ██║██║ ██║ ██║ ██║ ██║██║ ██║██║╚██╗██║ ╚██╗ ██╔╝██╔═══╝ | |
| ## ███████╗ ╚████╔╝ ╚██████╔╝███████╗╚██████╔╝ ██║ ██║╚██████╔╝██║ ╚████║ ╚████╔╝ ███████╗ | |
| ## ╚══════╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═══╝ ╚══════╝ | |
| ferramenta_evolution_v2() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_evolution | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mIngrese el dominio para la Evolution API (ej: api.sociosdigitales.pro): \e[0m" && read -r url_evolution | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_evolution | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio de la Evolution API:\e[97m $url_evolution\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_evolution | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE EVOLUTION API \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Evolution API" "iniciado" | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres Instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "evolution${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "evolution${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO LA EVOLUTION API \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui de fato vamos iniciar a instalação da Evolution API | |
| ## Criando uma Global Key Aleatória | |
| apikeyglobal=$(openssl rand -hex 16) | |
| ## Criando a stack | |
| cat > evolution_v2${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| evolution${1:+_$1}: | |
| image: atendai/evolution-api:v2.1.2 ## Versão da Evolution API | |
| volumes: | |
| - evolution${1:+_$1}_instances:/evolution/instances | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configurações Gerais | |
| - SERVER_URL=https://$url_evolution | |
| - AUTHENTICATION_API_KEY=$apikeyglobal | |
| - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true | |
| - DEL_INSTANCE=false | |
| - QRCODE_LIMIT=1902 | |
| - LANGUAGE=pt-BR | |
| ## Configuração do Cliente | |
| ## Pegue a versão em: https://wppconnect.io/pt-BR/whatsapp-versions/ | |
| - CONFIG_SESSION_PHONE_VERSION=2.3000.1022594794 | |
| - CONFIG_SESSION_PHONE_CLIENT=SociosPro | |
| - CONFIG_SESSION_PHONE_NAME=Chrome | |
| ## Configuração do Banco de Dados | |
| - DATABASE_ENABLED=true | |
| - DATABASE_PROVIDER=postgresql | |
| - DATABASE_CONNECTION_URI=postgresql://postgres:$senha_postgres@postgres:5432/evolution${1:+_$1} | |
| - DATABASE_CONNECTION_CLIENT_NAME=evolution${1:+_$1} | |
| - DATABASE_SAVE_DATA_INSTANCE=true | |
| - DATABASE_SAVE_DATA_NEW_MESSAGE=true | |
| - DATABASE_SAVE_MESSAGE_UPDATE=true | |
| - DATABASE_SAVE_DATA_CONTACTS=true | |
| - DATABASE_SAVE_DATA_CHATS=true | |
| - DATABASE_SAVE_DATA_LABELS=true | |
| - DATABASE_SAVE_DATA_HISTORIC=true | |
| ## Integração com OpenAI | |
| - OPENAI_ENABLED=true | |
| ## Integração com Dify | |
| - DIFY_ENABLED=true | |
| ## Integração com Typebot | |
| - TYPEBOT_ENABLED=true | |
| - TYPEBOT_API_VERSION=latest | |
| ## Integração com Chatwoot | |
| - CHATWOOT_ENABLED=true | |
| - CHATWOOT_MESSAGE_READ=true | |
| - CHATWOOT_MESSAGE_DELETE=true | |
| - CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgresql://postgres:$senha_postgres@postgres:5432/chatwoot?sslmode=disable | |
| - CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=false | |
| ## Configuração do Cache | |
| - CACHE_REDIS_ENABLED=true | |
| - CACHE_REDIS_URI=redis://redis:6379/8 | |
| - CACHE_REDIS_PREFIX_KEY=evolution | |
| - CACHE_REDIS_SAVE_INSTANCES=false | |
| - CACHE_LOCAL_ENABLED=false | |
| ## Configuração do S3 | |
| - S3_ENABLED=false | |
| - S3_ACCESS_KEY= | |
| - S3_SECRET_KEY= | |
| - S3_BUCKET=evolution | |
| - S3_PORT=443 | |
| - S3_ENDPOINT= | |
| - S3_USE_SSL=true | |
| #- S3_REGION=eu-south | |
| ## Configuração do WhatsApp Business | |
| - WA_BUSINESS_TOKEN_WEBHOOK=evolution | |
| - WA_BUSINESS_URL=https://graph.facebook.com | |
| - WA_BUSINESS_VERSION=v20.0 | |
| - WA_BUSINESS_LANGUAGE=pt_BR | |
| ## Telemetria | |
| - TELEMETRY=false | |
| - TELEMETRY_URL= | |
| ## Configuração do WebSocket | |
| - WEBSOCKET_ENABLED=false | |
| - WEBSOCKET_GLOBAL_EVENTS=false | |
| ## Configuração do SQS | |
| - SQS_ENABLED=false | |
| - SQS_ACCESS_KEY_ID= | |
| - SQS_SECRET_ACCESS_KEY= | |
| - SQS_ACCOUNT_ID= | |
| - SQS_REGION= | |
| ## Configuração do RabbitMQ | |
| - RABBITMQ_ENABLED=false | |
| - RABBITMQ_URI=amqp://USER:PASS@rabbitmq:5672/evolution${1:+_$1} | |
| - RABBITMQ_EXCHANGE_NAME=evolution | |
| - RABBITMQ_GLOBAL_ENABLED=false | |
| - RABBITMQ_EVENTS_APPLICATION_STARTUP=false | |
| - RABBITMQ_EVENTS_INSTANCE_CREATE=false | |
| - RABBITMQ_EVENTS_INSTANCE_DELETE=false | |
| - RABBITMQ_EVENTS_QRCODE_UPDATED=false | |
| - RABBITMQ_EVENTS_MESSAGES_SET=false | |
| - RABBITMQ_EVENTS_MESSAGES_UPSERT=true | |
| - RABBITMQ_EVENTS_MESSAGES_EDITED=false | |
| - RABBITMQ_EVENTS_MESSAGES_UPDATE=false | |
| - RABBITMQ_EVENTS_MESSAGES_DELETE=false | |
| - RABBITMQ_EVENTS_SEND_MESSAGE=false | |
| - RABBITMQ_EVENTS_CONTACTS_SET=false | |
| - RABBITMQ_EVENTS_CONTACTS_UPSERT=false | |
| - RABBITMQ_EVENTS_CONTACTS_UPDATE=false | |
| - RABBITMQ_EVENTS_PRESENCE_UPDATE=false | |
| - RABBITMQ_EVENTS_CHATS_SET=false | |
| - RABBITMQ_EVENTS_CHATS_UPSERT=false | |
| - RABBITMQ_EVENTS_CHATS_UPDATE=false | |
| - RABBITMQ_EVENTS_CHATS_DELETE=false | |
| - RABBITMQ_EVENTS_GROUPS_UPSERT=false | |
| - RABBITMQ_EVENTS_GROUP_UPDATE=false | |
| - RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE=false | |
| - RABBITMQ_EVENTS_CONNECTION_UPDATE=true | |
| - RABBITMQ_EVENTS_CALL=false | |
| - RABBITMQ_EVENTS_TYPEBOT_START=false | |
| - RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS=false | |
| ## Configuração do Webhook | |
| - WEBHOOK_GLOBAL_ENABLED=false | |
| - WEBHOOK_GLOBAL_URL= | |
| - WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false | |
| - WEBHOOK_EVENTS_APPLICATION_STARTUP=false | |
| - WEBHOOK_EVENTS_QRCODE_UPDATED=false | |
| - WEBHOOK_EVENTS_MESSAGES_SET=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPSERT=false | |
| - WEBHOOK_EVENTS_MESSAGES_EDITED=false | |
| - WEBHOOK_EVENTS_MESSAGES_UPDATE=false | |
| - WEBHOOK_EVENTS_MESSAGES_DELETE=false | |
| - WEBHOOK_EVENTS_SEND_MESSAGE=false | |
| - WEBHOOK_EVENTS_CONTACTS_SET=false | |
| - WEBHOOK_EVENTS_CONTACTS_UPSERT=false | |
| - WEBHOOK_EVENTS_CONTACTS_UPDATE=false | |
| - WEBHOOK_EVENTS_PRESENCE_UPDATE=false | |
| - WEBHOOK_EVENTS_CHATS_SET=false | |
| - WEBHOOK_EVENTS_CHATS_UPSERT=false | |
| - WEBHOOK_EVENTS_CHATS_UPDATE=false | |
| - WEBHOOK_EVENTS_CHATS_DELETE=false | |
| - WEBHOOK_EVENTS_GROUPS_UPSERT=false | |
| - WEBHOOK_EVENTS_GROUPS_UPDATE=false | |
| - WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE=false | |
| - WEBHOOK_EVENTS_CONNECTION_UPDATE=false | |
| - WEBHOOK_EVENTS_LABELS_EDIT=false | |
| - WEBHOOK_EVENTS_LABELS_ASSOCIATION=false | |
| - WEBHOOK_EVENTS_CALL=false | |
| - WEBHOOK_EVENTS_TYPEBOT_START=false | |
| - WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false | |
| - WEBHOOK_EVENTS_ERRORS=false | |
| - WEBHOOK_EVENTS_ERRORS_WEBHOOK= | |
| ## Configuração do Provider | |
| - PROVIDER_ENABLED=false | |
| - PROVIDER_HOST=127.0.0.1 | |
| - PROVIDER_PORT=5656 | |
| - PROVIDER_PREFIX=evolution${1:+_$1} | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=1 | |
| - traefik.http.routers.evolution_v2${1:+_$1}.rule=Host(\`$url_evolution\`) ## Url da Evolution API | |
| - traefik.http.routers.evolution_v2${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.evolution_v2${1:+_$1}.priority=1 | |
| - traefik.http.routers.evolution_v2${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.evolution_v2${1:+_$1}.service=evolution_v2${1:+_$1} | |
| - traefik.http.services.evolution_v2${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.services.evolution_v2${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| evolution${1:+_$1}_instances: | |
| external: true | |
| name: evolution${1:+_$1}_instances | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando stack" | |
| echo "No se pudo crear la stack de Evolution API" | |
| fi | |
| STACK_NAME="evolution_v2${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c evolution_v2.yaml evolution > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack da Evolution API" | |
| #fi | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Usa o serviço wait_evolution para verificar se o serviço esta online | |
| wait_stack "evolution_v2${1:+_$1}" | |
| telemetria "Evolution API" "finalizado" | |
| cd dados_vps | |
| cat > dados_evolution_v2${1:+_$1} <<EOL | |
| [ EVOLUTION API ] | |
| Manager Evolution: https://$url_evolution/manager | |
| URL: https://$url_evolution | |
| Global API Key: $apikeyglobal | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ EVOLUTION API ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mEnlace del Manager:\e[33m https://$url_evolution/manager\e[0m" | |
| echo "" | |
| echo -e "\e[97mURL de la API:\e[33m https://$url_evolution\e[0m" | |
| echo "" | |
| echo -e "\e[97mGLOBAL API KEY:\e[33m $apikeyglobal\e[0m" | |
| echo "" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ███╗██╗███╗ ██╗██╗ ██████╗ | |
| ## ████╗ ████║██║████╗ ██║██║██╔═══██╗ | |
| ## ██╔████╔██║██║██╔██╗ ██║██║██║ ██║ | |
| ## ██║╚██╔╝██║██║██║╚██╗██║██║██║ ██║ | |
| ## ██║ ╚═╝ ██║██║██║ ╚████║██║╚██████╔╝ | |
| ## ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═════╝ | |
| ferramenta_minio() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do Minio | |
| echo -e "\e[97mPaso$amarelo 1/4\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para MinIO (ej: minio.sociosdigitales.pro): \e[0m" && read -r url_minio | |
| echo "" | |
| ##Pergunta o Dominio para o S3 do Minio | |
| echo -e "\e[97mPaso$amarelo 2/4\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para MinIO S3 (ej: s3.sociosdigitales.pro): \e[0m" && read -r url_s3 | |
| echo "" | |
| ##Pergunta o Usuario para o Minio | |
| echo -e "\e[97mPaso$amarelo 3/4\e[0m" | |
| echo -e "$amarelo--> Evite caracteres especiales: \!#$ y/o espacios" | |
| echo -en "\e[33mIngrese un usuario para MinIO (ej: SociosPro): \e[0m" && read -r user_minio | |
| echo "" | |
| ##Pergunta a Senha para o Minio | |
| echo -e "\e[97mPaso$amarelo 4/4\e[0m" | |
| echo -e "$amarelo--> Mínimo 8 caracteres. Use letras MAYÚSCULAS y minúsculas, números y un carácter especial @ o _" | |
| echo -e "$amarelo--> Evite los caracteres especiales: \!#$" | |
| echo -en "\e[33mIngrese una contraseña para MinIO (ej: @Contraseña123_): \e[0m" && read -r senha_minio | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_minio | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Minio | |
| echo -e "\e[33mDominio de MinIO:\e[97m $url_minio\e[0m" | |
| echo "" | |
| ## Informação sobre URL para o S# do Minio | |
| echo -e "\e[33mDominio de S3:\e[97m $url_s3\e[0m" | |
| echo "" | |
| ## Informação sobre Usuario do Minio | |
| echo -e "\e[33mUsuario de MinIO:\e[97m $user_minio\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Minio | |
| echo -e "\e[33mContraseña de MinIO:\e[97m $senha_minio\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE MINIO \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria MinIO iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO MINIO \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack minio.yaml | |
| cat > minio${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| minio${1:+_$1}: | |
| image: quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z-cpuv1 ## Versão do Minio | |
| command: server /data --console-address ":9001" | |
| volumes: | |
| - minio${1:+_$1}_data:/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - MINIO_ROOT_USER=$user_minio | |
| - MINIO_ROOT_PASSWORD=$senha_minio ## Precisa conter no minimo 8 caracteres | |
| ## Url do minio | |
| - MINIO_BROWSER_REDIRECT_URL=https://$url_minio ## Url do minio | |
| ## - MINIO_SERVER_URL=https://$url_s3 ## Url do s3 | Comente esta linha caso tiver erro ao fazer login | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.minio_public${1:+_$1}.rule=Host(\`$url_s3\`) ## Url do s3 | |
| - traefik.http.routers.minio_public${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.minio_public${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.minio_public${1:+_$1}.loadbalancer.server.port=9000 | |
| - traefik.http.services.minio_public${1:+_$1}.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.minio_public${1:+_$1}.service=minio_public${1:+_$1} | |
| - traefik.http.routers.minio_console${1:+_$1}.rule=Host(\`$url_minio\`) ## Url do minio | |
| - traefik.http.routers.minio_console${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.minio_console${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.minio_console${1:+_$1}.loadbalancer.server.port=9001 | |
| - traefik.http.services.minio_console${1:+_$1}.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.minio_console${1:+_$1}.service=minio_console${1:+_$1} | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| minio${1:+_$1}_data: | |
| external: true | |
| name: minio${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de MinIO" | |
| fi | |
| sleep 1 | |
| STACK_NAME="minio${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull quay.io/minio/minio:latest | |
| ## Usa o serviço wait_minio para verificar se o serviço esta online | |
| wait_stack minio${1:+_$1}_minio${1:+_$1} | |
| telemetria MinIO finalizado | |
| cd dados_vps | |
| cat > dados_minio${1:+_$1} <<EOL | |
| [ MINIO ] | |
| Dominio do Minio: https://$url_minio | |
| Dominio do S3: https://$url_s3 | |
| Usuario: $user_minio | |
| Senha: $senha_minio | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicación: | |
| echo -e "\e[32m[ MINIO ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio MinIO:\e[97m https://$url_minio\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio S3:\e[97m https://$url_s3\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_minio\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $senha_minio\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ████████╗██╗ ██╗██████╗ ███████╗██████╗ ██████╗ ████████╗ | |
| ## ╚══██╔══╝╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗██╔═══██╗╚══██╔══╝ | |
| ## ██║ ╚████╔╝ ██████╔╝█████╗ ██████╔╝██║ ██║ ██║ | |
| ## ██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ██╔══██╗██║ ██║ ██║ | |
| ## ██║ ██║ ██║ ███████╗██████╔╝╚██████╔╝ ██║ | |
| ## ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═════╝ ╚═════╝ ╚═╝ | |
| ferramenta_typebot() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_typebot | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do Builder | |
| echo -e "\e[97mPaso$amarelo 1/10\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para el Builder de Typebot (ej: typebot.sociosdigitales.pro): \e[0m" && read -r url_typebot | |
| echo "" | |
| ##Pergunta o Dominio do Viewer | |
| echo -e "\e[97mPaso$amarelo 2/10\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para el Viewer de Typebot (ej: bot.sociosdigitales.pro): \e[0m" && read -r url_viewer | |
| echo "" | |
| ##Pergunta a versão da ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/10\e[0m" | |
| echo -en "\e[33mIngrese la versión que desea de Typebot (ej: 3.0.1 o latest): \e[0m" && read -r versao_typebot | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPaso$amarelo 4/10\e[0m" | |
| echo -en "\e[33mIngrese el Email para SMTP (ej: contacto@sociosdigitales.pro): \e[0m" && read -r email_typebot | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPaso$amarelo 5/10\e[0m" | |
| echo -e "$amarelo--> Si no tiene un usuario de email, use el mismo email de abajo" | |
| echo -en "\e[33mIngrese el Usuario para SMTP (ej: sociosdigitales o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_email_typebot | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPaso$amarelo 6/10\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si usa gmail, utilice la contraseña de aplicación" | |
| echo -en "\e[33mIngrese la Contraseña SMTP del Email (ej: @Contraseña123_): \e[0m" && read -r senha_email_typebot | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPaso$amarelo 7/10\e[0m" | |
| echo -en "\e[33mIngrese el Host SMTP del Email (ej: smtp.hostinger.com): \e[0m" && read -r smtp_email_typebot | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPaso$amarelo 8/10\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del Email (ej: 465): \e[0m" && read -r porta_smtp_typebot | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_typebot" -eq 465 ]; then | |
| smtp_secure_typebot=true | |
| else | |
| smtp_secure_typebot=false | |
| fi | |
| ## Pergunta qual é o Access Key do minio | |
| echo -e "\e[97mPaso$amarelo 9/10\e[0m" | |
| echo -en "\e[33mAccess Key de Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pergunta qual é a Secret Key do minio | |
| echo -e "\e[97mPaso$amarelo 10/10\e[0m" | |
| echo -en "\e[33mSecret Key de Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_typebot | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Builder | |
| echo -e "\e[33mDominio del Typebot Builder:\e[97m $url_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Viewer | |
| echo -e "\e[33mDominio del Typebot Viewer:\e[97m $url_viewer\e[0m" | |
| echo "" | |
| ## Informação sobre a versão da ferramenta | |
| echo -e "\e[33mVersión de Typebot:\e[97m $versao_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail del SMTP:\e[97m $email_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mUsuario del SMTP:\e[97m $usuario_email_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Email | |
| echo -e "\e[33mContraseña del Email:\e[97m $senha_email_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP del Email:\e[97m $smtp_email_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPuerto SMTP del Email:\e[97m $porta_smtp_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Secure SMTP | |
| echo -e "\e[33mSecure SMTP del Email:\e[97m $smtp_secure_typebot\e[0m" | |
| echo "" | |
| ## Informação sobre Access Key | |
| echo -e "\e[33mAccess Key de Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| ## Informação sobre Secret Key | |
| echo -e "\e[33mSecret Key de Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_typebot | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE TYPEBOT \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Typebot iniciado | |
| ## Nada nada nada.. só para aparecer a mensagem de passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "typebot${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "typebot${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• OBTENIENDO DATOS DE MINIO \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| pegar_senha_minio | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Obteniendo Contraseña de MinIO" | |
| else | |
| echo "1/2 - [ OFF ] - Obteniendo Contraseña de MinIO" | |
| echo "No fue posible obtener la contraseña de minio" | |
| echo "" | |
| fi | |
| pegar_link_s3 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Obteniendo URL del S3" | |
| echo "" | |
| else | |
| echo "2/2 - [ OFF ] - Obteniendo URL del S3" | |
| echo "No fue posible obtener el enlace del S3" | |
| echo "" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO TYPEBOT \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| key_typebot=$(openssl rand -hex 16) | |
| ## Criando a stack typebot.yaml | |
| cat > typebot${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| typebot${1:+_$1}_builder: | |
| image: baptistearno/typebot-builder:$versao_typebot ## Versão do Builder do Typebot | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/typebot${1:+_$1} | |
| ## Encryption key | |
| - ENCRYPTION_SECRET=$key_typebot | |
| - AUTH_TRUST_HOST=https://$url_typebot | |
| ## Plano Padrão (das novas contas) | |
| - DEFAULT_WORKSPACE_PLAN=UNLIMITED | |
| ## Urls do typebot | |
| - NEXTAUTH_URL=https://$url_typebot ## URL Builder | |
| - NEXT_PUBLIC_VIEWER_URL=https://$url_viewer ## URL Viewer | |
| - NEXTAUTH_URL_INTERNAL=http://localhost:3000 | |
| ## Desativer/ativar novos cadastros | |
| - DISABLE_SIGNUP=false | |
| ## Dados do SMTP | |
| - ADMIN_EMAIL=$email_typebot ## Email SMTP | |
| - NEXT_PUBLIC_SMTP_FROM='Suporte' <$email_typebot> | |
| - SMTP_AUTH_DISABLED=false | |
| - SMTP_USERNAME=$usuario_email_typebot | |
| - SMTP_PASSWORD=$senha_email_typebot | |
| - SMTP_HOST=$smtp_email_typebot | |
| - SMTP_PORT=$porta_smtp_typebot | |
| - SMTP_SECURE=$smtp_secure_typebot | |
| ## Dados Google Cloud | |
| #- GOOGLE_AUTH_CLIENT_ID= | |
| #- GOOGLE_SHEETS_CLIENT_ID= | |
| #- GOOGLE_AUTH_CLIENT_SECRET= | |
| #- GOOGLE_SHEETS_CLIENT_SECRET= | |
| #- NEXT_PUBLIC_GOOGLE_SHEETS_API_KEY= | |
| ## Dados do Minio/S3 | |
| - S3_ACCESS_KEY=$S3_ACCESS_KEY | |
| - S3_SECRET_KEY=$S3_SECRET_KEY | |
| - S3_BUCKET=typebot${1:+-$1} | |
| - S3_ENDPOINT=$url_s3 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - io.portainer.accesscontrol.users=admin | |
| - traefik.enable=true | |
| - traefik.http.routers.typebot${1:+_$1}_builder.rule=Host(\`$url_typebot\`) ## Url do Builder do Typebot | |
| - traefik.http.routers.typebot${1:+_$1}_builder.entrypoints=websecure | |
| - traefik.http.routers.typebot${1:+_$1}_builder.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.typebot${1:+_$1}_builder.loadbalancer.server.port=3000 | |
| - traefik.http.services.typebot${1:+_$1}_builder.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.typebot${1:+_$1}_builder.service=typebot${1:+_$1}_builder | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| typebot${1:+_$1}_viewer: | |
| image: baptistearno/typebot-viewer:$versao_typebot ## Versão do Viewer do Typebot | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/typebot${1:+_$1} | |
| ## Encryption key | |
| - ENCRYPTION_SECRET=$key_typebot | |
| - AUTH_TRUST_HOST=https://$url_typebot | |
| ## Plano Padrão (das novas contas) | |
| - DEFAULT_WORKSPACE_PLAN=UNLIMITED | |
| ## Urls do typebot | |
| - NEXTAUTH_URL=https://$url_typebot ## URL Builder | |
| - NEXT_PUBLIC_VIEWER_URL=https://$url_viewer ## URL Viewer | |
| - NEXTAUTH_URL_INTERNAL=http://localhost:3000 | |
| ## Desativer/ativar novos cadastros | |
| - DISABLE_SIGNUP=false | |
| ## Dados do SMTP | |
| - ADMIN_EMAIL=$email_typebot ## Email SMTP | |
| - NEXT_PUBLIC_SMTP_FROM='Suporte' <$email_typebot> | |
| - SMTP_AUTH_DISABLED=false | |
| - SMTP_USERNAME=$usuario_email_typebot | |
| - SMTP_PASSWORD=$senha_email_typebot | |
| - SMTP_HOST=$smtp_email_typebot | |
| - SMTP_PORT=$porta_smtp_typebot | |
| - SMTP_SECURE=$smtp_secure_typebot | |
| ## Dados Google Cloud | |
| #- GOOGLE_AUTH_CLIENT_ID= | |
| #- GOOGLE_SHEETS_CLIENT_ID= | |
| #- GOOGLE_AUTH_CLIENT_SECRET= | |
| #- GOOGLE_SHEETS_CLIENT_SECRET= | |
| #- NEXT_PUBLIC_GOOGLE_SHEETS_API_KEY= | |
| ## Dados do Minio/S3 | |
| - S3_ACCESS_KEY=$S3_ACCESS_KEY | |
| - S3_SECRET_KEY=$S3_SECRET_KEY | |
| - S3_BUCKET=typebot${1:+-$1} | |
| - S3_ENDPOINT=$url_s3 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - io.portainer.accesscontrol.users=admin | |
| - traefik.enable=true | |
| - traefik.http.routers.typebot${1:+_$1}_viewer.rule=Host(\`$url_viewer\`) ## Url do Viewer do Typebot | |
| - traefik.http.routers.typebot${1:+_$1}_viewer.entrypoints=websecure | |
| - traefik.http.routers.typebot${1:+_$1}_viewer.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.typebot${1:+_$1}_viewer.loadbalancer.server.port=3000 | |
| - traefik.http.services.typebot${1:+_$1}_viewer.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.typebot${1:+_$1}_viewer.service=typebot${1:+_$1}_viewer | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Typebot" | |
| fi | |
| STACK_NAME="typebot${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull baptistearno/typebot-builder:$versao_typebot baptistearno/typebot-viewer:$versao_typebot | |
| ## Usa o serviço wait_typebot para verificar se o serviço esta online | |
| wait_stack typebot${1:+_$1}_typebot${1:+_$1}_builder typebot${1:+_$1}_typebot${1:+_$1}_viewer | |
| telemetria Typebot finalizado | |
| cd dados_vps | |
| cat > dados_typebot${1:+_$1} <<EOL | |
| [ TYPEBOT ] | |
| Dominio de Typebot: https://$url_typebot | |
| Email: Cualquiera (cada email es un workspace) | |
| Contraseña: No tiene contraseña, llega a tu email el enlace mágico de acceso | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicación: | |
| echo -e "\e[32m[ TYPEBOT ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_typebot\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Cualquiera (no necesita ser el mismo que usó en la instalación)\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m No tiene contraseña, llega a tu email un enlace mágico de acceso.\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ██╗ █████╗ ███╗ ██╗ | |
| ## ████╗ ██║██╔══██╗████╗ ██║ | |
| ## ██╔██╗ ██║╚█████╔╝██╔██╗ ██║ | |
| ## ██║╚██╗██║██╔══██╗██║╚██╗██║ | |
| ## ██║ ╚████║╚█████╔╝██║ ╚████║ | |
| ## ╚═╝ ╚═══╝ ╚════╝ ╚═╝ ╚═══╝ | |
| ferramenta_n8n() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_n8n | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do N8N | |
| echo -e "\e[97mPaso$amarelo 1/7\e[0m" | |
| echo -en "\e[33mIngrese el dominio para N8N (ej: n8n.sociosdigitales.pro): \e[0m" && read -r url_editorn8n | |
| echo "" | |
| ##Pergunta o Dominio do Webhook | |
| echo -e "\e[97mPaso$amarelo 2/7\e[0m" | |
| echo -en "\e[33mIngrese el dominio para el Webhook de N8N (ej: webhook.sociosdigitales.pro): \e[0m" && read -r url_webhookn8n | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPaso$amarelo 3/7\e[0m" | |
| echo -en "\e[33mIngrese el Email para SMTP (ej: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_n8n | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPaso$amarelo 4/7\e[0m" | |
| echo -e "$amarelo--> Si no tiene un usuario de email, use el mismo email" | |
| echo -en "\e[33mIngrese el Usuario para SMTP (ej: sociosdigitales o contato@sociosdigitales.pro): \e[0m" && read -r usuario_smtp_n8n | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPaso$amarelo 5/7\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si usa Gmail, utilice la contraseña de aplicación" | |
| echo -en "\e[33mIngrese la Contraseña SMTP del Email (ej: @Senha123_): \e[0m" && read -r senha_smtp_n8n | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPaso$amarelo 6/7\e[0m" | |
| echo -en "\e[33mIngrese el Host SMTP del Email (ej: smtp.hostinger.com): \e[0m" && read -r host_smtp_n8n | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPaso$amarelo 7/7\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del Email (ej: 465): \e[0m" && read -r porta_smtp_n8n | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_typebot" -eq 465 ]; then | |
| smtp_secure_smtp_n8n=true | |
| else | |
| smtp_secure_smtp_n8n=false | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_n8n | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do N8N | |
| echo -e "\e[33mDominio de N8N:\e[97m $url_editorn8n\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Webhook | |
| echo -e "\e[33mDominio para el Webhook:\e[97m $url_webhookn8n\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail del SMTP:\e[97m $email_smtp_n8n\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mUsuario del SMTP:\e[97m $usuario_smtp_n8n\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Email | |
| echo -e "\e[33mContraseña del Email:\e[97m $senha_smtp_n8n\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP del Email:\e[97m $host_smtp_n8n\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPuerto SMTP del Email:\e[97m $porta_smtp_n8n\e[0m" | |
| echo "" | |
| ## Informação sobre Secure SMTP | |
| echo -e "\e[33mSecure SMTP del Email:\e[97m $smtp_secure_smtp_n8n\e[0m" | |
| echo "" | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_n8n | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE N8N \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria N8N iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica se tem postgres, se sim pega a senha e cria um banco nele, se não instala, pega a senha e cria o banco | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "n8n_queue${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "n8n_queue${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO N8N \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| encryption_key=$(openssl rand -hex 16) | |
| ## Criando a stack n8n.yaml | |
| cat > n8n${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| n8n${1:+_$1}_editor: | |
| image: n8nio/n8n:latest ## Versão do N8N | |
| command: start | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## 🗄️ Banco de Dados (PostgreSQL) | |
| - DB_TYPE=postgresdb | |
| - DB_POSTGRESDB_DATABASE=n8n_queue${1:+_$1} | |
| - DB_POSTGRESDB_HOST=postgres | |
| - DB_POSTGRESDB_PORT=5432 | |
| - DB_POSTGRESDB_USER=postgres | |
| - DB_POSTGRESDB_PASSWORD=$senha_postgres | |
| ## 🔐 Criptografia | |
| - N8N_ENCRYPTION_KEY=$encryption_key | |
| ## 🌐 URLs e Configurações de Acesso | |
| - N8N_HOST=$url_editorn8n | |
| - N8N_EDITOR_BASE_URL=https://$url_editorn8n/ | |
| - WEBHOOK_URL=https://$url_webhookn8n/ | |
| - N8N_PROTOCOL=https | |
| ## ⚙️ Ambiente de Execução | |
| - NODE_ENV=production | |
| - EXECUTIONS_MODE=queue | |
| - EXECUTIONS_TIMEOUT=3600 | |
| - EXECUTIONS_TIMEOUT_MAX=7200 | |
| - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true | |
| - N8N_RUNNERS_ENABLED=true | |
| - N8N_RUNNERS_MODE=internal | |
| ## 📦 Pacotes e Nós Comunitários | |
| - N8N_REINSTALL_MISSING_PACKAGES=true | |
| - N8N_COMMUNITY_PACKAGES_ENABLED=true | |
| - N8N_NODE_PATH=/home/node/.n8n/nodes | |
| - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true | |
| ## 📧 SMTP (Envio de E-mails) | |
| - N8N_SMTP_SENDER=$email_smtp_n8n | |
| - N8N_SMTP_USER=$usuario_smtp_n8n | |
| - N8N_SMTP_PASS=$senha_smtp_n8n | |
| - N8N_SMTP_HOST=$host_smtp_n8n | |
| - N8N_SMTP_PORT=$porta_smtp_n8n | |
| - N8N_SMTP_SSL=$smtp_secure_smtp_n8n | |
| ## 🔁 Redis (Fila de Execução) | |
| - QUEUE_BULL_REDIS_HOST=redis | |
| - QUEUE_BULL_REDIS_PORT=6379 | |
| - QUEUE_BULL_REDIS_DB=2 | |
| ## 📊 Métricas | |
| - N8N_METRICS=true | |
| ## ⏱️ Execuções e Limpeza | |
| - EXECUTIONS_DATA_PRUNE=true | |
| - EXECUTIONS_DATA_MAX_AGE=336 | |
| ## 🧠 Recursos de IA | |
| - N8N_AI_ENABLED=false | |
| - N8N_AI_PROVIDER=openai | |
| - N8N_AI_OPENAI_API_KEY= | |
| ## 🧰 Permissões em Funções Personalizadas | |
| - NODE_FUNCTION_ALLOW_BUILTIN=* | |
| - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash | |
| ## 🕒 Fuso Horário | |
| - GENERIC_TIMEZONE=America/Sao_Paulo | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.n8n${1:+_$1}_editor.rule=Host(\`$url_editorn8n\`) ## Url do Editor do N8N | |
| - traefik.http.routers.n8n${1:+_$1}_editor.entrypoints=websecure | |
| - traefik.http.routers.n8n${1:+_$1}_editor.priority=1 | |
| - traefik.http.routers.n8n${1:+_$1}_editor.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.n8n${1:+_$1}_editor.service=n8n${1:+_$1}_editor | |
| - traefik.http.services.n8n${1:+_$1}_editor.loadbalancer.server.port=5678 | |
| - traefik.http.services.n8n${1:+_$1}_editor.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| n8n${1:+_$1}_webhook: | |
| image: n8nio/n8n:latest ## Versão do N8N | |
| command: webhook | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## 🗄️ Banco de Dados (PostgreSQL) | |
| - DB_TYPE=postgresdb | |
| - DB_POSTGRESDB_DATABASE=n8n_queue${1:+_$1} | |
| - DB_POSTGRESDB_HOST=postgres | |
| - DB_POSTGRESDB_PORT=5432 | |
| - DB_POSTGRESDB_USER=postgres | |
| - DB_POSTGRESDB_PASSWORD=$senha_postgres | |
| ## 🔐 Criptografia | |
| - N8N_ENCRYPTION_KEY=$encryption_key | |
| ## 🌐 URLs e Configurações de Acesso | |
| - N8N_HOST=$url_editorn8n | |
| - N8N_EDITOR_BASE_URL=https://$url_editorn8n/ | |
| - WEBHOOK_URL=https://$url_webhookn8n/ | |
| - N8N_PROTOCOL=https | |
| ## ⚙️ Ambiente de Execução | |
| - NODE_ENV=production | |
| - EXECUTIONS_MODE=queue | |
| - EXECUTIONS_TIMEOUT=3600 | |
| - EXECUTIONS_TIMEOUT_MAX=7200 | |
| - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true | |
| - N8N_RUNNERS_ENABLED=true | |
| - N8N_RUNNERS_MODE=internal | |
| ## 📦 Pacotes e Nós Comunitários | |
| - N8N_REINSTALL_MISSING_PACKAGES=true | |
| - N8N_COMMUNITY_PACKAGES_ENABLED=true | |
| - N8N_NODE_PATH=/home/node/.n8n/nodes | |
| - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true | |
| ## 📧 SMTP (Envio de E-mails) | |
| - N8N_SMTP_SENDER=$email_smtp_n8n | |
| - N8N_SMTP_USER=$usuario_smtp_n8n | |
| - N8N_SMTP_PASS=$senha_smtp_n8n | |
| - N8N_SMTP_HOST=$host_smtp_n8n | |
| - N8N_SMTP_PORT=$porta_smtp_n8n | |
| - N8N_SMTP_SSL=$smtp_secure_smtp_n8n | |
| ## 🔁 Redis (Fila de Execução) | |
| - QUEUE_BULL_REDIS_HOST=redis | |
| - QUEUE_BULL_REDIS_PORT=6379 | |
| - QUEUE_BULL_REDIS_DB=2 | |
| ## 📊 Métricas | |
| - N8N_METRICS=true | |
| ## ⏱️ Execuções e Limpeza | |
| - EXECUTIONS_DATA_PRUNE=true | |
| - EXECUTIONS_DATA_MAX_AGE=336 | |
| ## 🧠 Recursos de IA | |
| - N8N_AI_ENABLED=false | |
| - N8N_AI_PROVIDER=openai | |
| - N8N_AI_OPENAI_API_KEY= | |
| ## 🧰 Permissões em Funções Personalizadas | |
| - NODE_FUNCTION_ALLOW_BUILTIN=* | |
| - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash | |
| ## 🕒 Fuso Horário | |
| - GENERIC_TIMEZONE=America/Sao_Paulo | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.n8n${1:+_$1}_webhook.rule=(Host(\`$url_webhookn8n\`)) ## Url do Webhook do N8N | |
| - traefik.http.routers.n8n${1:+_$1}_webhook.entrypoints=websecure | |
| - traefik.http.routers.n8n${1:+_$1}_webhook.priority=1 | |
| - traefik.http.routers.n8n${1:+_$1}_webhook.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.n8n${1:+_$1}_webhook.service=n8n${1:+_$1}_webhook | |
| - traefik.http.services.n8n${1:+_$1}_webhook.loadbalancer.server.port=5678 | |
| - traefik.http.services.n8n${1:+_$1}_webhook.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| n8n${1:+_$1}_worker: | |
| image: n8nio/n8n:latest ## Versão do N8N | |
| command: worker --concurrency=10 | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## 🗄️ Banco de Dados (PostgreSQL) | |
| - DB_TYPE=postgresdb | |
| - DB_POSTGRESDB_DATABASE=n8n_queue${1:+_$1} | |
| - DB_POSTGRESDB_HOST=postgres | |
| - DB_POSTGRESDB_PORT=5432 | |
| - DB_POSTGRESDB_USER=postgres | |
| - DB_POSTGRESDB_PASSWORD=$senha_postgres | |
| ## 🔐 Criptografia | |
| - N8N_ENCRYPTION_KEY=$encryption_key | |
| ## 🌐 URLs e Configurações de Acesso | |
| - N8N_HOST=$url_editorn8n | |
| - N8N_EDITOR_BASE_URL=https://$url_editorn8n/ | |
| - WEBHOOK_URL=https://$url_webhookn8n/ | |
| - N8N_PROTOCOL=https | |
| ## ⚙️ Ambiente de Execução | |
| - NODE_ENV=production | |
| - EXECUTIONS_MODE=queue | |
| - EXECUTIONS_TIMEOUT=3600 | |
| - EXECUTIONS_TIMEOUT_MAX=7200 | |
| - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true | |
| - N8N_RUNNERS_ENABLED=true | |
| - N8N_RUNNERS_MODE=internal | |
| ## 📦 Pacotes e Nós Comunitários | |
| - N8N_REINSTALL_MISSING_PACKAGES=true | |
| - N8N_COMMUNITY_PACKAGES_ENABLED=true | |
| - N8N_NODE_PATH=/home/node/.n8n/nodes | |
| - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true | |
| ## 📧 SMTP (Envio de E-mails) | |
| - N8N_SMTP_SENDER=$email_smtp_n8n | |
| - N8N_SMTP_USER=$usuario_smtp_n8n | |
| - N8N_SMTP_PASS=$senha_smtp_n8n | |
| - N8N_SMTP_HOST=$host_smtp_n8n | |
| - N8N_SMTP_PORT=$porta_smtp_n8n | |
| - N8N_SMTP_SSL=$smtp_secure_smtp_n8n | |
| ## 🔁 Redis (Fila de Execução) | |
| - QUEUE_BULL_REDIS_HOST=redis | |
| - QUEUE_BULL_REDIS_PORT=6379 | |
| - QUEUE_BULL_REDIS_DB=2 | |
| ## 📊 Métricas | |
| - N8N_METRICS=true | |
| ## ⏱️ Execuções e Limpeza | |
| - EXECUTIONS_DATA_PRUNE=true | |
| - EXECUTIONS_DATA_MAX_AGE=336 | |
| ## 🧠 Recursos de IA | |
| - N8N_AI_ENABLED=false | |
| - N8N_AI_PROVIDER=openai | |
| - N8N_AI_OPENAI_API_KEY= | |
| ## 🧰 Permissões em Funções Personalizadas | |
| - NODE_FUNCTION_ALLOW_BUILTIN=* | |
| - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash | |
| ## 🕒 Fuso Horário | |
| - GENERIC_TIMEZONE=America/Sao_Paulo | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de N8N" | |
| fi | |
| STACK_NAME="n8n${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull n8nio/n8n:latest | |
| ## Usa o serviço wait_n8n para verificar se o serviço esta online | |
| wait_stack n8n${1:+_$1}_n8n${1:+_$1}_editor n8n${1:+_$1}_n8n${1:+_$1}_webhook n8n${1:+_$1}_n8n${1:+_$1}_worker | |
| telemetria N8N finalizado | |
| cd dados_vps | |
| cat > dados_n8n${1:+_$1} <<EOL | |
| [ N8N ] | |
| Dominio de N8N: https://$url_editorn8n | |
| Dominio del Webhook de N8N: https://$url_webhookn8n | |
| Email: Necesita crearse en el primer acceso a N8N | |
| Contraseña: Necesita crearse en el primer acceso a N8N | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ N8N ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio Editor:\e[97m https://$url_editorn8n\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio Webhook:\e[97m https://$url_webhookn8n\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Necesita crearse en el primer acceso a N8N\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Necesita crearse en el primer acceso a N8N\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██████╗ ██╗ ██╗██╗███████╗███████╗ | |
| ## ██╔════╝██║ ██╔═══██╗██║ ██║██║██╔════╝██╔════╝ | |
| ## █████╗ ██║ ██║ ██║██║ █╗ ██║██║███████╗█████╗ | |
| ## ██╔══╝ ██║ ██║ ██║██║███╗██║██║╚════██║██╔══╝ | |
| ## ██║ ███████╗╚██████╔╝╚███╔███╔╝██║███████║███████╗ | |
| ## ╚═╝ ╚══════╝ ╚═════╝ ╚══╝╚══╝ ╚═╝╚══════╝╚══════╝ | |
| ferramenta_flowise() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_flowise | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Flowise (ej: flowise.sociosdigitales.pro): \e[0m" && read -r url_flowise | |
| echo "" | |
| ##Pergunta o Usuario para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/3\e[0m" | |
| echo -e "$amarelo--> Mínimo 5 caracteres. Evite los caracteres especiales: \!#$ y/o espacios" | |
| echo -en "\e[33mIngrese un usuario para Flowise (ej: admin): \e[0m" && read -r user_flowise | |
| echo "" | |
| ##Pergunta a Senha para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/3\e[0m" | |
| echo -e "$amarelo--> Mínimo 8 caracteres. Use letras MAYÚSCULAS y minúsculas, números y un carácter especial @ o _" | |
| echo -e "$amarelo--> Evite los caracteres especiales: \!#$" | |
| echo -en "\e[33mIngrese una contraseña para el usuario (ej: @Senha123_): \e[0m" && read -r pass_flowise | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_flowise | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Flowise | |
| echo -e "\e[33mDominio de Flowise:\e[97m $url_flowise\e[0m" | |
| echo "" | |
| ## Informação sobre Usuario do Flowise | |
| echo -e "\e[33mUsuario:\e[97m $user_flowise\e[0m" | |
| echo "" | |
| ## Informação sobre a Senha do Usuario do Flowise | |
| echo -e "\e[33mContraseña:\e[97m $pass_flowise\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_flowise | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE FLOWISE \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Flowise iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Já sabe né ksk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "flowise${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "flowise${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO FLOWISE \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando uma Encryption Key Aleatória | |
| encryption_key=$(openssl rand -hex 16) | |
| ## Criando a stack flowise.yaml | |
| cat > flowise${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| flowise${1:+_$1}: | |
| image: flowiseai/flowise:latest ## Versão do Flowise | |
| volumes: | |
| - flowise${1:+_$1}_data:/root/.flowise | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - FLOWISE_USERNAME=$user_flowise | |
| - FLOWISE_PASSWORD=$pass_flowise | |
| ## Dados do Postgres | |
| - DATABASE_TYPE=postgres | |
| - DATABASE_HOST=postgres | |
| - DATABASE_PORT=5432 | |
| - DATABASE_USER=postgres | |
| - DATABASE_PASSWORD=$senha_postgres | |
| - DATABASE_NAME=flowise${1:+_$1} | |
| ## Encryption Key | |
| - FLOWISE_SECRETKEY_OVERWRITE=$encryption_key | |
| ## Diretório das API Keys | |
| - APIKEY_PATH=/root/.flowise | |
| - SECRETKEY_PATH=/root/.flowise | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.flowise${1:+_$1}.rule=Host(\`$url_flowise\`) ## Url da aplicação | |
| - traefik.http.services.flowise${1:+_$1}.loadBalancer.server.port=3000 | |
| - traefik.http.routers.flowise${1:+_$1}.service=flowise${1:+_$1} | |
| - traefik.http.routers.flowise${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.flowise${1:+_$1}.tls.certresolver=letsencryptresolver | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| flowise${1:+_$1}_data: | |
| external: true | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Flowise" | |
| fi | |
| STACK_NAME="flowise${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull flowiseai/flowise:latest | |
| ## Usa o serviço wait_flowise para verificar se o serviço esta online | |
| wait_stack flowise${1:+_$1}_flowise${1:+_$1} | |
| telemetria Flowise finalizado | |
| cd dados_vps | |
| cat > dados_flowise${1:+_$1} <<EOL | |
| [ FLOWISE ] | |
| Dominio de Flowise: https://$url_flowise | |
| Usuario: $user_flowise | |
| Contraseña: $pass_flowise | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ FLOWISE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_flowise\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_flowise\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_flowise\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ █████╗ ██████╗ ███╗ ███╗██╗███╗ ██╗ ██╗ ██╗ | |
| ## ██╔══██╗██╔════╝ ██╔══██╗██╔══██╗████╗ ████║██║████╗ ██║ ██║ ██║ | |
| ## ██████╔╝██║ ███╗ ███████║██║ ██║██╔████╔██║██║██╔██╗ ██║ ███████║ | |
| ## ██╔═══╝ ██║ ██║ ██╔══██║██║ ██║██║╚██╔╝██║██║██║╚██╗██║ ╚════██║ | |
| ## ██║ ╚██████╔╝ ██║ ██║██████╔╝██║ ╚═╝ ██║██║██║ ╚████║ ██║ | |
| ## ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═╝ | |
| ferramenta_pgAdmin_4() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_pgAdmin_4 | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mIngrese el dominio para PgAdmin 4 (ej: pgadmin.sociosdigitales.pro): \e[0m" && read -r url_PgAdmin_4 | |
| echo "" | |
| ##Pergunta o Email para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mIngrese un email para PgAdmin 4 (ej: contato@sociosdigitales.pro): \e[0m" && read -r user_PgAdmin_4 | |
| echo "" | |
| ##Pergunta a Senha para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/3\e[0m" | |
| echo -e "$amarelo--> Mínimo 8 caracteres. Use letras MAYÚSCULAS y minúsculas, números y un carácter especial @ o _" | |
| echo -e "$amarelo--> Evite los caracteres especiales: \!#$" | |
| echo -en "\e[33mIngrese una contraseña para el usuario (ej: @Senha123_): \e[0m" && read -r pass_PgAdmin_4 | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_pgAdmin_4 | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do PgAdmin | |
| echo -e "\e[33mDominio de PgAdmin 4:\e[97m $url_PgAdmin_4\e[0m" | |
| echo "" | |
| ## Informação sobre email do PgAdmin | |
| echo -e "\e[33mEmail:\e[97m $user_PgAdmin_4\e[0m" | |
| echo "" | |
| ## Informação sobre a senha do PgAdmin | |
| echo -e "\e[33mContraseña:\e[97m $pass_PgAdmin_4\e[0m" | |
| echo "" | |
| ## Pergunta se as respuestas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não están correctas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE PGADMIN 4 \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "PgAdmin 4" "iniciado" | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO PGADMIN 4 \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack pgadmin.yaml | |
| cat > pgadmin${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| pgadmin${1:+_$1}: | |
| image: dpage/pgadmin4:latest ## Versão do PgAdmin 4 | |
| volumes: | |
| - pgadmin${1:+_$1}_data:/var/lib/pgadmin | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de Acesso | |
| - PGADMIN_DEFAULT_EMAIL=$user_PgAdmin_4 | |
| - PGADMIN_DEFAULT_PASSWORD=$pass_PgAdmin_4 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: '1' | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.pgadmin${1:+_$1}.rule=Host(\`$url_PgAdmin_4\`) ## Url da Ferramenta | |
| - traefik.http.services.pgadmin${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.pgadmin${1:+_$1}.service=pgadmin${1:+_$1} | |
| - traefik.http.routers.pgadmin${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.pgadmin${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.pgadmin${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| pgadmin${1:+_$1}_data: | |
| external: true | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de PgAdmin 4" | |
| fi | |
| STACK_NAME="pgadmin${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull dpage/pgadmin4:latest | |
| ## Usa o serviço wait_pgadmin_4 para verificar se o serviço esta online | |
| wait_stack pgadmin${1:+_$1}_pgadmin${1:+_$1} | |
| telemetria "PgAdmin 4" "finalizado" | |
| cd dados_vps | |
| cat > dados_pgadmin${1:+_$1} <<EOL | |
| [ PGADMIN 4 ] | |
| Dominio de pgadmin: https://$url_PgAdmin_4 | |
| Usuario: $user_PgAdmin_4 | |
| Contraseña: $pass_PgAdmin_4 | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ PGADMIN 4 ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_PgAdmin_4\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m $user_PgAdmin_4\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_PgAdmin_4\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██████╗ █████╗ ███████╗███████╗ | |
| ## ████╗ ██║██╔═══██╗██╔════╝██╔═══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝ | |
| ## ██╔██╗ ██║██║ ██║██║ ██║ ██║██████╔╝███████║███████╗█████╗ | |
| ## ██║╚██╗██║██║ ██║██║ ██║ ██║██╔══██╗██╔══██║╚════██║██╔══╝ | |
| ## ██║ ╚████║╚██████╔╝╚██████╗╚██████╔╝██████╔╝██║ ██║███████║███████╗ | |
| ## ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
| ferramenta_nocobase() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_nocobase | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/4\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Nocobase (ej: nocobase.sociosdigitales.pro): \e[0m" && read -r url_nocobase | |
| echo "" | |
| ##Pergunta o Email para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/4\e[0m" | |
| echo -en "\e[33mIngrese un email para Nocobase (ej: contato@sociosdigitales.pro): \e[0m" && read -r mail_nocobase | |
| echo "" | |
| ##Pergunta um Usuario para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/4\e[0m" | |
| echo -en "\e[33mIngrese un nombre de usuario para Nocobase (ej: SociosPro): \e[0m" && read -r user_nocobase | |
| echo "" | |
| ##Pergunta a Senha para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 4/4\e[0m" | |
| echo -e "$amarelo--> Mínimo 8 caracteres. Use letras MAYÚSCULAS y minúsculas, números y un carácter especial @ o _" | |
| echo -e "$amarelo--> Evite los caracteres especiales: \!#$" | |
| echo -en "\e[33mIngrese una contraseña para el usuario (ej: @Senha123_): \e[0m" && read -r pass_nocobase | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_nocobase | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Nocobase | |
| echo -e "\e[33mDominio de Nocobase:\e[97m $url_nocobase\e[0m" | |
| echo "" | |
| ## Informação sobre Email do Nocobase | |
| echo -e "\e[33mEmail:\e[97m $mail_nocobase\e[0m" | |
| echo "" | |
| ## Informação sobre Usuario do Nocobase | |
| echo -e "\e[33mUsuario:\e[97m $user_nocobase\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Nocobase | |
| echo -e "\e[33mContraseña:\e[97m $pass_nocobase\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para decir que las informaciones no están correctas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE NOCOBASE \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Nocobase iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cansei já de explicar o que isso faz kkkk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "nocobase${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "nocobase${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO NOCOBASE \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando uma Encryption Key Aleatória | |
| nocobase_key=$(openssl rand -hex 16) | |
| nocobase_encryption=$(openssl rand -hex 16) | |
| ## Criando a stack nocobase.yaml | |
| cat > nocobase${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| nocobase${1:+_$1}: | |
| image: nocobase/nocobase:latest ## Versão do Nocobase | |
| volumes: | |
| - nocobase${1:+_$1}_storage:/app/nocobase/storage | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - INIT_ROOT_EMAIL=$mail_nocobase | |
| - INIT_ROOT_PASSWORD=$pass_nocobase | |
| - INIT_ROOT_NICKNAME=$user_nocobase | |
| - INIT_ROOT_USERNAME=$user_nocobase | |
| ## Dados do Postgres | |
| - DB_DIALECT=postgres | |
| - DB_HOST=postgres | |
| - DB_DATABASE=nocobase${1:+_$1} | |
| - DB_USER=postgres | |
| - DB_PASSWORD=$senha_postgres | |
| ## Paths de URL | |
| - LOCAL_STORAGE_BASE_URL=/storage/uploads | |
| - API_BASE_PATH=/api/ | |
| ## Encryption Key | |
| - APP_KEY=$nocobase_key | |
| - ENCRYPTION_FIELD_KEY=$nocobase_encryption | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.nocobase${1:+_$1}.rule=Host(\`$url_nocobase\`) ## Url da aplicação | |
| - traefik.http.services.nocobase${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.nocobase${1:+_$1}.service=nocobase${1:+_$1} | |
| - traefik.http.routers.nocobase${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.nocobase${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.nocobase${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| nocobase${1:+_$1}_storage: | |
| external: true | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Nocobase" | |
| fi | |
| STACK_NAME="nocobase${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull nocobase/nocobase:latest | |
| ## Usa o serviço wait_stack "nocobase" para verificar se o serviço esta online | |
| wait_stack nocobase${1:+_$1}_nocobase${1:+_$1} | |
| telemetria Nocobase finalizado | |
| cd dados_vps | |
| cat > dados_nocobase<<EOL | |
| [ NOCOBASE ] | |
| Dominio de Nocobase: https://$url_nocobase | |
| Email: $mail_nocobase | |
| Usuario: $user_nocobase | |
| Contraseña: $pass_nocobase | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicación: | |
| echo -e "\e[32m[ NOCOBASE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_nocobase\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m $mail_nocobase\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_nocobase\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_nocobase\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ████████╗██████╗ ██████╗ ███████╗███████╗███████╗ | |
| ## ██╔══██╗██╔═══██╗╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔════╝ | |
| ## ██████╔╝██║ ██║ ██║ ██████╔╝██████╔╝█████╗ ███████╗███████╗ | |
| ## ██╔══██╗██║ ██║ ██║ ██╔═══╝ ██╔══██╗██╔══╝ ╚════██║╚════██║ | |
| ## ██████╔╝╚██████╔╝ ██║ ██║ ██║ ██║███████╗███████║███████║ | |
| ## ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ | |
| ferramenta_botpress() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_botpress | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Botpress (ej: botpress.sociosdigitales.pro): \e[0m" && read -r url_botpress | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_botpress | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Botpress | |
| echo -e "\e[33mDominio de Botpress:\e[97m $url_botpress\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_botpress | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE BOTPRESS \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Botpress iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cansei já de explicar o que isso faz kkkk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "botpress${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "botpress${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO BOTPRESS \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack botpress.yaml | |
| cat > botpress${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| botpress${1:+_$1}: | |
| image: botpress/server:latest | |
| volumes: | |
| - botpress${1:+_$1}_data:/botpress/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Url Botpress | |
| - EXTERNAL_URL=https://$url_botpress | |
| ## Modo | |
| - BP_PRODUCTION=true | |
| ## Dados Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/botpress${1:+_$1} | |
| ## Dados Redis | |
| - REDIS_URL=redis://redis:6379 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.botpress${1:+_$1}.rule=Host(\`$url_botpress\`) | |
| - traefik.http.services.botpress${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.botpress${1:+_$1}.service=botpress${1:+_$1} | |
| - traefik.http.routers.botpress${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.botpress${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.botpress${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| botpress${1:+_$1}_data: | |
| external: true | |
| name: botpress${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear la stack de Botpress" | |
| fi | |
| STACK_NAME="botpress${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c botpress.yaml botpress > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "No se pudo levantar la stack de Botpress" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull botpress/server:latest | |
| ## Usa o serviço wait_botpress para verificar se o serviço esta online | |
| wait_stack botpress${1:+_$1}_botpress${1:+_$1} | |
| telemetria Botpress finalizado | |
| cd dados_vps | |
| cat > dados_botpress${1:+_$1} <<EOL | |
| [ BOTPRESS ] | |
| Dominio de Botpress: https://$url_botpress | |
| Usuario: Debe crear en el primer acceso de Botpress | |
| Contraseña: Debe crear en el primer acceso de Botpress | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ BOTPRESS ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_botpress\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Debe crear en el primer acceso de Botpress\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Debe crear en el primer acceso de Botpress\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗ ███████╗███████╗███████╗ | |
| ## ██║ ██║██╔═══██╗██╔══██╗██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝██╔════╝ | |
| ## ██║ █╗ ██║██║ ██║██████╔╝██║ ██║██████╔╝██████╔╝█████╗ ███████╗███████╗ | |
| ## ██║███╗██║██║ ██║██╔══██╗██║ ██║██╔═══╝ ██╔══██╗██╔══╝ ╚════██║╚════██║ | |
| ## ╚███╔███╔╝╚██████╔╝██║ ██║██████╔╝██║ ██║ ██║███████╗███████║███████║ | |
| ## ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ | |
| ferramenta_wordpress() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_wordpress | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mIntroduzca el dominio para Wordpress (ej: sociosdigitales.pro o tienda.sociosdigitales.pro): \e[0m" && read -r url_wordpress | |
| echo "" | |
| ## Pergunta o nome do site | |
| echo -e "\e[97mPaso$amarelo 2/2\e[0m" | |
| echo -e "$amarelo--> Use solo letras minúsculas, sin espacios o caracteres especiales" | |
| echo -en "\e[33mIntroduzca el nombre del Sitio (ej: tiendasocios): \e[0m" && read -r nome_site_wordpress | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_wordpress | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Wordpress | |
| echo -e "\e[33mDominio de Wordpress:\e[97m $url_wordpress\e[0m" | |
| echo "" | |
| ## Informação sobre Nome do site | |
| echo -e "\e[33mNombre del Sitio:\e[97m $nome_site_wordpress\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE WORDPRESS \e[33m[1/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Wordpress iniciado | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO MYSQL \e[33m[2/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cria banco de dados do site no mysql | |
| verificar_container_mysql | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - MySQL ya instalado" | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de MySQL" | |
| criar_banco_mysql_da_stack "$nome_site_wordpress" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_mysql | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| criar_banco_mysql_da_stack "$nome_site_wordpress" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| cd | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO WORDPRESS \e[33m[4/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack wordpress.yaml | |
| cat > wordpress_$nome_site_wordpress.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| wordpress_$nome_site_wordpress: | |
| image: wordpress:latest ## Versão do Wordpress | |
| volumes: | |
| - wordpress_$nome_site_wordpress:/var/www/html | |
| - wordpress_${nome_site_wordpress}_php:/usr/local/etc/php | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do Mysql | |
| - WORDPRESS_DB_NAME=$nome_site_wordpress | |
| - WORDPRESS_DB_HOST=mysql | |
| - WORDPRESS_DB_PORT=3306 | |
| - WORDPRESS_DB_USER=root | |
| - WORDPRESS_DB_PASSWORD=$senha_mysql | |
| ## Redis | |
| - WP_REDIS_HOST=redis | |
| - WP_REDIS_PORT=6379 | |
| - WP_REDIS_DATABASE=6 | |
| ## Url do Wordpress | |
| - VIRTUAL_HOST=$url_wordpress | |
| ## Localização | |
| - WP_LOCALE=pt_BR | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.wordpress_$nome_site_wordpress.rule=Host(\`$url_wordpress\`) | |
| - traefik.http.routers.wordpress_$nome_site_wordpress.entrypoints=websecure | |
| - traefik.http.routers.wordpress_$nome_site_wordpress.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.wordpress_$nome_site_wordpress.service=wordpress_$nome_site_wordpress | |
| - traefik.http.services.wordpress_$nome_site_wordpress.loadbalancer.server.port=80 | |
| - traefik.http.services.wordpress_$nome_site_wordpress.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| wordpress_$nome_site_wordpress: | |
| external: true | |
| name: wordpress_$nome_site_wordpress | |
| wordpress_${nome_site_wordpress}_php: | |
| external: true | |
| name: wordpress_${nome_site_wordpress}_php | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Wordpress" | |
| fi | |
| STACK_NAME="wordpress_$nome_site_wordpress" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c $nome_da_stack_wordpress $nome_da_stack_wordpress_subir #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Wordpress" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull wordpress:latest | |
| ## Usa o serviço wait_wordpress para verificar se o serviço esta online | |
| wait_stack "wordpress_$nome_site_wordpress" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• EDITANDO PHP.INI \e[33m[6/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Editando o PHP.INI | |
| cp /var/lib/docker/volumes/wordpress_${nome_site_wordpress}_php/_data/php.ini-production /var/lib/docker/volumes/wordpress_${nome_site_wordpress}_php/_data/php.ini | |
| if [ $? -eq 0 ]; then | |
| echo "1/7 - [ OK ] - Copiando archivo php.ini" | |
| else | |
| echo "1/7 - [ OFF ] - Copiando archivo php.ini" | |
| fi | |
| caminho_php_ini="/var/lib/docker/volumes/wordpress_${nome_site_wordpress}_php/_data/php.ini" | |
| sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 1024M/" "$caminho_php_ini" | |
| if [ $? -eq 0 ]; then | |
| echo "2/7 - [ OK ] - Modificando upload_max_filesize a 1024M" | |
| else | |
| echo "2/7 - [ OFF ] - Modificando upload_max_filesize a 1024M" | |
| fi | |
| sed -i "s/^max_execution_time =.*/max_execution_time = 450/" "$caminho_php_ini" | |
| if [ $? -eq 0 ]; then | |
| echo "3/7 - [ OK ] - Modificando max_execution_time a 450" | |
| else | |
| echo "3/7 - [ OFF ] - Modificando max_execution_time a 450" | |
| fi | |
| sed -i "s/^memory_limit =.*/memory_limit = 1024M/" "$caminho_php_ini" | |
| if [ $? -eq 0 ]; then | |
| echo "4/7 - [ OK ] - Modificando memory_limit a 1024M" | |
| else | |
| echo "4/7 - [ OFF ] - Modificando memory_limit a 1024M" | |
| fi | |
| cd | |
| caminho_wp_config="/var/lib/docker/volumes/wordpress_$nome_site_wordpress/_data/wp-config.php" | |
| if [ $? -eq 0 ]; then | |
| echo "5/7 - [ OK ] - Obteniendo archivo wp-config.php" | |
| else | |
| echo "5/7 - [ OFF ] - Obteniendo archivo wp-config.php" | |
| fi | |
| sed -i "/\/\* Add any custom values between this line and the \"stop editing\" line. \*\//i\\ | |
| define( 'WP_REDIS_HOST', 'redis' );\n\ | |
| define( 'WP_REDIS_PORT', 6379 );\n" "$caminho_wp_config" | |
| if [ $? -eq 0 ]; then | |
| echo "6/7 - [ OK ] - Añadiendo configuraciones de Redis en wp-config.php" | |
| else | |
| echo "6/7 - [ OFF ] - Añadiendo configuraciones de Redis en wp-config.php" | |
| fi | |
| docker service update --force wordpress_${nome_site_wordpress}_wordpress_$nome_site_wordpress > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "7/7 - [ OK ] - Aplicando actualización en php.ini" | |
| else | |
| echo "7/7 - [ OK ] - Aplicando actualización en php.ini" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[7/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Usa o serviço wait_wordpress para verificar se o serviço esta online | |
| wait_stack "wordpress_$nome_site_wordpress" | |
| telemetria Wordpress finalizado | |
| cd dados_vps | |
| cat > wordpress_$nome_do_servico_wordpress <<EOL | |
| [ WORDPRESS ] | |
| Dominio de Wordpress: https://$url_wordpress | |
| Archivos del sitio: /var/lib/docker/volumes/wordpress_$nome_site_wordpress/_data | |
| Archivos de php: /var/lib/docker/volumes/wordpress_${nome_site_wordpress}_php/_data | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ WORDPRESS ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_wordpress\e[0m" | |
| echo "" | |
| echo -e "\e[33mArchivos del sitio:\e[97m /var/lib/docker/volumes/wordpress_$nome_site_wordpress/_data\e[0m" | |
| echo "" | |
| echo -e "\e[33mArchivos de php:\e[97m /var/lib/docker/volumes/wordpress_${nome_site_wordpress}_php/_data\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ █████╗ ███████╗███████╗██████╗ ██████╗ ██╗ ██╗ | |
| ## ██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗██╔═══██╗██║ ██║ | |
| ## ██████╔╝███████║███████╗█████╗ ██████╔╝██║ ██║██║ █╗ ██║ | |
| ## ██╔══██╗██╔══██║╚════██║██╔══╝ ██╔══██╗██║ ██║██║███╗██║ | |
| ## ██████╔╝██║ ██║███████║███████╗██║ ██║╚██████╔╝╚███╔███╔╝ | |
| ## ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ | |
| ferramenta_baserow() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_baserow | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Baserow (ej: baserow.sociosdigitales.pro): \e[0m" && read -r url_baserow | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mIngrese el correo para SMTP (ej: contacto@sociosdigitales.pro): \e[0m" && read -r mail_baserow | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/6\e[0m" | |
| echo -en "\e[33mIngrese el usuario para SMTP (ej: sociosdigitales o contacto@sociosdigitales.pro): \e[0m" && read -r user_baserow | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si está usando Gmail, utilice la contraseña de aplicación" | |
| echo -en "\e[33mIngrese la contraseña SMTP del correo (ej: @Contraseña123_): \e[0m" && read -r pass_baserow | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mIngrese el host SMTP del correo (ej: smtp.hostinger.com): \e[0m" && read -r host_baserow | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del correo (ej: 465): \e[0m" && read -r porta_baserow | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_baserow" -eq 465 ]; then | |
| ssl_baserow_environments="- EMAIL_SMTP_USE_SSL=true" | |
| else | |
| ssl_baserow_environments="- EMAIL_SMTP_USE_TLS=true" | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_baserow | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para Baserow:\e[97m $url_baserow\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mCorreo SMTP:\e[97m $mail_baserow\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mUsuario SMTP:\e[97m $user_baserow\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mContraseña SMTP:\e[97m $pass_baserow\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mHost SMTP:\e[97m $host_baserow\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mPuerto SMTP:\e[97m $porta_baserow\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_baserow | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE BASEROW \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Baserow iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "baserow${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "baserow${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| cd | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO BASEROW \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack baserow.yaml | |
| cat > baserow${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| baserow${1:+_$1}: | |
| image: baserow/baserow:latest ## Versão do Baserow | |
| volumes: | |
| - baserow${1:+_$1}_data:/baserow/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Url do baserow | |
| - BASEROW_PUBLIC_URL=https://$url_baserow | |
| ## Porta do baserow | |
| - BASEROW_CADDY_ADDRESSES=:80 | |
| ## Dados SMTP | |
| - EMAIL_SMTP=true ## Ativar/Desativar SMTP | |
| - FROM_EMAIL=$mail_baserow ## Email | |
| - EMAIL_SMTP_USER=$user_baserow ## Email (ou usuario) | |
| - EMAIL_SMTP_PASSWORD=$pass_baserow ## Senha do SMTP | |
| - EMAIL_SMTP_HOST=$host_baserow ## Host SMTP | |
| - EMAIL_SMTP_PORT=$porta_baserow ## Porta SMTP | |
| $ssl_baserow_environments | |
| ## Dados Redis | |
| - REDIS_URL=redis://redis:6379/11 | |
| ## Dados postgres: | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/baserow${1:+_$1} | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| #resources: | |
| # limits: | |
| # cpus: "1" | |
| # memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.baserow${1:+_$1}.rule=Host(\`$url_baserow\`) | |
| - traefik.http.services.baserow${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.baserow${1:+_$1}.service=baserow${1:+_$1} | |
| - traefik.http.routers.baserow${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.baserow${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.baserow${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| baserow${1:+_$1}_data: | |
| external: true | |
| name: baserow${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando stack" | |
| echo "No se pudo crear la stack de Baserow" | |
| fi | |
| STACK_NAME="baserow${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull baserow/baserow:latest | |
| ## Usa o serviço wait_baserow para verificar se o serviço esta online | |
| wait_stack baserow${1:+_$1}_baserow${1:+_$1} | |
| telemetria Baserow finalizado | |
| cd | |
| cd dados_vps | |
| cat > dados_baserow${1:+_$1} <<EOL | |
| [ BASEROW ] | |
| Dominio de Baserow: https://$url_baserow | |
| Usuario: Debe crear en el primer acceso de Baserow | |
| Contraseña: Debe crear en el primer acceso de Baserow | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ BASEROW ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_baserow\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Debe crear en el primer acceso de Baserow\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Debe crear en el primer acceso de Baserow\e[0m" | |
| echo "" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ███╗ ██████╗ ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██████╗ | |
| ## ████╗ ████║██╔═══██╗████╗ ██║██╔════╝ ██╔═══██╗██╔══██╗██╔══██╗ | |
| ## ██╔████╔██║██║ ██║██╔██╗ ██║██║ ███╗██║ ██║██║ ██║██████╔╝ | |
| ## ██║╚██╔╝██║██║ ██║██║╚██╗██║██║ ██║██║ ██║██║ ██║██╔══██╗ | |
| ## ██║ ╚═╝ ██║╚██████╔╝██║ ╚████║╚██████╔╝╚██████╔╝██████╔╝██████╔╝ | |
| ## ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ | |
| ferramenta_mongodb() { | |
| ## Verifica os recursos | |
| recursos 1 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_mongodb | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o nome de usuario | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -e "$amarelo--> Evite los caracteres especiales: @\!#$ y/o espacio" | |
| echo -en "\e[33mIngrese el nombre de usuario (ej: sociosdigitales): \e[0m" && read -r user_mongo | |
| echo "" | |
| ## Gera a senha aleatória | |
| pass_mongo=$(openssl rand -hex 16) | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_mongodb | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação do Usuario | |
| echo -e "\e[33mUsuario:\e[97m $user_mongo\e[0m" | |
| echo "" | |
| ## Informação da Senha gerada | |
| echo -e "\e[33mContraseña generada:\e[97m $pass_mongo\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_mongodb | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE MONGO DB \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria MongoDB iniciado | |
| ## NADA NADA NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO MONGO DB \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack mongodb.yaml | |
| cat > mongodb${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mongodb${1:+_$1}: | |
| image: mongo:latest | |
| command: mongod --port 27017 | |
| volumes: | |
| - mongodb${1:+_$1}_data:/data/db | |
| - mongodb${1:+_$1}_dump:/dump | |
| - mongodb${1:+_$1}_configdb_data:/data/configdb | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 27017:27017 | |
| environment: | |
| ## Dados de acesso | |
| - MONGO_INITDB_ROOT_USERNAME=$user_mongo | |
| - MONGO_INITDB_ROOT_PASSWORD=$pass_mongo | |
| - PUID=1000 | |
| - PGID=1000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: '1' | |
| memory: 2048M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| mongodb${1:+_$1}_data: | |
| external: true | |
| name: mongodb${1:+_$1}_data | |
| mongodb${1:+_$1}_dump: | |
| external: true | |
| name: mongodb${1:+_$1}_dump | |
| mongodb${1:+_$1}_configdb_data: | |
| external: true | |
| name: mongodb${1:+_$1}_configdb_data | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear la stack de MongoDB" | |
| fi | |
| STACK_NAME="mongodb${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c mongodb.yaml mongodb > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "No se pudo subir la stack de MongoDB" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull mongo:latest | |
| ## Usa o serviço wait_stack "mongodb" para verificar se o serviço esta online | |
| wait_stack mongodb${1:+_$1}_mongodb${1:+_$1} | |
| telemetria MongoDB finalizado | |
| cd dados_vps | |
| read -r ip _ <<<$(hostname -I) | |
| ip_vps=$ip | |
| cat > dados_mongodb${1:+_$1} <<EOL | |
| [ MONGODB ] | |
| Dominio de MongoDB: MongoDB://$user_mongo:$pass_mongo@$ip_vps:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true | |
| Usuario: $user_mongo | |
| Contraseña: $pass_mongo | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ MONGODB ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_mongo\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_mongo\e[0m" | |
| echo "" | |
| echo -e "\e[33mUrl Database:\e[97m mongodb://$user_mongo:$pass_mongo@$ip_vps:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ █████╗ ██████╗ ██████╗ ██╗████████╗███╗ ███╗ ██████╗ | |
| ## ██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║╚══██╔══╝████╗ ████║██╔═══██╗ | |
| ## ██████╔╝███████║██████╔╝██████╔╝██║ ██║ ██╔████╔██║██║ ██║ | |
| ## ██╔══██╗██╔══██║██╔══██╗██╔══██╗██║ ██║ ██║╚██╔╝██║██║▄▄ ██║ | |
| ## ██║ ██║██║ ██║██████╔╝██████╔╝██║ ██║ ██║ ╚═╝ ██║╚██████╔╝ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══▀▀═╝ | |
| ferramenta_rabbitmq() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_rabbitmq | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio do RabbitMq | |
| echo -e "\e[97mPaso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mIntroduzca el dominio para RabbitMQ (ej: rabbitmq.sociosdigitales.pro): \e[0m" && read -r url_rabbitmq | |
| echo "" | |
| echo -e "\e[97mPaso$amarelo 2/2\e[0m" | |
| echo -e "$amarelo--> Evita los caracteres especiales: @\!#$ y/o espacios" | |
| echo -en "\e[33mIntroduzca el nombre de usuario (ej: SociosPro): \e[0m" && read -r user_rabbitmq | |
| echo "" | |
| ## Gera a senha aleatória | |
| pass_rabbitmq=$(openssl rand -hex 16) | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_rabbitmq | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação do Dominio do RabbitMQ | |
| echo -e "\e[33mDominio de RabbitMQ:\e[97m $url_rabbitmq\e[0m" | |
| echo "" | |
| ## Informação do Usuario do RabbitMQ | |
| echo -e "\e[33mUsuario:\e[97m $user_rabbitmq\e[0m" | |
| echo "" | |
| ## Informação da Senha do RabbitMQ | |
| echo -e "\e[33mContraseña:\e[97m $pass_rabbitmq\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_rabbitmq | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE RABBITMQ \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria RabbitMQ iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO RABBITMQ \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| #Key aleatória cookie | |
| key_cookie=$(openssl rand -hex 16) | |
| ## Criando a stack rabbitmq.yaml | |
| cat > rabbitmq${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| rabbitmq${1:+_$1}: | |
| image: rabbitmq:management | |
| command: rabbitmq-server | |
| hostname: rabbitmq | |
| volumes: | |
| - rabbitmq${1:+_$1}_data:/var/lib/rabbitmq | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 5672:5672 | |
| # - 15672:15672 | |
| environment: | |
| ## Dados de acesso | |
| RABBITMQ_DEFAULT_USER: $user_rabbitmq | |
| RABBITMQ_DEFAULT_PASS: $pass_rabbitmq | |
| RABBITMQ_ERLANG_COOKIE: $key_cookie | |
| RABBITMQ_DEFAULT_VHOST: "/" | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.rabbitmq${1:+_$1}.rule=Host(\`$url_rabbitmq\`) | |
| - traefik.http.routers.rabbitmq${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.rabbitmq${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.rabbitmq${1:+_$1}.service=rabbitmq${1:+_$1} | |
| - traefik.http.services.rabbitmq${1:+_$1}.loadbalancer.server.port=15672 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| rabbitmq${1:+_$1}_data: | |
| external: true | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando stack" | |
| echo "No se pudo crear el stack de RabbitMQ" | |
| fi | |
| STACK_NAME="rabbitmq${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c rabbitmq.yaml rabbitmq > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do RabbitMQ" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull rabbitmq:management | |
| ## Usa o serviço wait_stack "pgadmin_4" para verificar se o serviço esta online | |
| wait_stack rabbitmq${1:+_$1}_rabbitmq${1:+_$1} | |
| telemetria RabbitMQ finalizado | |
| cd dados_vps | |
| ip_vps=$(curl -s ifconfig.me) | |
| cat > dados_rabbitmq${1:+_$1} <<EOL | |
| [ RABBITMQ ] | |
| Dominio de RabbitMQ: $url_rabbitmq | |
| Usuario: $user_rabbitmq | |
| Contraseña: $pass_rabbitmq | |
| URL: amqp://$user_rabbitmq:$pass_rabbitmq@rabbitmq:5672 | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ RABBITMQ ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_rabbitmq\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_rabbitmq\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_rabbitmq\e[0m" | |
| echo "" | |
| echo -e "\e[33mURL:\e[97m amqp://$user_rabbitmq:$pass_rabbitmq@rabbitmq:5672\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗██████╗ ████████╗██╗███╗ ███╗███████╗ ██╗ ██╗██╗ ██╗███╗ ███╗ █████╗ | |
| ## ██║ ██║██╔══██╗╚══██╔══╝██║████╗ ████║██╔════╝ ██║ ██╔╝██║ ██║████╗ ████║██╔══██╗ | |
| ## ██║ ██║██████╔╝ ██║ ██║██╔████╔██║█████╗ █████╔╝ ██║ ██║██╔████╔██║███████║ | |
| ## ██║ ██║██╔═══╝ ██║ ██║██║╚██╔╝██║██╔══╝ ██╔═██╗ ██║ ██║██║╚██╔╝██║██╔══██║ | |
| ## ╚██████╔╝██║ ██║ ██║██║ ╚═╝ ██║███████╗ ██║ ██╗╚██████╔╝██║ ╚═╝ ██║██║ ██║ | |
| ## ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_uptimekuma() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_uptimekuma | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio do uptime kuma | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Uptime Kuma (ex: uptimekuma.sociosdigitales.pro): \e[0m" && read -r url_uptimekuma | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_uptimekuma | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação do Dominio do uptimekuma | |
| echo -e "\e[33mDominio do Uptime Kuma:\e[97m $url_uptimekuma\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_mongodb | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO UPTIME KUMA \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Uptime Kuma" "iniciado" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO UPTIME KUMA \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack uptimekuma.yaml | |
| cat > uptimekuma${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| uptimekuma${1:+_$1}: | |
| image: louislam/uptime-kuma:latest | |
| volumes: | |
| - uptimekuma${1:+_$1}:/app/data | |
| networks: | |
| - $nome_rede_interna | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.uptimekuma${1:+_$1}.rule=Host(\`$url_uptimekuma\`) | |
| - traefik.http.routers.uptimekuma${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.uptimekuma${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.uptimekuma${1:+_$1}.loadBalancer.server.port=3001 | |
| - traefik.http.routers.uptimekuma${1:+_$1}.service=uptimekuma${1:+_$1} | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| uptimekuma${1:+_$1}: | |
| external: true | |
| name: uptimekuma${1:+_$1} | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Uptime Kuma" | |
| fi | |
| STACK_NAME="uptimekuma${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c uptimekuma.yaml uptimekuma #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Uptime Kuma" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull louislam/uptime-kuma:latest | |
| ## Usa o serviço wait_stack "uptimekuma" para verificar se o serviço esta online | |
| wait_stack uptimekuma${1:+_$1}_uptimekuma${1:+_$1} | |
| telemetria "Uptime Kuma" "finalizado" | |
| cd dados_vps | |
| ip_vps=$(curl -s ifconfig.me) | |
| cat > dados_uptimekuma${1:+_$1} <<EOL | |
| [ UPTIME KUMA ] | |
| Dominio do Uptime Kuma: $url_uptimekuma | |
| Usuario: Precisa criar dentro do Uptime Kuma | |
| Senha: Precisa criar dentro do Uptime Kuma | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ UPTIME KUMA ] \e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_uptimekuma\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar dentro do Uptime Kuma\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar dentro do Uptime Kuma\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ █████╗ ██╗ ██████╗ ██████╗ ███╗ ███╗ | |
| ## ██╔════╝██╔══██╗██║ ██╔════╝██╔═══██╗████╗ ████║ | |
| ## ██║ ███████║██║ ██║ ██║ ██║██╔████╔██║ | |
| ## ██║ ██╔══██║██║ ██║ ██║ ██║██║╚██╔╝██║ | |
| ## ╚██████╗██║ ██║███████╗╚██████╗╚██████╔╝██║ ╚═╝ ██║ | |
| ## ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ | |
| ferramenta_calcom() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_calcom | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Cal (ej: calcom.sociosdigitales.pro): \e[0m" && read -r url_calcom | |
| echo "" | |
| ## Pergunta o email SMTP | |
| echo -e "\e[97mPaso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mIngrese el Email para SMTP (ej: contacto@sociosdigitales.pro): \e[0m" && read -r email_calcom | |
| echo "" | |
| ## Pergunta o Ususario SMTP | |
| echo -e "\e[97mPaso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Si no tiene un usuario del email, use el mismo email" | |
| echo -en "\e[33mIngrese el Usuario para SMTP (ej: sociosdigitales o contacto@sociosdigitales.pro): \e[0m" && read -r user_calcom | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPaso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si está usando Gmail use la contraseña de aplicación" | |
| echo -en "\e[33mIngrese la Contraseña SMTP del Email (ej: @Contraseña123_): \e[0m" && read -r senha_email_calcom | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPaso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mIngrese el Host SMTP del Email (ej: smtp.hostinger.com): \e[0m" && read -r smtp_email_calcom | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPaso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del Email (ej: 465): \e[0m" && read -r porta_smtp_calcom | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_calcom | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio de Cal.com\e[97m $url_calcom\e[0m" | |
| echo "" | |
| ## Informação sobre Email SMTP | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_calcom\e[0m" | |
| echo "" | |
| ## Informação sobre Email SMTP | |
| echo -e "\e[33mUsuario SMTP:\e[97m $user_calcom\e[0m" | |
| echo "" | |
| ## Informação sobre Senha SMTP | |
| echo -e "\e[33mContraseña SMTP:\e[97m $senha_email_calcom\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP:\e[97m $smtp_email_calcom\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPuerto SMTP:\e[97m $porta_smtp_calcom\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_calcom | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE CAL.COM \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Calcom iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "calcom${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "calcom${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO CAL.COM \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key aleatória | |
| secret=$(openssl rand -hex 16) | |
| ## Criando a stack calcom.yaml | |
| cat > calcom${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| calcom${1:+_$1}: | |
| image: calcom/cal.com:v4.7.8 | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Licenças | |
| - NEXT_PUBLIC_LICENSE_CONSENT=agree | |
| - LICENSE=agree | |
| #- CALCOM_LICENSE_KEY= ## Descomente este campo caso tenha licença do mesmo | |
| ## URLs | |
| - NEXT_PUBLIC_WEBAPP_URL=https://$url_calcom | |
| - BASE_URL=https://$url_calcom | |
| - NEXTAUTH_URL=https://$url_calcom | |
| - NEXT_PUBLIC_CONSOLE_URL=https://$url_calcom | |
| - NEXT_PUBLIC_APP_URL=https://$url_calcom | |
| - NEXT_PUBLIC_WEBSITE_URL=https://$url_calcom | |
| - WEB_APP=https://$url_calcom | |
| ## Encrypition | |
| - NEXTAUTH_SECRET=$secret | |
| - CALENDSO_ENCRYPTION_KEY=$secret | |
| ## Dados Postgress | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/calcom${1:+_$1} | |
| - DATABASE_DIRECT_URL=postgresql://postgres:$senha_postgres@postgres:5432/calcom${1:+_$1} | |
| - CALENDSO_ENCRYPTION_KEY=postgresql://postgres:$senha_postgres@postgres:5432/calcom${1:+_$1} | |
| ## Configurações de Email e SMTP | |
| - EMAIL_FROM=$email_calcom | |
| - EMAIL_SERVER_HOST=$smtp_email_calcom | |
| - EMAIL_SERVER_PORT=$porta_smtp_calcom | |
| - EMAIL_SERVER_USER=$user_calcom | |
| - EMAIL_SERVER_PASSWORD=$senha_email_calcom | |
| ## Nodes | |
| - NODE_ENV=production | |
| #- NODE_TLS_REJECT_UNAUTHORIZED=0 | |
| ## Brand | |
| #- NEXT_PUBLIC_APP_NAME="Cal.com" | |
| #- NEXT_PUBLIC_SUPPORT_MAIL_ADDRESS="help@cal.com" | |
| #- NEXT_PUBLIC_COMPANY_NAME="Cal.com, Inc." | |
| #- NEXT_PUBLIC_DISABLE_SIGNUP=false ## false = novas inscrições permitidas | true = novas incrições fechadas | |
| ## Integração com Google (Calendario & Meet) | |
| #-GOOGLE_LOGIN_ENABLED=false | |
| #-GOOGLE_API_CREDENTIALS= | |
| ## Integração com Microsoft 365 | |
| #- MS_GRAPH_CLIENT_ID= | |
| #- MS_GRAPH_CLIENT_SECRET= | |
| ## Integração com Zoom | |
| #- ZOOM_CLIENT_ID= | |
| #- ZOOM_CLIENT_SECRET= | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.calcom${1:+_$1}_app.rule=Host(\`$url_calcom\`) | |
| - traefik.http.routers.calcom${1:+_$1}_app.entrypoints=websecure | |
| - traefik.http.routers.calcom${1:+_$1}_app.priority=1 | |
| - traefik.http.routers.calcom${1:+_$1}_app.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.calcom${1:+_$1}_app.service=calcom${1:+_$1}_app | |
| - traefik.http.services.calcom${1:+_$1}_app.loadbalancer.server.port=3000 | |
| - traefik.http.services.calcom${1:+_$1}_app.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear la stack de CalCom" | |
| fi | |
| STACK_NAME="calcom${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| telemetria Calcom finalizado | |
| #docker stack deploy --prune --resolve-image always -c calcom.yaml calcom > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "No se pudo desplegar la stack de CalCom" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull calcom/cal.com:v4.7.8 | |
| ## Usa o serviço wait_stack "calcom" para verificar se o serviço esta online | |
| wait_stack calcom${1:+_$1}_calcom${1:+_$1} | |
| cd dados_vps | |
| cat > dados_calcom${1:+_$1} <<EOL | |
| [ CAL.COM ] | |
| Dominio de Cal.com: $url_calcom | |
| Usuario: Debe crear dentro de Cal.com | |
| Contraseña: Debe crear dentro de Cal.com | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ CAL.COM ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_calcom\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Debe crear dentro de Cal.com\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Debe crear dentro de Cal.com\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ███╗ █████╗ ██╗ ██╗████████╗██╗ ██████╗ | |
| ## ████╗ ████║██╔══██╗██║ ██║╚══██╔══╝██║██╔════╝ | |
| ## ██╔████╔██║███████║██║ ██║ ██║ ██║██║ | |
| ## ██║╚██╔╝██║██╔══██║██║ ██║ ██║ ██║██║ | |
| ## ██║ ╚═╝ ██║██║ ██║╚██████╔╝ ██║ ██║╚██████╗ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ | |
| ferramenta_mautic() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_mautic | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/4\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Mautic (ej: mautic.sociosdigitales.pro): \e[0m" && read -r url_mautic | |
| echo "" | |
| ## Pergunta o usuario da ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/4\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ y/o espacios" | |
| echo -en "\e[33mIngrese un usuario (ej: SociosPro): \e[0m" && read -r user_mautic | |
| echo "" | |
| ## Pergunta o email da ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/4\e[0m" | |
| echo -en "\e[33mIngrese el Email de administrador: (ej: contacto@sociosdigitales.pro): \e[0m" && read -r email_mautic | |
| echo "" | |
| ## Pergunta o senha da ferramenta | |
| echo -e "\e[97mPaso$amarelo 4/4\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$" | |
| echo -en "\e[33mIngrese una contraseña (ej: @Contraseña123_): \e[0m" && read -r senha_email_mautic | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_mautic | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio de Mautic:\e[97m $url_mautic\e[0m" | |
| echo "" | |
| ## Informação sobre Usuario Admin | |
| echo -e "\e[33mUsuario admin:\e[97m $user_mautic\e[0m" | |
| echo "" | |
| ## Informação sobre Email Admin | |
| echo -e "\e[33mEmail del administrador:\e[97m $email_mautic\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mContraseña del Admin:\e[97m $senha_email_mautic\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_mautic | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE MAUTIC \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Mautic iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO MYSQL \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| dados | |
| ## Cria banco de dados do site no mysql | |
| verificar_container_mysql | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - MySQL ya instalado" | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de MySQL" | |
| criar_banco_mysql_da_stack "mautic${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_mysql | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| criar_banco_mysql_da_stack "mautic${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO MAUTIC \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack mautic.yaml | |
| cat > mautic${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mautic_web${1:+_$1}: | |
| image: mautic/mautic:latest ## Versão do Mautic | |
| volumes: | |
| - mautic${1:+_$1}_config:/var/www/html/config | |
| - mautic${1:+_$1}_docroot:/var/www/html/docroot | |
| - mautic${1:+_$1}_media:/var/www/html/docroot/media | |
| - mautic${1:+_$1}_logs:/var/www/html/var/logs | |
| - mautic${1:+_$1}_cron:/opt/mautic/cron | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados MySQL | |
| - MAUTIC_DB_NAME=mautic${1:+_$1} | |
| - MAUTIC_DB_HOST=mysql | |
| - MAUTIC_DB_PORT=3306 | |
| - MAUTIC_DB_USER=root | |
| - MAUTIC_DB_PASSWORD=$senha_mysql | |
| ## Dados de acesso | |
| - MAUTIC_ADMIN_EMAIL=$email_mautic | |
| - MAUTIC_ADMIN_USERNAME=$user_mautic | |
| - MAUTIC_ADMIN_PASSWORD=$senha_email_mautic | |
| - MAUTIC_URL=https://$url_mautic | |
| ## Configurações | |
| - MAUTIC_TRUSTED_PROXIES=["0.0.0.0/0"] | |
| - DOCKER_MAUTIC_ROLE=mautic_web | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_EMAIL=2 | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_HIT=2 | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_FAILED=2 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 2048M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.mautic${1:+_$1}.rule=Host(\`$url_mautic\`) # substitua SeuDominio.com.br pelo seu domínio | |
| - traefik.http.services.mautic${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.mautic${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.mautic${1:+_$1}.service=mautic${1:+_$1} | |
| - traefik.http.routers.mautic${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.mautic${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mautic_worker${1:+_$1}: | |
| image: mautic/mautic:latest ## Versão do Mautic | |
| volumes: | |
| - mautic${1:+_$1}_config:/var/www/html/config | |
| - mautic${1:+_$1}_docroot:/var/www/html/docroot | |
| - mautic${1:+_$1}_media:/var/www/html/docroot/media | |
| - mautic${1:+_$1}_logs:/var/www/html/var/logs | |
| - mautic${1:+_$1}_cron:/opt/mautic/cron | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados MySQL | |
| - MAUTIC_DB_NAME=mautic${1:+_$1} | |
| - MAUTIC_DB_HOST=mysql | |
| - MAUTIC_DB_PORT=3306 | |
| - MAUTIC_DB_USER=root | |
| - MAUTIC_DB_PASSWORD=$senha_mysql | |
| ## Dados de acesso | |
| - MAUTIC_ADMIN_EMAIL=$email_mautic | |
| - MAUTIC_ADMIN_USERNAME=$user_mautic | |
| - MAUTIC_ADMIN_PASSWORD=$senha_email_mautic | |
| - MAUTIC_URL=https://$url_mautic | |
| ## Configurações | |
| - MAUTIC_TRUSTED_PROXIES=["0.0.0.0/0"] | |
| - DOCKER_MAUTIC_ROLE=mautic_worker | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_EMAIL=2 | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_HIT=2 | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_FAILED=2 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 2048M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mautic_cron${1:+_$1}: | |
| image: mautic/mautic:latest ## Versão do Mautic | |
| volumes: | |
| - mautic${1:+_$1}_config:/var/www/html/config | |
| - mautic${1:+_$1}_docroot:/var/www/html/docroot | |
| - mautic${1:+_$1}_media:/var/www/html/docroot/media | |
| - mautic${1:+_$1}_logs:/var/www/html/var/logs | |
| - mautic${1:+_$1}_cron:/opt/mautic/cron | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados MySQL | |
| - MAUTIC_DB_NAME=mautic${1:+_$1} | |
| - MAUTIC_DB_HOST=mysql | |
| - MAUTIC_DB_PORT=3306 | |
| - MAUTIC_DB_USER=root | |
| - MAUTIC_DB_PASSWORD=$senha_mysql | |
| ## Dados de acesso | |
| - MAUTIC_ADMIN_EMAIL=$email_mautic | |
| - MAUTIC_ADMIN_USERNAME=$user_mautic | |
| - MAUTIC_ADMIN_PASSWORD=$senha_email_mautic | |
| - MAUTIC_URL=https://$url_mautic | |
| ## Configurações | |
| - MAUTIC_TRUSTED_PROXIES=["0.0.0.0/0"] | |
| - DOCKER_MAUTIC_ROLE=mautic_cron | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_EMAIL=2 | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_HIT=2 | |
| - DOCKER_MAUTIC_WORKERS_CONSUME_FAILED=2 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "0.5" | |
| memory: 512M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| mautic${1:+_$1}_config: | |
| external: true | |
| name: mautic${1:+_$1}_config | |
| mautic${1:+_$1}_docroot: | |
| external: true | |
| name: mautic${1:+_$1}_docroot | |
| mautic${1:+_$1}_media: | |
| external: true | |
| name: mautic${1:+_$1}_media | |
| mautic${1:+_$1}_logs: | |
| external: true | |
| name: mautic${1:+_$1}_logs | |
| mautic${1:+_$1}_cron: | |
| external: true | |
| name: mautic${1:+_$1}_cron | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear la stack de Mautic" | |
| fi | |
| STACK_NAME="mautic${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull mautic/mautic:latest | |
| ## Usa o serviço wait_stack "mautic" para verificar se o serviço esta online | |
| wait_stack mautic${1:+_$1}_mautic_web${1:+_$1} mautic${1:+_$1}_mautic_worker${1:+_$1} mautic${1:+_$1}_mautic_cron${1:+_$1} | |
| telemetria Mautic finalizado | |
| cd dados_vps | |
| cat > dados_mautic${1:+_$1} <<EOL | |
| [ MAUTIC 5 ] | |
| Dominio do Mautic: $url_mautic | |
| Usuario: $user_mautic | |
| Email: $email_mautic | |
| Contraseña: $senha_email_mautic | |
| Database Name: mautic${1:+_$1} | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ MAUTIC 5 ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_mautic\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_mautic\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m $email_mautic\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $senha_email_mautic\e[0m" | |
| echo "" | |
| echo -e "\e[33mDatabase Name:\e[97m mautic${1:+_$1}\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## █████╗ ██████╗ ██████╗ ███████╗███╗ ███╗██╗████████╗██╗ ██╗ | |
| ## ██╔══██╗██╔══██╗██╔══██╗██╔════╝████╗ ████║██║╚══██╔══╝██║ ██║ | |
| ## ███████║██████╔╝██████╔╝███████╗██╔████╔██║██║ ██║ ███████║ | |
| ## ██╔══██║██╔═══╝ ██╔═══╝ ╚════██║██║╚██╔╝██║██║ ██║ ██╔══██║ | |
| ## ██║ ██║██║ ██║ ███████║██║ ╚═╝ ██║██║ ██║ ██║ ██║ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ | |
| ferramenta_appsmith() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_appsmith | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Appsmith (ex: appsmith.sociosdigitales.pro): \e[0m" && read -r url_appsmith | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_appsmith | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do Appsmith\e[97m $url_appsmith\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_appsmith | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO APPSMITH \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Appsmith iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO APPSMITH \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando uma Encryption Key Aleatória | |
| secret=$(openssl rand -hex 16) | |
| ## Criando a stack appsmith.yaml | |
| cat > appsmith${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| appsmith${1:+_$1}: | |
| image: appsmith/appsmith-ee:latest | |
| volumes: | |
| - appsmith${1:+_$1}_data:/appsmith-stacks | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url Appsmith | |
| - APPSMITH_CUSTOM_DOMAIN=https://$url_appsmith | |
| ## Ativar/Desativar Novas Inscrições | |
| - APPSMITH_SIGNUP_DISABLED=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 2048M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.appsmith${1:+_$1}.rule=Host(\`$url_appsmith\`) | |
| - traefik.http.routers.appsmith${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.appsmith${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.appsmith${1:+_$1}.service=appsmith${1:+_$1} | |
| - traefik.http.services.appsmith${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.services.appsmith${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| appsmith${1:+_$1}_data: | |
| external: true | |
| name: appsmith${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Appsmith" | |
| fi | |
| STACK_NAME="appsmith${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c appsmith.yaml appsmith > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Appsmith" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull appsmith/appsmith-ee:latest | |
| ## Usa o serviço wait_stack "nocobase" para verificar se o serviço esta online | |
| wait_stack appsmith${1:+_$1}_appsmith${1:+_$1} | |
| telemetria Appsmith finalizado | |
| cd dados_vps | |
| cat > dados_appsmith${1:+_$1} <<EOL | |
| [ APPSMITH ] | |
| Dominio do Appsmith: https://$url_nocobase | |
| Usuario: Precisa criar no primeiro acesso do Appsmith | |
| Senha: Precisa criar no primeiro acesso do Appsmith | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ APPSMITH ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_appsmith\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Appsmith\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Appsmith\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ██████╗ █████╗ ███╗ ██╗████████╗ | |
| ## ██╔═══██╗██╔══██╗██╔══██╗██╔══██╗████╗ ██║╚══██╔══╝ | |
| ## ██║ ██║██║ ██║██████╔╝███████║██╔██╗ ██║ ██║ | |
| ## ██║▄▄ ██║██║ ██║██╔══██╗██╔══██║██║╚██╗██║ ██║ | |
| ## ╚██████╔╝██████╔╝██║ ██║██║ ██║██║ ╚████║ ██║ | |
| ## ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ | |
| ferramenta_qdrant() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_qdrant | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| read -r ip _ <<<$(hostname -I) | |
| echo -e "\e[97mPasso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mDigite o ip da vps (seu ip: $ip) ou dominio para Qdrant (ex: qdrant.sociosdigitales.pro): \e[0m" && read -r ip_vps | |
| echo "" | |
| ## Pergunta quandos nodes deseja | |
| echo -e "\e[97mPasso$amarelo 2/2\e[0m" | |
| echo -en "\e[33mDigite quantos Nodes você deseja (recomendado: 5): \e[0m" && read -r nodes_qdrant | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_qdrant | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mIp da VPS ou Dominio:\e[97m $ip_vps\e[0m" | |
| echo "" | |
| ## Informação sobre quantidade de nodes | |
| echo -e "\e[33mQuantidade de Nodes:\e[97m $nodes_qdrant\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_qdrant | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO QDRANT \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria QDrant iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO QDRANT \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack qdrant.yaml | |
| cat <<EOL > qdrant.yaml | |
| version: "3.7" | |
| services: | |
| EOL | |
| for ((i=0; i< $nodes_qdrant; i++)); do | |
| node_name="qdrant_node_$i" | |
| volume_name="qdrant_data_$i" | |
| cat <<EOL >> qdrant.yaml | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| $node_name: | |
| image: qdrant/qdrant:latest ## Versão do Qdrant | |
| volumes: | |
| - $volume_name:/qdrant | |
| networks: | |
| - $nome_rede_interna | |
| ports: | |
| - "$((6333 + i * 10)):6333" | |
| - "$((6334 + i * 10)):6334" | |
| environment: | |
| - QDRANT__SERVICE__GRPC_PORT=6334 | |
| - QDRANT__CLUSTER__ENABLED=true | |
| - QDRANT__CLUSTER__P2P__PORT=6335 | |
| - QDRANT__CLUSTER__CONSENSUS__MAX_MESSAGE_QUEUE_SIZE=5000 | |
| - QDRANT__LOG_LEVEL=debug,raft=info | |
| deploy: | |
| resources: | |
| limits: | |
| cpus: "0.3" | |
| EOL | |
| if ((i == 0)); then | |
| echo " command: ./qdrant --uri 'http://qdrant_node_0:6335'" >> qdrant.yaml | |
| else | |
| echo " command: bash -c \"sleep $((10 + i * 3)) && ./qdrant --bootstrap 'http://qdrant_node_0:6335' --uri 'http://qdrant_node_$i:6335'\"" >> qdrant.yaml | |
| fi | |
| echo "" >> qdrant.yaml | |
| done | |
| cat <<EOL >> qdrant.yaml | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| EOL | |
| for ((i=0; i< $nodes_qdrant; i++)); do | |
| volume_name="qdrant_data_$i" | |
| echo " $volume_name:" >> qdrant.yaml | |
| done | |
| cat <<EOL >> qdrant.yaml | |
| networks: | |
| $nome_rede_interna: | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Qdrant" | |
| fi | |
| STACK_NAME="qdrant" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c qdrant.yaml qdrant > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Qdrant" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Usa o serviço wait_stack "qdrant" para verificar se o serviço esta online | |
| wait_stack "qdrant_qdrant_node_0" | |
| telemetria QDrant finalizado | |
| cd dados_vps | |
| cat > dados_qdrant <<EOL | |
| [ QDRANT ] | |
| Dominio do Qdrant: https://$ip_vps:6333/dashboard | |
| Usuario: Não Tem | |
| Senha: Não Tem | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ QDRANT ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDashboard:\e[97m http://$ip_vps:6333/dashboard\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Não Tem\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Não Tem\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗ ██████╗ ██████╗ ███████╗███████╗██████╗ ██████╗██████╗ ███╗ ███╗ | |
| ## ██║ ██║██╔═══██╗██╔═══██╗██╔════╝██╔════╝██╔══██╗ ██╔════╝██╔══██╗████╗ ████║ | |
| ## ██║ █╗ ██║██║ ██║██║ ██║█████╗ █████╗ ██║ ██║ ██║ ██████╔╝██╔████╔██║ | |
| ## ██║███╗██║██║ ██║██║ ██║██╔══╝ ██╔══╝ ██║ ██║ ██║ ██╔══██╗██║╚██╔╝██║ | |
| ## ╚███╔███╔╝╚██████╔╝╚██████╔╝██║ ███████╗██████╔╝ ╚██████╗██║ ██║██║ ╚═╝ ██║ | |
| ## ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝╚═════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_woofed() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_woofedcrm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o WoofedCRM (ex: woofedcrm.sociosdigitales.pro): \e[0m" && read -r url_woofed | |
| echo "" | |
| ## Pergunta o nome do Usuario do Motor | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -e "$amarelo--> Evite os caracteres especiais: @\!#$ e/ou espaço" | |
| echo -en "\e[33mDigite o User do MOTOR (ex: orionpro): \e[0m" && read -r email_admin_woofed | |
| echo "" | |
| ## Pergunta o nome do Senha do Motor | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -e "$amarelo--> Evite os caracteres especiais: \!#$ e/ou espaço" | |
| echo -en "\e[33mDigite a Senha do MOTOR (ex: @Senha123_): \e[0m" && read -r senha_email_woofed | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_woofedcrm | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre o dominio | |
| echo -e "\e[33mDominio:\e[97m $url_woofed\e[0m" | |
| echo "" | |
| ## Informação sobre o usuario | |
| echo -e "\e[33mUser MOTOR:\e[97m $email_admin_woofed\e[0m" | |
| echo "" | |
| ## Informação sobre a senha | |
| echo -e "\e[33mSenha MOTOR:\e[97m $senha_email_woofed\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_woofedcrm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO WOOFED CRM \e[33m[1/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria WoofedCRM iniciado | |
| dados | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES VECTOR \e[33m[2/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| verificar_container_pgvector | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - PgVector já instalado" | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do PgVector" | |
| criar_banco_pgvector_da_stack "woofedcrm${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_pgvector | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| criar_banco_pgvector_da_stack "woofedcrm${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/7]\e[0m" | |
| echo "" | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO WOOFED CRM \e[33m[4/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando uma Encryption Key Aleatória | |
| encryption_key_woofed=$(openssl rand -hex 16) | |
| # Verifica se o arquivo evolution.yaml existe | |
| if [ -f "/root/evolution.yaml" ]; then | |
| # Extrai os valores do arquivo evolution.yaml e formata no estilo desejado | |
| EVOLUTION_API_ENDPOINT="- EVOLUTION_API_ENDPOINT=$(grep -oP '(?<=- SERVER_URL=)[^#]*' /root/evolution.yaml | sed 's/ //g')" | |
| EVOLUTION_API_ENDPOINT_TOKEN="- EVOLUTION_API_ENDPOINT_TOKEN=$(grep -oP '(?<=- AUTHENTICATION_API_KEY=)[^#]*' /root/evolution.yaml | sed 's/ //g')" | |
| else | |
| # Define os valores padrão se o arquivo não existir | |
| EVOLUTION_API_ENDPOINT="#- EVOLUTION_API_ENDPOINT=" | |
| EVOLUTION_API_ENDPOINT_TOKEN="#- EVOLUTION_API_ENDPOINT_TOKEN=" | |
| fi | |
| ## Criando a stack woofedcrm.yaml | |
| cat > woofedcrm${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| woofedcrm${1:+_$1}_web: | |
| image: douglara/woofedcrm:latest | |
| command: bundle exec rails s -p 3000 -b 0.0.0.0 | |
| volumes: | |
| - woofedcrm${1:+_$1}_data:/app/public/assets | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url WoofedCRM | |
| - FRONTEND_URL=https://$url_woofed | |
| - SECRET_KEY_BASE=$encryption_key_woofed | |
| ## Idioma | |
| - LANGUAGE=pt-BR | |
| ## Permitir/Bloquear novas Inscrições | |
| - ENABLE_USER_SIGNUP=true | |
| ## Credenciais Motor | |
| - MOTOR_AUTH_USERNAME=$email_admin_woofed | |
| - MOTOR_AUTH_PASSWORD=$senha_email_woofed | |
| ## Endpoints Evolution API | |
| $EVOLUTION_API_ENDPOINT ## BaseUrl | |
| $EVOLUTION_API_ENDPOINT_TOKEN ## Global Api Key | |
| ## Timezone | |
| - DEFAULT_TIMEZONE=Brasilia | |
| ## Dados OpenAI | |
| #- OPENAI_API_KEY= | |
| ## Dados PgVector | |
| - DATABASE_URL=postgres://postgres:$senha_pgvector@pgvector:5432/woofedcrm${1:+_$1} | |
| ## Dados Redis | |
| - REDIS_URL=redis://redis:6379/0 | |
| ## Dados Storage | |
| - ACTIVE_STORAGE_SERVICE=local | |
| ## Modo de Produção | |
| - RAILS_ENV=production | |
| - RACK_ENV=production | |
| - NODE_ENV=production | |
| - RAILS_LOG_LEVEL=debug | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.woofedcrm${1:+_$1}.rule=Host(\`$url_woofed\`) | |
| - traefik.http.routers.woofedcrm${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.woofedcrm${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.woofedcrm${1:+_$1}.priority=1 | |
| - traefik.http.routers.woofedcrm${1:+_$1}.service=woofedcrm${1:+_$1} | |
| - traefik.http.services.woofedcrm${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.services.woofedcrm${1:+_$1}.loadbalancer.passhostheader=true | |
| - traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https | |
| - traefik.http.routers.woofedcrm${1:+_$1}.middlewares=sslheader@docker | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| woofedcrm${1:+_$1}_sidekiq: | |
| image: douglara/woofedcrm:latest | |
| command: bundle exec sidekiq -C config/sidekiq.yml | |
| volumes: | |
| - woofedcrm${1:+_$1}_data:/app/public/assets | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url WoofedCRM | |
| - FRONTEND_URL=https://$url_woofed | |
| - SECRET_KEY_BASE=$encryption_key_woofed | |
| ## Idioma | |
| - LANGUAGE=pt-BR | |
| ## Permitir/Bloquear novas Inscrições | |
| - ENABLE_USER_SIGNUP=true | |
| ## Credenciais Motor | |
| - MOTOR_AUTH_USERNAME=$email_admin_woofed | |
| - MOTOR_AUTH_PASSWORD=$senha_email_woofed | |
| ## Endpoints Evolution API | |
| $EVOLUTION_API_ENDPOINT ## BaseUrl | |
| $EVOLUTION_API_ENDPOINT_TOKEN ## Global Api Key | |
| ## Timezone | |
| - DEFAULT_TIMEZONE=Brasilia | |
| ## Dados OpenAI | |
| #- OPENAI_API_KEY= | |
| ## Dados PgVector | |
| - DATABASE_URL=postgres://postgres:$senha_pgvector@pgvector:5432/woofedcrm${1:+_$1} | |
| ## Dados Redis | |
| - REDIS_URL=redis://redis:6379/0 | |
| ## Dados Storage | |
| - ACTIVE_STORAGE_SERVICE=local | |
| ## Modo de Produção | |
| - RAILS_ENV=production | |
| - RACK_ENV=production | |
| - NODE_ENV=production | |
| - RAILS_LOG_LEVEL=debug | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| woofedcrm${1:+_$1}_job: | |
| image: douglara/woofedcrm:latest | |
| command: bundle exec good_job | |
| volumes: | |
| - woofedcrm${1:+_$1}_data:/app/public/assets | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url WoofedCRM | |
| - FRONTEND_URL=https://$url_woofed | |
| - SECRET_KEY_BASE=$encryption_key_woofed | |
| ## Idioma | |
| - LANGUAGE=pt-BR | |
| ## Permitir/Bloquear novas Inscrições | |
| - ENABLE_USER_SIGNUP=true | |
| ## Credenciais Motor | |
| - MOTOR_AUTH_USERNAME=$email_admin_woofed | |
| - MOTOR_AUTH_PASSWORD=$senha_email_woofed | |
| ## Endpoints Evolution API | |
| $EVOLUTION_API_ENDPOINT ## BaseUrl | |
| $EVOLUTION_API_ENDPOINT_TOKEN ## Global Api Key | |
| ## Timezone | |
| - DEFAULT_TIMEZONE=Brasilia | |
| ## Dados OpenAI | |
| #- OPENAI_API_KEY= | |
| ## Dados PgVector | |
| - DATABASE_URL=postgres://postgres:$senha_pgvector@pgvector:5432/woofedcrm${1:+_$1} | |
| ## Dados Redis | |
| - REDIS_URL=redis://redis:6379/0 | |
| ## Dados Storage | |
| - ACTIVE_STORAGE_SERVICE=local | |
| ## Modo de Produção | |
| - RAILS_ENV=production | |
| - RACK_ENV=production | |
| - NODE_ENV=production | |
| - RAILS_LOG_LEVEL=debug | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| woofedcrm${1:+_$1}_data: | |
| external: true | |
| name: woofedcrm${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do WoofedCRM" | |
| fi | |
| STACK_NAME="woofedcrm${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c woofedcrm.yaml woofedcrm #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do WoofedCRM" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/7]\e[0m" | |
| wait_30_sec | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull douglara/woofedcrm:latest | |
| ## Usa o serviço wait_stack "woofedcrm" para verificar se o serviço esta online | |
| wait_stack woofedcrm${1:+_$1}_woofedcrm${1:+_$1}_web woofedcrm${1:+_$1}_woofedcrm${1:+_$1}_sidekiq woofedcrm${1:+_$1}_woofedcrm${1:+_$1}_job | |
| telemetria WoofedCRM finalizado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• CONFIGURANDO E MIGRANDO BANCO DE DADOS \e[33m[6/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| #MIGRANDO BANCO DE DADOS DO WOOFED CRM | |
| container_name="woofedcrm${1:+_$1}_web" | |
| max_wait_time=1200 | |
| wait_interval=60 | |
| elapsed_time=0 | |
| while [ $elapsed_time -lt $max_wait_time ]; do | |
| CONTAINER_ID=$(docker ps -q --filter "name=$container_name") | |
| if [ -n "$CONTAINER_ID" ]; then | |
| break | |
| fi | |
| sleep $wait_interval | |
| elapsed_time=$((elapsed_time + wait_interval)) | |
| done | |
| if [ -z "$CONTAINER_ID" ]; then | |
| echo "O contêiner não foi encontrado após $max_wait_time segundos." | |
| exit 1 | |
| fi | |
| docker exec -it "$CONTAINER_ID" bundle exec rails db:create > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Executando: bundle exec rails db:create" | |
| else | |
| echo "1/2- [ OFF ] - Executando: bundle exec rails db:create" | |
| fi | |
| docker exec -it "$CONTAINER_ID" bundle exec rails db:migrate > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Executando: bundle exec rails db:migrate" | |
| else | |
| echo "2/2- [ OFF ] - Executando: bundle exec rails db:migrate" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[7/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Usa o serviço wait_stack "woofedcrm" para verificar se o serviço esta online | |
| wait_stack woofedcrm${1:+_$1}_woofedcrm${1:+_$1}_web woofedcrm${1:+_$1}_woofedcrm${1:+_$1}_sidekiq woofedcrm${1:+_$1}_woofedcrm${1:+_$1}_job | |
| cd dados_vps | |
| cat > dados_woofedcrm${1:+_$1} <<EOL | |
| [ WOOFED CRM ] | |
| Dominio do WoofedCRM: https://$url_woofed | |
| Email: Precisa criar dentro do WoofedCRM | |
| Senha: Precisa criar dentro do WoofedCRM | |
| Acesso ao Motor: https://$url_woofed/motor_admin | |
| Usuario do Motor: $email_admin_woofed | |
| Senha do Motor: $senha_email_woofed | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ WOOFED CRM ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio:\e[33m https://$url_woofed\e[0m" | |
| echo "" | |
| echo -e "\e[97mEmail:\e[33m Precisa criar dentro do WoofedCRM\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha:\e[33m Precisa criar dentro do WoofedCRM\e[0m" | |
| echo "" | |
| echo -e "\e[97mURL MOTOR:\e[33m https://$url_woofed/motor_admin\e[0m" | |
| echo "" | |
| echo -e "\e[97mUser MOTOR:\e[33m $email_admin_woofed\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha MOTOR:\e[33m $senha_email_woofed\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗ ██████╗ ██████╗ ███╗ ███╗██████╗ ██████╗ ██╗ ██████╗██╗ ██╗███████╗ | |
| ## ██╔════╝██╔═══██╗██╔══██╗████╗ ████║██╔══██╗██╔══██╗██║██╔════╝██║ ██╔╝██╔════╝ | |
| ## █████╗ ██║ ██║██████╔╝██╔████╔██║██████╔╝██████╔╝██║██║ █████╔╝ ███████╗ | |
| ## ██╔══╝ ██║ ██║██╔══██╗██║╚██╔╝██║██╔══██╗██╔══██╗██║██║ ██╔═██╗ ╚════██║ | |
| ## ██║ ╚██████╔╝██║ ██║██║ ╚═╝ ██║██████╔╝██║ ██║██║╚██████╗██║ ██╗███████║ | |
| ## ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ | |
| ferramenta_formbricks() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_formbricks | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Formbricks (ex: formbricks.sociosdigitales.pro): \e[0m" && read -r url_formbricks | |
| echo "" | |
| ## Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mDigite um Email para o SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_formbricks | |
| echo "" | |
| ## Pergunta o User SMTP | |
| echo -e "\e[97mPasso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuario do SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_formbricks | |
| echo "" | |
| ## Pergunta a Senha SMTP | |
| echo -e "\e[97mPasso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do email (ex: @Senha123_): \e[0m" && read -r senha_formbricks | |
| echo "" | |
| ## Pergunta o Host SMTP | |
| echo -e "\e[97mPasso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do email (ex: smtp.hostinger.com): \e[0m" && read -r host_formbricks | |
| echo "" | |
| ## Pergunta a Porta SMTP | |
| echo -e "\e[97mPasso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mDigite a Porta SMTP do email (ex: 465): \e[0m" && read -r porta_formbricks | |
| echo "" | |
| if [ "$porta_formbricks" -eq 465 ] || [ "$porta_formbricks" -eq 25 ]; then | |
| ssl_formbricks=1 | |
| else | |
| ssl_formbricks=0 | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_formbricks | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio:\e[97m $url_formbricks\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_formbricks\e[0m" | |
| echo "" | |
| ## Informação sobre UserSMTP | |
| echo -e "\e[33mUser SMTP:\e[97m $user_smtp_formbricks\e[0m" | |
| echo "" | |
| ## Informação sobre Senha | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_formbricks\e[0m" | |
| echo "" | |
| ## Informação sobre Host | |
| echo -e "\e[33mHost SMTP:\e[97m $host_formbricks\e[0m" | |
| echo "" | |
| ## Informação sobre Porta | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_formbricks\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_formbricks | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO FORMBRICKS \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Formbricks iniciado | |
| ## Nada nada nada.. só para aparecer a mensagem de passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO PGVECTOR \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| verificar_container_pgvector | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - PgVector já instalado" | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do PgVector" | |
| criar_banco_pgvector_da_stack "formbricks${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_pgvector | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| criar_banco_pgvector_da_stack "formbricks${1:+_$1}" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO FORMBRICKS \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Gera keys aleatórias | |
| encryption_key_form=$(openssl rand -hex 32) | |
| next_key_form=$(openssl rand -hex 32) | |
| cron_key_form=$(openssl rand -hex 32) | |
| ## Criando a stack formbricks.yaml | |
| cat > formbricks${1:+_$1}.yaml <<-EOF | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| formbricks${1:+_$1}: | |
| image: formbricks/formbricks:latest | |
| volumes: | |
| - formbricks${1:+_$1}_data:/home/nextjs/apps/web/uploads/ | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url da aplicação | |
| - WEBAPP_URL=https://$url_formbricks | |
| - NEXTAUTH_URL=https://$url_formbricks | |
| ## Banco de dados Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_pgvector@pgvector:5432/formbricks${1:+_$1}?schema=public | |
| ## Licença Enterprise ou Self-hosting | |
| ## Solicitar licenta Self-hosting --> https://sociosdigitales.pro/formbricks_licence/ <-- ## | |
| - ENTERPRISE_LICENSE_KEY= | |
| ## Keys aleatórias 32 caracteres | |
| - ENCRYPTION_KEY=$encryption_key_form | |
| - NEXTAUTH_SECRET=$next_key_form | |
| - CRON_SECRET=$cron_key_form | |
| ## Dados do SMTP | |
| - MAIL_FROM=$email_formbricks | |
| - SMTP_HOST=$host_formbricks | |
| - SMTP_PORT=$porta_formbricks | |
| - SMTP_SECURE_ENABLED=$ssl_formbricks #(0= false | 1= true) | |
| - SMTP_USER=$user_smtp_formbricks | |
| - SMTP_PASSWORD=$senha_formbricks | |
| ## Ativar/Desativar registros e convites (0= false | 1= true) | |
| - SIGNUP_DISABLED=0 | |
| - INVITE_DISABLED=0 | |
| - EMAIL_VERIFICATION_DISABLED=0 | |
| - PASSWORD_RESET_DISABLED=0 | |
| ## Dados do Formbricks (para pesquisa) | |
| - NEXT_PUBLIC_FORMBRICKS_API_HOST= | |
| - NEXT_PUBLIC_FORMBRICKS_ENVIRONMENT_ID= | |
| - NEXT_PUBLIC_FORMBRICKS_ONBOARDING_SURVEY_ID= | |
| ## Login Google Cloud | |
| - GOOGLE_AUTH_ENABLED=0 | |
| - GOOGLE_CLIENT_ID= | |
| - GOOGLE_CLIENT_SECRET= | |
| ## Google Sheets | |
| - GOOGLE_SHEETS_CLIENT_ID= | |
| - GOOGLE_SHEETS_CLIENT_SECRET= | |
| - GOOGLE_SHEETS_REDIRECT_URL= | |
| ## Login Github | |
| - GITHUB_AUTH_ENABLED=0 | |
| - GITHUB_ID= | |
| - GITHUB_SECRET= | |
| ## Login Github | |
| - NOTION_OAUTH_CLIENT_ID= | |
| - NOTION_OAUTH_CLIENT_SECRET= | |
| ## Login Airtable | |
| - AIRTABLE_CLIENT_ID= | |
| ## Termos e politica de privacidade | |
| #- PRIVACY_URL= | |
| #- TERMS_URL= | |
| #- IMPRINT_URL= | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.formbricks${1:+_$1}.rule=Host(\`$url_formbricks\`) | |
| - traefik.http.services.formbricks${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.formbricks${1:+_$1}.service=formbricks${1:+_$1} | |
| - traefik.http.routers.formbricks${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.formbricks${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.formbricks${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| formbricks${1:+_$1}_data: | |
| external: true | |
| name: formbricks${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOF | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Formbricks" | |
| fi | |
| STACK_NAME="formbricks${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c formbricks.yaml formbricks > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do Formbricks" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull formbricks/formbricks:latest | |
| ## Usa o serviço wait_stack "formbricks" para verificar se o serviço esta online | |
| wait_stack formbricks${1:+_$1}_formbricks${1:+_$1} | |
| wait_30_sec | |
| telemetria Formbricks finalizado | |
| cd dados_vps | |
| cat > dados_formbricks${1:+_$1} <<EOL | |
| [ FORMBRICKS ] | |
| Dominio do Formbricks: https://$url_formbricks | |
| Email: Precisa de criar dentro do Formbricks | |
| Senha: Precisa de criar dentro do Formbricks | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ FORMBRICKS ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_formbricks\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Precisa de criar dentro do Formbricks\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa de criar dentro do Formbricks\e[0m" | |
| echo "" | |
| echo "> Aguarde aproximadamente 5 minutos antes de acessar devido à migração em andamento." | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗ | |
| ## ████╗ ██║██╔═══██╗██╔════╝██╔═══██╗██╔══██╗██╔══██╗ | |
| ## ██╔██╗ ██║██║ ██║██║ ██║ ██║██║ ██║██████╔╝ | |
| ## ██║╚██╗██║██║ ██║██║ ██║ ██║██║ ██║██╔══██╗ | |
| ## ██║ ╚████║╚██████╔╝╚██████╗╚██████╔╝██████╔╝██████╔╝ | |
| ## ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ | |
| ferramenta_nocodb() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_nocodb | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mIngrese el dominio para NocoDB (ej: nocodb.sociosdigitales.pro): \e[0m" && read -r url_nocodb | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_nocodb | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para NocoDB:\e[97m $url_nocodb\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_nocodb | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE NOCODB \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria NocoDB iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Já sabe né ksk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "nocodb${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "nocodb${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO NOCODB \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack | |
| cat > nocodb${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| nocodb${1:+_$1}: | |
| image: nocodb/nocodb:latest | |
| volumes: | |
| - nocodb${1:+_$1}_data:/usr/app/data | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url do Nocobase | |
| - NC_PUBLIC_URL=https://$url_nocodb | |
| ## Dados Postgres | |
| - NC_DB=pg://postgres:5432?u=postgres&p=$senha_postgres&d=nocodb${1:+_$1} | |
| ## Desativar Telemetria | |
| - NC_DISABLE_TELE=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.nocodb${1:+_$1}.rule=Host(\`$url_nocodb\`) | |
| - traefik.http.routers.nocodb${1:+_$1}.entrypoints=websecure | |
| - traefik.http.services.nocodb${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.routers.nocodb${1:+_$1}.service=nocodb${1:+_$1} | |
| - traefik.http.routers.nocodb${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - com.centurylinklabs.watchtower.enable=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| nocodb${1:+_$1}_data: | |
| external: true | |
| name: nocodb${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de NocoDB" | |
| fi | |
| STACK_NAME="nocodb${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c nocodb.yaml nocodb > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do NocoDB" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull nocodb/nocodb:latest | |
| ## Usa o serviço wait_nocodb para verificar se o serviço esta online | |
| wait_stack nocodb${1:+_$1}_nocodb${1:+_$1} | |
| telemetria NocoDB finalizado | |
| cd dados_vps | |
| cat > dados_nocodb${1:+_$1} <<EOL | |
| [ NOCODB ] | |
| Dominio do NocoDB: https://$url_nocodb | |
| Usuario: Precisa criar no primeiro acesso do NocoDB | |
| Contraseña: Precisa criar no primeiro acesso do NocoDB | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ NOCODB ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_nocodb\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Debe crearse en el primer acceso de NocoDB\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Debe crearse en el primer acceso de NocoDB\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗██╗ ██╗███████╗███████╗ | |
| ## ██║ ██╔══██╗████╗ ██║██╔════╝ ██╔════╝██║ ██║██╔════╝██╔════╝ | |
| ## ██║ ███████║██╔██╗ ██║██║ ███╗█████╗ ██║ ██║███████╗█████╗ | |
| ## ██║ ██╔══██║██║╚██╗██║██║ ██║██╔══╝ ██║ ██║╚════██║██╔══╝ | |
| ## ███████╗██║ ██║██║ ╚████║╚██████╔╝██║ ╚██████╔╝███████║███████╗ | |
| ## ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝ | |
| ferramenta_langfuse() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_langfuse | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Langfuse (ex: langfuse.sociosdigitales.pro): \e[0m" && read -r url_langfuse | |
| echo "" | |
| ## Pergunta qual é o Access Key do minio | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mAccess Key Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pergunta qual é a Secret Key do minio | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -en "\e[33mSecret Key Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_langfuse | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ARQUIVO_CLICKHOUSE="/root/dados_vps/dados_clickhouse" | |
| API_CLICKHOUSE=$(grep "API do clickhouse:" "$ARQUIVO_CLICKHOUSE" | cut -d ":" -f2- | xargs) | |
| USUARIO_CLICKHOUSE=$(grep "Usuario:" "$ARQUIVO_CLICKHOUSE" | cut -d ":" -f2- | xargs) | |
| SENHA_CLICKHOUSE=$(grep "Senha:" "$ARQUIVO_CLICKHOUSE" | cut -d ":" -f2- | xargs) | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para o Langfuse:\e[97m $url_langfuse\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio do ClickHouse:\e[97m $API_CLICKHOUSE\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mUsuario do ClickHouse:\e[97m $USUARIO_CLICKHOUSE\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mSenha do ClickHouse:\e[97m $SENHA_CLICKHOUSE\e[0m" | |
| echo "" | |
| ## Informação sobre Access Key | |
| echo -e "\e[33mAccess Key Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| ## Informação sobre Secret Key | |
| echo -e "\e[33mSecret Key Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_langfuse | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO LANGFUSE \e[33m[1/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Langfuse iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Já sabe né ksk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "langfuse${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "langfuse${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• CRIANDO BANCO NO CLICKHOUSE \e[33m[3/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| docker exec -it "$(docker ps --filter 'name=clickhouse' -q)" clickhouse-client -q "CREATE DATABASE langfuse${1:+_$1};" > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Banco langfuse${1:+_$1} criado" | |
| else | |
| echo "1/1 - [ OFF ] - Erro ao criar Banco langfuse${1:+_$1}" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• PEGANDO DADOS DO MINIO \e[33m[4/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| pegar_senha_minio | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Pegando Senha do MinIO" | |
| else | |
| echo "1/2 - [ OFF ] - Pegando Senha do MinIO" | |
| echo "Não foi possivel pegar a senha do minio" | |
| echo "" | |
| fi | |
| pegar_link_s3 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Pegando URL do S3" | |
| echo "" | |
| else | |
| echo "2/2 - [ OFF ] - Pegando URL do S3" | |
| echo "Não foi possivel pegar o link do S3" | |
| echo "" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO LANGFUSE \e[33m[5/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória 64caracteres | |
| key_encryption=$(openssl rand -hex 32) | |
| ## Criando key Aleatória 64caracteres | |
| key_secret=$(openssl rand -hex 32) | |
| ## Criando key Aleatória 32caracteres | |
| key_salt=$(openssl rand -hex 32) | |
| ## Criando a stack langfuse.yaml | |
| cat > langfuse${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| langfuse${1:+_$1}_app: | |
| image: langfuse/langfuse:latest | |
| networks: | |
| - $nome_rede_interna ## Rede interna | |
| environment: | |
| ## Url do Langfuse | |
| - NEXTAUTH_URL=https://$url_langfuse | |
| ## Desativar novas incrições | |
| - NEXT_PUBLIC_SIGN_UP_DISABLED=false | |
| ## Secrets Key | |
| - ENCRYPTION_KEY=$key_encryption | |
| - NEXTAUTH_SECRET=$key_secret | |
| - SALT=$key_salt | |
| ## Dados Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/langfuse${1:+_$1} | |
| ## Dados do ClickHouse | |
| - CLICKHOUSE_MIGRATION_URL=clickhouse://clickhouse:9000 | |
| - CLICKHOUSE_URL=$API_CLICKHOUSE | |
| - CLICKHOUSE_USER=$USUARIO_CLICKHOUSE | |
| - CLICKHOUSE_PASSWORD=$SENHA_CLICKHOUSE | |
| - CLICKHOUSE_CLUSTER_ENABLED=false | |
| - CLICKHOUSE_DB=langfuse${1:+_$1} | |
| ## Dados Redis | |
| - REDIS_CONNECTION_STRING=redis://redis:6379 | |
| ## Dados do S3 - Eventos | |
| - LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT=https://$url_s3 | |
| - LANGFUSE_S3_EVENT_UPLOAD_BUCKET=langfuse${1:+-$1} | |
| - LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID=$S3_ACCESS_KEY | |
| - LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=$S3_SECRET_KEY | |
| - LANGFUSE_S3_EVENT_UPLOAD_REGION=auto | |
| - LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE=true | |
| - LANGFUSE_S3_EVENT_UPLOAD_PREFIX=events/ | |
| ## Dados do S3 - Medias | |
| - LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=https://$url_s3 | |
| - LANGFUSE_S3_MEDIA_UPLOAD_BUCKET=langfuse${1:+-$1} | |
| - LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID=$S3_ACCESS_KEY | |
| - LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=$S3_SECRET_KEY | |
| - LANGFUSE_S3_MEDIA_UPLOAD_REGION=auto | |
| - LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE=true | |
| - LANGFUSE_S3_MEDIA_UPLOAD_PREFIX=media/ | |
| ## Ativar Telemetria | |
| - TELEMETRY_ENABLED=false | |
| ## Features experimentais | |
| - LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=false | |
| ## Node | |
| - NODE_ENV=production | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: '1' | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.langfuse${1:+_$1}.rule=Host(\`$url_langfuse\`) | |
| - traefik.http.routers.langfuse${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.langfuse${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.langfuse${1:+_$1}.service=langfuse${1:+_$1} | |
| - traefik.http.services.langfuse${1:+_$1}.loadbalancer.passHostHeader=true | |
| - traefik.http.services.langfuse${1:+_$1}.loadbalancer.server.port=3000 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| langfuse${1:+_$1}_worker: | |
| image: langfuse/langfuse-worker:latest | |
| networks: | |
| - $nome_rede_interna ## Rede interna | |
| environment: | |
| ## Url do Langfuse | |
| - NEXTAUTH_URL=https://$url_langfuse | |
| ## Desativar novas incrições | |
| - NEXT_PUBLIC_SIGN_UP_DISABLED=false | |
| ## Secrets Key | |
| - ENCRYPTION_KEY=$key_encryption | |
| - NEXTAUTH_SECRET=$key_secret | |
| - SALT=$key_salt | |
| ## Dados Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/langfuse${1:+_$1} | |
| ## Dados do ClickHouse | |
| - CLICKHOUSE_MIGRATION_URL=clickhouse://clickhouse:9000 | |
| - CLICKHOUSE_URL=$API_CLICKHOUSE | |
| - CLICKHOUSE_USER=$USUARIO_CLICKHOUSE | |
| - CLICKHOUSE_PASSWORD=$SENHA_CLICKHOUSE | |
| - CLICKHOUSE_CLUSTER_ENABLED=false | |
| - CLICKHOUSE_DB=langfuse${1:+_$1} | |
| ## Dados Redis | |
| - REDIS_CONNECTION_STRING=redis://redis:6379 | |
| ## Dados do S3 - Eventos | |
| - LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT=https://$url_s3 | |
| - LANGFUSE_S3_EVENT_UPLOAD_BUCKET=langfuse${1:+-$1} | |
| - LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID=$S3_ACCESS_KEY | |
| - LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=$S3_SECRET_KEY | |
| - LANGFUSE_S3_EVENT_UPLOAD_REGION=auto | |
| - LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE=true | |
| - LANGFUSE_S3_EVENT_UPLOAD_PREFIX=events/ | |
| ## Dados do S3 - Medias | |
| - LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=https://$url_s3 | |
| - LANGFUSE_S3_MEDIA_UPLOAD_BUCKET=langfuse${1:+-$1} | |
| - LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID=$S3_ACCESS_KEY | |
| - LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=$S3_SECRET_KEY | |
| - LANGFUSE_S3_MEDIA_UPLOAD_REGION=auto | |
| - LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE=true | |
| - LANGFUSE_S3_MEDIA_UPLOAD_PREFIX=media/ | |
| ## Ativar Telemetria | |
| - TELEMETRY_ENABLED=false | |
| ## Features experimentais | |
| - LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=false | |
| ## Node | |
| - NODE_ENV=production | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: '1' | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: ## Rede interna | |
| external: true | |
| name: $nome_rede_interna ## Rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do langfuse" | |
| fi | |
| STACK_NAME="langfuse${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c langfuse.yaml langfuse > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do langfuse" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[6/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull langfuse/langfuse:latest langfuse/langfuse-worker:latest | |
| ## Usa o serviço wait_langfuse para verificar se o serviço esta online | |
| wait_stack langfuse${1:+_$1}_langfuse${1:+_$1}_app langfuse${1:+_$1}_langfuse${1:+_$1}_worker | |
| telemetria Langfuse finalizado | |
| cd dados_vps | |
| cat > dados_langfuse${1:+_$1} <<EOL | |
| [ LANGFUSE ] | |
| Dominio do Langfuse: https://$url_langfuse | |
| Usuario: Precisa criar no primeiro acesso do langfuse | |
| Senha: Precisa criar no primeiro acesso do langfuse | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ LANGFUSE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_langfuse\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Langfuse\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Langfuse\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ███╗███████╗████████╗ █████╗ ██████╗ █████╗ ███████╗███████╗ | |
| ## ████╗ ████║██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝ | |
| ## ██╔████╔██║█████╗ ██║ ███████║██████╔╝███████║███████╗█████╗ | |
| ## ██║╚██╔╝██║██╔══╝ ██║ ██╔══██║██╔══██╗██╔══██║╚════██║██╔══╝ | |
| ## ██║ ╚═╝ ██║███████╗ ██║ ██║ ██║██████╔╝██║ ██║███████║███████╗ | |
| ## ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
| ferramenta_metabase() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_metabase | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Metabase (ex: metabase.sociosdigitales.pro): \e[0m" && read -r url_metabase | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_metabase | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para o metabase:\e[97m $url_metabase\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_metabase | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO METABASE \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria MetaBase iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Já sabe né ksk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "metabase${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "metabase${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO METABASE \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória 64caracteres | |
| key_secret=$(openssl rand -hex 32) | |
| ## Criando key Aleatória 32caracteres | |
| key_salt=$(openssl rand -hex 16) | |
| ## Criando a stack metabase.yaml | |
| cat > metabase${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| metabase${1:+_$1}: | |
| image: metabase/metabase:latest | |
| volumes: | |
| - metabase${1:+_$1}_data:/metabase3-data | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url MetaBase | |
| - MB_SITE_URL=https://$url_metabase | |
| - MB_REDIRECT_ALL_REQUESTS_TO_HTTPS=true | |
| - MB_JETTY_PORT=3000 | |
| - MB_JETTY_HOST=0.0.0.0 | |
| ## Dados postgres | |
| - MB_DB_MIGRATION_LOCATION=none | |
| - MB_DB_TYPE=postgres | |
| - MB_DB_DBNAME=metabase${1:+_$1} | |
| - MB_DB_PORT=5432 | |
| - MB_DB_USER=postgres | |
| - MB_DB_PASS=$senha_postgres | |
| - MB_DB_HOST=postgres | |
| - MB_AUTOMIGRATE=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.metabase${1:+_$1}.rule=Host(\`$url_metabase\`) | |
| - traefik.http.services.metabase${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.metabase${1:+_$1}.service=metabase${1:+_$1} | |
| - traefik.http.routers.metabase${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.metabase${1:+_$1}.tls=true | |
| - traefik.http.routers.metabase${1:+_$1}.tls.certresolver=letsencryptresolver | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| metabase${1:+_$1}_data: | |
| external: true | |
| name: metabase${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do metabase" | |
| fi | |
| STACK_NAME="metabase${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c metabase.yaml metabase > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do metabase" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull metabase/metabase:latest | |
| ## Usa o serviço wait_stack "metabase" para verificar se o serviço esta online | |
| wait_stack metabase${1:+_$1}_metabase${1:+_$1} | |
| telemetria MetaBase finalizado | |
| cd dados_vps | |
| cat > dados_metabase${1:+_$1} <<EOL | |
| [ METABASE ] | |
| Dominio do metabase: https://$url_metabase | |
| Usuario: Precisa criar no primeiro acesso do metabase | |
| Senha: Precisa criar no primeiro acesso do metabase | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ METABASE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_metabase\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do metabase\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do metabase\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ██████╗ ██████╗ | |
| ## ██╔═══██╗██╔══██╗██╔═══██╗██╔═══██╗ | |
| ## ██║ ██║██║ ██║██║ ██║██║ ██║ | |
| ## ██║ ██║██║ ██║██║ ██║██║ ██║ | |
| ## ╚██████╔╝██████╔╝╚██████╔╝╚██████╔╝ | |
| ## ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ | |
| ferramenta_odoo() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_odoo | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Odoo (ex: odoo.sociosdigitales.pro): \e[0m" && read -r url_odoo | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_odoo | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para o Odoo:\e[97m $url_odoo\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_odoo | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO ODOO \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Odoo iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO ODOO \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando senha do postgres | |
| senha_postgres_odoo=$(openssl rand -hex 16) | |
| ## Criando a stack odoo.yaml | |
| cat > odoo${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| odoo${1:+_$1}_app: | |
| image: odoo:18.0 | |
| volumes: | |
| - odoo${1:+_$1}_app_data:/var/lib/odoo | |
| - odoo${1:+_$1}_app_config:/etc/odoo | |
| - odoo${1:+_$1}_app_addons:/mnt/extra-addons | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados postgres do Odoo | |
| - HOST=odoo${1:+_$1}_db | |
| - USER=odoo | |
| - PASSWORD=$senha_postgres_odoo | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.odoo${1:+_$1}_app.rule=Host(\`$url_odoo\`) | |
| - traefik.http.routers.odoo${1:+_$1}_app.entrypoints=websecure | |
| - traefik.http.routers.odoo${1:+_$1}_app.tls=true | |
| - traefik.http.routers.odoo${1:+_$1}_app.service=odoo${1:+_$1}_app | |
| - traefik.http.routers.odoo${1:+_$1}_app.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.odoo${1:+_$1}_app.loadbalancer.server.port=8069 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| odoo${1:+_$1}_db: | |
| image: postgres:15 | |
| volumes: | |
| - odoo${1:+_$1}_db_data:/var/lib/postgresql/data/pgdata | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 5434:5432 | |
| environment: | |
| ## Dados Postgres | |
| - POSTGRES_DB=postgres | |
| - POSTGRES_PASSWORD=$senha_postgres_odoo | |
| - POSTGRES_USER=odoo | |
| - PGDATA=/var/lib/postgresql/data/pgdata | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| odoo${1:+_$1}_app_data: | |
| external: true | |
| name: odoo${1:+_$1}_app_data | |
| odoo${1:+_$1}_app_config: | |
| external: true | |
| name: odoo${1:+_$1}_app_config | |
| odoo${1:+_$1}_app_addons: | |
| external: true | |
| name: odoo${1:+_$1}_app_addons | |
| odoo${1:+_$1}_db_data: | |
| external: true | |
| name: odoo${1:+_$1}_db_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| attachable: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do odoo" | |
| fi | |
| STACK_NAME="odoo${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c odoo.yaml odoo > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Odoo" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull odoo:18.0 postgres:15 | |
| ## Usa o serviço wait_odoo para verificar se o serviço esta online | |
| wait_stack odoo${1:+_$1}_odoo${1:+_$1}_app odoo${1:+_$1}_odoo${1:+_$1}_db | |
| telemetria Odoo finalizado | |
| cd dados_vps | |
| cat > dados_odoo${1:+_$1} <<EOL | |
| [ ODOO ] | |
| Dominio do odoo: https://$url_odoo | |
| Usuario: Precisa criar no primeiro acesso do Odoo | |
| Senha: Precisa criar no primeiro acesso do Odoo | |
| Database Name: odoo | |
| Database Password: $senha_postgres_odoo | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ ODOO ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_odoo\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Odoo\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Odoo\e[0m" | |
| echo "" | |
| echo -e "\e[33mDatabase Name:\e[97m odoo\e[0m" | |
| echo "" | |
| echo -e "\e[33mDatabase Password:\e[97m $senha_postgres_odoo\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗██╗ ██╗ █████╗ ████████╗██╗ ██╗ ██████╗ ██████╗ ████████╗ | |
| ## ██╔════╝██║ ██║██╔══██╗╚══██╔══╝██║ ██║██╔═══██╗██╔═══██╗╚══██╔══╝ | |
| ## ██║ ███████║███████║ ██║ ██║ █╗ ██║██║ ██║██║ ██║ ██║ | |
| ## ██║ ██╔══██║██╔══██║ ██║ ██║███╗██║██║ ██║██║ ██║ ██║ | |
| ## ╚██████╗██║ ██║██║ ██║ ██║ ╚███╔███╔╝╚██████╔╝╚██████╔╝ ██║ | |
| ## ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═╝ | |
| ## | |
| ## ███╗ ██╗███████╗███████╗████████╗ ██████╗ ██████╗ | |
| ## ████╗ ██║██╔════╝██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗ | |
| ## ██╔██╗ ██║█████╗ ███████╗ ██║ ██║ ██║██████╔╝ | |
| ## ██║╚██╗██║██╔══╝ ╚════██║ ██║ ██║ ██║██╔══██╗ | |
| ## ██║ ╚████║███████╗███████║ ██║ ╚██████╔╝██║ ██║ | |
| ## ╚═╝ ╚═══╝╚══════╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ | |
| ferramenta_chatwoot_nestor() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_chatwoot_nestor | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Chatwoot (ex: chatwoot.sociosdigitales.pro): \e[0m" && read -r url_chatwoot | |
| echo "" | |
| ## Pega o nome do dominio para ser o nome da empresa | |
| nome_empresa_chatwoot="$nome_servidor" | |
| ## Pergunta o email SMTP | |
| echo -e "\e[97mPasso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_admin_chatwoot | |
| echo "" | |
| ## Define o dominio SMTP com o dominio do email | |
| dominio_smtp_chatwoot=$(echo "$email_admin_chatwoot" | cut -d "@" -f 2) | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_chatwoot | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_email_chatwoot | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r smtp_email_chatwoot | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_chatwoot | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_chatwoot" -eq 465 ]; then | |
| sobre_ssl=true | |
| else | |
| sobre_ssl=false | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_chatwoot_nestor | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do Chatwoot:\e[97m $url_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre Nome da Empresa | |
| echo -e "\e[33mNome da Empresa:\e[97m $nome_empresa_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre Email de SMTP | |
| echo -e "\e[33mEmail do SMTP:\e[97m $email_admin_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre Usuario do SMTP | |
| echo -e "\e[33mUser do SMTP:\e[97m $user_smtp_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre Senha de SMTP | |
| echo -e "\e[33mSenha do SMTP:\e[97m $senha_email_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP:\e[97m $smtp_email_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_chatwoot\e[0m" | |
| echo "" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_chatwoot_nestor | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO CHATWOOT NESTOR \e[33m[1/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Chatwoot Nestor" "iniciado" | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO PGVECTOR \e[33m[2/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "chatwoot_nestor${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "chatwoot_nestor${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO CHATWOOT NESTOR \e[33m[4/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Neste passo vamos estar criando a Stack yaml do Chatwoot na pasta /root/ | |
| ## Isso possibilitará que o usuario consiga edita-lo posteriormente | |
| ## Depois vamos instalar o Chatwoot e verificar se esta tudo certo. | |
| ## Criando key aleatória | |
| encryption_key=$(openssl rand -hex 16) | |
| ## Criando a stack chatwoot_nestor.yaml | |
| cat > chatwoot_nestor${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| chatwoot_nestor${1:+_$1}_app: | |
| image: chatwoot/chatwoot/v4.1.0 ## Versão do Chatwoot Nestor | |
| command: bundle exec rails s -p 3000 -b 0.0.0.0 | |
| entrypoint: docker/entrypoints/rails.sh | |
| volumes: | |
| - chatwoot_nestor${1:+_$1}_storage:/app/storage ## Arquivos de conversa | |
| - chatwoot_nestor${1:+_$1}_public:/app/public ## Arquivos de logos | |
| - chatwoot_nestor${1:+_$1}_mailer:/app/app/views/devise/mailer ## Arquivos de email | |
| - chatwoot_nestor${1:+_$1}_mailers:/app/app/views/mailers ## Arquivos de emails | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Qualquer Url com # no final | |
| - CHATWOOT_HUB_URL=https://sociosdigitales.pro/setup# | |
| ## Nome da Empresa | |
| - INSTALLATION_NAME=$nome_empresa_chatwoot | |
| ## Secret key | |
| - SECRET_KEY_BASE=$encryption_key | |
| ## Url Chatwoot | |
| - FRONTEND_URL=https://$url_chatwoot | |
| - FORCE_SSL=true | |
| ## Idioma/Localização padrão | |
| - DEFAULT_LOCALE=pt_BR | |
| - TZ=America/Brasil | |
| ## Google Cloud - Modifique de acordo com os seus dados (lembre-se de mudar no chatwoot_sidekiq) | |
| #- GOOGLE_OAUTH_CLIENT_ID=369777777777-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com | |
| #- GOOGLE_OAUTH_CLIENT_SECRET=ABCDEF-GHijklmnoPqrstuvwX-yz1234567 | |
| #- GOOGLE_OAUTH_CALLBACK_URL=https://<your-server-domain>/omniauth/google_oauth2/callback | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| - REDIS_PREFIX=chatwoot_nestor${1:+_$1}_ | |
| ## Dados do Postgres | |
| - POSTGRES_HOST=postgres | |
| - POSTGRES_USERNAME=postgres | |
| - POSTGRES_PASSWORD=$senha_postgres ## Senha do postgres | |
| - POSTGRES_DATABASE=chatwoot_nestor${1:+_$1} | |
| ## Armazenamento | |
| - ACTIVE_STORAGE_SERVICE=local ## use s3_compatible para MinIO | |
| #- STORAGE_BUCKET_NAME=chatwoot_nestor${1:+_$1} | |
| #- STORAGE_ACCESS_KEY_ID=ACCESS_KEY_MINIO | |
| #- STORAGE_SECRET_ACCESS_KEY=SECRET_KEY_MINIO | |
| #- STORAGE_REGION=eu-south | |
| #- STORAGE_ENDPOINT=https://s3.DOMINIO.COM | |
| #- STORAGE_FORCE_PATH_STYLE=true | |
| ## Dados do SMTP | |
| - MAILER_SENDER_EMAIL=$email_admin_chatwoot <$email_admin_chatwoot> ## Email SMTP | |
| - SMTP_DOMAIN=$dominio_smtp_chatwoot ## Dominio do email | |
| - SMTP_ADDRESS=$smtp_email_chatwoot ## Host SMTP | |
| - SMTP_PORT=$porta_smtp_chatwoot ## Porta SMTP | |
| - SMTP_SSL=$sobre_ssl ## Se a porta for 465 = true | Se a porta for 587 = false | |
| - SMTP_USERNAME=$user_smtp_chatwoot ## Usuario SMTP | |
| - SMTP_PASSWORD=$senha_email_chatwoot ## Senha do SMTP | |
| - SMTP_AUTHENTICATION=login | |
| - SMTP_ENABLE_STARTTLS_AUTO=true | |
| - SMTP_OPENSSL_VERIFY_MODE=peer | |
| - MAILER_INBOUND_EMAIL_DOMAIN=$email_admin_chatwoot ## Email SMTP | |
| ## Melhorias | |
| - SIDEKIQ_CONCURRENCY=10 | |
| - RACK_TIMEOUT_SERVICE_TIMEOUT=0 | |
| - RAILS_MAX_THREADS=5 | |
| - WEB_CONCURRENCY=2 | |
| - ENABLE_RACK_ATTACK=false | |
| ## Outras configurações | |
| - NODE_ENV=production | |
| - RAILS_ENV=production | |
| - INSTALLATION_ENV=docker | |
| - RAILS_LOG_TO_STDOUT=true | |
| - USE_INBOX_AVATAR_FOR_BOT=true | |
| - ENABLE_ACCOUNT_SIGNUP=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.chatwoot_nestor${1:+_$1}_app.rule=Host(\`$url_chatwoot\`) | |
| - traefik.http.routers.chatwoot_nestor${1:+_$1}_app.entrypoints=websecure | |
| - traefik.http.routers.chatwoot_nestor${1:+_$1}_app.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.chatwoot_nestor${1:+_$1}_app.priority=1 | |
| - traefik.http.routers.chatwoot_nestor${1:+_$1}_app.service=chatwoot_nestor${1:+_$1}_app | |
| - traefik.http.services.chatwoot_nestor${1:+_$1}_app.loadbalancer.server.port=3000 | |
| - traefik.http.services.chatwoot_nestor${1:+_$1}_app.loadbalancer.passhostheader=true | |
| - traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https | |
| - traefik.http.routers.chatwoot_nestor${1:+_$1}_app.middlewares=sslheader@docker | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| chatwoot_nestor${1:+_$1}_sidekiq: | |
| image: chatwoot/chatwoot/v4.1.0 ## Versão do Chatwoot Nestor | |
| command: bundle exec sidekiq -C config/sidekiq.yml | |
| volumes: | |
| - chatwoot_nestor${1:+_$1}_storage:/app/storage ## Arquivos de conversa | |
| - chatwoot_nestor${1:+_$1}_public:/app/public ## Arquivos de logos | |
| - chatwoot_nestor${1:+_$1}_mailer:/app/app/views/devise/mailer ## Arquivos de email | |
| - chatwoot_nestor${1:+_$1}_mailers:/app/app/views/mailers ## Arquivos de emails | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Qualquer Url com # no final | |
| - CHATWOOT_HUB_URL=https://sociosdigitales.pro/setup# | |
| ## Nome da Empresa | |
| - INSTALLATION_NAME=$nome_empresa_chatwoot | |
| ## Secret key | |
| - SECRET_KEY_BASE=$encryption_key | |
| ## Url Chatwoot | |
| - FRONTEND_URL=https://$url_chatwoot | |
| - FORCE_SSL=true | |
| ## Idioma/Localização padrão | |
| - DEFAULT_LOCALE=pt_BR | |
| - TZ=America/Sao_Paulo | |
| ## Google Cloud - Modifique de acordo com os seus dados (lembre-se de mudar no chatwoot_sidekiq) | |
| #- GOOGLE_OAUTH_CLIENT_ID=369777777777-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com | |
| #- GOOGLE_OAUTH_CLIENT_SECRET=ABCDEF-GHijklmnoPqrstuvwX-yz1234567 | |
| #- GOOGLE_OAUTH_CALLBACK_URL=https://<your-server-domain>/omniauth/google_oauth2/callback | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| - REDIS_PREFIX=chatwoot_nestor${1:+_$1}_ | |
| ## Dados do Postgres | |
| - POSTGRES_HOST=postgres | |
| - POSTGRES_USERNAME=postgres | |
| - POSTGRES_PASSWORD=$senha_postgres ## Senha do postgres | |
| - POSTGRES_DATABASE=chatwoot_nestor${1:+_$1} | |
| ## Armazenamento | |
| - ACTIVE_STORAGE_SERVICE=local ## use s3_compatible para MinIO | |
| #- STORAGE_BUCKET_NAME=chatwoot_nestor${1:+_$1} | |
| #- STORAGE_ACCESS_KEY_ID=ACCESS_KEY_MINIO | |
| #- STORAGE_SECRET_ACCESS_KEY=SECRET_KEY_MINIO | |
| #- STORAGE_REGION=eu-south | |
| #- STORAGE_ENDPOINT=https://s3.DOMINIO.COM | |
| #- STORAGE_FORCE_PATH_STYLE=true | |
| ## Dados do SMTP | |
| - MAILER_SENDER_EMAIL=$email_admin_chatwoot <$email_admin_chatwoot> ## Email SMTP | |
| - SMTP_DOMAIN=$dominio_smtp_chatwoot ## Dominio do email | |
| - SMTP_ADDRESS=$smtp_email_chatwoot ## Host SMTP | |
| - SMTP_PORT=$porta_smtp_chatwoot ## Porta SMTP | |
| - SMTP_SSL=$sobre_ssl ## Se a porta for 465 = true | Se a porta for 587 = false | |
| - SMTP_USERNAME=$user_smtp_chatwoot ## Usuario SMTP | |
| - SMTP_PASSWORD=$senha_email_chatwoot ## Senha do SMTP | |
| - SMTP_AUTHENTICATION=login | |
| - SMTP_ENABLE_STARTTLS_AUTO=true | |
| - SMTP_OPENSSL_VERIFY_MODE=peer | |
| - MAILER_INBOUND_EMAIL_DOMAIN=$email_admin_chatwoot ## Email SMTP | |
| ## Melhorias | |
| - SIDEKIQ_CONCURRENCY=10 | |
| - RACK_TIMEOUT_SERVICE_TIMEOUT=0 | |
| - RAILS_MAX_THREADS=5 | |
| - WEB_CONCURRENCY=2 | |
| - ENABLE_RACK_ATTACK=false | |
| ## Outras configurações | |
| - NODE_ENV=production | |
| - RAILS_ENV=production | |
| - INSTALLATION_ENV=docker | |
| - RAILS_LOG_TO_STDOUT=true | |
| - USE_INBOX_AVATAR_FOR_BOT=true | |
| - ENABLE_ACCOUNT_SIGNUP=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| chatwoot_nestor${1:+_$1}_storage: | |
| external: true | |
| name: chatwoot_nestor${1:+_$1}_storage | |
| chatwoot_nestor${1:+_$1}_public: | |
| external: true | |
| name: chatwoot_nestor${1:+_$1}_public | |
| chatwoot_nestor${1:+_$1}_mailer: | |
| external: true | |
| name: chatwoot_nestor${1:+_$1}_mailer | |
| chatwoot_nestor${1:+_$1}_mailers: | |
| external: true | |
| name: chatwoot_nestor${1:+_$1}_mailers | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Chatwoot" | |
| fi | |
| STACK_NAME="chatwoot_nestor${1:+_$1}" | |
| stack_editavel #> /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c chatwoot.yaml chatwoot > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do Chatwoot" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull sendingtk/chatwoot:latest | |
| ## Usa o serviço wait_chatwoot para verificar se o serviço esta online | |
| wait_stack chatwoot_nestor${1:+_$1}_chatwoot_nestor${1:+_$1}_app chatwoot_nestor${1:+_$1}_chatwoot_nestor${1:+_$1}_sidekiq | |
| telemetria "Chatwoot Nestor" "finalizado" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• MIGRANDO BANCO DE DADOS \e[33m[6/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos estar migrando o banco de dados usando o comando "bundle exec rails db:chatwoot_prepare" | |
| ## Basicamente voce poderia entrar no banco de dados do chatwoot e executar o comando por lá tambem | |
| container_name="chatwoot_nestor${1:+_$1}_chatwoot_nestor${1:+_$1}_app" | |
| max_wait_time=1200 | |
| wait_interval=60 | |
| elapsed_time=0 | |
| while [ $elapsed_time -lt $max_wait_time ]; do | |
| CONTAINER_ID=$(docker ps -q --filter "name=$container_name") | |
| if [ -n "$CONTAINER_ID" ]; then | |
| break | |
| fi | |
| sleep $wait_interval | |
| elapsed_time=$((elapsed_time + wait_interval)) | |
| done | |
| if [ -z "$CONTAINER_ID" ]; then | |
| echo "O contêiner não foi encontrado após $max_wait_time segundos." | |
| exit 1 | |
| fi | |
| docker exec -it "$CONTAINER_ID" bundle exec rails db:chatwoot_prepare > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Executando no container: bundle exec rails db:chatwoot_prepare" | |
| else | |
| echo "1/1 - [ OFF ] - Executando no container: bundle exec rails db:chatwoot_prepare" | |
| echo "Não foi possivel migrar o banco de dados" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• ATIVANDO FUNÇÕES DO SUPER ADMIN \e[33m[7/7]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos alterar um dado no postgres para liberar algumas funções ocultas no painel de super admin | |
| wait_for_postgres | |
| CONTAINER_ID_NESTOR=$(docker ps -q --filter "name=postgres_postgres") | |
| docker exec -i $CONTAINER_ID_NESTOR psql -U postgres <<EOF > /dev/null 2>&1 | |
| \c chatwoot_nestor${1:+_$1}; | |
| update installation_configs set locked = false; | |
| \q | |
| EOF | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Desbloqueando tabela installation_configs no postgres" | |
| else | |
| echo "1/1 - [ OFF ] - Desbloqueando tabela installation_configs no postgres" | |
| echo "Não foi possivel liberar as funções do super_admin" | |
| fi | |
| echo "" | |
| ## Salvando informações da instalação dentro de /dados_vps/ | |
| cd dados_vps | |
| cat > dados_chatwoot_nestor${1:+_$1} <<EOL | |
| [ CHATWOOT NESTOR ] | |
| Dominio do Chatwoot: https://$url_chatwoot | |
| Usuario: Precisa criar dentro do Chatwoot | |
| Senha: Precisa criar dentro do Chatwoot | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ CHATWOOT NESTOR ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio:\e[33m https://$url_chatwoot\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m Precisa criar dentro do Chatwoot\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha:\e[33m Precisa criar dentro do Chatwoot\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗███╗ ██╗ ██████╗ █████╗ ██████╗ ██╗ | |
| ## ██║ ██║████╗ ██║██╔═══██╗ ██╔══██╗██╔══██╗██║ | |
| ## ██║ ██║██╔██╗ ██║██║ ██║ ███████║██████╔╝██║ | |
| ## ██║ ██║██║╚██╗██║██║ ██║ ██╔══██║██╔═══╝ ██║ | |
| ## ╚██████╔╝██║ ╚████║╚██████╔╝ ██║ ██║██║ ██║ | |
| ## ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_unoapi() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_unoapi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio da UnoApi | |
| echo -e "\e[97mPasso$amarelo 1/11\e[0m" | |
| echo -en "\e[33mDigite o Dominio para a Uno API (ex: unoapi.sociosdigitales.pro): \e[0m" && read -r url_unoapi | |
| echo "" | |
| ##Pergunta o Dominio do Chatwoot | |
| echo -e "\e[97mPasso$amarelo 2/11\e[0m" | |
| echo -en "\e[33mDigite o Dominio do Chatwoot já instalado (ex: chatwoot.sociosdigitales.pro): \e[0m" && read -r url_chatwoot_uno | |
| echo "" | |
| ##Pergunta o o token do usuario | |
| echo -e "\e[97mPasso$amarelo 3/11\e[0m" | |
| echo -en "\e[33mDigite o token de usuario administrador do Chatwoot: \e[0m" && read -r token_chatwoot_uno | |
| echo "" | |
| ##Pergunta se quer ignorar mensagens de grupos | |
| echo -e "\e[97mPasso$amarelo 4/11\e[0m" | |
| echo -en "\e[33mIgnorar mensagens de grupos (true ou false): \e[0m" && read -r op_1 | |
| echo "" | |
| ## Pergunta se quer ignorar o stauts de transmissão | |
| echo -e "\e[97mPasso$amarelo 5/11\e[0m" | |
| echo -en "\e[33mIgnorar Status de Transmissão (true ou false): \e[0m" && read -r op_2 | |
| echo "" | |
| ## Pergunta se quer ignorar mensagens de trasmissão | |
| echo -e "\e[97mPasso$amarelo 6/11\e[0m" | |
| echo -en "\e[33mIgnorar Mensagens de Trasmissão (true ou false): \e[0m" && read -r op_3 | |
| echo "" | |
| ## Pergunta se quer ignorar mensagem de status | |
| echo -e "\e[97mPasso$amarelo 7/11\e[0m" | |
| echo -en "\e[33mIgnorar Mensagem de Status (true ou false): \e[0m" && read -r op_4 | |
| echo "" | |
| ## Pergunta se quer ignorar as próprias mensagens | |
| echo -e "\e[97mPasso$amarelo 8/11\e[0m" | |
| echo -en "\e[33mIgnorar Proprias Mensagens (true ou false): \e[0m" && read -r op_5 | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 9/11\e[0m" | |
| echo -en "\e[33mEnviar status de conexão (true ou false): \e[0m" && read -r op_6 | |
| echo "" | |
| ## Pergunta qual é o Access Key do minio | |
| echo -e "\e[97mPasso$amarelo 10/11\e[0m" | |
| echo -en "\e[33mAccess Key Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pergunta qual é a Secret Key do minio | |
| echo -e "\e[97mPasso$amarelo 11/11\e[0m" | |
| echo -en "\e[33mSecret Key Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| ## Pegando senha do rabbitMQ | |
| pegar_user_senha_rabbitmq | |
| ## Pegando senha do minio | |
| pegar_senha_minio | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_unoapi | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| echo -e "\e[33mDominio da Uno API:\e[97m $url_unoapi\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio do Chatwoot:\e[97m $url_chatwoot_uno\e[0m" | |
| echo "" | |
| echo -e "\e[33mToken do Administrador:\e[97m $token_chatwoot_uno\e[0m" | |
| echo "" | |
| echo -e "\e[33mIgnorar mensagens de grupos:\e[97m $op_1\e[0m" | |
| echo "" | |
| echo -e "\e[33mIgnorar Status de Transmissão:\e[97m $op_2\e[0m" | |
| echo "" | |
| echo -e "\e[33mIgnorar Mensagens de Trasmissão:\e[97m $op_3\e[0m" | |
| echo "" | |
| echo -e "\e[33mIgnorar Mensagem de Status:\e[97m $op_4\e[0m" | |
| echo "" | |
| echo -e "\e[33mIgnorar Proprias mensagens:\e[97m $op_5\e[0m" | |
| echo "" | |
| echo -e "\e[33mEnviar status de conexão:\e[97m $op_6\e[0m" | |
| echo "" | |
| echo -e "\e[33mAccess Key Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| echo -e "\e[33mSecret Key Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| echo -e "\e[33mUser RabbitMq:\e[97m $user_rabbit_mqs\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha RabbitMq:\e[97m $senha_rabbit_mqs\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_unoapi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DA UNO API \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Uno API" "iniciado" | |
| ## Nada nada nada.. só para aparecer a mensagem de passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO UNO API \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| ##key_unoapi=$(openssl rand -hex 16) | |
| ## Criando a stack unoapi.yaml | |
| cat > unoapi${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| unoapi${1:+_$1}: | |
| image: clairton/unoapi-cloud:latest | |
| entrypoint: yarn cloud | |
| volumes: | |
| - unoapi${1:+_$1}_data:/home/u/app | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Url Uno API | |
| - BASE_URL=https://$url_unoapi | |
| ## Token Uno Api | |
| - UNOAPI_AUTH_TOKEN=any | |
| ## Configurações da Uno API | |
| - IGNORE_GROUP_MESSAGES=$op_1 | |
| - IGNORE_BROADCAST_STATUSES=$op_2 | |
| - IGNORE_BROADCAST_MESSAGES=$op_3 | |
| - IGNORE_STATUS_MESSAGE=$op_4 | |
| - IGNORE_OWN_MESSAGES=$op_5 | |
| - REJECT_CALLS= | |
| - REJECT_CALLS_WEBHOOK= | |
| - SEND_CONNECTION_STATUS=$op_6 | |
| ## Sobre Webhook | |
| - WEBHOOK_URL=https://$url_chatwoot_uno/webhooks/whatsapp | |
| - WEBHOOK_HEADER=api_access_token | |
| - WEBHOOK_TOKEN=$token_chatwoot_uno | |
| ## Dados do Minio/S3 | |
| - STORAGE_ENDPOINT=https://$url_s3 | |
| - STORAGE_ACCESS_KEY_ID=$S3_ACCESS_KEY | |
| - STORAGE_SECRET_ACCESS_KEY=$S3_SECRET_KEY | |
| - STORAGE_BUCKET_NAME=unoapi${1:+_$1} | |
| - STORAGE_FORCE_PATH_STYLE=true | |
| ## Dados do RabbitMQ | |
| - AMQP_URL=amqp://$user_rabbit_mqs:$senha_rabbit_mqs@rabbitmq:5672/unoapi${1:+_$1} | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| ## Outras configurações | |
| - LOG_LEVEL=debug | |
| - UNO_LOG_LEVEL=debug | |
| - UNOAPI_RETRY_REQUEST_DELAY=1_000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.unoapi${1:+_$1}.rule=Host(\`$url_unoapi\`) | |
| - traefik.http.routers.unoapi${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.unoapi${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.unoapi${1:+_$1}.loadbalancer.server.port=9876 | |
| - traefik.http.routers.unoapi${1:+_$1}.priority=1 | |
| - traefik.http.services.unoapi${1:+_$1}.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.unoapi${1:+_$1}.service=unoapi${1:+_$1} | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| unoapi${1:+_$1}_data: | |
| external: true | |
| name: unoapi${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Uno API" | |
| fi | |
| STACK_NAME="unoapi${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c unoapi.yaml unoapi > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do Uno API" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull clairton/unoapi-cloud:latest | |
| ## Usa o serviço wait_unoapi para verificar se o serviço esta online | |
| wait_stack unoapi${1:+_$1}_unoapi${1:+_$1} | |
| telemetria "Uno API" "finalizado" | |
| cd dados_vps | |
| cat > dados_unoapi${1:+_$1} <<EOL | |
| [ UNO API ] | |
| Dominio do unoapi: https://$url_unoapi | |
| Auth Token: any | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ UNO API ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_unoapi\e[0m" | |
| echo "" | |
| echo -e "\e[33mPing:\e[97m https://$url_unoapi/ping\e[0m" | |
| echo "" | |
| echo -e "\e[33mAuth Token:\e[97m any\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ██████╗ ███╗ ███╗ ███╗ ██╗ ██████╗ ██████╗ ███████╗███████╗ | |
| ## ████╗ ██║██╔══██╗████╗ ██║ ██╔════╝██╔═══██╗████╗ ████║ ████╗ ██║██╔═══██╗██╔══██╗██╔════╝██╔════╝ | |
| ## ██╔██╗ ██║╚█████╔╝██╔██╗ ██║ ██║ ██║ ██║██╔████╔██║ ██╔██╗ ██║██║ ██║██║ ██║█████╗ ███████╗ | |
| ## ██║╚██╗██║██╔══██╗██║╚██╗██║ ██║ ██║ ██║██║╚██╔╝██║ ██║╚██╗██║██║ ██║██║ ██║██╔══╝ ╚════██║ | |
| ## ██║ ╚████║╚█████╔╝██║ ╚████║ ╚██████╗╚██████╔╝██║ ╚═╝ ██║ ██║ ╚████║╚██████╔╝██████╔╝███████╗███████║ | |
| ## ╚═╝ ╚═══╝ ╚════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ | |
| ## | |
| ## ██████╗ ██████╗ ██████╗ ██╗ ██╗███████╗██████╗ █████╗ ███████╗ █████╗ | |
| ## ██╔══██╗██╔═══██╗ ██╔═══██╗██║ ██║██╔════╝██╔══██╗██╔══██╗██╔════╝██╔══██╗ | |
| ## ██║ ██║██║ ██║ ██║ ██║██║ ██║█████╗ ██████╔╝███████║███████╗███████║ | |
| ## ██║ ██║██║ ██║ ██║▄▄ ██║██║ ██║██╔══╝ ██╔═══╝ ██╔══██║╚════██║██╔══██║ | |
| ## ██████╔╝╚██████╔╝ ╚██████╔╝╚██████╔╝███████╗██║ ██║ ██║███████║██║ ██║ | |
| ## ╚═════╝ ╚═════╝ ╚══▀▀═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ | |
| ferramenta_n8n_quepasa() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_n8n_quepasa | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do N8N | |
| echo -e "\e[97mPasso$amarelo 1/8\e[0m" | |
| echo -en "\e[33mDigite o dominio para o N8N (ex: n8n.sociosdigitales.pro): \e[0m" && read -r url_editorn8n | |
| echo "" | |
| ##Pergunta o Dominio do Webhook | |
| echo -e "\e[97mPasso$amarelo 2/8\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Webhook do N8N (ex: webhook.sociosdigitales.pro): \e[0m" && read -r url_webhookn8n | |
| echo "" | |
| ##Pergunta Dominio do Chatwoot | |
| echo -e "\e[97mPasso$amarelo 3/8\e[0m" | |
| echo -en "\e[33mDigite o dominio do Chatwoot (ex: chatwoot.sociosdigitales.pro): \e[0m" && read -r dominio_chatwoot | |
| echo "" | |
| ##Pergunta Dominio do Quepasa | |
| echo -e "\e[97mPasso$amarelo 4/8\e[0m" | |
| echo -en "\e[33mDigite o dominio do Quepasa (ex: quepasa.sociosdigitales.pro): \e[0m" && read -r dominio_quepasa | |
| echo "" | |
| ##Pergunta Email do Quepasa | |
| echo -e "\e[97mPasso$amarelo 5/8\e[0m" | |
| echo -en "\e[33mDigite o email do Quepasa (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_quepasa | |
| echo "" | |
| ## Nome usuario padrão para criação do qrcode (utoken) | |
| echo -e "\e[97mPasso$amarelo 6/8\e[0m" | |
| echo -en "\e[33mNome do usuario padrão (Crie um usuario Admin no Chatwoot) (ex: Bot): \e[0m" && read -r user_padrao | |
| echo "" | |
| ## Token do usuario criado Admin | |
| echo -e "\e[97mPasso$amarelo 7/8\e[0m" | |
| echo -en "\e[33mToken do seu usuario criado (ex: cv1dNNkgiXLvqKl6LSj0V4yu6Eqd77N): \e[0m" && read -r user_padrao_token | |
| echo "" | |
| ## ID do usuario criado Admin | |
| echo -e "\e[97mPasso$amarelo 8/8\e[0m" | |
| echo -en "\e[33mID do seu usuario criado (ex: 2): \e[0m" && read -r user_padrao_id | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_n8n_quepasa | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do N8N | |
| echo -e "\e[33mDominio do N8N:\e[97m $url_editorn8n\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Webhook | |
| echo -e "\e[33mDominio para o Webhook:\e[97m $url_webhookn8n\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Chatwoot | |
| echo -e "\e[33mDominio do Chatwoot:\e[97m $dominio_chatwoot\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Quepasa | |
| echo -e "\e[33mDominio do Quepasa:\e[97m $dominio_quepasa\e[0m" | |
| echo "" | |
| ## Informação Email do Quepasa | |
| echo -e "\e[33mEmail do Quepasa:\e[97m $email_quepasa\e[0m" | |
| echo "" | |
| ## Nome do usuario padrão para vincular ao qrcode (utoken) | |
| echo -e "\e[33mNome do User Padrão:\e[97m $user_padrao\e[0m" | |
| echo "" | |
| ## Token do usuario padrão para vincular ao qrcode (utoken) | |
| echo -e "\e[33mToken User Padrão:\e[97m $user_padrao_token\e[0m" | |
| echo "" | |
| ## ID do usuario padrão para vincular ao qrcode (utoken) | |
| echo -e "\e[33mToken User Padrão:\e[97m $user_padrao_id\e[0m" | |
| echo "" | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_n8n_quepasa | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO N8N \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "N8N & Quepasa" "iniciado" | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES\e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica se tem postgres, se sim pega a senha e cria um banco nele, se não instala, pega a senha e cria o banco | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "n8n_quepasa${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "n8n_quepasa${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO N8N \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| encryption_key=$(openssl rand -hex 16) | |
| ## Criando a stack n8n_quepasa.yaml | |
| cat > n8n_quepasa${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| n8n_quepasa${1:+_$1}_editor: | |
| image: deividms/n8n-quepasa:latest ## Versão do N8N | |
| command: start | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do postgres | |
| - DB_TYPE=postgresdb | |
| - DB_POSTGRESDB_DATABASE=n8n_quepasa${1:+_$1} | |
| - DB_POSTGRESDB_HOST=postgres | |
| - DB_POSTGRESDB_PORT=5432 | |
| - DB_POSTGRESDB_USER=postgres | |
| - DB_POSTGRESDB_PASSWORD=$senha_postgres | |
| ## Dados do Quepasa | |
| ### Fluxos IDS | |
| - C8Q_QUEPASAINBOXCONTROL=1001 | |
| - C8Q_GETCHATWOOTCONTACTS=1002 | |
| - C8Q_QUEPASACHATCONTROL=1003 | |
| - C8Q_CHATWOOTPROFILEUPDATE=1004 | |
| - C8Q_POSTTOWEBCALLBACK=1005 | |
| - C8Q_POSTTOCHATWOOT=1006 | |
| - C8Q_CHATWOOTTOQUEPASAGREETINGS=1007 | |
| - C8Q_TOCHATWOOTTRANSCRIPT=pi4APHD9F05Dv6FR | |
| - C8Q_TOCHATWOOTTRANSCRIPTRESUME=true | |
| - C8Q_GETVALIDCONVERSATION=qjdP01sHPfaPFUq1 | |
| - C8Q_WF_CHATWOOTEXTRA=t1o1WDo9E7C5EmJC | |
| - C8Q_WF_TOTYPEBOT=JSpCXQiF7TT1zUgp | |
| - C8Q_WF_QUEPASAINBOXCONTROL_TYPEBOT=BvfU3kc7i0j68IpZ | |
| - C8Q_WF_QUEPASAINBOXCONTROL_SOC=wtn1ZvAUTFwKCHfK | |
| - C8Q_WF_QUEPASAINBOXCONTROL_WEBHOOK=Zj197aISsaIkZP2Z | |
| ### Config Gerais | |
| - C8Q_SINGLETHREAD=false | |
| - C8Q_MSGFOR_NO_CSAT= | |
| - C8Q_SUPERUSER_NAME=$user_padrao | |
| - C8Q_SUPERUSER_TOKEN=$user_padrao_token | |
| - C8Q_SUPERUSER_ID=$user_padrao_id | |
| - C8Q_CW_PUBLIC_URL=$dominio_chatwoot | |
| - C8Q_QP_DEFAULT_USER=$email_quepasa | |
| - C8Q_QP_BOTTITLE=$nome_servidor | |
| - C8Q_QP_CONTACT=$email_quepasa | |
| - C8Q_CW_HOST=https://$dominio_chatwoot | |
| - C8Q_N8N_HOST=https://$url_editorn8n | |
| - C8Q_N8N_WEBHOOK=https://$url_webhookn8n | |
| - C8Q_QUEPASA_HOST=https://$dominio_quepasa | |
| - C8Q_QP_HOST=https://$dominio_quepasa | |
| - C8Q_MSGFOR_UNKNOWN_CONTENT=! "Algum EMOJI" ou "Alguma Reação que o sistema não entende ainda ..." | |
| - C8Q_MSGFOR_EDITED_CONTENT=⚠️ **Essa mensagem foi editada !** | |
| - C8Q_MSGFOR_ATTACHERROR_CONTENT=** Falha ao baixar anexo ! | |
| - C8Q_MSGFOR_LOCALIZATION_CONTENT=* Localização * | |
| - C8Q_MSGFOR_REVOKED_CONTENT=❌ Essa mensagem foi apagada !!! | |
| - C8Q_MSGFOR_CALL_CONTENT=⚠️ O usuário requisitou uma chamada de voz ! | |
| - C8Q_MSGFOR_REJECT_CALL=Não aceitamos Ligação - MSG configurada na Stack | |
| - C8Q_QP_DEFAULT_CALL=true | |
| ### Typebot | |
| # - C8Q_TYPEBOT_HOST=url_web_typebot | |
| # - C8Q_TYPEBOT_TOKEN=API-Token | |
| ## Encryption Key | |
| - N8N_ENCRYPTION_KEY=$encryption_key | |
| ## Url do N8N | |
| - N8N_HOST=$url_editorn8n | |
| - N8N_EDITOR_BASE_URL=https://$url_editorn8n/ | |
| - WEBHOOK_URL=https://$url_webhookn8n/ | |
| - N8N_PROTOCOL=https | |
| ## Modo do Node | |
| - NODE_ENV=production | |
| - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true | |
| - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true | |
| - N8N_RUNNERS_ENABLED=true | |
| ## Modo de execução (deletar caso deseje em modo regular) | |
| - EXECUTIONS_MODE=queue | |
| ## Dados do Redis | |
| - QUEUE_BULL_REDIS_HOST=redis | |
| - QUEUE_BULL_REDIS_PORT=6379 | |
| - QUEUE_BULL_REDIS_DB=2 | |
| - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash | |
| - EXECUTIONS_DATA_PRUNE=true | |
| - EXECUTIONS_DATA_MAX_AGE=336 | |
| ## Timezone | |
| - GENERIC_TIMEZONE=America/Sao_Paulo | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "0.5" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_editor.rule=Host(\`$url_editorn8n\`) | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_editor.entrypoints=websecure | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_editor.priority=1 | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_editor.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_editor.service=n8n_quepasa${1:+_$1}_editor | |
| - traefik.http.services.n8n_quepasa${1:+_$1}_editor.loadbalancer.server.port=5678 | |
| - traefik.http.services.n8n_quepasa${1:+_$1}_editor.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| n8n_quepasa${1:+_$1}_webhook: | |
| image: deividms/n8n-quepasa:latest ## Versão do N8N | |
| command: webhook | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do postgres | |
| - DB_TYPE=postgresdb | |
| - DB_POSTGRESDB_DATABASE=n8n_quepasa${1:+_$1} | |
| - DB_POSTGRESDB_HOST=postgres | |
| - DB_POSTGRESDB_PORT=5432 | |
| - DB_POSTGRESDB_USER=postgres | |
| - DB_POSTGRESDB_PASSWORD=$senha_postgres | |
| ## Dados do Quepasa | |
| ### Fluxos IDS | |
| - C8Q_QUEPASAINBOXCONTROL=1001 | |
| - C8Q_GETCHATWOOTCONTACTS=1002 | |
| - C8Q_QUEPASACHATCONTROL=1003 | |
| - C8Q_CHATWOOTPROFILEUPDATE=1004 | |
| - C8Q_POSTTOWEBCALLBACK=1005 | |
| - C8Q_POSTTOCHATWOOT=1006 | |
| - C8Q_CHATWOOTTOQUEPASAGREETINGS=1007 | |
| - C8Q_TOCHATWOOTTRANSCRIPT=pi4APHD9F05Dv6FR | |
| - C8Q_TOCHATWOOTTRANSCRIPTRESUME=true | |
| - C8Q_GETVALIDCONVERSATION=qjdP01sHPfaPFUq1 | |
| - C8Q_WF_CHATWOOTEXTRA=t1o1WDo9E7C5EmJC | |
| - C8Q_WF_TOTYPEBOT=JSpCXQiF7TT1zUgp | |
| - C8Q_WF_QUEPASAINBOXCONTROL_TYPEBOT=BvfU3kc7i0j68IpZ | |
| - C8Q_WF_QUEPASAINBOXCONTROL_SOC=wtn1ZvAUTFwKCHfK | |
| - C8Q_WF_QUEPASAINBOXCONTROL_WEBHOOK=Zj197aISsaIkZP2Z | |
| ### Config Gerais | |
| - C8Q_SINGLETHREAD=false | |
| - C8Q_MSGFOR_NO_CSAT= | |
| - C8Q_SUPERUSER_NAME=$user_padrao | |
| - C8Q_SUPERUSER_TOKEN=$user_padrao_token | |
| - C8Q_SUPERUSER_ID=$user_padrao_id | |
| - C8Q_CW_PUBLIC_URL=$dominio_chatwoot | |
| - C8Q_QP_DEFAULT_USER=$email_quepasa | |
| - C8Q_QP_BOTTITLE=$nome_servidor | |
| - C8Q_QP_CONTACT=$email_quepasa | |
| - C8Q_CW_HOST=https://$dominio_chatwoot | |
| - C8Q_N8N_HOST=https://$url_editorn8n | |
| - C8Q_N8N_WEBHOOK=https://$url_webhookn8n | |
| - C8Q_QUEPASA_HOST=https://$dominio_quepasa | |
| - C8Q_QP_HOST=https://$dominio_quepasa | |
| - C8Q_MSGFOR_UNKNOWN_CONTENT=! "Algum EMOJI" ou "Alguma Reação que o sistema não entende ainda ..." | |
| - C8Q_MSGFOR_EDITED_CONTENT=⚠️ **Essa mensagem foi editada !** | |
| - C8Q_MSGFOR_ATTACHERROR_CONTENT=** Falha ao baixar anexo ! | |
| - C8Q_MSGFOR_LOCALIZATION_CONTENT=* Localização * | |
| - C8Q_MSGFOR_REVOKED_CONTENT=❌ Essa mensagem foi apagada !!! | |
| - C8Q_MSGFOR_CALL_CONTENT=⚠️ O usuário requisitou uma chamada de voz ! | |
| - C8Q_MSGFOR_REJECT_CALL=Não aceitamos Ligação - MSG configurada na Stack | |
| - C8Q_QP_DEFAULT_CALL=true | |
| ### Typebot | |
| # - C8Q_TYPEBOT_HOST=url_web_typebot | |
| # - C8Q_TYPEBOT_TOKEN=API-Token | |
| ## Encryption Key | |
| - N8N_ENCRYPTION_KEY=$encryption_key | |
| ## Url do N8N | |
| - N8N_HOST=$url_editorn8n | |
| - N8N_EDITOR_BASE_URL=https://$url_editorn8n/ | |
| - WEBHOOK_URL=https://$url_webhookn8n/ | |
| - N8N_PROTOCOL=https | |
| ## Modo do Node | |
| - NODE_ENV=production | |
| - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true | |
| - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true | |
| - N8N_RUNNERS_ENABLED=true | |
| ## Modo de execução (deletar caso deseje em modo regular) | |
| - EXECUTIONS_MODE=queue | |
| ## Dados do Redis | |
| - QUEUE_BULL_REDIS_HOST=redis | |
| - QUEUE_BULL_REDIS_PORT=6379 | |
| - QUEUE_BULL_REDIS_DB=2 | |
| - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash | |
| - EXECUTIONS_DATA_PRUNE=true | |
| - EXECUTIONS_DATA_MAX_AGE=336 | |
| ## Timezone | |
| - GENERIC_TIMEZONE=America/Sao_Paulo | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "0.5" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_webhook.rule=(Host(\`$url_webhookn8n\`)) | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_webhook.entrypoints=websecure | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_webhook.priority=1 | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_webhook.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.n8n_quepasa${1:+_$1}_webhook.service=n8n_quepasa${1:+_$1}_webhook | |
| - traefik.http.services.n8n_quepasa${1:+_$1}_webhook.loadbalancer.server.port=5678 | |
| - traefik.http.services.n8n_quepasa${1:+_$1}_webhook.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| n8n_quepasa${1:+_$1}_worker: | |
| image: deividms/n8n-quepasa:latest ## Versão do N8N | |
| command: worker --concurrency=10 | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do postgres | |
| - DB_TYPE=postgresdb | |
| - DB_POSTGRESDB_DATABASE=n8n_quepasa${1:+_$1} | |
| - DB_POSTGRESDB_HOST=postgres | |
| - DB_POSTGRESDB_PORT=5432 | |
| - DB_POSTGRESDB_USER=postgres | |
| - DB_POSTGRESDB_PASSWORD=$senha_postgres | |
| ## Dados do Quepasa | |
| ### Fluxos IDS | |
| - C8Q_QUEPASAINBOXCONTROL=1001 | |
| - C8Q_GETCHATWOOTCONTACTS=1002 | |
| - C8Q_QUEPASACHATCONTROL=1003 | |
| - C8Q_CHATWOOTPROFILEUPDATE=1004 | |
| - C8Q_POSTTOWEBCALLBACK=1005 | |
| - C8Q_POSTTOCHATWOOT=1006 | |
| - C8Q_CHATWOOTTOQUEPASAGREETINGS=1007 | |
| - C8Q_TOCHATWOOTTRANSCRIPT=pi4APHD9F05Dv6FR | |
| - C8Q_TOCHATWOOTTRANSCRIPTRESUME=true | |
| - C8Q_GETVALIDCONVERSATION=qjdP01sHPfaPFUq1 | |
| - C8Q_WF_CHATWOOTEXTRA=t1o1WDo9E7C5EmJC | |
| - C8Q_WF_TOTYPEBOT=JSpCXQiF7TT1zUgp | |
| - C8Q_WF_QUEPASAINBOXCONTROL_TYPEBOT=BvfU3kc7i0j68IpZ | |
| - C8Q_WF_QUEPASAINBOXCONTROL_SOC=wtn1ZvAUTFwKCHfK | |
| - C8Q_WF_QUEPASAINBOXCONTROL_WEBHOOK=Zj197aISsaIkZP2Z | |
| ### Config Gerais | |
| - C8Q_SINGLETHREAD=false | |
| - C8Q_MSGFOR_NO_CSAT= | |
| - C8Q_SUPERUSER_NAME=$user_padrao | |
| - C8Q_SUPERUSER_TOKEN=$user_padrao_token | |
| - C8Q_SUPERUSER_ID=$user_padrao_id | |
| - C8Q_CW_PUBLIC_URL=$dominio_chatwoot | |
| - C8Q_QP_DEFAULT_USER=$email_quepasa | |
| - C8Q_QP_BOTTITLE=$nome_servidor | |
| - C8Q_QP_CONTACT=$email_quepasa | |
| - C8Q_CW_HOST=https://$dominio_chatwoot | |
| - C8Q_N8N_HOST=https://$url_editorn8n | |
| - C8Q_N8N_WEBHOOK=https://$url_webhookn8n | |
| - C8Q_QUEPASA_HOST=https://$dominio_quepasa | |
| - C8Q_QP_HOST=https://$dominio_quepasa | |
| - C8Q_MSGFOR_UNKNOWN_CONTENT=! "Algum EMOJI" ou "Alguma Reação que o sistema não entende ainda ..." | |
| - C8Q_MSGFOR_EDITED_CONTENT=⚠️ **Essa mensagem foi editada !** | |
| - C8Q_MSGFOR_ATTACHERROR_CONTENT=** Falha ao baixar anexo ! | |
| - C8Q_MSGFOR_LOCALIZATION_CONTENT=* Localização * | |
| - C8Q_MSGFOR_REVOKED_CONTENT=❌ Essa mensagem foi apagada !!! | |
| - C8Q_MSGFOR_CALL_CONTENT=⚠️ O usuário requisitou uma chamada de voz ! | |
| - C8Q_MSGFOR_REJECT_CALL=Não aceitamos Ligação - MSG configurada na Stack | |
| - C8Q_QP_DEFAULT_CALL=true | |
| ### Typebot | |
| # - C8Q_TYPEBOT_HOST=url_web_typebot | |
| # - C8Q_TYPEBOT_TOKEN=API-Token | |
| ## Encryption Key | |
| - N8N_ENCRYPTION_KEY=$encryption_key | |
| ## Url do N8N | |
| - N8N_HOST=$url_editorn8n | |
| - N8N_EDITOR_BASE_URL=https://$url_editorn8n/ | |
| - WEBHOOK_URL=https://$url_webhookn8n/ | |
| - N8N_PROTOCOL=https | |
| ## Modo do Node | |
| - NODE_ENV=production | |
| - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true | |
| - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true | |
| - N8N_RUNNERS_ENABLED=true | |
| ## Modo de execução (deletar caso deseje em modo regular) | |
| - EXECUTIONS_MODE=queue | |
| ## Dados do Redis | |
| - QUEUE_BULL_REDIS_HOST=redis | |
| - QUEUE_BULL_REDIS_PORT=6379 | |
| - QUEUE_BULL_REDIS_DB=2 | |
| - NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodash | |
| - EXECUTIONS_DATA_PRUNE=true | |
| - EXECUTIONS_DATA_MAX_AGE=336 | |
| ## Timezone | |
| - GENERIC_TIMEZONE=America/Sao_Paulo | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do N8N Quepasa" | |
| fi | |
| STACK_NAME="n8n_quepasa${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c n8n_quepasa.yaml n8n_quepasa > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do N8N Quepasa" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull deividms/n8n-quepasa:latest | |
| ## Usa o serviço wait_n8n para verificar se o serviço esta online | |
| wait_stack n8n_quepasa${1:+_$1}_n8n_quepasa${1:+_$1}_editor n8n_quepasa${1:+_$1}_n8n_quepasa${1:+_$1}_webhook n8n_quepasa${1:+_$1}_n8n_quepasa${1:+_$1}_worker | |
| telemetria "N8N & Quepasa" "finalizado" | |
| cd dados_vps | |
| cat > dados_n8n_quepasa${1:+_$1} <<EOL | |
| [ N8N QUEPASA ] | |
| Dominio do N8N: https://$url_editorn8n | |
| Dominio do N8N: https://$url_webhookn8n | |
| Email: Precisa criar no primeiro acesso do N8N | |
| Senha: Precisa criar no primeiro acesso do N8N | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ N8N QUEPASA ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_editorn8n\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Precisa criar no primeiro acesso do N8N\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do N8N\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗ ██╗███████╗██████╗ █████╗ ███████╗ █████╗ | |
| ## ██╔═══██╗██║ ██║██╔════╝██╔══██╗██╔══██╗██╔════╝██╔══██╗ | |
| ## ██║ ██║██║ ██║█████╗ ██████╔╝███████║███████╗███████║ | |
| ## ██║▄▄ ██║██║ ██║██╔══╝ ██╔═══╝ ██╔══██║╚════██║██╔══██║ | |
| ## ╚██████╔╝╚██████╔╝███████╗██║ ██║ ██║███████║██║ ██║ | |
| ## ╚══▀▀═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ | |
| ferramenta_quepasa() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_quepasa | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Quepasa (ex: quepasa.sociosdigitales.pro): \e[0m" && read -r url_quepasa | |
| echo "" | |
| ##Pergunta o email para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/2\e[0m" | |
| echo -en "\e[33mDigite o email para o Quepasa (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_quepasa | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_quepasa | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do quepasa | |
| echo -e "\e[33mDominio do Quepasa:\e[97m $url_quepasa\e[0m" | |
| echo "" | |
| ## Informação sobre email do quepasa | |
| echo -e "\e[33mEmail do Quepasa:\e[97m $email_quepasa\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO QUEPASA \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Quepasa iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES\e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica se tem postgres, se sim pega a senha e cria um banco nele, se não instala, pega a senha e cria o banco | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "quepasa${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "quepasa${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO QUEPASA \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack | |
| key_quepasa=$(openssl rand -hex 16) | |
| cat > quepasa${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| quepasa${1:+_$1}: | |
| image: deividms/quepasa:latest ## Imagem/versão do Quepasa | |
| volumes: | |
| - quepasa${1:+_$1}_volume:/opt/quepasa | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados de acesso | |
| - DOMAIN=$url_quepasa | |
| ## Email Quepasa | |
| - EMAIL=$email_quepasa | |
| - QUEPASA_BASIC_AUTH_USER=$email_quepasa | |
| - QUEPASA_BASIC_AUTH_PASSWORD=$email_quepasa | |
| ## Titulo no celular | |
| - APP_TITLE=OrionDesign ## Mude aqui o nome que vai aparecer no celular. | |
| ## TimeZone | |
| - TZ=America/Sao_Paulo | |
| ## Banco de dados | |
| - DBDRIVER=postgres | |
| - DBHOST=postgres | |
| - DBDATABASE=quepasa${1:+_$1} | |
| - DBPORT=5432 | |
| - DBUSER=postgres | |
| - DBPASSWORD=$senha_postgres | |
| - DBSSLMODE=disable | |
| ## Configurações para o WhatsApp | |
| - GROUPS=true | |
| - BROADCASTS=false | |
| - READRECEIPTS=forcedfalse | |
| - CALLS=true | |
| - READUPDATE=false | |
| - LOGLEVEL=DEBUG | |
| ## Configurações quepasa | |
| - QUEPASA_HOST_NAME=Quepasa | |
| - QUEPASA_MEMORY_LIMIT=4096M | |
| - WEBSOCKETSSL=true | |
| - REMOVEDIGIT9=true | |
| - SIGNING_SECRET=$key_quepasa | |
| ## Webhook | |
| - WEBHOOK_QUEPASA=$url_quepasa/webhook/quepasa | |
| - WEBHOOK_TESTE_QUEPASA=$url_quepasa/webhook-test/quepasa | |
| ## Portas | |
| - QUEPASA_EXTERNAL_PORT=31000 | |
| - QUEPASA_INTERNAL_PORT=31000 | |
| - WEBAPIPORT=31000 | |
| ## Outras configurações | |
| - DEBUGREQUESTS=false | |
| - SYNOPSISLENGTH=500 | |
| - METRICS_HOST= | |
| - METRICS_PORT=9392 | |
| - MIGRATIONS=/builder/migrations | |
| - DEBUGJSONMESSAGES=false | |
| - HTTPLOGS=false | |
| ## WHATSMEOW SERVICE | |
| - WHATSMEOW_LOGLEVEL=WARN | |
| - WHATSMEOW_DBLOGLEVEL=WARN | |
| ## Env Mode | |
| - APP_ENV=production | |
| - NODE_ENV=production | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 2096M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.quepasa${1:+_$1}.rule=Host(\`$url_quepasa\`) | |
| - traefik.http.routers.quepasa${1:+_$1}.tls=true | |
| - traefik.http.routers.quepasa${1:+_$1}.entrypoints=web,websecure | |
| - traefik.http.routers.quepasa${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.quepasa${1:+_$1}.service=quepasa${1:+_$1} | |
| - traefik.http.routers.quepasa${1:+_$1}.priority=1 | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.SSLRedirect=true | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.STSSeconds=315360000 | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.browserXSSFilter=true | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.contentTypeNosniff=true | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.forceSTSHeader=true | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.SSLHost=\${QUEPASA_HOST} | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.STSIncludeSubdomains=true | |
| - traefik.http.middlewares.quepasa${1:+_$1}.headers.STSPreload=true | |
| - traefik.http.services.quepasa${1:+_$1}.loadbalancer.server.port=31000 | |
| - traefik.http.services.quepasa${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| quepasa${1:+_$1}_volume: | |
| external: true | |
| name: quepasa${1:+_$1}_volume | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Quepasa" | |
| fi | |
| STACK_NAME="quepasa${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c quepasa.yaml quepasa > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Quepasa" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull deividms/quepasa:latest | |
| ## Usa o serviço wait_quepasa para verificar se o serviço esta online | |
| wait_stack quepasa${1:+_$1}_quepasa${1:+_$1} | |
| telemetria Quepasa finalizado | |
| cd dados_vps | |
| cat > dados_quepasa${1:+_$1} <<EOL | |
| [ QUEPASA ] | |
| Dominio do quepasa: https://$url_quepasa | |
| Email: $email_quepasa | |
| Usuario: Precisa de criar ao entrar no /setup | |
| Senha: Precisa de criar ao entrar no /setup | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ QUEPASA ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_quepasa\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m $email_quepasa\e[0m" | |
| echo "" | |
| echo -e "\e[33mUrl Setup:\e[97m https://$url_quepasa/setup\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa de criar ao entrar no setup\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa de criar ao entrar no setup\e[0m" | |
| echo "" | |
| echo -e "\e[97mObservação:\e[33m Depois que criar sua conta no /setup, digite \e[97mquepasa.setup.off \e[0m" | |
| echo -e "\e[33mpara desativar o /setup do quepasa.\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ██████╗██╗ ██╗███████╗███████╗ █████╗ ██╗ | |
| ## ██╔══██╗██╔═══██╗██╔════╝██║ ██║██╔════╝██╔════╝██╔══██╗██║ | |
| ## ██║ ██║██║ ██║██║ ██║ ██║███████╗█████╗ ███████║██║ | |
| ## ██║ ██║██║ ██║██║ ██║ ██║╚════██║██╔══╝ ██╔══██║██║ | |
| ## ██████╔╝╚██████╔╝╚██████╗╚██████╔╝███████║███████╗██║ ██║███████╗ | |
| ## ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝ | |
| ferramenta_docuseal() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_docuseal | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Docuseal (ex: docuseal.sociosdigitales.pro): \e[0m" && read -r url_docuseal | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mDigite a Email SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_docuseal | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_docuseal | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP (ex: @Senha123_): \e[0m" && read -r senha_smtp_docuseal | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_docuseal | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mDigite a Porta SMTP (ex: 465): \e[0m" && read -r porta_smtp_docuseal | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_docuseal | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do docuseal | |
| echo -e "\e[33mDominio do docuseal:\e[97m $url_docuseal\e[0m" | |
| echo "" | |
| ## Informação sobre URL do docuseal | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_docuseal\e[0m" | |
| echo "" | |
| ## Informação sobre URL do docuseal | |
| echo -e "\e[33mUser SMTP:\e[97m $user_smtp_docuseal\e[0m" | |
| echo "" | |
| ## Informação sobre URL do docuseal | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_docuseal\e[0m" | |
| echo "" | |
| ## Informação sobre URL do docuseal | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_docuseal\e[0m" | |
| echo "" | |
| ## Informação sobre URL do docuseal | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_docuseal\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_docuseal | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO DOCUSEAL \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Docuseal iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cansei já de explicar o que isso faz kkkk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "docuseal${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "docuseal${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO DOCUSEAL \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Pegar o dominio do email | |
| dominio_smtp_docuseal="${email_smtp_docuseal}" | |
| key_docuseal=$(openssl rand -hex 16) | |
| key_docuseal2=$(openssl rand -hex 16) | |
| ## Criando a stack docuseal.yaml | |
| cat > docuseal${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| docuseal${1:+_$1}: | |
| image: docuseal/docuseal:latest | |
| volumes: | |
| - docuseal${1:+_$1}_data:/data | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados de Acesso | |
| - HOST=$url_docuseal | |
| - FORCE_SSL=true | |
| ## Secret Key | |
| - SECRET_KEY_BASE=$key_docuseal | |
| ## Dados do Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/docuseal${1:+_$1} | |
| ## Dados SMTP | |
| - SMTP_USERNAME=$user_smtp_docuseal | |
| - SMTP_PASSWORD=$senha_smtp_docuseal | |
| - SMTP_ADDRESS=$host_smtp_docuseal | |
| - SMTP_PORT=$porta_smtp_docuseal | |
| - SMTP_FROM=$email_smtp_docuseal | |
| - SMTP_DOMAIN=$dominio_smtp_docuseal | |
| - SMTP_AUTHENTICATION=login | |
| ## Dados do S3 | |
| ##- AWS_ACCESS_KEY_ID= | |
| ##- AWS_SECRET_ACCESS_KEY= | |
| ##- S3_ATTACHMENTS_BUCKET= | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.docuseal${1:+_$1}.rule=Host(\`$url_docuseal\`) | |
| - traefik.http.services.docuseal${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.docuseal${1:+_$1}.service=docuseal${1:+_$1} | |
| - traefik.http.routers.docuseal${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.docuseal${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.docuseal${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| docuseal${1:+_$1}_data: | |
| external: true | |
| name: docuseal${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do docuseal" | |
| fi | |
| STACK_NAME="docuseal${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c docuseal.yaml docuseal > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do docuseal" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull docuseal/docuseal:latest | |
| ## Usa o serviço wait_docuseal para verificar se o serviço esta online | |
| wait_stack docuseal${1:+_$1}_docuseal${1:+_$1} | |
| telemetria Docuseal finalizado | |
| cd dados_vps | |
| cat > dados_docuseal${1:+_$1} <<EOL | |
| [ DOCUSEAL ] | |
| Dominio do docuseal: https://$url_docuseal | |
| Usuario: Precisa de criar ao fazer o primeiro login | |
| Senha: Precisa de criar ao fazer o primeiro login | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ DOCUSEAL ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_docuseal\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa de criar ao fazer o primeiro login\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa de criar ao fazer o primeiro login\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ █████╗ ███████╗ █████╗ ███╗ ██╗ █████╗ | |
| ## ██╔════╝ ██╔══██╗██╔══██╗██╔════╝██╔══██╗████╗ ██║██╔══██╗ | |
| ## ██║ ███╗██████╔╝███████║█████╗ ███████║██╔██╗ ██║███████║ | |
| ## ██║ ██║██╔══██╗██╔══██║██╔══╝ ██╔══██║██║╚██╗██║██╔══██║ | |
| ## ╚██████╔╝██║ ██║██║ ██║██║ ██║ ██║██║ ╚████║██║ ██║ | |
| ## ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ | |
| ferramenta_monitor() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_monitor | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 1/4\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Grafana (ex: grafana.sociosdigitales.pro): \e[0m" && read -r url_grafana | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 2/4\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Prometheus (ex: prometheus.sociosdigitales.pro): \e[0m" && read -r url_prometheus | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 3/4\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o cAdvisor (ex: cadvisor.sociosdigitales.pro): \e[0m" && read -r url_cadvisor | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 4/4\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o NodeExporter (ex: node.sociosdigitales.pro): \e[0m" && read -r url_nodeexporter | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_monitor | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do Grafana:\e[97m $url_grafana\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do Prometheus:\e[97m $url_prometheus\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do Cadvisor:\e[97m $url_cadvisor\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do NodeExporter:\e[97m $url_nodeexporter\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_monitor | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO GRAFANA + PROMETHEUS + CADVISOR \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Grafana iniciado | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• BAIXANDO RECURSOS \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| mkdir blablabla | |
| cd blablabla | |
| git clone https://github.com/oriondesign2015/SetupOrion.git > /dev/null 2>&1 | |
| sudo mv /root/blablabla/SetupOrion/Extras/Grafana/monitor-orion /opt | |
| cd | |
| rm -r blablabla | |
| cd | |
| cd | |
| ## Criando arquivo datasource | |
| cat > datasource.yml <<EOL | |
| apiVersion: 1 | |
| datasources: | |
| - name: Prometheus | |
| type: prometheus | |
| url: https://$url_prometheus | |
| isDefault: true | |
| access: proxy | |
| editable: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/4 - [ OK ] - Criando datasource.yml" | |
| else | |
| echo "1/4 - [ OFF ] - Criando datasource.ym" | |
| echo "Não foi possivel criar o datasource" | |
| fi | |
| cp /root/datasource.yml /opt/monitor-orion/grafana/ | |
| if [ $? -eq 0 ]; then | |
| echo "2/6 - [ OK ] - Movendo datasource.yml para o diretório /opt/monitor-orion/grafana/" | |
| else | |
| echo "2/6 - [ OFF ] - Movendo datasource.yml para o diretório /opt/monitor-orion/grafana/" | |
| echo "Não foi possivel copiar o datasource para o diretório opt" | |
| fi | |
| cp /root/datasource.yml /opt/monitor-orion/grafana/provisioning/datasources/ | |
| if [ $? -eq 0 ]; then | |
| echo "3/6 - [ OK ] - Movendo datasource.yml para o diretório /opt/monitor-orion/grafana/provisioning/datasources/" | |
| else | |
| echo "3/6 - [ OFF ] - Movendo datasource.yml para o diretório /opt/monitor-orion/grafana/provisioning/datasources/" | |
| echo "Não foi possivel copiar o datasource para o diretório opt" | |
| fi | |
| rm /root/datasource.yml | |
| if [ $? -eq 0 ]; then | |
| echo "4/6 - [ OK ] - Removendo datasource.yml do /root/" | |
| else | |
| echo "4/6 - [ OFF ] - Removendo datasource.yml do /root/" | |
| echo "Não foi possivel deletar o datasource para o diretório opt" | |
| fi | |
| cd | |
| ## Criando arquivo prometheus yml | |
| cat > prometheus.yml <<EOL | |
| global: | |
| scrape_interval: 15s | |
| scrape_timeout: 10s | |
| evaluation_interval: 15s | |
| alerting: | |
| alertmanagers: | |
| - static_configs: | |
| - targets: [] | |
| scheme: http | |
| timeout: 10s | |
| api_version: v2 | |
| scrape_configs: | |
| - job_name: prometheus | |
| honor_timestamps: true | |
| scrape_interval: 15s | |
| scrape_timeout: 10s | |
| metrics_path: /metrics | |
| scheme: http | |
| static_configs: | |
| - targets: ['$url_prometheus','$url_cadvisor','$url_nodeexporter'] | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "5/6 - [ OK ] - Criando arquivo prometheus.yml" | |
| else | |
| echo "5/6 - [ OFF ] - Criando arquivo prometheus.yml" | |
| echo "Não foi possivel criar o prometheus" | |
| fi | |
| mv /root/prometheus.yml /opt/monitor-orion/prometheus/ | |
| if [ $? -eq 0 ]; then | |
| echo "6/6 - [ OK ] - Movendo arquivo prometheus.yml para /opt/monitor-orion/prometheus/" | |
| else | |
| echo "6/6 - [ OFF ] - Movendo arquivo prometheus.yml para /opt/monitor-orion/prometheus/" | |
| echo "Não foi possivel copiar o datasource para o diretório opt" | |
| fi | |
| cd | |
| cd | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO GRAFANA + PROMETHEUS + CADVISOR \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui de fato vamos iniciar a instalação das ferramentas | |
| ## Criando a stack monitor.yaml ou grafana.yaml | |
| cat > monitor.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| prometheus: | |
| image: prom/prometheus:latest | |
| volumes: | |
| - /opt/monitor-orion/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml | |
| networks: | |
| - $nome_rede_interna | |
| ports: | |
| - "9191:9090" | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.prometheus.rule=Host(\`$url_prometheus\`) | |
| - traefik.http.services.prometheus.loadbalancer.server.port=9090 | |
| - traefik.http.routers.prometheus.service=prometheus | |
| - traefik.http.routers.prometheus.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.prometheus.entrypoints=websecure | |
| - traefik.http.routers.prometheus.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| grafana: | |
| image: grafana/grafana:latest | |
| volumes: | |
| - /opt/monitor-orion/grafana/grafana.ini:/etc/grafana/grafana.ini | |
| - /opt/monitor-orion/grafana/provisioning/datasources:/etc/grafana/provisioning/datasources | |
| - /opt/monitor-orion/grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards | |
| - /opt/monitor-orion/grafana/dashboards:/etc/grafana/dashboards | |
| networks: | |
| - $nome_rede_interna | |
| ports: | |
| - "3111:3000" | |
| links: | |
| - prometheus | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.grafana.rule=Host(\`$url_grafana\`) | |
| - traefik.http.services.grafana.loadbalancer.server.port=3000 | |
| - traefik.http.routers.grafana.service=grafana | |
| - traefik.http.routers.grafana.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.grafana.entrypoints=websecure | |
| - traefik.http.routers.grafana.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| node-exporter: | |
| image: prom/node-exporter:latest | |
| restart: unless-stopped | |
| networks: | |
| - $nome_rede_interna | |
| ports: | |
| - "9100:9100" | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.node-exporter.rule=Host(\`$url_nodeexporter\`) | |
| - traefik.http.services.node-exporter.loadbalancer.server.port=9100 | |
| - traefik.http.routers.node-exporter.service=node-exporter | |
| - traefik.http.routers.node-exporter.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.node-exporter.entrypoints=websecure | |
| - traefik.http.routers.node-exporter.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| cadvisor: | |
| image: gcr.io/cadvisor/cadvisor | |
| restart: unless-stopped | |
| volumes: | |
| - /:/rootfs:ro | |
| - /var/run:/var/run:rw | |
| - /sys:/sys:ro | |
| - /sys/fs/cgroup:/sys/fs/cgroup | |
| - /var/lib/docker/:/var/lib/docker:ro | |
| networks: | |
| - $nome_rede_interna | |
| ports: | |
| - "8181:8080" | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.cadvisor.rule=Host(\`$url_cadvisor\`) | |
| - traefik.http.services.cadvisor.loadbalancer.server.port=8080 | |
| - traefik.http.routers.cadvisor.service=cadvisor | |
| - traefik.http.routers.cadvisor.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.cadvisor.entrypoints=websecure | |
| - traefik.http.routers.cadvisor.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: | |
| name: $nome_rede_interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Monitor" | |
| fi | |
| STACK_NAME="monitor" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c monitor.yaml monitor > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do Monitor" | |
| #fi | |
| echo "" | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull prom/prometheus:latest grafana/grafana:latest prom/node-exporter:latest gcr.io/cadvisor/cadvisor | |
| ## Usa o serviço wait_monitor para verificar se o serviço esta online | |
| wait_stack monitor_prometheus monitor_grafana monitor_node-exporter monitor_cadvisor | |
| telemetria Grafana finalizado | |
| cd dados_vps | |
| cat > dados_monitor <<EOL | |
| [ MONITOR ] | |
| Dominio Grafana: https://$url_grafana | |
| Dominio Prometheus: https://$url_prometheus | |
| Dominio cAdvisor: https://$url_cadvisor | |
| Dominio NodeExporter: https://$url_nodeexporter | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ GRAFANA + PROMETHEUS + CADVISOR ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio Grafana:\e[33m https://$url_grafana\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario Grafana:\e[33m admin\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha Grafana:\e[33m admin\e[0m" | |
| echo -e "\e[97mDepois do primeiro login, será solicitado que você altere a senha.\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio Prometheus:\e[33m https://$url_prometheus\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio cAdvisor:\e[33m https://$url_cadvisor\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio NodeExporter:\e[33m https://$url_nodeexporter\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗███████╗██╗ ██╗ █████╗ ██╗ | |
| ## ██╔══██╗██║██╔════╝╚██╗ ██╔╝██╔══██╗██║ | |
| ## ██║ ██║██║█████╗ ╚████╔╝ ███████║██║ | |
| ## ██║ ██║██║██╔══╝ ╚██╔╝ ██╔══██║██║ | |
| ## ██████╔╝██║██║ ██║██╗██║ ██║██║ | |
| ## ╚═════╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚═╝ | |
| ferramenta_dify() { | |
| ## Verifica os recursos | |
| recursos 2 4 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_dify | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do Dify AI | |
| echo -e "\e[97mPaso$amarelo 1/9\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Dify AI (ej: dify.sociosdigitales.pro): \e[0m" && read -r url_dify | |
| echo "" | |
| ##Pergunta o Dominio do Dify AI | |
| echo -e "\e[97mPaso$amarelo 2/9\e[0m" | |
| echo -en "\e[33mIngrese el dominio para la API de Dify AI (ej: api-dify.sociosdigitales.pro): \e[0m" && read -r url_dify_api | |
| echo "" | |
| ##Pergunta o Dominio do Qdrant | |
| #read -r ip _ <<<$(hostname -I) | |
| #echo -e "\e[97mPaso$amarelo 2/10\e[0m" | |
| #echo -en "\e[33mIngrese el dominio de Qdrant (ej: http://$ip o http://qdrant.sociosdigitales.pro): \e[0m" && read -r url_quedrant | |
| #echo "" | |
| ##Pergunta a Api Key do Qdrant | |
| #key_dify_rand=$(openssl rand -hex 16) | |
| #echo -e "\e[97mPaso$amarelo 3/10\e[0m" | |
| #echo -en "\e[33mIngrese la Api Key de Qdrant (ej: $key_dify_rand): \e[0m" && read -r apikey_qdrant | |
| #echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPaso$amarelo 3/9\e[0m" | |
| echo -en "\e[33mIngrese el Email para SMTP (ej: contato@sociosdigitales.pro): \e[0m" && read -r email_dify | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPaso$amarelo 4/9\e[0m" | |
| echo -e "$amarelo--> Si no tiene un usuario de email, use el mismo email de abajo" | |
| echo -en "\e[33mIngrese el Usuario para SMTP (ej: sociosdigitales o contato@sociosdigitales.pro): \e[0m" && read -r user_email_dify | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPaso$amarelo 5/9\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si usa gmail use la contraseña de app" | |
| echo -en "\e[33mIngrese la Contraseña SMTP del Email (ej: @Senha123_): \e[0m" && read -r senha_email_dify | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPaso$amarelo 6/9\e[0m" | |
| echo -en "\e[33mIngrese el Host SMTP del Email (ej: smtp.hostinger.com): \e[0m" && read -r smtp_email_dify | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPaso$amarelo 7/9\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del Email (ej: 465): \e[0m" && read -r porta_smtp_dify | |
| echo "" | |
| ## Pergunta qual é o Access Key do minio | |
| echo -e "\e[97mPaso$amarelo 8/9\e[0m" | |
| echo -en "\e[33mAccess Key Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pergunta qual é a Secret Key do minio | |
| echo -e "\e[97mPaso$amarelo 9/9\e[0m" | |
| echo -en "\e[33mSecret Key Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_dify | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Builder | |
| echo -e "\e[33mDominio de Dify AI:\e[97m $url_dify\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Viewer | |
| #echo -e "\e[33mDominio de Qdrant:\e[97m $url_quedrant\e[0m" | |
| #echo "" | |
| ## Informação sobre a versão da ferramenta | |
| #echo -e "\e[33mApi Key Qdrant:\e[97m $apikey_qdrant\e[0m" | |
| #echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail del SMTP:\e[97m $email_dify\e[0m" | |
| echo "" | |
| ## Informação sobre UserSMTP | |
| echo -e "\e[33mUsuario del SMTP:\e[97m $user_email_dify\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Email | |
| echo -e "\e[33mContraseña del Email:\e[97m $senha_email_dify\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP del Email:\e[97m $smtp_email_dify\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPuerto SMTP del Email:\e[97m $porta_smtp_dify\e[0m" | |
| echo "" | |
| ## Informação sobre Access Key | |
| echo -e "\e[33mAccess Key Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| ## Informação sobre Secret Key | |
| echo -e "\e[33mSecret Key Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_dify | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE DIFY \e[33m[1/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Dify iniciado | |
| cd | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres ya instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de Postgres" | |
| criar_banco_postgres_da_stack "dify${1:+_$1}" | |
| criar_banco_postgres_da_stack "dify${1:+_$1}_plugin" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "dify${1:+_$1}" | |
| criar_banco_postgres_da_stack "dify${1:+_$1}_plugin" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis ya instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• OBTENIENDO DATOS DE MINIO \e[33m[4/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| pegar_senha_minio | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Obteniendo contraseña de MinIO" | |
| else | |
| echo "1/2 - [ OFF ] - Obteniendo contraseña de MinIO" | |
| echo "No fue posible obtener la contraseña de minio" | |
| fi | |
| pegar_link_s3 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Obteniendo Url S3 de MinIO" | |
| else | |
| echo "2/2 - [ OFF ] - Obteniendo Url S3 de MinIO" | |
| echo "No fue posible obtener el link del S3" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO DIFY \e[33m[5/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| secret_key=$(openssl rand -hex 16) | |
| token_weaviate=$(openssl rand -hex 16) | |
| token_apikey_plugins=$(openssl rand -hex 16) | |
| token_deamon=$(openssl rand -hex 16) | |
| sandbox_key=$(openssl rand -hex 16) | |
| ## Criando a stack dify.yaml | |
| cat > dify${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| dify${1:+_$1}_api: | |
| image: langgenius/dify-api:latest | |
| volumes: | |
| - dify${1:+_$1}_storage:/app/api/storage | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Modo da execução | |
| - MODE=api | |
| ## URLs | |
| - CONSOLE_WEB_URL=https://$url_dify | |
| - APP_WEB_URL=https://$url_dify | |
| - CONSOLE_API_URL=https://$url_dify_api | |
| - SERVICE_API_URL=https://$url_dify_api | |
| - APP_API_URL=https://$url_dify_api | |
| - FILES_URL=https://$url_dify_api | |
| - MAIL_TYPE=smtp | |
| - MAIL_DEFAULT_SEND_FROM=$email_dify (eg=no-reply $email_dify) | |
| - SMTP_SERVER=$smtp_email_dify | |
| - SMTP_PORT=$porta_smtp_dify | |
| - SMTP_USERNAME=$user_email_dify | |
| - SMTP_PASSWORD=$senha_email_dify | |
| - SMTP_USE_TLS=true | |
| - SMTP_OPPORTUNISTIC_TLS=false | |
| - INVITE_EXPIRY_HOURS=24 | |
| - RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5 | |
| ## Configurações servidor | |
| - DIFY_BIND_ADDRESS=0.0.0.0 | |
| - DIFY_PORT=5001 | |
| - SERVER_WORKER_AMOUNT=1 | |
| - SERVER_WORKER_CLASS=gevent | |
| - SERVER_WORKER_CONNECTIONS=10 | |
| - API_TOOL_DEFAULT_CONNECT_TIMEOUT=10 | |
| - API_TOOL_DEFAULT_READ_TIMEOUT=60 | |
| - WEB_API_CORS_ALLOW_ORIGINS=* | |
| - CONSOLE_CORS_ALLOW_ORIGINS=* | |
| ## Dados Postgres | |
| - MIGRATION_ENABLED=true | |
| - DB_USERNAME=postgres | |
| - DB_PASSWORD=$senha_postgres | |
| - DB_HOST=postgres | |
| - DB_PORT=5432 | |
| - DB_DATABASE=dify${1:+-$1} | |
| - SQLALCHEMY_POOL_SIZE=50 | |
| - SQLALCHEMY_POOL_RECYCLE=1800 | |
| - SQLALCHEMY_ECHO=false | |
| ## Dados Redis | |
| - REDIS_HOST=redis | |
| - REDIS_PORT=6379 | |
| - REDIS_USERNAME= | |
| - REDIS_PASSWORD= | |
| - REDIS_USE_SSL=false | |
| - REDIS_DB=0 | |
| - CELERY_BROKER_URL=redis://redis:6379/1 | |
| - BROKER_USE_SSL=false | |
| ## Dados S3 Storage | |
| - STORAGE_TYPE=s3 | |
| - S3_ENDPOINT=https://$url_s3 | |
| - S3_BUCKET_NAME=dify${1:+-$1} | |
| - S3_ACCESS_KEY=$S3_ACCESS_KEY | |
| - S3_SECRET_KEY=$S3_SECRET_KEY | |
| - S3_REGION=us-east | |
| - S3_USE_AWS_MANAGED_IAM=false | |
| ## Limites de upload de arquivos | |
| - UPLOAD_FILE_SIZE_LIMIT=15 | |
| - UPLOAD_FILE_BATCH_LIMIT=5 | |
| - UPLOAD_IMAGE_FILE_SIZE_LIMIT=10 | |
| - UPLOAD_VIDEO_FILE_SIZE_LIMIT=100 | |
| - UPLOAD_AUDIO_FILE_SIZE_LIMIT=50 | |
| ## Dadis Weaviate | |
| - VECTOR_STORE=weaviate | |
| - WEAVIATE_ENDPOINT=http://dify${1:+_$1}_weaviate:8080 | |
| - WEAVIATE_API_KEY=$token_weaviate | |
| ## Dados Sandbox | |
| - CODE_EXECUTION_ENDPOINT=http://dify${1:+_$1}_sandbox:8194 | |
| - CODE_EXECUTION_API_KEY=$sandbox_key | |
| - CODE_MAX_NUMBER=9223372036854775807 | |
| - CODE_MIN_NUMBER=-9223372036854775808 | |
| - CODE_MAX_DEPTH=5 | |
| - CODE_MAX_PRECISION=20 | |
| - CODE_MAX_STRING_LENGTH=80000 | |
| - CODE_MAX_STRING_ARRAY_LENGTH=30 | |
| - CODE_MAX_OBJECT_ARRAY_LENGTH=30 | |
| - CODE_MAX_NUMBER_ARRAY_LENGTH=1000 | |
| - CODE_EXECUTION_CONNECT_TIMEOUT=10 | |
| - CODE_EXECUTION_READ_TIMEOUT=60 | |
| - CODE_EXECUTION_WRITE_TIMEOUT=10 | |
| - TEMPLATE_TRANSFORM_MAX_LENGTH=80000 | |
| ## Dados Plugin Daemon | |
| - PLUGIN_DAEMON_URL=http://dify${1:+_$1}_plugin_daemon:5002 | |
| - PLUGIN_DAEMON_KEY=$token_deamon | |
| - PLUGIN_MAX_PACKAGE_SIZE=52428800 | |
| - INNER_API_KEY_FOR_PLUGIN=$token_apikey_plugins | |
| - PLUGIN_REMOTE_INSTALL_HOST=localhost | |
| - PLUGIN_REMOTE_INSTALL_PORT=5003 | |
| ## Dados Celery worker | |
| - CELERY_WORKER_CLASS= | |
| - CELERY_WORKER_AMOUNT= | |
| - CELERY_AUTO_SCALE=false | |
| - CELERY_MAX_WORKERS= | |
| - CELERY_MIN_WORKERS= | |
| ## Limites de execução dos workflows | |
| - WORKFLOW_MAX_EXECUTION_STEPS=500 | |
| - WORKFLOW_MAX_EXECUTION_TIME=1200 | |
| - WORKFLOW_CALL_MAX_DEPTH=5 | |
| - MAX_VARIABLE_SIZE=204800 | |
| - WORKFLOW_PARALLEL_DEPTH_LIMIT=3 | |
| - WORKFLOW_FILE_UPLOAD_LIMIT=10 | |
| - LOOP_NODE_MAX_COUNT=100 | |
| - MAX_TOOLS_NUM=10 | |
| - MAX_PARALLEL_LIMIT=10 | |
| - MAX_ITERATIONS_NUM=5 | |
| ## Configurações do Node HTTP Request | |
| - HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760 | |
| - HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576 | |
| - HTTP_REQUEST_NODE_SSL_VERIFY=True | |
| ## Configurações de geração de texto | |
| - TEXT_GENERATION_TIMEOUT_MS=60000 | |
| - PROMPT_GENERATION_MAX_TOKENS=512 | |
| - CODE_GENERATION_MAX_TOKENS=1024 | |
| - MULTIMODAL_SEND_FORMAT=base64 | |
| ## Dados Sentry | |
| - SENTRY_DSN= | |
| - API_SENTRY_DSN= | |
| - API_SENTRY_TRACES_SAMPLE_RATE=1.0 | |
| - API_SENTRY_PROFILES_SAMPLE_RATE=1.0 | |
| ## Dados ETL | |
| - ETL_TYPE=dify | |
| - INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000 | |
| ## Limites de rate limits e timeouts | |
| - APP_MAX_ACTIVE_REQUESTS=0 | |
| - APP_MAX_EXECUTION_TIME=1200 | |
| - FILES_ACCESS_TIMEOUT=300 | |
| - GUNICORN_TIMEOUT=360 | |
| ## Secret Key | |
| - SECRET_KEY=$secret_key | |
| ## Autenticação e tokens | |
| - ACCESS_TOKEN_EXPIRE_MINUTES=60 | |
| - REFRESH_TOKEN_EXPIRE_DAYS=30 | |
| - INIT_PASSWORD= | |
| ## Logs | |
| - LOG_LEVEL=INFO | |
| - LOG_FILE=/app/logs/server.log | |
| - LOG_FILE_MAX_SIZE=20 | |
| - LOG_FILE_BACKUP_COUNT=5 | |
| - LOG_DATEFORMAT=%d-%m-%Y %H:%M:%S | |
| - LOG_TZ=UTC | |
| ## Debug | |
| - DEBUG=false | |
| - FLASK_DEBUG=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.dify${1:+_$1}_api.rule=Host(\`$url_dify_api\`) | |
| - traefik.http.services.dify${1:+_$1}_api.loadbalancer.server.port=5001 | |
| - traefik.http.routers.dify${1:+_$1}_api.service=dify${1:+_$1}_api | |
| - traefik.http.routers.dify${1:+_$1}_api.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.dify${1:+_$1}_api.entrypoints=websecure | |
| - traefik.http.routers.dify${1:+_$1}_api.tls=true | |
| - traefik.http.middlewares.corsMiddleware.headers.accessControlAllowMethods=GET,POST,PUT,DELETE,OPTIONS | |
| - traefik.http.middlewares.corsMiddleware.headers.accessControlAllowHeaders=Content-Type,Authorization | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| dify${1:+_$1}_worker: | |
| image: langgenius/dify-api:latest | |
| volumes: | |
| - dify_storage:/app/api/storage | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Modo da execução | |
| - MODE=worker | |
| ## URLs | |
| - CONSOLE_WEB_URL=https://$url_dify | |
| - APP_WEB_URL=https://$url_dify | |
| - CONSOLE_API_URL=https://$url_dify_api | |
| - SERVICE_API_URL=https://$url_dify_api | |
| - APP_API_URL=https://$url_dify_api | |
| - FILES_URL=https://$url_dify_api | |
| - MAIL_TYPE=smtp | |
| - MAIL_DEFAULT_SEND_FROM=$email_dify (eg=no-reply $email_dify) | |
| - SMTP_SERVER=$smtp_email_dify | |
| - SMTP_PORT=$porta_smtp_dify | |
| - SMTP_USERNAME=$user_email_dify | |
| - SMTP_PASSWORD=$senha_email_dify | |
| - SMTP_USE_TLS=true | |
| - SMTP_OPPORTUNISTIC_TLS=false | |
| - INVITE_EXPIRY_HOURS=24 | |
| - RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5 | |
| ## Configurações servidor | |
| - DIFY_BIND_ADDRESS=0.0.0.0 | |
| - DIFY_PORT=5001 | |
| - SERVER_WORKER_AMOUNT=1 | |
| - SERVER_WORKER_CLASS=gevent | |
| - SERVER_WORKER_CONNECTIONS=10 | |
| - API_TOOL_DEFAULT_CONNECT_TIMEOUT=10 | |
| - API_TOOL_DEFAULT_READ_TIMEOUT=60 | |
| - WEB_API_CORS_ALLOW_ORIGINS=* | |
| - CONSOLE_CORS_ALLOW_ORIGINS=* | |
| ## Dados Postgres | |
| - MIGRATION_ENABLED=true | |
| - DB_USERNAME=postgres | |
| - DB_PASSWORD=$senha_postgres | |
| - DB_HOST=postgres | |
| - DB_PORT=5432 | |
| - DB_DATABASE=dify${1:+-$1} | |
| - SQLALCHEMY_POOL_SIZE=50 | |
| - SQLALCHEMY_POOL_RECYCLE=1800 | |
| - SQLALCHEMY_ECHO=false | |
| ## Dados Redis | |
| - REDIS_HOST=redis | |
| - REDIS_PORT=6379 | |
| - REDIS_USERNAME= | |
| - REDIS_PASSWORD= | |
| - REDIS_USE_SSL=false | |
| - REDIS_DB=0 | |
| - CELERY_BROKER_URL=redis://redis:6379/1 | |
| - BROKER_USE_SSL=false | |
| ## Dados S3 Storage | |
| - STORAGE_TYPE=s3 | |
| - S3_ENDPOINT=https://$url_s3 | |
| - S3_BUCKET_NAME=dify${1:+-$1} | |
| - S3_ACCESS_KEY=$S3_ACCESS_KEY | |
| - S3_SECRET_KEY=$S3_SECRET_KEY | |
| - S3_REGION=us-east | |
| - S3_USE_AWS_MANAGED_IAM=false | |
| ## Limites de upload de arquivos | |
| - UPLOAD_FILE_SIZE_LIMIT=15 | |
| - UPLOAD_FILE_BATCH_LIMIT=5 | |
| - UPLOAD_IMAGE_FILE_SIZE_LIMIT=10 | |
| - UPLOAD_VIDEO_FILE_SIZE_LIMIT=100 | |
| - UPLOAD_AUDIO_FILE_SIZE_LIMIT=50 | |
| ## Dadis Weaviate | |
| - VECTOR_STORE=weaviate | |
| - WEAVIATE_ENDPOINT=http://dify${1:+_$1}_weaviate:8080 | |
| - WEAVIATE_API_KEY=$token_weaviate | |
| ## Dados Sandbox | |
| - CODE_EXECUTION_ENDPOINT=http://dify${1:+_$1}_sandbox:8194 | |
| - CODE_EXECUTION_API_KEY=$sandbox_key | |
| - CODE_MAX_NUMBER=9223372036854775807 | |
| - CODE_MIN_NUMBER=-9223372036854775808 | |
| - CODE_MAX_DEPTH=5 | |
| - CODE_MAX_PRECISION=20 | |
| - CODE_MAX_STRING_LENGTH=80000 | |
| - CODE_MAX_STRING_ARRAY_LENGTH=30 | |
| - CODE_MAX_OBJECT_ARRAY_LENGTH=30 | |
| - CODE_MAX_NUMBER_ARRAY_LENGTH=1000 | |
| - CODE_EXECUTION_CONNECT_TIMEOUT=10 | |
| - CODE_EXECUTION_READ_TIMEOUT=60 | |
| - CODE_EXECUTION_WRITE_TIMEOUT=10 | |
| - TEMPLATE_TRANSFORM_MAX_LENGTH=80000 | |
| ## Dados Plugin Daemon | |
| - PLUGIN_DAEMON_URL=http://dify${1:+_$1}_plugin_daemon:5002 | |
| - PLUGIN_DAEMON_KEY=$token_deamon | |
| - PLUGIN_MAX_PACKAGE_SIZE=52428800 | |
| - INNER_API_KEY_FOR_PLUGIN=$token_apikey_plugins | |
| - PLUGIN_REMOTE_INSTALL_HOST=localhost | |
| - PLUGIN_REMOTE_INSTALL_PORT=5003 | |
| ## Dados Celery worker | |
| - CELERY_WORKER_CLASS= | |
| - CELERY_WORKER_AMOUNT= | |
| - CELERY_AUTO_SCALE=false | |
| - CELERY_MAX_WORKERS= | |
| - CELERY_MIN_WORKERS= | |
| ## Limites de execução dos workflows | |
| - WORKFLOW_MAX_EXECUTION_STEPS=500 | |
| - WORKFLOW_MAX_EXECUTION_TIME=1200 | |
| - WORKFLOW_CALL_MAX_DEPTH=5 | |
| - MAX_VARIABLE_SIZE=204800 | |
| - WORKFLOW_PARALLEL_DEPTH_LIMIT=3 | |
| - WORKFLOW_FILE_UPLOAD_LIMIT=10 | |
| - LOOP_NODE_MAX_COUNT=100 | |
| - MAX_TOOLS_NUM=10 | |
| - MAX_PARALLEL_LIMIT=10 | |
| - MAX_ITERATIONS_NUM=5 | |
| ## Configurações do Node HTTP Request | |
| - HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760 | |
| - HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576 | |
| - HTTP_REQUEST_NODE_SSL_VERIFY=True | |
| ## Configurações de geração de texto | |
| - TEXT_GENERATION_TIMEOUT_MS=60000 | |
| - PROMPT_GENERATION_MAX_TOKENS=512 | |
| - CODE_GENERATION_MAX_TOKENS=1024 | |
| - MULTIMODAL_SEND_FORMAT=base64 | |
| ## Dados Sentry | |
| - SENTRY_DSN= | |
| - API_SENTRY_DSN= | |
| - API_SENTRY_TRACES_SAMPLE_RATE=1.0 | |
| - API_SENTRY_PROFILES_SAMPLE_RATE=1.0 | |
| ## Dados ETL | |
| - ETL_TYPE=dify | |
| - INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000 | |
| ## Limites de rate limits e timeouts | |
| - APP_MAX_ACTIVE_REQUESTS=0 | |
| - APP_MAX_EXECUTION_TIME=1200 | |
| - FILES_ACCESS_TIMEOUT=300 | |
| - GUNICORN_TIMEOUT=360 | |
| ## Secret Key | |
| - SECRET_KEY=$secret_key | |
| ## Autenticação e tokens | |
| - ACCESS_TOKEN_EXPIRE_MINUTES=60 | |
| - REFRESH_TOKEN_EXPIRE_DAYS=30 | |
| - INIT_PASSWORD= | |
| ## Logs | |
| - LOG_LEVEL=INFO | |
| - LOG_FILE=/app/logs/server.log | |
| - LOG_FILE_MAX_SIZE=20 | |
| - LOG_FILE_BACKUP_COUNT=5 | |
| - LOG_DATEFORMAT=%d-%m-%Y %H:%M:%S | |
| - LOG_TZ=UTC | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| dify${1:+_$1}_web: | |
| image: langgenius/dify-web:latest | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## URLs | |
| - CONSOLE_API_URL=https://$url_dify_api | |
| - APP_API_URL=https://$url_dify_api | |
| - MARKETPLACE_API_URL=https://marketplace.dify.ai | |
| - MARKETPLACE_URL=https://marketplace.dify.ai | |
| ## Sentry | |
| - SENTRY_DSN= | |
| ## Telemetria | |
| - NEXT_TELEMETRY_DISABLED=1 | |
| ## Geração de Texto | |
| - TEXT_GENERATION_TIMEOUT_MS=60000 | |
| - TOP_K_MAX_VALUE=10 | |
| ## Configurações de Segurança | |
| - CSP_WHITELIST= | |
| ## Limites e Contadores | |
| - INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000 | |
| - PM2_INSTANCES=2 | |
| - LOOP_NODE_MAX_COUNT=100 | |
| - MAX_TOOLS_NUM=10 | |
| - MAX_PARALLEL_LIMIT=10 | |
| - MAX_ITERATIONS_NUM=5 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.dify${1:+_$1}_web.rule=Host(\`$url_dify\`) | |
| - traefik.http.services.dify${1:+_$1}_web.loadbalancer.server.port=3000 | |
| - traefik.http.routers.dify${1:+_$1}_web.service=dify${1:+_$1}_web | |
| - traefik.http.routers.dify${1:+_$1}_web.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.dify${1:+_$1}_web.entrypoints=websecure | |
| - traefik.http.routers.dify${1:+_$1}_web.tls=true | |
| - traefik.http.middlewares.corsMiddleware.headers.accessControlAllowMethods=GET,POST,PUT,DELETE,OPTIONS | |
| - traefik.http.middlewares.corsMiddleware.headers.accessControlAllowHeaders=Content-Type,Authorization | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| dify${1:+_$1}_sandbox: | |
| image: langgenius/dify-sandbox:0.2.11 | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## API Key | |
| - API_KEY=$sandbox_key | |
| ## Configurações | |
| - GIN_MODE=release | |
| - WORKER_TIMEOUT=15 | |
| - ENABLE_NETWORK=true | |
| - SANDBOX_PORT=8194 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| dify${1:+_$1}_weaviate: | |
| image: semitechnologies/weaviate:1.19.0 | |
| volumes: | |
| - dify${1:+_$1}_weaviate:/var/lib/weaviate | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Persistência de Dados | |
| - PERSISTENCE_DATA_PATH=/var/lib/weaviate | |
| ## Consultas | |
| - QUERY_DEFAULTS_LIMIT=25 | |
| ## Autenticação | |
| - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=false | |
| - AUTHENTICATION_APIKEY_ENABLED=true | |
| - AUTHENTICATION_APIKEY_ALLOWED_KEYS=$token_weaviate | |
| - AUTHENTICATION_APIKEY_USERS=contato@sociosdigitales.pro | |
| ## Autorização | |
| - AUTHORIZATION_ADMINLIST_ENABLED=true | |
| - AUTHORIZATION_ADMINLIST_USERS=contato@sociosdigitales.pro | |
| ## Configurações do Cluster | |
| - CLUSTER_HOSTNAME=node1 | |
| ## Telemetria | |
| - DISABLE_TELEMETRY=true | |
| ## Módulos | |
| - DEFAULT_VECTORIZER_MODULE=none | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| dify${1:+_$1}_plugin_daemon: | |
| image: langgenius/dify-plugin-daemon:latest-local | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - "5003:5003" | |
| volumes: | |
| - dify${1:+_$1}_plugin_daemon_storage:/app/storage | |
| environment: | |
| ## Banco de Dados | |
| - DB_USERNAME=postgres | |
| - DB_PASSWORD=$senha_postgres | |
| - DB_HOST=postgres | |
| - DB_PORT=5432 | |
| - DB_DATABASE=dify${1:+_$1}_plugin | |
| ## Servidor | |
| - SERVER_PORT=5002 | |
| - SERVER_KEY=$token_deamon | |
| ## Plugins | |
| - MAX_PLUGIN_PACKAGE_SIZE=52428800 | |
| - PPROF_ENABLED=false | |
| - DIFY_INNER_API_URL=https://$url_dify_api | |
| - DIFY_INNER_API_KEY=$token_apikey_plugins | |
| - PLUGIN_REMOTE_INSTALLING_HOST=0.0.0.0 | |
| - PLUGIN_REMOTE_INSTALLING_PORT=5003 | |
| - PLUGIN_WORKING_PATH=/app/storage/cwd | |
| - FORCE_VERIFYING_SIGNATURE=true | |
| - PYTHON_ENV_INIT_TIMEOUT=120 | |
| - PLUGIN_MAX_EXECUTION_TIMEOUT=600 | |
| - PIP_MIRROR_URL= | |
| ## Redis | |
| - REDIS_HOST=redis | |
| - REDIS_PORT=6379 | |
| ## Logs | |
| - LOG_LEVEL=DEBUG | |
| - LOG_FILE=/app/storage/plugin_daemon.log | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| dify${1:+_$1}_storage: | |
| external: true | |
| name: dify${1:+_$1}_storage | |
| dify${1:+_$1}_weaviate: | |
| external: true | |
| name: dify${1:+_$1}_weaviate | |
| dify${1:+_$1}_plugin_daemon_storage: | |
| external: true | |
| name: dify${1:+_$1}_plugin_daemon_storage | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de Dify Ai" | |
| fi | |
| STACK_NAME="dify${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c dify.yaml dify > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "No fue posible subir la stack de Dify Ai" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[6/6]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull langgenius/dify-api:latest langgenius/dify-web:latest langgenius/dify-sandbox:0.2.11 semitechnologies/weaviate:latest langgenius/dify-plugin-daemon:latest-local | |
| ## Usa o serviço wait_dify para verificar se o serviço esta online | |
| wait_stack dify${1:+_$1}_dify${1:+_$1}_api dify${1:+_$1}_dify${1:+_$1}_worker dify${1:+_$1}_dify${1:+_$1}_web dify${1:+_$1}_dify${1:+_$1}_sandbox dify${1:+_$1}_dify${1:+_$1}_weaviate dify${1:+_$1}_dify${1:+_$1}_plugin_daemon | |
| telemetria Dify finalizado | |
| cd dados_vps | |
| cat > dados_dify${1:+_$1} <<EOL | |
| [ DIFY AI ] | |
| Dominio de dify: https://$url_dify | |
| Email: Necesita crearse la primera vez que ingrese a Dify AI | |
| Contraseña: Necesita crearse la primera vez que ingrese a Dify AI | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ DIFY AI ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_dify\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Necesita crearse la primera vez que ingrese a Dify AI.\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Necesita crearse la primera vez que ingrese a Dify AI.\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗ ██╗ █████╗ ███╗ ███╗ █████╗ | |
| ## ██╔═══██╗██║ ██║ ██╔══██╗████╗ ████║██╔══██╗ | |
| ## ██║ ██║██║ ██║ ███████║██╔████╔██║███████║ | |
| ## ██║ ██║██║ ██║ ██╔══██║██║╚██╔╝██║██╔══██║ | |
| ## ╚██████╔╝███████╗███████╗██║ ██║██║ ╚═╝ ██║██║ ██║ | |
| ## ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_ollama() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_ollama | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mDigite o dominio para o WebUI Ollama (ex: ollama.sociosdigitales.pro): \e[0m" && read -r url_ollama | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/2\e[0m" | |
| echo -en "\e[33mDigite o dominio para a API Ollama (ex: apiollama.sociosdigitales.pro): \e[0m" && read -r url_apiollama | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_ollama | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para o WebUI Ollama:\e[97m $url_ollama\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para a API do Ollama:\e[97m $url_apiollama\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_ollama | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO OLLAMA \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Ollama iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO OLLAMA \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| WEBUI_SECRET_KEY=$(openssl rand -hex 16) | |
| ## Criando a stack ollama.yaml | |
| cat > ollama${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| ollama${1:+_$1}: | |
| image: ollama/ollama:latest | |
| volumes: | |
| - ollama${1:+_$1}_data:/root/.ollama | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 11434:11434 | |
| environment: | |
| - OLLAMA_HOST=0.0.0.0 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=1 | |
| - traefik.http.routers.ollama${1:+_$1}.rule=Host(\`$url_apiollama\`) | |
| - traefik.http.routers.ollama${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.ollama${1:+_$1}.priority=1 | |
| - traefik.http.routers.ollama${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.ollama${1:+_$1}.service=ollama${1:+_$1} | |
| - traefik.http.services.ollama${1:+_$1}.loadbalancer.server.port=11434 | |
| - traefik.http.services.ollama${1:+_$1}.loadbalancer.passHostHeader=1 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| openwebui${1:+_$1}: | |
| image: ghcr.io/open-webui/open-webui:main | |
| volumes: | |
| - open${1:+_$1}_webui:/app/backend/data | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 8085:8080 | |
| environment: | |
| - OLLAMA_BASE_URL=https://$url_apiollama | |
| - WEBUI_SECRET_KEY=$WEBUI_SECRET_KEY | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.openwebui${1:+_$1}.rule=Host(\`$url_ollama\`) | |
| - traefik.http.routers.openwebui${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.openwebui${1:+_$1}.priority=1 | |
| - traefik.http.routers.openwebui${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.openwebui${1:+_$1}.service=openwebui${1:+_$1} | |
| - traefik.http.services.openwebui${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.services.openwebui${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| ollama${1:+_$1}_data: | |
| external: true | |
| name: ollama${1:+_$1}_data | |
| open${1:+_$1}_webui: | |
| external: true | |
| name: open${1:+_$1}_webui | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Ollama" | |
| fi | |
| STACK_NAME="ollama${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c ollama.yaml ollama > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Ollama" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull ollama/ollama:latest ghcr.io/open-webui/open-webui:main | |
| ## Usa o serviço wait_nocodb para verificar se o serviço esta online | |
| wait_stack ollama${1:+_$1}_openwebui${1:+_$1} ollama${1:+_$1}_ollama${1:+_$1} | |
| cd dados_vps | |
| cat > dados_ollama${1:+_$1} <<EOL | |
| [ OLLAMA ] | |
| Dominio do Open WebUI: https://$url_ollama | |
| Dominio da API Ollama: https://$url_apiollama | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ OLLAMA ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mOpen WebUI:\e[97m https://$url_ollama\e[0m" | |
| echo "" | |
| echo -e "\e[33mOllama API:\e[97m https://$url_apiollama\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## █████╗ ███████╗███████╗██╗███╗ ██╗███████╗ | |
| ## ██╔══██╗██╔════╝██╔════╝██║████╗ ██║██╔════╝ | |
| ## ███████║█████╗ █████╗ ██║██╔██╗ ██║█████╗ | |
| ## ██╔══██║██╔══╝ ██╔══╝ ██║██║╚██╗██║██╔══╝ | |
| ## ██║ ██║██║ ██║ ██║██║ ╚████║███████╗ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ | |
| ferramenta_affine() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_affine | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/7\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Affine (ex: affine.sociosdigitales.pro): \e[0m" && read -r url_affine | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/7\e[0m" | |
| echo -en "\e[33mDigite o Email de Admin (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_affine | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/7\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$" | |
| echo -en "\e[33mDigite a Senha de Admin (ex: @Senha123_): \e[0m" && read -r senha_affine | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 4/7\e[0m" | |
| echo -en "\e[33mDigite a Email SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_affine | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 5/7\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP (ex: @Senha123_): \e[0m" && read -r senha_smtp_affine | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 6/7\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_affine | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 7/7\e[0m" | |
| echo -en "\e[33mDigite a Porta SMTP (ex: 465): \e[0m" && read -r porta_smtp_affine | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_affine | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mDominio do Affine:\e[97m $url_affine\e[0m" | |
| echo "" | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mEmail de Admin:\e[97m $email_affine\e[0m" | |
| echo "" | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mSenha de Admin:\e[97m $senha_affine\e[0m" | |
| echo "" | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_affine\e[0m" | |
| echo "" | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_affine\e[0m" | |
| echo "" | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_affine\e[0m" | |
| echo "" | |
| ## Informação sobre URL do affine | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_affine\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_affine | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO AFFINE \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Affine iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "affine${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "affine${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO AFFINE \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack affine.yaml | |
| cat > affine${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| affine${1:+_$1}: | |
| image: ghcr.io/toeverything/affine-graphql:stable-39476d1 | |
| command: | |
| ['sh', '-c', 'node ./scripts/self-host-predeploy && node ./dist/index.js'] | |
| volumes: | |
| - affine${1:+_$1}_config:/root/.affine/config:rw | |
| - affine${1:+_$1}_storage:/root/.affine/storage:rw | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 3010:3010 | |
| # - 5555:5555 | |
| logging: | |
| driver: 'json-file' | |
| options: | |
| max-size: '1000m' | |
| restart: on-failure:5 | |
| environment: | |
| ## Dados de acesso | |
| - AFFINE_ADMIN_EMAIL=$email_affine | |
| - AFFINE_ADMIN_PASSWORD=$senha_affine | |
| - AFFINE_SERVER_HOST=$url_affine | |
| ## Dados do SMTP | |
| - MAILER_USER=$email_smtp_affine | |
| - MAILER_PASSWORD=$senha_smtp_affine | |
| - MAILER_HOST=$host_smtp_affine | |
| - MAILER_PORT=$porta_smtp_affine | |
| ## Dados do Postgres | |
| - POSTGRES_USER=postgres | |
| - POSTGRES_PASSWORD=$senha_postgres | |
| - POSTGRES_DB=affine${1:+_$1} | |
| - DATABASE_URL=postgres://postgres:$senha_postgres@postgres:5432/affine${1:+_$1}?sslmode=disable | |
| - PGDATA=/var/lib/postgresql/data/pgdata | |
| ## Outras configurações | |
| - NODE_OPTIONS="--import=./scripts/register.js" | |
| - AFFINE_CONFIG_PATH=/root/.affine/config | |
| - REDIS_SERVER_HOST=redis | |
| - NODE_ENV=production | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.affine${1:+_$1}.rule=Host(\`$url_affine\`) | |
| - traefik.http.services.affine${1:+_$1}.loadbalancer.server.port=3010 | |
| - traefik.http.routers.affine${1:+_$1}.service=affine${1:+_$1} | |
| - traefik.http.routers.affine${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.affine${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.affine${1:+_$1}.tls=true | |
| - traefik.frontend.headers.STSPreload=true | |
| - traefik.frontend.headers.STSSeconds=31536000 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| affine${1:+_$1}_config: | |
| external: true | |
| name: affine${1:+_$1}_config | |
| affine${1:+_$1}_storage: | |
| external: true | |
| name: affine${1:+_$1}_storage | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Affine" | |
| fi | |
| STACK_NAME="affine${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c affine.yaml affine > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Affine" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull ghcr.io/toeverything/affine-graphql:stable-39476d1 | |
| ## Usa o serviço wait_stack "affine" para verificar se o serviço esta online | |
| wait_stack affine${1:+_$1}_affine${1:+_$1} | |
| telemetria Affine finalizado | |
| cd dados_vps | |
| cat > dados_affine${1:+_$1} <<EOL | |
| [ AFFINE ] | |
| Dominio do Affine: https://$url_affine | |
| Usuario: $email_affine | |
| Senha: $senha_affine | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ AFFINE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_affine\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $email_affine\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $senha_affine\e[0m" | |
| echo "" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗██████╗ ███████╗ ██████╗████████╗██╗ ██╗███████╗ | |
| ## ██╔══██╗██║██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔════╝ | |
| ## ██║ ██║██║██████╔╝█████╗ ██║ ██║ ██║ ██║███████╗ | |
| ## ██║ ██║██║██╔══██╗██╔══╝ ██║ ██║ ██║ ██║╚════██║ | |
| ## ██████╔╝██║██║ ██║███████╗╚██████╗ ██║ ╚██████╔╝███████║ | |
| ## ╚═════╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ | |
| ferramenta_directus() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_directus | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/9\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Directus (ex: directus.sociosdigitales.pro): \e[0m" && read -r url_directus | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/9\e[0m" | |
| echo -en "\e[33mDigite a Email de Admin (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_directus | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/9\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$" | |
| echo -en "\e[33mDigite a Senha para o Admin (ex: @Senha123_): \e[0m" && read -r senha_directus | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 4/9\e[0m" | |
| echo -en "\e[33mDigite a Email SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_directus | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 5/9\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP (ex: @Senha123_): \e[0m" && read -r senha_smtp_directus | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 6/9\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_directus | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 7/9\e[0m" | |
| echo -en "\e[33mDigite a Porta SMTP (ex: 465): \e[0m" && read -r porta_smtp_directus | |
| echo "" | |
| ## Pergunta qual é o Access Key do minio | |
| echo -e "\e[97mPasso$amarelo 8/9\e[0m" | |
| echo -en "\e[33mAccess Key Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pergunta qual é a Secret Key do minio | |
| echo -e "\e[97mPasso$amarelo 9/9\e[0m" | |
| echo -en "\e[33mSecret Key Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| pegar_senha_minio | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Pegando senha do MinIO" | |
| else | |
| echo "1/2 - [ OFF ] - Pegando senha do MinIO" | |
| echo "Não foi possivel pegar a senha do minio" | |
| fi | |
| pegar_link_s3 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Pegando Url S3 do MinIO" | |
| else | |
| echo "2/2 - [ OFF ] - Pegando Url S3 do MinIO" | |
| echo "Não foi possivel pegar o link do S3" | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_directus | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mDominio do Directus:\e[97m $url_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mEmail de Admin:\e[97m $email_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mSenha de Admin:\e[97m $senha_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_directus\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mAccess Key Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| ## Informação sobre URL do directus | |
| echo -e "\e[33mSecret Key Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_directus" -eq 465 ]; then | |
| ssl_smtp_directus=true | |
| else | |
| ssl_smtp_directus=false | |
| fi | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_directus | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO DIRECTUS \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Directus iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "directus${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "directus${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO DIRECTUS \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Gerar Secret Key | |
| key_directus=$(openssl rand -hex 16) | |
| key_directus2=$(openssl rand -hex 16) | |
| ## Criando a stack directus.yaml | |
| cat > directus${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| directus${1:+_$1}: | |
| image: directus/directus:latest | |
| volumes: | |
| - directus${1:+_$1}_uploads:/directus/uploads | |
| - directus${1:+_$1}_data:/directus/database | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados de acesso | |
| - ADMIN_EMAIL=$email_directus | |
| - ADMIN_PASSWORD=$senha_directus | |
| - PUBLIC_URL=https://$url_directus | |
| ## Dados SMTP | |
| - EMAIL_SMTP_USER=$email_smtp_directus | |
| - EMAIL_SMTP_PASSWORD=$senha_smtp_directus | |
| - EMAIL_SMTP_HOST=$host_smtp_directus | |
| - EMAIL_SMTP_PORT=$porta_smtp_directus | |
| - EMAIL_SMTP_SECURE=$ssl_smtp_directus | |
| ## Dados MinIO | |
| - STORAGE_s3_KEY=$S3_ACCESS_KEY | |
| - STORAGE_s3_SECRET=$S3_SECRET_KEY | |
| - STORAGE_s3_BUCKET=directus${1:+-$1} | |
| - STORAGE_s3_REGION=eu-south | |
| - STORAGE_s3_ENDPOINT=$url_s3 | |
| ## Redis | |
| - REDIS=redis://redis:6379/4 | |
| ## Secret Keys & Env | |
| - KEY=$key_directus | |
| - SECRET=$key_directus2 | |
| - APP_ENV=production | |
| ## Dados Postgres | |
| - DB_CLIENT=postgres | |
| - DB_HOST=postgres | |
| - DB_PORT=5432 | |
| - DB_DATABASE=directus${1:+_$1} | |
| - DB_USER=postgres | |
| - DB_PASSWORD=$senha_postgres | |
| - DB_CONNECTION_STRING=postgresql://postgres:$senha_postgres@postgres:5432/directus${1:+_$1} | |
| - DB_PREFIX=drcts_ | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.directus${1:+_$1}.rule=Host(\`$url_directus\`) | |
| - traefik.http.services.directus${1:+_$1}.loadbalancer.server.port=8055 | |
| - traefik.http.routers.directus${1:+_$1}.service=directus${1:+_$1} | |
| - traefik.http.routers.directus${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.directus${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.directus${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| directus${1:+_$1}_uploads: | |
| external: true | |
| name: directus${1:+_$1}_uploads | |
| directus${1:+_$1}_data: | |
| external: true | |
| name: directus${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| attachable: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do directus" | |
| fi | |
| STACK_NAME="directus${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c directus.yaml directus > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do directus" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull directus/directus:latest | |
| ## Usa o serviço wait_tack "directus" para verificar se o serviço esta online | |
| wait_stack directus${1:+_$1}_directus${1:+_$1} | |
| telemetria Directus finalizado | |
| cd dados_vps | |
| cat > dados_directus${1:+_$1} <<EOL | |
| [ DIRECTUS ] | |
| Dominio do directus: https://$url_directus | |
| Usuario: $email_directus | |
| Senha: $senha_directus | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ DIRECTUS ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_directus\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $email_directus\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $senha_directus\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗ █████╗ ██╗ ██╗██╗ ████████╗██╗ ██╗ █████╗ ██████╗ ██████╗ ███████╗███╗ ██╗ | |
| ## ██║ ██║██╔══██╗██║ ██║██║ ╚══██╔══╝██║ ██║██╔══██╗██╔══██╗██╔══██╗██╔════╝████╗ ██║ | |
| ## ██║ ██║███████║██║ ██║██║ ██║ ██║ █╗ ██║███████║██████╔╝██║ ██║█████╗ ██╔██╗ ██║ | |
| ## ╚██╗ ██╔╝██╔══██║██║ ██║██║ ██║ ██║███╗██║██╔══██║██╔══██╗██║ ██║██╔══╝ ██║╚██╗██║ | |
| ## ╚████╔╝ ██║ ██║╚██████╔╝███████╗██║ ╚███╔███╔╝██║ ██║██║ ██║██████╔╝███████╗██║ ╚████║ | |
| ## ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚══════╝╚═╝ ╚═══╝ | |
| ferramenta_vaultwarden() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_vaultwarden | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/5\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o VaultWarden (ex: vaultwarden.sociosdigitales.pro): \e[0m" && read -r url_vaultwarden | |
| echo "" | |
| ## Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 2/5\e[0m" | |
| echo -en "\e[33mDigite um Email para o SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_vaultwarden | |
| echo "" | |
| ## Pergunta a Senha SMTP | |
| echo -e "\e[97mPasso$amarelo 3/5\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do email (ex: @Senha123_): \e[0m" && read -r senha_vaultwarden | |
| echo "" | |
| ## Pergunta o Host SMTP | |
| echo -e "\e[97mPasso$amarelo 4/5\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do email (ex: smtp.hostinger.com): \e[0m" && read -r host_vaultwarden | |
| echo "" | |
| ## Pergunta a Porta SMTP | |
| echo -e "\e[97mPasso$amarelo 5/5\e[0m" | |
| echo -en "\e[33mDigite a Porta SMTP do email (ex: 465): \e[0m" && read -r porta_vaultwarden | |
| echo "" | |
| if [ "$porta_vaultwarden" -eq 465 ] || [ "$porta_vaultwarden" -eq 25 ]; then | |
| ssl_vaultwarden=force_tls | |
| else | |
| ssl_vaultwarden=starttls | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_vaultwarden | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio:\e[97m $url_vaultwarden\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_vaultwarden\e[0m" | |
| echo "" | |
| ## Informação sobre Senha | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_vaultwarden\e[0m" | |
| echo "" | |
| ## Informação sobre Host | |
| echo -e "\e[33mHost SMTP:\e[97m $host_vaultwarden\e[0m" | |
| echo "" | |
| ## Informação sobre Porta | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_vaultwarden\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_vaultwarden | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO VAULTWARDEN \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria VaultWarden iniciado | |
| ## Nada nada nada.. só para aparecer a mensagem de passo. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO VAULTWARDEN \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack vaultwarden.yaml | |
| cat > vaultwarden${1:+_$1}.yaml <<-EOF | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| vaultwarden${1:+_$1}: | |
| image: vaultwarden/server:latest | |
| volumes: | |
| - vaultwarden${1:+_$1}_data:/data | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 1973:80 | |
| environment: | |
| ## Dominio do Dashboard | |
| - DOMAIN=https://$url_vaultwarden | |
| ## Permitir novos registros | |
| - SIGNUPS_ALLOWED=true | |
| ## Dados do SMTP | |
| - SMTP_FROM=$email_vaultwarden | |
| - SMTP_USERNAME=$email_vaultwarden | |
| - SMTP_PASSWORD=$senha_vaultwarden | |
| - SMTP_HOST=$host_vaultwarden | |
| - SMTP_PORT=$porta_vaultwarden | |
| - SMTP_SECURITY=$ssl_vaultwarden | |
| ## Configuração do Websocket | |
| - WEBSOCKET_ENABLED=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - "traefik.enable=true" | |
| - "traefik.http.routers.vaultwarden${1:+_$1}.rule=Host(\`$url_vaultwarden\`)" | |
| - "traefik.http.routers.vaultwarden${1:+_$1}.service=vaultwarden${1:+_$1}" | |
| - "traefik.http.routers.vaultwarden${1:+_$1}.entrypoints=websecure" | |
| - "traefik.http.services.vaultwarden${1:+_$1}.loadbalancer.server.port=80" | |
| - "traefik.http.routers.vaultwarden${1:+_$1}.tls=true" | |
| - "traefik.http.routers.vaultwarden${1:+_$1}.tls.certresolver=letsencryptresolver" | |
| - "traefik.http.services.vaultwarden${1:+_$1}.loadbalancer.passhostheader=true" | |
| - "traefik.http.routers.vaultwarden${1:+_$1}.middlewares=compresstraefik" | |
| - "traefik.http.middlewares.compresstraefik.compress=true" | |
| - "traefik.docker.network=$nome_rede_interna" | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| vaultwarden${1:+_$1}_data: | |
| external: true | |
| name: vaultwarden${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOF | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do vaultwarden" | |
| fi | |
| STACK_NAME="vaultwarden${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c vaultwarden.yaml vaultwarden > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do vaultwarden" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull vaultwarden/server:latest | |
| ## Usa o serviço wait_vaultwarden para verificar se o serviço esta online | |
| wait_stack vaultwarden${1:+_$1}_vaultwarden${1:+_$1} | |
| telemetria VaultWarden finalizado | |
| cd dados_vps | |
| cat > dados_vaultwarden${1:+_$1} <<EOL | |
| [ VAULTWARDEN ] | |
| Dominio do vaultwarden: https://$url_vaultwarden | |
| Email: Precisa de criar dentro do vaultwarden | |
| Senha: Precisa de criar dentro do vaultwarden | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ VAULTWARDEN ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_vaultwarden\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Precisa de criar dentro do VaultWarden\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa de criar dentro do VaultWarden\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ██╗███████╗██╗ ██╗████████╗ ██████╗██╗ ██████╗ ██╗ ██╗██████╗ | |
| ## ████╗ ██║██╔════╝╚██╗██╔╝╚══██╔══╝██╔════╝██║ ██╔═══██╗██║ ██║██╔══██╗ | |
| ## ██╔██╗ ██║█████╗ ╚███╔╝ ██║ ██║ ██║ ██║ ██║██║ ██║██║ ██║ | |
| ## ██║╚██╗██║██╔══╝ ██╔██╗ ██║ ██║ ██║ ██║ ██║██║ ██║██║ ██║ | |
| ## ██║ ╚████║███████╗██╔╝ ██╗ ██║ ╚██████╗███████╗╚██████╔╝╚██████╔╝██████╔╝ | |
| ## ╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ | |
| ferramenta_nextcloud() { | |
| ## Verifica os recursos | |
| recursos 2 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_nextcloud | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o dominio para o NextCloud (ex: nextcloud.sociosdigitales.pro): \e[0m" && read -r url_nextcloud | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mDigite o Usuario para o NextCloud (ex: orion): \e[0m" && read -r user_nextcloud | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -e "$amarelo--> Minimo 8 caracteres. Use Letras MAIUSCULAS e minusculas, numero e um caractere especial @ ou _" | |
| echo -en "\e[33mDigite o Senha o Usuario (ex: @Senha123_): \e[0m" && read -r pass_nextcloud | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_nextcloud | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do nextcloud | |
| echo -e "\e[33mDominio do NextCloud:\e[97m $url_nextcloud\e[0m" | |
| echo "" | |
| ## Informação sobre URL do nextcloud | |
| echo -e "\e[33mUsuario do NextCloud:\e[97m $user_nextcloud\e[0m" | |
| echo "" | |
| ## Informação sobre URL do nextcloud | |
| echo -e "\e[33mSenha do NextCloud:\e[97m $pass_nextcloud\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO NEXTCLOUD \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria NextCloud iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "nextcloud${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "nextcloud${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO NEXTCLOUD \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack nextcloud.yaml | |
| cat > nextcloud${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| nextcloud${1:+_$1}: | |
| image: nextcloud:latest | |
| volumes: | |
| - nextcloud${1:+_$1}_data:/var/www/html | |
| networks: | |
| - $nome_rede_interna | |
| #ports: | |
| # - 8282:80 | |
| environment: | |
| ## Dados de acesso: | |
| - NEXTCLOUD_ADMIN_USER=$user_nextcloud | |
| - NEXTCLOUD_ADMIN_PASSWORD=$pass_nextcloud | |
| ## Dados do Postgres | |
| - POSTGRES_HOST=postgres | |
| - POSTGRES_DB=nextcloud${1:+_$1} | |
| - POSTGRES_USER=postgres | |
| - POSTGRES_PASSWORD=$senha_postgres | |
| ## Dados do Redis | |
| - REDIS_HOST=redis | |
| ## Configurações para HTTPS | |
| - OVERWRITEPROTOCOL=https | |
| - TRUSTED_PROXIES=127.0.0.1 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.nextcloud${1:+_$1}.rule=Host(\`$url_nextcloud\`) | |
| - traefik.http.services.nextcloud${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.nextcloud${1:+_$1}.service=nextcloud${1:+_$1} | |
| - traefik.http.routers.nextcloud${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.nextcloud${1:+_$1}.entrypoints=web,websecure | |
| - traefik.http.routers.nextcloud${1:+_$1}.tls=true | |
| - traefik.http.routers.nextcloud${1:+_$1}.middlewares=nextcloud_redirectregex | |
| - traefik.http.middlewares.nextcloud${1:+_$1}_redirectregex.redirectregex.permanent=true | |
| - traefik.http.middlewares.nextcloud${1:+_$1}_redirectregex.redirectregex.regex=https://(.*)/.well-known/(?:card|cal)dav | |
| - traefik.http.middlewares.nextcloud${1:+_$1}_redirectregex.redirectregex.replacement=https://$$1/remote.php/dav | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| nextcloud${1:+_$1}_cron: | |
| image: nextcloud:latest | |
| entrypoint: /cron.sh | |
| volumes: | |
| - nextcloud${1:+_$1}_data:/var/www/html | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| nextcloud${1:+_$1}_data: | |
| external: true | |
| name: nextcloud${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do nextcloud" | |
| fi | |
| STACK_NAME="nextcloud${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c nextcloud.yaml nextcloud > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do nextcloud" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull nextcloud:latest | |
| ## Usa o serviço wait_nextcloud para verificar se o serviço esta online | |
| wait_stack nextcloud${1:+_$1}_nextcloud${1:+_$1} nextcloud${1:+_$1}_nextcloud${1:+_$1}_cron | |
| telemetria NextCloud finalizado | |
| cd dados_vps | |
| # Caminho do arquivo onde a substituição será feita | |
| wait_30_sec | |
| arquivo_next_cloud="/var/lib/docker/volumes/nextcloud${1:+_$1}_data/_data/config/config.php" | |
| # Comando sed para substituir a linha, utilizando a variável | |
| sed -i "s/0 => 'localhost'/0 => '$url_nextcloud'/" "$arquivo_next_cloud" | |
| sleep 5 | |
| ## Só por garantia | |
| sed -i "s/0 => 'localhost'/0 => '$url_nextcloud'/" "$arquivo_next_cloud" | |
| sleep 5 | |
| sed -i "/'maintenance' => false,/a \ 'overwriteprotocol' => 'https',\n 'trusted_proxies' => ['127.0.0.1']," "$arquivo_next_cloud" | |
| sleep 5 | |
| cat > dados_nextcloud${1:+_$1} <<EOL | |
| [ NEXTCLOUD ] | |
| Dominio do NextCloud: https://$url_nextcloud | |
| Usuario: $user_nextcloud | |
| Senha: $pass_nextcloud | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ NEXTCLOUD ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_nextcloud\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_nextcloud\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $pass_nextcloud\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗████████╗██████╗ █████╗ ██████╗ ██╗ | |
| ## ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██╔══██╗██║ | |
| ## ███████╗ ██║ ██████╔╝███████║██████╔╝██║ | |
| ## ╚════██║ ██║ ██╔══██╗██╔══██║██╔═══╝ ██║ | |
| ## ███████║ ██║ ██║ ██║██║ ██║██║ ██║ | |
| ## ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_strapi() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_strapi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Strapi (ex: strapi.sociosdigitales.pro): \e[0m" && read -r url_strapi | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_strapi | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para o strapi:\e[97m $url_strapi\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_strapi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO STRAPI \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Strapi iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO STRAPI \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| jwt_secret=$(openssl rand -hex 16) | |
| admin_jwt=$(openssl rand -hex 16) | |
| app_key=$(openssl rand -hex 16) | |
| senha_mysql=$(openssl rand -hex 16) | |
| ## Criando a stack strapi.yaml | |
| cat > strapi${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| strapi${1:+_$1}_app: | |
| image: strapi/strapi | |
| volumes: | |
| #- strapi${1:+_$1}_config:/srv/app/config | |
| #- strapi${1:+_$1}_src:/srv/app/src | |
| #- strapi${1:+_$1}_public_uploads:/srv/app/public/uploads | |
| - strapi${1:+_$1}_data:/srv/app | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados MySQL | |
| - DATABASE_CLIENT=mysql | |
| - DATABASE_HOST=strapi${1:+_$1}_db | |
| - DATABASE_NAME=strapi | |
| - DATABASE_PORT=3306 | |
| - DATABASE_USERNAME=root | |
| - DATABASE_PASSWORD=$senha_mysql | |
| ## Secret Keys | |
| - JWT_SECRET=$jwt_secret | |
| - ADMIN_JWT_SECRET=$admin_jwt | |
| - APP_KEYS=$app_key | |
| ## Outros dados | |
| - NODE_ENV=production | |
| - STRAPI_TELEMETRY_DISABLED=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.strapi${1:+_$1}.rule=Host(\`$url_strapi\`) | |
| - traefik.http.routers.strapi${1:+_$1}.entrypoints=web,websecure | |
| - traefik.http.routers.strapi${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.strapi${1:+_$1}.service=strapi${1:+_$1} | |
| - traefik.http.services.strapi${1:+_$1}.loadbalancer.server.port=1337 | |
| - traefik.http.services.strapi${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| strapi${1:+_$1}_db: | |
| image: percona/percona-server:8.0 | |
| command: | |
| [ | |
| "--character-set-server=utf8mb4", | |
| "--collation-server=utf8mb4_general_ci", | |
| "--sql-mode=", | |
| "--default-authentication-plugin=mysql_native_password", | |
| "--max-allowed-packet=512MB" | |
| ] | |
| volumes: | |
| - strapi${1:+_$1}_db:/var/lib/mysql | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| - MYSQL_ROOT_PASSWORD=$senha_mysql | |
| - MYSQL_DATABASE=strapi | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| #strapi${1:+_$1}_config: | |
| # external: true | |
| # name: strapi${1:+_$1}_config | |
| #strapi${1:+_$1}_src: | |
| # external: true | |
| # name: strapi${1:+_$1}_src | |
| #strapi${1:+_$1}_public_uploads: | |
| # external: true | |
| # name: strapi${1:+_$1}_public_uploads | |
| strapi${1:+_$1}_data: | |
| external: true | |
| name: strapi${1:+_$1}_data | |
| strapi${1:+_$1}_db: | |
| external: true | |
| name: strapi${1:+_$1}_db | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Strapi" | |
| fi | |
| STACK_NAME="strapi${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c strapi.yaml strapi #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do Strapi" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull strapi/strapi percona/percona-server:8.0 | |
| ## Usa o serviço wait_stack "strapi" para verificar se o serviço esta online | |
| wait_stack strapi${1:+_$1}_strapi${1:+_$1}_app strapi${1:+_$1}_strapi${1:+_$1}_db | |
| wait_30_sec | |
| wait_30_sec | |
| telemetria Strapi finalizado | |
| cd dados_vps | |
| cat > dados_strapi${1:+_$1} <<EOL | |
| [ STRAPI ] | |
| Dominio do Strapi: https://$url_strapi | |
| Usuario: Precisa criar no primeiro acesso do Strapi | |
| Senha: Precisa criar no primeiro acesso do Strapi | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ STRAPI ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_strapi\e[0m" | |
| echo "" | |
| echo -e "\e[33mSetup Inicial:\e[97m https://$url_strapi/admin\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do strapi\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do strapi\e[0m" | |
| echo "" | |
| echo "> Aguarde aproximadamente 5 minutos antes de acessar devido à migração em andamento." | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗ ██╗██████╗ ███╗ ███╗██╗ ██╗ █████╗ ██████╗ ███╗ ███╗██╗███╗ ██╗ | |
| ## ██╔══██╗██║ ██║██╔══██╗ ████╗ ████║╚██╗ ██╔╝ ██╔══██╗██╔══██╗████╗ ████║██║████╗ ██║ | |
| ## ██████╔╝███████║██████╔╝ ██╔████╔██║ ╚████╔╝ ███████║██║ ██║██╔████╔██║██║██╔██╗ ██║ | |
| ## ██╔═══╝ ██╔══██║██╔═══╝ ██║╚██╔╝██║ ╚██╔╝ ██╔══██║██║ ██║██║╚██╔╝██║██║██║╚██╗██║ | |
| ## ██║ ██║ ██║██║ ██║ ╚═╝ ██║ ██║ ██║ ██║██████╔╝██║ ╚═╝ ██║██║██║ ╚████║ | |
| ## ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ | |
| ferramenta_phpmyadmin() { | |
| ## Verifica os recursos | |
| recursos 1 2 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_phpmyadmin | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mIntroduzca el dominio para PhpMyAdmin (ej: phpmyadmin.sociosdigitales.pro): \e[0m" && read -r url_phpmyadmin | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/2\e[0m" | |
| echo -en "\e[33mIntroduzca el Host MySQL (ej: mysql ó 1.111.111.11:3306): \e[0m" && read -r host_phpmyadmin | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_phpmyadmin | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ##Informação do Dominio | |
| echo -e "\e[33mDominio para PhpMyAdmin:\e[97m $url_phpmyadmin\e[0m" | |
| echo "" | |
| ##Informação do Dominio | |
| echo -e "\e[33mHost MySQL:\e[97m $host_phpmyadmin\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_phpmyadmin | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE PHPMYADMIN \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria PhpMyAdmin iniciado | |
| ## NADA | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO PHPMYADMIN \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack phpmyadmin.yaml | |
| cat > phpmyadmin${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| phpmyadmin${1:+_$1}: | |
| image: phpmyadmin/phpmyadmin:latest | |
| command: ["apache2-foreground"] | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados do MySQL | |
| - PMA_HOSTS=$host_phpmyadmin | |
| - PMA_PORT=3306 | |
| ## Dado de acesso | |
| #- PMA_USER= | |
| #- PMA_PASSWORD= | |
| - PMA_ABSOLUTE_URI=https://$url_phpmyadmin | |
| ## Limite de Upload | |
| - UPLOAD_LIMIT=10M | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 2048M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.phpmyadmin${1:+_$1}.rule=Host(\`$url_phpmyadmin\`) | |
| - traefik.http.routers.phpmyadmin${1:+_$1}.entrypoints=web,websecure | |
| - traefik.http.routers.phpmyadmin${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.phpmyadmin${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.phpmyadmin${1:+_$1}.service=phpmyadmin${1:+_$1} | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de phpmyadmin" | |
| fi | |
| STACK_NAME="phpmyadmin${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull phpmyadmin/phpmyadmin:latest | |
| ## Usa o serviço wait_stack "phpmyadmin" para verificar se o serviço esta online | |
| wait_stack phpmyadmin${1:+_$1}_phpmyadmin${1:+_$1} | |
| telemetria PhpMyAdmin finalizado | |
| cd | |
| cd dados_vps | |
| cat > dados_phpmyadmin${1:+_$1} <<EOL | |
| [ PHPMYADMIN ] | |
| Dominio de phpmyadmin: https://$url_phpmyadmin | |
| Usuario: Los mismos de su MySQL | |
| Contraseña: Los mismos de su MySQL | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ PHPMYADMIN ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_phpmyadmin\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Los mismos de su MySQL\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Los mismos de su MySQL\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██╗██████╗ █████╗ ██████╗ █████╗ ███████╗███████╗ | |
| ## ██╔════╝██║ ██║██╔══██╗██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝ | |
| ## ███████╗██║ ██║██████╔╝███████║██████╔╝███████║███████╗█████╗ | |
| ## ╚════██║██║ ██║██╔═══╝ ██╔══██║██╔══██╗██╔══██║╚════██║██╔══╝ | |
| ## ███████║╚██████╔╝██║ ██║ ██║██████╔╝██║ ██║███████║███████╗ | |
| ## ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
| ferramenta_supabase() { | |
| ## Verifica los recursos | |
| recursos 2 4 && continue || return | |
| ## Limpia el terminal | |
| clear | |
| ## Activa la función datos para obtener los datos de la vps | |
| dados | |
| ## Muestra el nombre de la aplicación | |
| nombre_supabase | |
| ## Muestra mensaje para completar información | |
| preencha_as_info | |
| generate_jwt_tokens() { | |
| # Verificar la disponibilidad de los comandos necesarios e instalarlos si es necesario | |
| if ! command -v openssl &> /dev/null; then | |
| echo "El comando 'openssl' no está disponible. Intentando instalar..." | |
| if [[ "$(uname)" == "Darwin" ]]; then | |
| # macOS | |
| brew install openssl | |
| elif [[ "$(expr substr $(uname -s) 1 5)" == "Linux" ]]; then | |
| # Linux | |
| if [[ -f /etc/redhat-release ]]; then | |
| # Red Hat, CentOS, Fedora | |
| sudo yum install -y openssl | |
| elif [[ -f /etc/debian_version ]]; then | |
| # Debian, Ubuntu | |
| sudo apt-get install -y openssl | |
| else | |
| echo "No se pudo identificar la distribución Linux. Por favor, instale OpenSSL manualmente." | |
| return 1 | |
| fi | |
| else | |
| echo "Sistema operativo no soportado. Por favor, instale OpenSSL manualmente." | |
| return 1 | |
| fi | |
| fi | |
| if ! command -v jq &> /dev/null; then | |
| echo "El comando 'jq' no está disponible. Intentando instalar..." | |
| if [[ "$(uname)" == "Darwin" ]]; then | |
| # macOS | |
| brew install jq | |
| elif [[ "$(expr substr $(uname -s) 1 5)" == "Linux" ]]; then | |
| # Linux | |
| if [[ -f /etc/redhat-release ]]; then | |
| # Red Hat, CentOS, Fedora | |
| sudo yum install -y jq | |
| elif [[ -f /etc/debian_version ]]; then | |
| # Debian, Ubuntu | |
| sudo apt-get install -y jq | |
| else | |
| echo "No se pudo identificar la distribución Linux. Por favor, instale jq manualmente." | |
| return 1 | |
| fi | |
| else | |
| echo "Sistema operativo no soportado. Por favor, instale jq manualmente." | |
| return 1 | |
| fi | |
| fi | |
| # Definir los payloads de los JWTs | |
| payload_service_key=$(echo '{ | |
| "role": "service_role", | |
| "iss": "supabase", | |
| "iat": 1715050800, | |
| "exp": 1872817200 | |
| }' | jq .) | |
| payload_anon_key=$(echo '{ | |
| "role": "anon", | |
| "iss": "supabase", | |
| "iat": 1715050800, | |
| "exp": 1872817200 | |
| }' | jq .) | |
| # Generar una clave secreta aleatoria y segura | |
| secret=$(openssl rand -hex 20) | |
| # Codificar el header en base64url | |
| header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | openssl base64 | tr -d '=' | tr '+/' '-_' | tr -d '\n') | |
| # Codificar los payloads en base64url | |
| payload_service_key_base64=$(echo -n "$payload_service_key" | openssl base64 | tr -d '=' | tr '+/' '-_' | tr -d '\n') | |
| payload_anon_key_base64=$(echo -n "$payload_anon_key" | openssl base64 | tr -d '=' | tr '+/' '-_' | tr -d '\n') | |
| # Crear las firmas de los tokens usando la misma clave secreta | |
| signature_service_key=$(echo -n "$header.$payload_service_key_base64" | openssl dgst -sha256 -hmac "$secret" -binary | openssl base64 | tr -d '=' | tr '+/' '-_' | tr -d '\n') | |
| signature_anon_key=$(echo -n "$header.$payload_anon_key_base64" | openssl dgst -sha256 -hmac "$secret" -binary | openssl base64 | tr -d '=' | tr '+/' '-_' | tr -d '\n') | |
| # Combinar las partes de los tokens | |
| token_service_key="$header.$payload_service_key_base64.$signature_service_key" | |
| token_anon_key="$header.$payload_anon_key_base64.$signature_anon_key" | |
| # Retornar los valores generados como una cadena separada por espacios | |
| echo "$secret $token_service_key $token_anon_key" | |
| } | |
| # Llamar la función y almacenar el retorno en una variable | |
| result=$(generate_jwt_tokens) | |
| # Verificar si el resultado está vacío | |
| if [[ -z "$result" ]]; then | |
| echo "La función retornó un resultado vacío. Verifique la configuración del ambiente y las dependencias." | |
| exit 1 | |
| fi | |
| # Extraer los valores individuales usando el comando 'read' | |
| read secret token_service_key token_anon_key <<< "$result" | |
| ## Inicia un Loop hasta que los datos estén correctos | |
| while true; do | |
| ## Pregunta el Dominio del Builder | |
| echo -e "\e[97mPaso$amarelo 1/5\e[0m" | |
| echo -en "\e[33mIngrese el Dominio para Supabase (ej: supabase.sociosdigitales.pro): \e[0m" && read -r url_supabase | |
| echo "" | |
| ## Pregunta el Dominio del Viewer | |
| echo -e "\e[97mPaso$amarelo 2/5\e[0m" | |
| echo -en "\e[33mIngrese el Usuario para Supabase (ej: SociosPro): \e[0m" && read -r user_supabase | |
| echo "" | |
| ## Pregunta la versión de la herramienta | |
| echo -e "\e[97mPaso$amarelo 3/5\e[0m" | |
| echo -e "$amarelo--> Sin NINGÚN carácter especial, tales como: @\!#$ entre otros" | |
| echo -en "\e[33mIngrese la Contraseña del usuario para Supabase (ej: Contraseña123): \e[0m" && read -r pass_supabase | |
| echo "" | |
| ## Genera la JWT_Key | |
| JWT_Key="$secret" | |
| ## Genera la ANON_KEY | |
| ANON_KEY="$token_anon_key" | |
| ## Genera el SERVICE_KEY | |
| SERVICE_KEY="$token_service_key" | |
| ## Pregunta cuál es el Access Key de minio | |
| echo -e "\e[97mPaso$amarelo 4/5\e[0m" | |
| echo -en "\e[33mAccess Key Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pregunta cuál es la Secret Key de minio | |
| echo -e "\e[97mPaso$amarelo 5/5\e[0m" | |
| echo -en "\e[33mSecret Key Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| ## Limpia el terminal | |
| clear | |
| ## Muestra el nombre de la aplicación | |
| nombre_supabase | |
| ## Muestra mensaje para verificar la información | |
| conferindo_as_info | |
| ## Información sobre URL del Builder | |
| echo -e "\e[33mDominio de Supabase:\e[97m $url_supabase\e[0m" | |
| echo "" | |
| ## Información sobre URL del Viewer | |
| echo -e "\e[33mUsuario:\e[97m $user_supabase\e[0m" | |
| echo "" | |
| ## Información sobre la versión de la herramienta | |
| echo -e "\e[33mContraseña:\e[97m $pass_supabase\e[0m" | |
| echo "" | |
| ## Información sobre JWT_Key | |
| echo -e "\e[33mJWT_Key:\e[97m $JWT_Key\e[0m" | |
| echo "" | |
| ## Información sobre ANON_KEY | |
| echo -e "\e[33mAnon Key:\e[97m $ANON_KEY\e[0m" | |
| echo "" | |
| ## Información sobre SERVICE_KEY | |
| echo -e "\e[33mService Key:\e[97m $SERVICE_KEY\e[0m" | |
| echo "" | |
| ## Información sobre Access Key | |
| echo -e "\e[33mAccess Key Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| ## Información sobre Secret Key | |
| echo -e "\e[33mSecret Key Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| ## Pregunta si las respuestas son correctas | |
| read -p "¿Son correctas las respuestas? (Y/N): " confirmacion | |
| if [ "$confirmacion" = "Y" ] || [ "$confirmacion" = "y" ]; then | |
| ## Escribió Y para confirmar que la información es correcta | |
| ## Limpiar el terminal | |
| clear | |
| ## Mostrar mensaje de Instalando | |
| instalando_msg | |
| ## Sale del Loop | |
| break | |
| else | |
| ## Escribió N para indicar que la información no es correcta | |
| ## Limpiar el terminal | |
| clear | |
| ## Muestra el nombre de la herramienta | |
| nombre_supabase | |
| ## Muestra mensaje para completar información | |
| preencha_as_info | |
| ## Vuelve al inicio del loop con las preguntas | |
| fi | |
| done | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE SUPABASE \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Supabase iniciado | |
| cd | |
| mkdir temp${1:+_$1} | |
| cd temp${1:+_$1} | |
| git clone --depth 1 https://github.com/oriondesign2015/SetupOrion > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Descargando Repositorio de Supabase" | |
| else | |
| echo "1/3 - [ OFF ] - Descargando Repositorio de Supabase" | |
| echo "No fue posible descargar." | |
| fi | |
| mv SetupOrion/Extras/Supabase /root/supabase${1:+_$1} | |
| cd | |
| rm -r temp${1:+_$1} | |
| sudo mkdir -p /root/supabase${1:+_$1}/docker/volumes/db/data | |
| if [ $? -eq 0 ]; then | |
| echo "2/3 - [ OK ] - Creando directorio 1" | |
| else | |
| echo "2/3 - [ OFF ] - Creando directorio 1" | |
| echo "No se pudo crear el directorio" | |
| fi | |
| sudo mkdir -p /root/supabase${1:+_$1}/docker/volumes/storage | |
| if [ $? -eq 0 ]; then | |
| echo "3/3 - [ OK ] - Creando directorio 2" | |
| else | |
| echo "3/3 - [ OFF ] - Creando directorio 2" | |
| echo "No se pudo crear el directorio" | |
| fi | |
| cat > kong.yml <<EOL | |
| _format_version: '2.1' | |
| _transform: true | |
| ### | |
| ### O Consumers / Users | |
| ### | |
| consumers: | |
| - username: DASHBOARD | |
| - username: anon | |
| keyauth_credentials: | |
| - key: \$SUPABASE_ANON_KEY | |
| - username: service_role | |
| keyauth_credentials: | |
| - key: \$SUPABASE_SERVICE_KEY | |
| ### | |
| ### R Access Control List | |
| ### | |
| acls: | |
| - consumer: anon | |
| group: anon | |
| - consumer: service_role | |
| group: admin | |
| ### | |
| ### I Dashboard credentials | |
| ### | |
| basicauth_credentials: | |
| - consumer: DASHBOARD | |
| username: \$DASHBOARD_USERNAME | |
| password: \$DASHBOARD_PASSWORD | |
| ### | |
| ### O API Routes | |
| ### | |
| services: | |
| ## Open Auth routes | |
| - name: auth-v1-open | |
| url: http://auth${1:+_$1}:9999/verify | |
| routes: | |
| - name: auth-v1-open | |
| strip_path: true | |
| paths: | |
| - /auth/v1/verify | |
| plugins: | |
| - name: cors | |
| - name: auth-v1-open-callback | |
| url: http://auth${1:+_$1}:9999/callback | |
| routes: | |
| - name: auth-v1-open-callback | |
| strip_path: true | |
| paths: | |
| - /auth/v1/callback | |
| plugins: | |
| - name: cors | |
| - name: auth-v1-open-authorize | |
| url: http://auth${1:+_$1}:9999/authorize | |
| routes: | |
| - name: auth-v1-open-authorize | |
| strip_path: true | |
| paths: | |
| - /auth/v1/authorize | |
| plugins: | |
| - name: cors | |
| ## Secure Auth routes | |
| - name: auth-v1 | |
| _comment: 'GoTrue: /auth/v1/* -> http://auth${1:+_$1}:9999/*' | |
| url: http://auth${1:+_$1}:9999/ | |
| routes: | |
| - name: auth-v1-all | |
| strip_path: true | |
| paths: | |
| - /auth/v1/ | |
| plugins: | |
| - name: cors | |
| - name: key-auth | |
| config: | |
| hide_credentials: false | |
| - name: acl | |
| config: | |
| hide_groups_header: true | |
| allow: | |
| - admin | |
| - anon | |
| ## N Secure REST routes | |
| - name: rest-v1 | |
| _comment: 'PostgREST: /rest/v1/* -> http://rest${1:+_$1}:3000/*' | |
| url: http://rest${1:+_$1}:3000/ | |
| routes: | |
| - name: rest-v1-all | |
| strip_path: true | |
| paths: | |
| - /rest/v1/ | |
| plugins: | |
| - name: cors | |
| - name: key-auth | |
| config: | |
| hide_credentials: true | |
| - name: acl | |
| config: | |
| hide_groups_header: true | |
| allow: | |
| - admin | |
| - anon | |
| ## Secure GraphQL routes | |
| - name: graphql-v1 | |
| _comment: 'PostgREST: /graphql/v1/* -> http://rest${1:+_$1}:3000/rpc/graphql' | |
| url: http://rest${1:+_$1}:3000/rpc/graphql | |
| routes: | |
| - name: graphql-v1-all | |
| strip_path: true | |
| paths: | |
| - /graphql/v1 | |
| plugins: | |
| - name: cors | |
| - name: key-auth | |
| config: | |
| hide_credentials: true | |
| - name: request-transformer | |
| config: | |
| add: | |
| headers: | |
| - Content-Profile:graphql_public | |
| - name: acl | |
| config: | |
| hide_groups_header: true | |
| allow: | |
| - admin | |
| - anon | |
| ## Secure Realtime routes | |
| - name: realtime-v1-ws | |
| _comment: 'Realtime: /realtime/v1/* -> ws://realtime${1:+_$1}:4000/socket/*' | |
| url: http://realtime${1:+_$1}-dev.supabase-realtime:4000/socket | |
| protocol: ws | |
| routes: | |
| - name: realtime-v1-ws | |
| strip_path: true | |
| paths: | |
| - /realtime/v1/ | |
| plugins: | |
| - name: cors | |
| - name: key-auth | |
| config: | |
| hide_credentials: false | |
| - name: acl | |
| config: | |
| hide_groups_header: true | |
| allow: | |
| - admin | |
| - anon | |
| - name: realtime-v1-rest | |
| _comment: 'Realtime: /realtime/v1/* -> ws://realtime${1:+_$1}:4000/socket/*' | |
| url: http://realtime${1:+_$1}-dev.supabase-realtime:4000/api | |
| protocol: http | |
| routes: | |
| - name: realtime-v1-rest | |
| strip_path: true | |
| paths: | |
| - /realtime/v1/api | |
| plugins: | |
| - name: cors | |
| - name: key-auth | |
| config: | |
| hide_credentials: false | |
| - name: acl | |
| config: | |
| hide_groups_header: true | |
| allow: | |
| - admin | |
| - anon | |
| ## Storage routes: the storage server manages its own auth | |
| - name: storage-v1 | |
| _comment: 'Storage: /storage/v1/* -> http://storage${1:+_$1}:5000/*' | |
| url: http://storage${1:+_$1}:5000/ | |
| routes: | |
| - name: storage-v1-all | |
| strip_path: true | |
| paths: | |
| - /storage/v1/ | |
| plugins: | |
| - name: cors | |
| ## Edge Functions routes | |
| - name: functions-v1 | |
| _comment: 'Edge Functions: /functions/v1/* -> http://functions${1:+_$1}:9000/*' | |
| url: http://functions${1:+_$1}:9000/ | |
| routes: | |
| - name: functions-v1-all | |
| strip_path: true | |
| paths: | |
| - /functions/v1/ | |
| plugins: | |
| - name: cors | |
| ## Analytics routes | |
| - name: analytics-v1 | |
| _comment: 'Analytics: /analytics/v1/* -> http://logflare${1:+_$1}:4000/*' | |
| url: http://analytics${1:+_$1}:4000/ | |
| routes: | |
| - name: analytics-v1-all | |
| strip_path: true | |
| paths: | |
| - /analytics/v1/ | |
| ## Secure Database routes | |
| - name: meta | |
| _comment: 'pg-meta: /pg/* -> http://pg-meta${1:+_$1}:8080/*' | |
| url: http://meta${1:+_$1}:8080/ | |
| routes: | |
| - name: meta-all | |
| strip_path: true | |
| paths: | |
| - /pg/ | |
| plugins: | |
| - name: key-auth | |
| config: | |
| hide_credentials: false | |
| - name: acl | |
| config: | |
| hide_groups_header: true | |
| allow: | |
| - admin | |
| ## Protected Dashboard - catch all remaining routes | |
| - name: dashboard | |
| _comment: 'Studio: /* -> http://studio${1:+_$1}:3000/*' | |
| url: http://studio${1:+_$1}:3000/ | |
| routes: | |
| - name: dashboard-all | |
| strip_path: true | |
| paths: | |
| - / | |
| plugins: | |
| - name: cors | |
| - name: basic-auth | |
| config: | |
| hide_credentials: true | |
| EOL | |
| rm /root/supabase${1:+_$1}/docker/volumes/api/kong.yml | |
| mv kong.yml /root/supabase${1:+_$1}/docker/volumes/api/kong.yml | |
| echo "" | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• VERIFICANDO DATOS DE MINIO \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| pegar_senha_minio | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Obteniendo Contraseña de MinIO" | |
| else | |
| echo "1/2 - [ OFF ] - Obteniendo Contraseña de MinIO" | |
| echo "No fue posible obtener la contraseña de minio" | |
| fi | |
| pegar_link_s3 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Obteniendo URL de S3" | |
| else | |
| echo "2/2 - [ OFF ] - Obteniendo URL de S3" | |
| echo "No fue posible obtener el enlace de S3" | |
| fi | |
| echo "" | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• INSTALANDO SUPABASE \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Creando claves aleatorias | |
| Senha_Postgres=$(openssl rand -hex 16) | |
| Logflare_key=$(openssl rand -hex 16) | |
| SECRET_KEY_BASE=$(openssl rand -hex 32) | |
| VAULT_ENC_KEY=$(openssl rand -hex 32) | |
| ## Creando la stack supabase.yaml | |
| cat > supabase${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| studio${1:+_$1}: | |
| image: supabase/studio:20241014-c083b3b ## Versão do Supabase Studio | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Definindo o Hostname | |
| - HOSTNAME=0.0.0.0 | |
| ## Configurações de Logs | |
| - DEBUG=next:* | |
| - NEXT_PUBLIC_ENABLE_LOGS=true | |
| - NEXT_ANALYTICS_BACKEND_PROVIDER=postgres | |
| ## Configuração de Branding | |
| - DEFAULT_ORGANIZATION_NAME=OrionDesign | |
| - DEFAULT_PROJECT_NAME=SetupOrion | |
| ## Configuração do Banco de Dados PostgreSQL | |
| - POSTGRES_PASSWORD=$Senha_Postgres | |
| - STUDIO_PG_META_URL=http://meta${1:+_$1}:8080 | |
| ## Configuração do Supabase | |
| - SUPABASE_URL=http://kong${1:+_$1}:8000 | |
| - SUPABASE_PUBLIC_URL=https://$url_supabase | |
| ## Integração com Logflare | |
| - LOGFLARE_API_KEY=$Logflare_key | |
| - LOGFLARE_URL=http://analytics${1:+_$1}:4000 | |
| ## Configurações de Autenticação | |
| - SUPABASE_ANON_KEY=$ANON_KEY | |
| - SUPABASE_SERVICE_KEY=$SERVICE_KEY | |
| - AUTH_JWT_SECRET=$JWT_Key | |
| ## Configuração do OpenAI (opcional) | |
| # - OPENAI_API_KEY= | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| kong${1:+_$1}: | |
| image: kong:2.8.1 ## Versão do Supabase Kong | |
| entrypoint: bash -c 'eval "echo \"\$\$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start' | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/api/kong.yml:/home/kong/temp.yml:ro | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração de usuário e senha do Dashboard | |
| - DASHBOARD_USERNAME=$user_supabase | |
| - DASHBOARD_PASSWORD=$pass_supabase | |
| ## Configurações de Autenticação | |
| - JWT_SECRET=$JWT_Key | |
| - SUPABASE_ANON_KEY=$ANON_KEY | |
| - SUPABASE_SERVICE_KEY=$SERVICE_KEY | |
| ## Configuração do Banco de Dados | |
| - KONG_DATABASE=off | |
| - KONG_DECLARATIVE_CONFIG=/home/kong/kong.yml | |
| ## Configuração de DNS | |
| - KONG_DNS_ORDER=LAST,A,CNAME | |
| ## Configuração de Plugins | |
| - KONG_PLUGINS=request-transformer,cors,key-auth,acl,basic-auth | |
| ## Configurações de Buffers do NGINX | |
| - KONG_NGINX_PROXY_PROXY_BUFFER_SIZE=160k | |
| - KONG_NGINX_PROXY_PROXY_BUFFERS=64 160k | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.kong${1:+_$1}.rule=Host(\`$url_supabase\`) && PathPrefix(\`/\`) ## Url do Supabase | |
| - traefik.http.services.kong${1:+_$1}.loadbalancer.server.port=8000 | |
| - traefik.http.routers.kong${1:+_$1}.service=kong${1:+_$1} | |
| - traefik.http.routers.kong${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.kong${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.kong${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| auth${1:+_$1}: | |
| image: supabase/gotrue:v2.158.1 ## Versão do Supabase Auth | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração Geral da API Auth | |
| - GOTRUE_API_HOST=0.0.0.0 | |
| - GOTRUE_API_PORT=9999 | |
| - API_EXTERNAL_URL=https://$url_supabase | |
| ## Configuração do Banco de Dados | |
| - GOTRUE_DB_DRIVER=postgres | |
| - GOTRUE_DB_DATABASE_URL=postgres://supabase_auth_admin:$Senha_Postgres@db${1:+_$1}:5432/postgres ## Troque a senha do postgres | |
| ## Configurações de URL e Permissões | |
| - GOTRUE_SITE_URL=https://$url_supabase | |
| - GOTRUE_URI_ALLOW_LIST= | |
| - GOTRUE_DISABLE_SIGNUP=false | |
| ## Configurações de JWT | |
| - GOTRUE_JWT_ADMIN_ROLES=service_role | |
| - GOTRUE_JWT_AUD=authenticated | |
| - GOTRUE_JWT_DEFAULT_GROUP_NAME=authenticated | |
| - GOTRUE_JWT_EXP=31536000 | |
| - GOTRUE_JWT_SECRET=$JWT_Key | |
| ## Configuração de Email | |
| - GOTRUE_EXTERNAL_EMAIL_ENABLED=false | |
| - GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED=false | |
| #- GOTRUE_MAILER_AUTOCONFIRM=true # Envia emails automaticamente para confirmar cadastros | |
| #- GOTRUE_SMTP_ADMIN_EMAIL=email@dominio.com # Email administrador SMTP | |
| #- GOTRUE_SMTP_HOST=smtp.dominio.com # Host SMTP | |
| #- GOTRUE_SMTP_PORT=587 # Porta SMTP | |
| #- GOTRUE_SMTP_USER=email@dominio.com # Usuário SMTP | |
| #- GOTRUE_SMTP_PASS=senha # Senha SMTP | |
| #- GOTRUE_SMTP_SENDER_NAME=email@dominio.com # Nome do remetente SMTP | |
| ## Configurações de URL para Emails | |
| - GOTRUE_MAILER_URLPATHS_INVITE=/auth/v1/verify | |
| - GOTRUE_MAILER_URLPATHS_CONFIRMATION=/auth/v1/verify | |
| - GOTRUE_MAILER_URLPATHS_RECOVERY=/auth/v1/verify | |
| - GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE=/auth/v1/verify | |
| ## Configurações de SMS | |
| - GOTRUE_EXTERNAL_PHONE_ENABLED=false | |
| - GOTRUE_SMS_AUTOCONFIRM=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| rest${1:+_$1}: | |
| image: postgrest/postgrest:v12.2.0 ## Versão do Supabase Rest | |
| command: "postgrest" | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do Banco de Dados | |
| - PGRST_DB_URI=postgres://authenticator:$Senha_Postgres@db${1:+_$1}:5432/postgres | |
| - PGRST_DB_SCHEMAS=public,storage,graphql_public | |
| - PGRST_DB_ANON_ROLE=anon | |
| ## Configurações de JWT (JSON Web Tokens) | |
| - PGRST_JWT_SECRET=$JWT_Key | |
| - PGRST_APP_SETTINGS_JWT_SECRET=$JWT_Key | |
| - PGRST_APP_SETTINGS_JWT_EXP=31536000 | |
| ## Outras Configurações | |
| - PGRST_DB_USE_LEGACY_GUCS="false" | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| realtime${1:+_$1}: | |
| image: supabase/realtime:v2.30.34 ## Versão do Supabase Realtime | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração da API Realtime | |
| - PORT=4000 | |
| - API_JWT_SECRET=$JWT_Key | |
| - SECRET_KEY_BASE=$SECRET_KEY_BASE | |
| - APP_NAME=realtime | |
| ## Configuração do Banco de Dados | |
| - DB_HOST=db${1:+_$1} | |
| - DB_PORT=5432 | |
| - DB_USER=supabase_admin | |
| - DB_PASSWORD=$Senha_Postgres | |
| - DB_NAME=postgres | |
| - DB_AFTER_CONNECT_QUERY='SET search_path TO _realtime' | |
| - DB_ENC_KEY=supabaserealtime | |
| ## Configuração de Conexão e Rede | |
| - ERL_AFLAGS=-proto_dist inet_tcp | |
| - DNS_NODES="''" | |
| - RLIMIT_NOFILE=10000 | |
| ## Configuração do Ambiente | |
| - SEED_SELF_HOST=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| storage${1:+_$1}: | |
| image: supabase/storage-api:v1.11.13 ## Versão do Supabase Storage | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/storage:/var/lib/storage:z | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do PostgREST e JWT | |
| - ANON_KEY=$ANON_KEY | |
| - SERVICE_KEY=$SERVICE_KEY | |
| - POSTGREST_URL=http://rest${1:+_$1}:3000 | |
| - PGRST_JWT_SECRET=$JWT_Key | |
| - DATABASE_URL=postgres://supabase_storage_admin:$Senha_Postgres@db${1:+_$1}:5432/postgres | |
| ## Configuração de Armazenamento de Arquivos MinIO | |
| - FILE_SIZE_LIMIT=52428800 | |
| - STORAGE_BACKEND=s3 | |
| - GLOBAL_S3_BUCKET=supabase${1:+-$1} ## Nome da bucket do MinIO | |
| - GLOBAL_S3_ENDPOINT=https://$url_s3 ## URL S3 do MinIO | |
| - GLOBAL_S3_PROTOCOL=https | |
| - GLOBAL_S3_FORCE_PATH_STYLE=true | |
| - AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY ## Access Key | |
| - AWS_SECRET_ACCESS_KEY=$S3_SECRET_KEY ## Secret Key | |
| - AWS_DEFAULT_REGION=eu-south ## Região MinIO | |
| - FILE_STORAGE_BACKEND_PATH=/var/lib/storage | |
| ## Configuração de Imagens | |
| - ENABLE_IMAGE_TRANSFORMATION="true" | |
| - IMGPROXY_URL=http://imgproxy${1:+_$1}:5001 | |
| ## Configuração de Identificação e Região | |
| - TENANT_ID=stub | |
| - REGION=eu-south ## Região | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| imgproxy${1:+_$1}: | |
| image: darthsim/imgproxy:v3.8.0 ## Versão do Supabase Imgproxy | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/storage:/var/lib/storage:z | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do IMGPROXY | |
| - IMGPROXY_BIND=:5001 | |
| - IMGPROXY_LOCAL_FILESYSTEM_ROOT=/ | |
| - IMGPROXY_USE_ETAG="true" | |
| - IMGPROXY_ENABLE_WEBP_DETECTION=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| meta${1:+_$1}: | |
| image: supabase/postgres-meta:v0.84.2 ## Versão do Meta | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do PG_META | |
| - PG_META_PORT=8080 | |
| - PG_META_DB_HOST=db${1:+_$1} | |
| - PG_META_DB_PORT=5432 | |
| - PG_META_DB_NAME=postgres | |
| - PG_META_DB_USER=supabase_admin | |
| - PG_META_DB_PASSWORD=$Senha_Postgres | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| functions${1:+_$1}: | |
| image: supabase/edge-runtime:v1.59.0 ## Versão do Supabase Functions | |
| command: | |
| - start | |
| - --main-service | |
| - /home/deno/functions/main | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/functions:/home/deno/functions:Z | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração de JWT e Supabase | |
| - VERIFY_JWT="false" | |
| - JWT_SECRET=$JWT_Key | |
| - SUPABASE_URL=http://kong${1:+_$1}:8000 | |
| - SUPABASE_ANON_KEY=$ANON_KEY | |
| - SUPABASE_SERVICE_ROLE_KEY=$SERVICE_KEY | |
| - SUPABASE_DB_URL=postgresql://postgres:$Senha_Postgres@db${1:+_$1}:5432/postgres | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| analytics${1:+_$1}: | |
| image: supabase/logflare:1.4.0 ## Versão do Supabase Analytics | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração de Banco de Dados | |
| - DB_USERNAME=supabase_admin | |
| - DB_DATABASE=_supabase | |
| - DB_HOSTNAME=db${1:+_$1} | |
| - DB_PORT=5432 | |
| - DB_PASSWORD=$Senha_Postgres | |
| - DB_SCHEMA=_analytics | |
| ## Configuração do Postgres Backend | |
| - POSTGRES_BACKEND_URL=postgresql://supabase_admin:$Senha_Postgres@db${1:+_$1}:5432/_supabase | |
| - POSTGRES_BACKEND_SCHEMA=_analytics | |
| ## Configuração do Logflare | |
| - LOGFLARE_NODE_HOST=127.0.0.1 | |
| - LOGFLARE_API_KEY=$Logflare_key | |
| - LOGFLARE_SINGLE_TENANT=true | |
| - LOGFLARE_SUPABASE_MODE=true | |
| - LOGFLARE_MIN_CLUSTER_SIZE=1 | |
| - LOGFLARE_FEATURE_FLAG_OVERRIDE=multibackend=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| db${1:+_$1}: | |
| image: supabase/postgres:15.1.1.78 ## Versão do Supabase Db | |
| command: | |
| - postgres | |
| - '-c' | |
| - config_file=/etc/postgresql/postgresql.conf | |
| - '-c' | |
| - log_min_messages=fatal | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/db/realtime.sql:/docker-entrypoint-initdb.d/migrations/99-realtime.sql:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/webhooks.sql:/docker-entrypoint-initdb.d/init-scripts/98-webhooks.sql:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/roles.sql:/docker-entrypoint-initdb.d/init-scripts/99-roles.sql:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/jwt.sql:/docker-entrypoint-initdb.d/init-scripts/99-jwt.sql:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/data:/var/lib/postgresql/data:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/_supabase.sql:/docker-entrypoint-initdb.d/migrations/97-_supabase.sql:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/logs.sql:/docker-entrypoint-initdb.d/migrations/99-logs.sql:Z | |
| - /root/supabase${1:+_$1}/docker/volumes/db/pooler.sql:/docker-entrypoint-initdb.d/migrations/99-pooler.sql:Z | |
| - supabase${1:+_$1}_db_config:/etc/postgresql-custom | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do PostgreSQL | |
| - POSTGRES_HOST=/var/run/postgresql | |
| - PGPORT=5432 | |
| - POSTGRES_PORT=5432 | |
| - POSTGRES_PASSWORD=$Senha_Postgres | |
| - POSTGRES_DB=postgres | |
| - PGDATABASE=postgres | |
| ## Configuração de JWT | |
| - JWT_SECRET=$JWT_Key | |
| - JWT_EXP=31536000 ## O padrão é 3600 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| vector${1:+_$1}: | |
| image: timberio/vector:0.28.1-alpine ## Versão do Supabase Vector | |
| command: | |
| - '--config' | |
| - etc/vector/vector.yml | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/logs/vector.yml:/etc/vector/vector.yml:ro | |
| - /var/run/docker.sock:/var/run/docker.sock:ro | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do Logflare | |
| - LOGFLARE_API_KEY=$Logflare_key | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| supavisor${1:+_$1}: | |
| image: supabase/supavisor:1.1.56 ## Versão do Supabase Supavisor | |
| command: | |
| - /bin/sh | |
| - -c | |
| - /app/bin/migrate && /app/bin/supavisor eval "\$\$(cat /etc/pooler/pooler.exs)" && /app/bin/server | |
| volumes: | |
| - /root/supabase${1:+_$1}/docker/volumes/pooler/pooler.exs:/etc/pooler/pooler.exs:ro | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração do Banco de Dados | |
| - POSTGRES_PORT=5432 | |
| - POSTGRES_DB=postgres | |
| - POSTGRES_PASSWORD=$Senha_Postgres | |
| - DATABASE_URL=ecto://postgres:$Senha_Postgres@db${1:+_$1}:5432/_supabase | |
| - CLUSTER_POSTGRES=true | |
| ## Configuração de JWT | |
| - API_JWT_SECRET=$JWT_Key | |
| - METRICS_JWT_SECRET=$JWT_Key | |
| ## Configuração de Segurança | |
| - SECRET_KEY_BASE=$SECRET_KEY_BASE | |
| - VAULT_ENC_KEY=your-encryption-key-32-chars-min | |
| ## O valor a cima era para ser: $VAULT_ENC_KEY | |
| ## Mas por algum motivo não funciona kkkk | |
| ## Configuração de Regionalização | |
| - REGION=local | |
| ## Configuração de Erlang | |
| - ERL_AFLAGS=-proto_dist inet_tcp | |
| ## Configuração do Pooler | |
| - POOLER_TENANT_ID=1 | |
| - POOLER_DEFAULT_POOL_SIZE=20 | |
| - POOLER_MAX_CLIENT_CONN=100 | |
| - POOLER_POOL_MODE=transaction | |
| ## Configuração de Porta | |
| - PORT=4000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| supabase${1:+_$1}_db_config: | |
| external: true | |
| name: supabase${1:+_$1}_db_config | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No fue posible crear la stack de supabase" | |
| fi | |
| STACK_NAME="supabase${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| ## Mensaje de Paso | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Descargando imágenes: | |
| pull supabase/studio:20241014-c083b3b kong:2.8.1 supabase/gotrue:v2.158.1 postgrest/postgrest:v12.2.0 supabase/realtime:v2.30.34 supabase/storage-api:v1.11.13 darthsim/imgproxy:v3.8.0 supabase/postgres-meta:v0.84.2 supabase/edge-runtime:v1.59.0 supabase/logflare:1.4.0 supabase/postgres:15.1.1.78 timberio/vector:0.28.1-alpine supabase/supavisor:1.1.56 | |
| ## Usa el servicio wait_stack "supabase" para verificar si el servicio está online | |
| wait_stack supabase${1:+_$1}_studio${1:+_$1} supabase${1:+_$1}_kong${1:+_$1} supabase${1:+_$1}_auth${1:+_$1} supabase${1:+_$1}_rest${1:+_$1} supabase${1:+_$1}_realtime${1:+_$1} supabase${1:+_$1}_storage${1:+_$1} supabase${1:+_$1}_imgproxy${1:+_$1} supabase${1:+_$1}_meta${1:+_$1} supabase${1:+_$1}_functions${1:+_$1} supabase${1:+_$1}_analytics${1:+_$1} supabase${1:+_$1}_db${1:+_$1} supabase${1:+_$1}_vector${1:+_$1} supabase${1:+_$1}_supavisor${1:+_$1} | |
| telemetria Supabase finalizado | |
| cd datos_vps | |
| cat > dados_supabase${1:+_$1} <<EOL | |
| [ SUPABASE ] | |
| Dominio de Supabase: https://$url_supabase | |
| Usuario: $user_supabase | |
| Contraseña: $pass_supabase | |
| JWT Key: $JWT_Key | |
| Anon Key: $ANON_KEY | |
| Service Key: $SERVICE_KEY | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensaje de finalizado | |
| instalado_msg | |
| ## Mensaje de Guarde los Datos | |
| guarde_os_dados_msg | |
| ## Datos de la Aplicación: | |
| echo -e "\e[32m[ SUPABASE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_supabase\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_supabase\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_supabase\e[0m" | |
| echo "" | |
| echo -e "\e[33mAnon key:\e[97m $ANON_KEY\e[0m" | |
| echo "" | |
| echo -e "\e[33mService key:\e[97m $SERVICE_KEY\e[0m" | |
| ## Créditos del instalador | |
| creditos_msg | |
| ## Pregunta si desea instalar otra aplicación | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ██╗████████╗███████╗██╗ ██╗ | |
| ## ████╗ ██║╚══██╔══╝██╔════╝╚██╗ ██╔╝ | |
| ## ██╔██╗ ██║ ██║ █████╗ ╚████╔╝ | |
| ## ██║╚██╗██║ ██║ ██╔══╝ ╚██╔╝ | |
| ## ██║ ╚████║ ██║ ██║ ██║ | |
| ## ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ | |
| ferramenta_ntfy() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_ntfy | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Ntfy (ex: ntfy.sociosdigitales.pro): \e[0m" && read -r url_ntfy | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mDigite o Usuario (ex: sociospro): \e[0m" && read -r user_ntfy | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -en "\e[33mDigite a Senha (ex: @Senha123_): \e[0m" && read -r pass_ntfy | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_ntfy | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio da Ntfy:\e[97m $url_ntfy\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mUsuario do Ntfy:\e[97m $user_ntfy\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mSenha do Ntfy:\e[97m $pass_ntfy\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_ntfy | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO NTFY \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO O NTFY \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Ntfy iniciado | |
| ## Gerando Hash | |
| hashed_senha=$(htpasswd -nb $user_ntfy $pass_ntfy | sed -e s/\\$/\\$\\$/g) | |
| ## Gerando Base64 | |
| authentication=$(echo -n "$user_ntfy:$pass_ntfy" | base64) | |
| ## Criando a stack ntfy.yaml | |
| cat > ntfy${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| ntfy${1:+_$1}: | |
| image: binwiederhier/ntfy:latest | |
| command: | |
| - serve | |
| volumes: | |
| - ntfy${1:+_$1}_cache:/var/cache/ntfy | |
| - ntfy${1:+_$1}_etc:/etc/ntfy | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| - TZ=UTC | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.ntfy${1:+_$1}.rule=Host(\`$url_ntfy\`) | |
| - traefik.http.services.ntfy${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.ntfy${1:+_$1}.service=ntfy${1:+_$1} | |
| - traefik.http.routers.ntfy${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.ntfy${1:+_$1}.entrypoints=websecure | |
| - traefik.http.middlewares.ntfy${1:+_$1}-auth.basicauth.users=$hashed_senha | |
| - traefik.http.routers.ntfy${1:+_$1}.middlewares=ntfy${1:+_$1}-auth | |
| - traefik.http.routers.ntfy${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| ntfy${1:+_$1}_cache: | |
| external: true | |
| name: ntfy${1:+_$1}_cache | |
| ntfy${1:+_$1}_etc: | |
| external: true | |
| name: ntfy${1:+_$1}_etc | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack da Ntfy" | |
| fi | |
| STACK_NAME="ntfy${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c ntfy.yaml ntfy > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack da Ntfy" | |
| #fi | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull binwiederhier/ntfy:latest | |
| ## Usa o serviço wait_ntfy para verificar se o serviço esta online | |
| wait_stack ntfy${1:+_$1}_ntfy${1:+_$1} | |
| telemetria Ntfy finalizado | |
| cd dados_vps | |
| cat > dados_ntfy${1:+_$1} <<EOL | |
| [ NTFY ] | |
| Link do Ntfy: https://$url_ntfy | |
| Usuario: $user_ntfy | |
| Senha: $pass_ntfy | |
| Authorization: Basic $authentication | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ NTFY ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mLink do Ntfy:\e[33m https://$url_ntfy\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m $user_ntfy\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha:\e[33m $pass_ntfy\e[0m" | |
| echo "" | |
| echo -e "\e[97mAuthorization:\e[33m Basic $authentication\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗ | |
| ## ██║ ██╔═══██╗██║ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗ | |
| ## ██║ ██║ ██║██║ █╗ ██║██║ ██║ ██║██║ ██║█████╗ ██████╔╝ | |
| ## ██║ ██║ ██║██║███╗██║██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗ | |
| ## ███████╗╚██████╔╝╚███╔███╔╝╚██████╗╚██████╔╝██████╔╝███████╗██║ ██║ | |
| ## ╚══════╝ ╚═════╝ ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ | |
| ferramenta_lowcoder() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_lowcoder | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 1/8\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Lowcoder (ex: lowcoder.sociosdigitales.pro): \e[0m" && read -r url_lowcoder | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 2/8\e[0m" | |
| echo -en "\e[33mDigite o User do MongoDB (ex: sociospro): \e[0m" && read -r user_mongodb_lowcoder | |
| echo "" | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 3/8\e[0m" | |
| echo -en "\e[33mDigite a senha do MongoDB (ex: @Senha123_): \e[0m" && read -r pass_mongodb_lowcoder | |
| echo "" | |
| ## Pergunta o email SMTP | |
| echo -e "\e[97mPasso$amarelo 4/8\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_lowcoder | |
| echo "" | |
| ## Pergunta o Ususario SMTP | |
| echo -e "\e[97mPasso$amarelo 5/8\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuario para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_lowcoder | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 6/8\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_smtp_lowcoder | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 7/8\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_lowcoder | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 8/8\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_lowcoder | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_lowcoder | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio da lowcoder:\e[97m $url_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mUsuario do MongoDB:\e[97m $user_mongodb_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mSenha do MongoDB:\e[97m $pass_mongodb_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mUser SMTP:\e[97m $user_smtp_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_lowcoder\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_lowcoder\e[0m" | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_lowcoder" -eq 465 ]; then | |
| smtp_secure_lowcoder_ssl=true | |
| smtp_secure_lowcoder_startls=false | |
| else | |
| smtp_secure_lowcoder_ssl=false | |
| smtp_secure_lowcoder_startls=true | |
| fi | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_lowcoder | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO LOWCODER \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria LowCoder iniciado | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[2/4]\e[0m" | |
| echo "" | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO O LOWCODER \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Gerando Encryption | |
| encryption_key_lowcoder1=$(openssl rand -hex 16) | |
| encryption_key_lowcoder2=$(openssl rand -hex 16) | |
| encryption_key_lowcoder3=$(openssl rand -hex 32) | |
| ## Pegando ip da vps | |
| read -r ip _ <<<$(hostname -I) | |
| ## Criando a stack lowcoder.yaml | |
| cat > lowcoder${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| lowcoder${1:+_$1}_api: | |
| image: lowcoderorg/lowcoder-ce-api-service:latest | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| - LOWCODER_PUID=9001 | |
| - LOWCODER_PGID=9001 | |
| ## Dados MongoDB | |
| - LOWCODER_MONGODB_URL=mongodb://$user_mongodb_lowcoder:$pass_mongodb_lowcoder@$ip:27017/lowcoder${1:+_$1}?authSource=admin&readPreference=primary&ssl=false&directConnection=true | |
| ## Dados Redis | |
| - LOWCODER_REDIS_URL=redis://redis:6379 | |
| ## Dominio | |
| - LOWCODER_NODE_SERVICE_URL=http://lowcoder${1:+_$1}_node:6060 | |
| ## Configurações | |
| - LOWCODER_MAX_QUERY_TIMEOUT=120 | |
| - LOWCODER_EMAIL_AUTH_ENABLED=true | |
| - LOWCODER_EMAIL_SIGNUP_ENABLED=true ## true = permitir criar novas contas | |
| - LOWCODER_CREATE_WORKSPACE_ON_SIGNUP=true ## true = permitir criar novos workspaces | |
| - LOWCODER_WORKSPACE_MODE=SAAS | |
| ## Encryption | |
| - LOWCODER_DB_ENCRYPTION_PASSWORD=$encryption_key_lowcoder1 ## hash Encryption | |
| - LOWCODER_DB_ENCRYPTION_SALT=$encryption_key_lowcoder2 ## hash Encryption | |
| - LOWCODER_API_KEY_SECRET=$encryption_key_lowcoder3 # hash Encryption | |
| ## Outras configurações | |
| - LOWCODER_CORS_DOMAINS=* | |
| - LOWCODER_MAX_ORGS_PER_USER=100 | |
| - LOWCODER_MAX_MEMBERS_PER_ORG=1000 | |
| - LOWCODER_MAX_GROUPS_PER_ORG=100 | |
| - LOWCODER_MAX_APPS_PER_ORG=1000 | |
| - LOWCODER_MAX_DEVELOPERS=50 | |
| ## Dados SMTP | |
| - LOWCODER_ADMIN_SMTP_HOST=$host_smtp_lowcoder | |
| - LOWCODER_ADMIN_SMTP_PORT=$porta_smtp_lowcoder | |
| - LOWCODER_ADMIN_SMTP_USERNAME=$user_smtp_lowcoder | |
| - LOWCODER_ADMIN_SMTP_PASSWORD=$senha_smtp_lowcoder | |
| - LOWCODER_ADMIN_SMTP_AUTH=true | |
| - LOWCODER_ADMIN_SMTP_SSL_ENABLED=$smtp_secure_lowcoder_ssl | |
| - LOWCODER_ADMIN_SMTP_STARTTLS_ENABLED=$smtp_secure_lowcoder_startls | |
| - LOWCODER_ADMIN_SMTP_STARTTLS_REQUIRED=$smtp_secure_lowcoder_startls | |
| - LOWCODER_EMAIL_NOTIFICATIONS_SENDER=$email_smtp_lowcoder | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| lowcoder${1:+_$1}_node: | |
| image: lowcoderorg/lowcoder-ce-node-service:latest | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| - LOWCODER_PUID=9001 | |
| - LOWCODER_PGID=9001 | |
| - LOWCODER_API_SERVICE_URL=http://lowcoder${1:+_$1}_api:8080 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "0.5" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| lowcoder${1:+_$1}_frontend: | |
| image: lowcoderorg/lowcoder-ce-frontend:latest | |
| volumes: | |
| - lowcoder${1:+_$1}_assets:/lowcoder/assets | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| - LOWCODER_PUID=9001 | |
| - LOWCODER_PGID=9001 | |
| - LOWCODER_MAX_REQUEST_SIZE=20m | |
| - LOWCODER_MAX_QUERY_TIMEOUT=120 | |
| - LOWCODER_API_SERVICE_URL=http://lowcoder${1:+_$1}_api:8080 | |
| - LOWCODER_NODE_SERVICE_URL=http://lowcoder${1:+_$1}_node:6060 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.lowcoder${1:+_$1}.rule=Host(\`$url_lowcoder\`) && PathPrefix(\`/\`) | |
| - traefik.http.services.lowcoder${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.lowcoder${1:+_$1}.service=lowcoder${1:+_$1} | |
| - traefik.http.routers.lowcoder${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.lowcoder${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.lowcoder${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| lowcoder${1:+_$1}_assets: | |
| external: true | |
| name: lowcoder${1:+_$1}_assets | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack da Lowcoder" | |
| fi | |
| STACK_NAME="lowcoder${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c lowcoder.yaml lowcoder > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack da lowcoder" | |
| #fi | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull lowcoderorg/lowcoder-ce-api-service:latest lowcoderorg/lowcoder-ce-node-service:latest lowcoderorg/lowcoder-ce-frontend:latest | |
| ## Usa o serviço wait_stack "lowcoder" para verificar se o serviço esta online | |
| wait_stack lowcoder${1:+_$1}_lowcoder${1:+_$1}_api lowcoder${1:+_$1}_lowcoder${1:+_$1}_node lowcoder${1:+_$1}_lowcoder${1:+_$1}_frontend | |
| telemetria LowCoder finalizado | |
| cd dados_vps | |
| cat > dados_lowcoder${1:+_$1} <<EOL | |
| [ LOWCODER ] | |
| Link do Lowcoder: https://$url_lowcoder | |
| Usuario: Precisa de criar dentro do LowCoder | |
| Senha: Precisa de criar dentro do LowCoder | |
| API_KEY: $encryption_key_lowcoder3 | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ LOWCODER ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mLink do Lowcoder:\e[33m https://$url_lowcoder\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m Precisa de criar dentro do LowCoder\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha:\e[33m Precisa de criar dentro do LowCoder\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗██╗ ██████╗ ██╗ ██╗ | |
| ## ██║ ██╔══██╗████╗ ██║██╔════╝ ██╔════╝██║ ██╔═══██╗██║ ██║ | |
| ## ██║ ███████║██╔██╗ ██║██║ ███╗█████╗ ██║ ██║ ██║██║ █╗ ██║ | |
| ## ██║ ██╔══██║██║╚██╗██║██║ ██║██╔══╝ ██║ ██║ ██║██║███╗██║ | |
| ## ███████╗██║ ██║██║ ╚████║╚██████╔╝██║ ███████╗╚██████╔╝╚███╔███╔╝ | |
| ## ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚══════╝ ╚═════╝ ╚══╝╚══╝ | |
| ferramenta_langflow() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_langflow | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do Builder | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o Dominio para LangFlow (ex: langflow.sociosdigitales.pro): \e[0m" && read -r url_langflow | |
| echo "" | |
| ##Pergunta o Usuario para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -e "$amarelo--> Minimo 5 caracteres. Evite os caracteres especiais: \!#$ e/ou espaço" | |
| echo -en "\e[33mDigite um usuario para o LangFlow (ex: admin): \e[0m" && read -r user_langflow | |
| echo "" | |
| ##Pergunta a Senha para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -e "$amarelo--> Evite os caracteres especiais: \!#$" | |
| echo -en "\e[33mDigite uma senha para o usuario do LangFlow (ex: @Senha123_): \e[0m" && read -r pass_langflow | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_langflow | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Builder | |
| echo -e "\e[33mDominio do Langflow:\e[97m $url_langflow\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Builder | |
| echo -e "\e[33mUsuario:\e[97m $user_langflow\e[0m" | |
| echo "" | |
| ## Informação sobre URL do Builder | |
| echo -e "\e[33mSenha:\e[97m $pass_langflow\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_langflow | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO LANGFLOW \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Langflow iniciado | |
| ## Nada nada nada.. só para aparecer a mensagem de passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "langflow${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "langflow${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO LANGFLOW \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| #key_langflow=$(openssl rand -hex 16) | |
| #key_langflow=$(openssl rand -hex 16 | sed 's/\(..\)/\1/g' | sed 's/\(....\)\(....\)\(....\)\(....\)\(....\)/\1-\2-\3-\4-\5/') | |
| #key_langflow=$(curl -s https://www.uuidgenerator.net/api/version1) | |
| key_langflow=$(python3 -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())') | |
| ## Criando a stack langflow.yaml | |
| cat > langflow${1:+_$1}.yaml <<EOL | |
| version: "3.8" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| langflow${1:+_$1}: | |
| image: langflowai/langflow:1.1.3 | |
| volumes: | |
| - langflow${1:+_$1}_data:/app/langflow | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - LANGFLOW_AUTO_LOGIN=false | |
| - LANGFLOW_SUPERUSER=$user_langflow | |
| - LANGFLOW_SUPERUSER_PASSWORD=$pass_langflow | |
| - LANGFLOW_HOST=0.0.0.0 | |
| - BACKEND_URL=https://$url_langflow | |
| ## Secret Key | |
| ## Gere em: https://www.uuidgenerator.net/api/version1 | |
| - LANGFLOW_SECRET_KEY=$key_langflow | |
| ## Permitir novas incrições | |
| - LANGFLOW_NEW_USER_IS_ACTIVE=false ## false = Precisa autorizar novas inscrições | |
| ## Dados do Postgres | |
| - LANGFLOW_DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/langflow${1:+_$1} | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.langflow${1:+_$1}.rule=Host(\`$url_langflow\`) ## Url da aplicação | |
| - traefik.http.services.langflow${1:+_$1}.loadBalancer.server.port=7860 | |
| - traefik.http.routers.langflow${1:+_$1}.service=langflow${1:+_$1} | |
| - traefik.http.routers.langflow${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.langflow${1:+_$1}.tls.certresolver=letsencryptresolver | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| langflow${1:+_$1}_data: | |
| external: true | |
| name: langflow${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do langflow" | |
| fi | |
| STACK_NAME="langflow${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c langflow.yaml langflow > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do langflow" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull langflowai/langflow:1.1.3 | |
| ## Usa o serviço wait_stack "langflow" para verificar se o serviço esta online | |
| wait_stack langflow${1:+_$1}_langflow${1:+_$1} | |
| telemetria Langflow finalizado | |
| cd dados_vps | |
| cat > dados_langflow${1:+_$1} <<EOL | |
| [ LANGFLOW ] | |
| Dominio do langflow: https://$url_langflow | |
| Usuario: $user_langflow | |
| Senha: $pass_langflow | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ LANGFLOW ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_langflow\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_langflow\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $pass_langflow\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ███████╗███╗ ██╗ ██████╗ ██████╗ ██████╗ ██╗███████╗ ██████╗████████╗ | |
| ## ██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ██╔══██╗██╔══██╗██╔═══██╗ ██║██╔════╝██╔════╝╚══██╔══╝ | |
| ## ██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██████╔╝██████╔╝██║ ██║ ██║█████╗ ██║ ██║ | |
| ## ██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██╔═══╝ ██╔══██╗██║ ██║██ ██║██╔══╝ ██║ ██║ | |
| ## ╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║ ██║╚██████╔╝╚█████╔╝███████╗╚██████╗ ██║ | |
| ## ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚════╝ ╚══════╝ ╚═════╝ ╚═╝ | |
| ferramenta_openproject() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_openproject | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o OpenProject (ex: openproject.sociosdigitales.pro): \e[0m" && read -r url_openproject | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_openproject | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do openproject | |
| echo -e "\e[33mDominio do OpenProject:\e[97m $url_openproject\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_minio | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO OPENPROJECT \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria OpenProject iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "openproject${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "openproject${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO OPENPROJECT \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| key_openproject=$(openssl rand -hex 16) | |
| ## Criando a stack | |
| cat > openproject${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| openproject${1:+_$1}: | |
| image: openproject/openproject:15 | |
| volumes: | |
| - openproject${1:+_$1}_pgdata:/var/openproject/pgdata | |
| - openproject${1:+_$1}_assets:/var/openproject/assets | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Secret Key | |
| - OPENPROJECT_SECRET_KEY_BASE=$key_openproject | |
| ## Dominio: | |
| - OPENPROJECT_HOST__NAME=$url_openproject | |
| - OPENPROJECT_HTTPS=true | |
| ## Dados do Redis | |
| - OPENPROJECT_RAILS__CACHE__STORE=redis | |
| - OPENPROJECT_CACHE_REDIS_URL=redis://redis:6379 | |
| ## Dados do Postgres | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/openproject${1:+_$1} | |
| ## Configurações | |
| - OPENPROJECT_DEFAULT__LANGUAGE=pt-BR | |
| ## Dados SMTP | |
| ## Deixei comentado pois a environment da senha não esta funcionando como o esperado | |
| #- OPENPROJECT_EMAIL__DELIVERY__METHOD=smtp | |
| #- OPENPROJECT_MAIL__FROM=email@dominio.com | |
| #- OPENPROJECT_SMTP__USER__NAME=Usuario_do_Email | |
| #- OPENPROJECT_SMTP__DOMAIN=dominio.com | |
| #- OPENPROJECT_SMTP__PASSWORD=Senha_do_Email | |
| #- OPENPROJECT_SMTP__ADDRESS=smtp.dominio.com | |
| #- OPENPROJECT_SMTP__PORT=587 | |
| #- OPENPROJECT_SMTP__ENABLE__STARTTLS__AUTO=true | |
| #- OPENPROJECT_SMTP__AUTHENTICATION=plain | |
| #- OPENPROJECT_SMTP__OPENSSL__VERIFY__MODE=peer | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=1 | |
| - traefik.http.routers.openproject${1:+_$1}.rule=Host(\`$url_openproject\`) | |
| - traefik.http.routers.openproject${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.openproject${1:+_$1}.priority=1 | |
| - traefik.http.routers.openproject${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.openproject${1:+_$1}.service=openproject${1:+_$1} | |
| - traefik.http.services.openproject${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.services.openproject${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| openproject${1:+_$1}_pgdata: | |
| external: true | |
| name: openproject${1:+_$1}_pgdata | |
| openproject${1:+_$1}_assets: | |
| external: true | |
| name: openproject${1:+_$1}_assets | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do OpenProject" | |
| fi | |
| STACK_NAME="openproject${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c openproject.yaml openproject > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do openproject" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull openproject/openproject:15 | |
| ## Usa o serviço wait_stack "openproject" para verificar se o serviço esta online | |
| wait_stack openproject${1:+_$1}_openproject${1:+_$1} | |
| wait_30_sec | |
| wait_30_sec | |
| telemetria OpenProject finalizado | |
| cd dados_vps | |
| cat > dados_openproject${1:+_$1} <<EOL | |
| [ OPENPROJECT ] | |
| Dominio do openproject: https://$url_openproject | |
| Usuario: admin | |
| Senha: admin | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ OPENPROJECT ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_openproject\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m admin\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m admin\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗███████╗██████╗ | |
| ## ╚══███╔╝██╔════╝██╔══██╗ | |
| ## ███╔╝ █████╗ ██████╔╝ | |
| ## ███╔╝ ██╔══╝ ██╔═══╝ | |
| ## ███████╗███████╗██║ | |
| ## ╚══════╝╚══════╝╚═╝ | |
| ferramenta_zep() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_zep | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Zep (ex: zep.sociosdigitales.pro): \e[0m" && read -r url_zep | |
| echo "" | |
| ## Pergunta o nome do Usuario do Motor | |
| echo -e "\e[97mPasso$amarelo 2/2\e[0m" | |
| echo -en "\e[33mApiKey OpenAI: \e[0m" && read -r apikey_openai_zep | |
| echo "" | |
| ## Criando uma Encryption Key Aleatória | |
| encryption_key_zep=$(openssl rand -hex 16) | |
| apikey_zep=$(openssl rand -hex 16) | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_zep | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre o dominio | |
| echo -e "\e[33mDominio do Zep:\e[97m $url_zep\e[0m" | |
| echo "" | |
| ## Informação sobre o usuario | |
| echo -e "\e[33mApiKey da OpenAI:\e[97m $apikey_openai_zep\e[0m" | |
| echo "" | |
| ## Informação sobre a senha | |
| echo -e "\e[33mApiKey do Zep:\e[97m $apikey_zep\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_zep | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO ZEP \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Zep iniciado | |
| cd | |
| mkdir temp | |
| cd temp | |
| git clone --depth 1 https://github.com/oriondesign2015/setuporion > /dev/null 2>&1 | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Baixando Repositório do Zep" | |
| else | |
| echo "1/1 - [ OFF ] - Baixando Repositório do Zep" | |
| echo "Não foi possivel Baixar." | |
| fi | |
| mv setuporion/Extras/Zep /root/zep${1:+_$1} | |
| cd | |
| cd | |
| rm -r temp | |
| cd | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES VECTOR \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| dados | |
| verificar_container_pgvector | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - PgVector já instalado" | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do PgVector" | |
| criar_banco_pgvector_da_stack "zep${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_pgvector | |
| pegar_senha_pgvector > /dev/null 2>&1 | |
| criar_banco_pgvector_da_stack "zep${1:+_$1}" | |
| fi | |
| sleep 5 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO ZEP \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack zep.yaml | |
| cat > zep${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| zep${1:+_$1}_nlp: | |
| image: ghcr.io/getzep/zep-nlp-server:latest | |
| networks: | |
| - $nome_rede_interna | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| zep${1:+_$1}_app: | |
| image: ghcr.io/getzep/zep:latest | |
| volumes: | |
| - /root/zep${1:+_$1}/config.yaml:/app/config.yaml | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados Postgres | |
| - ZEP_STORE_TYPE=postgres | |
| - ZEP_STORE_POSTGRES_DSN=postgres://postgres:$senha_pgvector@pgvector:5432/zep${1:+_$1}?sslmode=disable | |
| ## Dados de acesso: | |
| - ZEP_AUTH_SECRET=$apikey_zep | |
| ## Dados OpenAI | |
| - ZEP_OPENAI_API_KEY=$apikey_openai_zep | |
| ## Dados NLP | |
| - ZEP_NLP_SERVER_URL=http://zep${1:+_$1}_nlp:5557 | |
| ## Configurações de extração | |
| - ZEP_EXTRACTORS_DOCUMENTS_EMBEDDINGS_SERVICE=openai | |
| - ZEP_EXTRACTORS_DOCUMENTS_EMBEDDINGS_DIMENSIONS=1536 | |
| - ZEP_EXTRACTORS_MESSAGES_EMBEDDINGS_SERVICE=openai | |
| - ZEP_EXTRACTORS_MESSAGES_EMBEDDINGS_DIMENSIONS=1536 | |
| - ZEP_EXTRACTORS_MESSAGES_SUMMARIZER_EMBEDDINGS_SERVICE=openai | |
| - ZEP_EXTRACTORS_MESSAGES_SUMMARIZER_EMBEDDINGS_DIMENSIONS=1536 | |
| ## Configuração Graphiti | |
| - ZEP_GRAPHITI_URL=http://zep${1:+_$1}_graphiti:8003 | |
| ## Degub: | |
| - ZEP_LOG_LEVEL=debug | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.zep${1:+_$1}.rule=Host(\`$url_zep\`) | |
| - traefik.http.routers.zep${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.zep${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.zep${1:+_$1}.loadbalancer.server.port=8000 | |
| - traefik.http.services.zep${1:+_$1}.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.zep${1:+_$1}.service=zep${1:+_$1} | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Zep" | |
| fi | |
| STACK_NAME="zep${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c zep.yaml zep #> /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do zep" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| ## Baixando imagens: | |
| pull ghcr.io/getzep/zep-nlp-server:latest ghcr.io/getzep/zep:latest | |
| ## Usa o serviço wait_zep para verificar se o serviço esta online | |
| wait_stack zep${1:+_$1}_zep${1:+_$1}_nlp zep${1:+_$1}_zep${1:+_$1}_app | |
| telemetria Zep finalizado | |
| wait_30_sec | |
| cd dados_vps | |
| cat > dados_zep${1:+_$1} <<EOL | |
| [ ZEP ] | |
| Dominio do Zep: https://$url_zep/admin | |
| ApiKey da OpenAI: $apikey_openai_zep | |
| ApiKey do Zep: $apikey_zep | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ ZEP ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio:\e[33m https://$url_zep/admin\e[0m" | |
| echo "" | |
| echo -e "\e[97mApiKey do Zep:\e[33m $apikey_zep\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗██╗ ██╗███╗ ███╗██╗ ██╗██╗ ██╗██████╗ | |
| ## ██║ ██║██║ ██║████╗ ████║██║ ██║██║ ██║██╔══██╗ | |
| ## ███████║██║ ██║██╔████╔██║███████║██║ ██║██████╔╝ | |
| ## ██╔══██║██║ ██║██║╚██╔╝██║██╔══██║██║ ██║██╔══██╗ | |
| ## ██║ ██║╚██████╔╝██║ ╚═╝ ██║██║ ██║╚██████╔╝██████╔╝ | |
| ## ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ | |
| ferramenta_humhub() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| # Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_humhub | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ## Pergunta o Dominio da ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/10\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o HumHub (ex: humhub.sociosdigitales.pro): \e[0m" && read -r url_humhub | |
| echo "" | |
| ## Pergunta o usuario da ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/10\e[0m" | |
| echo -e "$amarelo--> AutoConfig é uma função que pula as etapas de configurações pós instalação" | |
| echo -en "\e[33mUsar o AutoConfig do HumHub (exemplo: 0 para não ou 1 para sim): \e[0m" && read -r autoconfig_humhub_valor | |
| echo "" | |
| if [ "$autoconfig_humhub_valor" -eq 1 ]; then | |
| autoconfig_humhub="- HUMHUB_AUTO_INSTALL=1" | |
| elif [ "$autoconfig_humhub_valor" -eq 0 ]; then | |
| autoconfig_humhub="#- HUMHUB_AUTO_INSTALL=0" | |
| else | |
| echo "Erro ao receber resposta do AutoConfig. Resposta precisa ser 0 ou 1" | |
| echo "Definindo para 0" | |
| autoconfig_humhub_valor="0" | |
| autoconfig_humhub="#- HUMHUB_AUTO_INSTALL=0" | |
| fi | |
| ## Pergunta o usuario da ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ e/ou espaços" | |
| echo -en "\e[33mDigite um Usuario Admin (ex: SociosPro): \e[0m" && read -r user_humhub | |
| echo "" | |
| ## Pergunta o email da ferramenta | |
| echo -e "\e[97mPasso$amarelo 4/10\e[0m" | |
| echo -en "\e[33mDigite o Email do Admin: (ex: contacto@sociosdigitales.pro): \e[0m" && read -r email_humhub | |
| echo "" | |
| ## Pergunta o senha da ferramenta | |
| echo -e "\e[97mPasso$amarelo 5/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$" | |
| echo -en "\e[33mDigite uma Senha para o Admin (ex: @Senha123_): \e[0m" && read -r pass_humhub | |
| echo "" | |
| ## Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 6/10\e[0m" | |
| echo -en "\e[33mDigite um Email para o SMTP (ex: contacto@sociosdigitales.pro): \e[0m" && read -r email_smtp_humhub | |
| echo "" | |
| ## Pergunta o User SMTP | |
| echo -e "\e[97mPasso$amarelo 7/10\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuario do SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_humhub | |
| echo "" | |
| ## Pergunta a Senha SMTP | |
| echo -e "\e[97mPasso$amarelo 8/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do email (ex: @Senha123_): \e[0m" && read -r senha_smtp_humhub | |
| echo "" | |
| ## Pergunta o Host SMTP | |
| echo -e "\e[97mPasso$amarelo 9/10\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do email (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_humhub | |
| echo "" | |
| ## Pergunta a Porta SMTP | |
| echo -e "\e[97mPasso$amarelo 10/10\e[0m" | |
| echo -en "\e[33mDigite a Porta SMTP do email (ex: 465): \e[0m" && read -r porta_smtp_humhub | |
| echo "" | |
| if [ "$porta_smtp_humhub" -eq 465 ] || [ "$porta_smtp_humhub" -eq 25 ]; then | |
| porta_smtp_humhub_conv=1 | |
| else | |
| porta_smtp_humhub_conv=0 | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_humhub | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio do HumHub:\e[97m $url_humhub\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsar AutoConfig:\e[97m $autoconfig_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Usuario Admin | |
| echo -e "\e[33mUsuario Admin:\e[97m $user_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Email Admin | |
| echo -e "\e[33mEmail do Admin:\e[97m $email_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mSenha do Admin:\e[97m $pass_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mUsuario SMTP:\e[97m $user_smtp_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_humhub\e[0m" | |
| echo "" | |
| ## Informação sobre Senha Admin | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_humhub\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_humhub | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO HUMHUB \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria HumHub iniciado | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO MYSQL \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| dados | |
| ## Cria banco de dados do site no mysql | |
| verificar_container_mysql | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - MySQL já instalado" | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do MySQL" | |
| criar_banco_mysql_da_stack "humhub${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_mysql | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| criar_banco_mysql_da_stack "humhub${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO HUMHUB \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack | |
| cat > humhub${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| humhub${1:+_$1}: | |
| image: mriedmann/humhub:latest | |
| volumes: | |
| - humhub${1:+_$1}_data:/var/www/localhost/htdocs/protected/modules | |
| - humhub${1:+_$1}_uploads:/var/www/localhost/htdocs/uploads | |
| - humhub${1:+_$1}_assets:/var/www/localhost/htdocs/assets | |
| - humhub${1:+_$1}_themes:/var/www/localhost/htdocs/themes | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados de acesso | |
| - HUMHUB_ADMIN_USERNAME=$user_humhub | |
| - HUMHUB_ADMIN_PASSWORD=$pass_humhub | |
| - HUMHUB_EMAIL=$email_humhub | |
| - HUMHUB_EMAIL_NAME=$user_humhub | |
| - HUMHUB_ADMIN_EMAIL=$email_humhub | |
| ## Dados SMTP | |
| - HUMHUB_MAILER_TRANSPORT_TYPE=smtp | |
| - HUMHUB_MAILER_SYSTEM_EMAIL_ADDRESS=$email_smtp_humhub | |
| - HUMHUB_MAILER_USERNAME=$user_smtp_humhub | |
| - HUMHUB_MAILER_PASSWORD=$senha_smtp_humhub | |
| - HUMHUB_MAILER_SYSTEM_EMAIL_NAME=Suporte | |
| - HUMHUB_MAILER_HOSTNAME=$host_smtp_humhub | |
| - HUMHUB_MAILER_PORT=$porta_smtp_humhub | |
| - HUMHUB_MAILER_ALLOW_SELF_SIGNED_CERTS=$porta_smtp_humhub_conv ## 0 = TLS | 1 = SSL | |
| ## Dados do MySQL | |
| - HUMHUB_DB_HOST=mysql | |
| - HUMHUB_DB_USER=root | |
| - HUMHUB_DB_PASSWORD=$senha_mysql | |
| - HUMHUB_DB_NAME=humhub${1:+_$1} | |
| $autoconfig_humhub | |
| ## Dados Redis | |
| - HUMHUB_REDIS_HOSTNAME=redis | |
| - HUMHUB_REDIS_PORT=6379 | |
| - HUMHUB_CACHE_EXPIRE_TIME=3600 | |
| - HUMHUB_CACHE_CLASS=yii\redis\Cache | |
| - HUMHUB_QUEUE_CLASS=humhub\modules\queue\driver\Redis | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.humhub${1:+_$1}.rule=Host(\`$url_humhub\`) | |
| - traefik.http.routers.humhub${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.humhub${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.humhub${1:+_$1}.service=humhub${1:+_$1} | |
| - traefik.http.services.humhub${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.services.humhub${1:+_$1}.loadbalancer.passHostHeader=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| humhub${1:+_$1}_data: | |
| external: true | |
| name: humhub${1:+_$1}_data | |
| humhub${1:+_$1}_uploads: | |
| external: true | |
| name: humhub${1:+_$1}_uploads | |
| humhub${1:+_$1}_themes: | |
| external: true | |
| name: humhub${1:+_$1}_themes | |
| humhub${1:+_$1}_assets: | |
| external: true | |
| name: humhub${1:+_$1}_assets | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do HumHub" | |
| fi | |
| STACK_NAME="humhub${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c humhub.yaml humhub > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do humhub" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull mriedmann/humhub:latest | |
| ## Usa o serviço wait_calcom para verificar se o serviço esta online | |
| wait_stack humhub${1:+_$1}_humhub${1:+_$1} | |
| telemetria HumHub finalizado | |
| cd dados_vps | |
| cat > dados_humhub${1:+_$1} <<EOL | |
| [ HUMHUB ] | |
| Dominio do humhub: $url_humhub | |
| Usuario: $user_humhub | |
| Email: $email_humhub | |
| Senha: $pass_humhub | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ HUMHUB ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_humhub\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_humhub\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $pass_humhub\e[0m" | |
| echo "" | |
| echo -e "\e[33mHost MySQL:\e[97m mysql\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario MySQL:\e[97m root\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha MySQL:\e[97m $senha_mysql\e[0m" | |
| echo "" | |
| echo -e "\e[33mBase de dados MySQL:\e[97m humhub\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗ ██████╗ ██╗ ██╗██████╗ ██╗ ███████╗ | |
| ## ╚██╗ ██╔╝██╔═══██╗██║ ██║██╔══██╗██║ ██╔════╝ | |
| ## ╚████╔╝ ██║ ██║██║ ██║██████╔╝██║ ███████╗ | |
| ## ╚██╔╝ ██║ ██║██║ ██║██╔══██╗██║ ╚════██║ | |
| ## ██║ ╚██████╔╝╚██████╔╝██║ ██║███████╗███████║ | |
| ## ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ | |
| ferramenta_yourls() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_yourls | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Yourls (ej: yourls.sociosdigitales.pro): \e[0m" && read -r url_yourls | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mIngrese el Usuario (ej: sociosdigitales): \e[0m" && read -r user_yourls | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 3/3\e[0m" | |
| echo -en "\e[33mIngrese la Contraseña del usuario (ej: @Senha123_): \e[0m" && read -r pass_yourls | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_yourls | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do yourls | |
| echo -e "\e[33mDominio del Yourls:\e[97m $url_yourls\e[0m" | |
| echo "" | |
| ## Informação sobre URL do yourls | |
| echo -e "\e[33mUsuario:\e[97m $user_yourls\e[0m" | |
| echo "" | |
| ## Informação sobre URL do yourls | |
| echo -e "\e[33mContraseña:\e[97m $pass_yourls\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_yourls | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE YOURLS \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Yourls iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO MYSQL \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cria banco de dados do site no mysql | |
| verificar_container_mysql | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - MySQL ya instalado" | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando contraseña de MySQL" | |
| criar_banco_mysql_da_stack "yourls${1:+_$1}" | |
| echo "3/3 - [ OK ] - Creando base de datos" | |
| echo "" | |
| else | |
| ferramenta_mysql | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| criar_banco_mysql_da_stack "yourls${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO YOURLS \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack yourls.yaml | |
| cat > yourls${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| yourls${1:+_$1}: | |
| image: yourls:latest | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - YOURLS_SITE=https://$url_yourls ## Url da Aplicação | |
| - YOURLS_USER=$user_yourls | |
| - YOURLS_PASS=$pass_yourls | |
| ## Dados do Mysql | |
| - YOURLS_DB_HOST=mysql | |
| - YOURLS_DB_NAME=yourls${1:+_$1} | |
| - YOURLS_DB_USER=root | |
| - YOURLS_DB_PASS=$senha_mysql | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.yourls${1:+_$1}.rule=Host(\`$url_yourls\`) ## Url da aplicação | |
| - traefik.http.routers.yourls${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.yourls${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.yourls${1:+_$1}.service=yourls${1:+_$1} | |
| - traefik.http.services.yourls${1:+_$1}.loadbalancer.server.port=80 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear la stack de Yourls" | |
| fi | |
| STACK_NAME="yourls${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c yourls.yaml yourls > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do yourls" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull yourls:latest | |
| ## Usa o serviço wait_stack "yourls" para verificar se o serviço esta online | |
| wait_stack yourls${1:+_$1}_yourls${1:+_$1} | |
| telemetria Yourls finalizado | |
| cd datos_vps | |
| cat > datos_yourls${1:+_$1} <<EOL | |
| [ YOURLS ] | |
| Dominio del Yourls: https://$url_yourls/admin | |
| Usuario: $user_yourls | |
| Contraseña: $pass_yourls | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ YOURLS ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_yourls/admin\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_yourls\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m $pass_yourls\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ████████╗██╗ ██╗███████╗███╗ ██╗████████╗██╗ ██╗ ██████╗██████╗ ███╗ ███╗ | |
| ## ╚══██╔══╝██║ ██║██╔════╝████╗ ██║╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔══██╗████╗ ████║ | |
| ## ██║ ██║ █╗ ██║█████╗ ██╔██╗ ██║ ██║ ╚████╔╝ ██║ ██████╔╝██╔████╔██║ | |
| ## ██║ ██║███╗██║██╔══╝ ██║╚██╗██║ ██║ ╚██╔╝ ██║ ██╔══██╗██║╚██╔╝██║ | |
| ## ██║ ╚███╔███╔╝███████╗██║ ╚████║ ██║ ██║ ╚██████╗██║ ██║██║ ╚═╝ ██║ | |
| ## ╚═╝ ╚══╝╚══╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_twentycrm() { | |
| ## Verifica os recursos | |
| recursos 1 4 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_twentycrm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mDigite o dominio para o TwentyCRM (ex: twentycrm.sociosdigitales.pro): \e[0m" && read -r url_twentycrm | |
| echo "" | |
| ## Pergunta o email SMTP | |
| echo -e "\e[97mPasso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_twentycrm | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r user_smtp_twentycrm | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r pass_smtp_twentycrm | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_twentycrm | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_twentycrm | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_twentycrm | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do twentycrm | |
| echo -e "\e[33mDominio do TwentyCRM:\e[97m $url_twentycrm\e[0m" | |
| echo "" | |
| ## Informação sobre URL do twentycrm | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_twentycrm\e[0m" | |
| echo "" | |
| ## Informação sobre URL do twentycrm | |
| echo -e "\e[33mUsuario do SMTP:\e[97m $user_smtp_twentycrm\e[0m" | |
| echo "" | |
| ## Informação sobre URL do twentycrm | |
| echo -e "\e[33mSenha do Email SMTP:\e[97m $pass_smtp_twentycrm\e[0m" | |
| echo "" | |
| ## Informação sobre URL do twentycrm | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_twentycrm\e[0m" | |
| echo "" | |
| ## Informação sobre URL do twentycrm | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_twentycrm\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_twentycrm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO TWENTYCRM \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria TwentyCRM iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO TWENTYCRM \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| senha_postgres_twentycrm=$(openssl rand -hex 16) | |
| Key_aleatoria_twentycrm_1=$(openssl rand -hex 16) | |
| Key_aleatoria_twentycrm_2=$(openssl rand -hex 16) | |
| Key_aleatoria_twentycrm_3=$(openssl rand -hex 16) | |
| Key_aleatoria_twentycrm_4=$(openssl rand -hex 16) | |
| ## Criando a stack | |
| cat > twentycrm${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| twentycrm${1:+_$1}_server: | |
| image: twentycrm/twenty:latest | |
| volumes: | |
| - twentycrm${1:+_$1}_data:/app/packages/twenty-server/.local-storage | |
| - twentycrm${1:+_$1}_docker:/app/docker-data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - PORT=3000 | |
| - SERVER_URL=https://$url_twentycrm | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| ## Dados do Postgres | |
| - PG_DATABASE_URL=postgres://postgres:$senha_postgres_twentycrm@twentycrm${1:+_$1}_db:5432/default | |
| ## Dados da Storage/s3 | |
| - STORAGE_TYPE=local | |
| ## Secret Keys | |
| - APP_SECRET=$Key_aleatoria_twentycrm_1 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 4192M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.twentycrm${1:+_$1}.rule=Host(\`$url_twentycrm\`) ## Url da aplicação | |
| - traefik.http.services.twentycrm${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.twentycrm${1:+_$1}.service=twentycrm${1:+_$1} | |
| - traefik.http.routers.twentycrm${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.twentycrm${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.twentycrm${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| twentycrm${1:+_$1}_worker: | |
| image: twentycrm/twenty:latest | |
| command: ["yarn", "worker:prod"] | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - PORT=3000 | |
| - SERVER_URL=https://$url_twentycrm | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| ## Dados do Postgres | |
| - PG_DATABASE_URL=postgres://postgres:$senha_postgres_twentycrm@twentycrm${1:+_$1}_db:5432/default | |
| - DISABLE_DB_MIGRATIONS=true | |
| ## Dados da Storage/s3 | |
| - STORAGE_TYPE=local | |
| ## Secret Keys | |
| - APP_SECRET=$Key_aleatoria_twentycrm_1 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| twentycrm${1:+_$1}_db: | |
| image: twentycrm/twenty-postgres-spilo:latest | |
| volumes: | |
| - twentycrm${1:+_$1}_db:/home/postgres/pgdata | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - PGUSER_SUPERUSER=postgres | |
| - POSTGRESQL_PASSWORD=$senha_postgres_twentycrm | |
| - PGPASSWORD_SUPERUSER=$senha_postgres_twentycrm | |
| - ALLOW_NOSSL=true | |
| - SPILO_PROVIDER=local | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| twentycrm${1:+_$1}_data: | |
| external: true | |
| name: twentycrm${1:+_$1}_data | |
| twentycrm${1:+_$1}_docker: | |
| external: true | |
| name: twentycrm${1:+_$1}_docker | |
| twentycrm${1:+_$1}_db: | |
| external: true | |
| name: twentycrm${1:+_$1}_db | |
| networks: | |
| $nome_rede_interna: ## Nome da sua rede interna | |
| name: $nome_rede_interna ## Nome da sua rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do twentycrm" | |
| fi | |
| STACK_NAME="twentycrm${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c twentycrm.yaml twentycrm > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do twentycrm" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull twentycrm/twenty:latest twentycrm/twenty-postgres-spilo:latest | |
| ## Usa o serviço wait_stack "twentycrm" para verificar se o serviço esta online | |
| wait_stack twentycrm${1:+_$1}_twentycrm${1:+_$1}_server twentycrm${1:+_$1}_twentycrm${1:+_$1}_worker twentycrm${1:+_$1}_twentycrm${1:+_$1}_db | |
| wait_30_sec | |
| sudo chmod -R 755 /var/lib/docker/volumes/twentycrm${1:+_$1}_docker | |
| sudo chown -R 1000:1000 /var/lib/docker/volumes/twentycrm${1:+_$1}_docker | |
| sudo chmod -R 755 /var/lib/docker/volumes/twentycrm${1:+_$1}_data | |
| sudo chown -R 1000:1000 /var/lib/docker/volumes/twentycrm${1:+_$1}_data | |
| wait_30_sec | |
| telemetria TwentyCRM finalizado | |
| cd dados_vps | |
| cat > dados_twentycrm${1:+_$1} <<EOL | |
| [ TWENTYCRM ] | |
| Dominio do TwentyCRM: https://$url_twentycrm | |
| Usuario: Precisa criar no primeiro acesso do TwentyCRM | |
| Senha: Precisa criar no primeiro acesso do TwentyCRM | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ TWENTYCRM ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio do TwentyCRM:\e[97m https://$url_twentycrm\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do TwentyCRM\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do TwentyCRM\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ███╗ █████╗ ████████╗████████╗███████╗██████╗ ███╗ ███╗ ██████╗ ███████╗████████╗ | |
| ## ████╗ ████║██╔══██╗╚══██╔══╝╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██╔═══██╗██╔════╝╚══██╔══╝ | |
| ## ██╔████╔██║███████║ ██║ ██║ █████╗ ██████╔╝██╔████╔██║██║ ██║███████╗ ██║ | |
| ## ██║╚██╔╝██║██╔══██║ ██║ ██║ ██╔══╝ ██╔══██╗██║╚██╔╝██║██║ ██║╚════██║ ██║ | |
| ## ██║ ╚═╝ ██║██║ ██║ ██║ ██║ ███████╗██║ ██║██║ ╚═╝ ██║╚██████╔╝███████║ ██║ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝ | |
| ferramenta_mattermost() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_mattermost | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Mattermost (ex: mattermost.sociosdigitales.pro): \e[0m" && read -r url_mattermost | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_mattermost | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do mattermost | |
| echo -e "\e[33mDominio do Mattermost:\e[97m $url_mattermost\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_mattermost | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO MATTERMOST \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Mattermost iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cansei já de explicar o que isso faz kkkk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "mattermost${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "mattermost${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO MATTERMOST \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack mattermost.yaml | |
| cat > mattermost${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| mattermost${1:+_$1}: | |
| image: mattermost/mattermost-team-edition:latest | |
| volumes: | |
| - mattermost${1:+_$1}_data:/mattermost/data | |
| - mattermost${1:+_$1}_config:/mattermost/config | |
| - mattermost${1:+_$1}_logs:/mattermost/logs | |
| - mattermost${1:+_$1}_plugins:/mattermost/plugins | |
| - mattermost${1:+_$1}_client_plugins:/mattermost/client/plugins | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados de acesso | |
| - MM_SERVICESETTINGS_SITEURL=https://$url_mattermost | |
| ## Dados do Postgres | |
| - MM_SQLSETTINGS_DRIVERNAME=postgres | |
| - MM_SQLSETTINGS_DATASOURCE=postgres://postgres:$senha_postgres@postgres:5432/mattermost${1:+_$1}?sslmode=disable&connect_timeout=10 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.mattermost${1:+_$1}.rule=Host(\`$url_mattermost\`) | |
| - traefik.http.routers.mattermost${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.mattermost${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.mattermost${1:+_$1}.service=mattermost${1:+_$1} | |
| - traefik.http.services.mattermost${1:+_$1}.loadbalancer.server.port=8065 | |
| - traefik.http.services.mattermost${1:+_$1}.loadbalancer.passhostheader=true | |
| - traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https | |
| - traefik.http.routers.mattermost${1:+_$1}.middlewares=sslheader@docker | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| mattermost${1:+_$1}_data: | |
| external: true | |
| name: mattermost${1:+_$1}_data | |
| mattermost${1:+_$1}_config: | |
| external: true | |
| name: mattermost${1:+_$1}_config | |
| mattermost${1:+_$1}_logs: | |
| external: true | |
| name: mattermost${1:+_$1}_logs | |
| mattermost${1:+_$1}_plugins: | |
| external: true | |
| name: mattermost${1:+_$1}_plugins | |
| mattermost${1:+_$1}_client_plugins: | |
| external: true | |
| name: mattermost${1:+_$1}_client_plugins | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do mattermost" | |
| fi | |
| STACK_NAME="mattermost${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c mattermost.yaml mattermost > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do mattermost" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull mattermost/mattermost-team-edition:latest | |
| ## Usa o serviço wait_stack "mattermost" para verificar se o serviço esta online | |
| wait_stack mattermost${1:+_$1}_mattermost${1:+_$1} | |
| telemetria Mattermost finalizado | |
| cd dados_vps | |
| cat > dados_mattermost${1:+_$1} <<EOL | |
| [ MATTERMOST ] | |
| Dominio do Mattermost: https://$url_mattermost | |
| Usuario: Precisa criar no primeiro acesso do Mattermost | |
| Senha: Precisa criar no primeiro acesso do Mattermost | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ MATTERMOST ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_mattermost\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Mattermost\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Mattermost\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗ ██╗████████╗██╗ ██╗███╗ ██╗███████╗ | |
| ## ██╔═══██╗██║ ██║╚══██╔══╝██║ ██║████╗ ██║██╔════╝ | |
| ## ██║ ██║██║ ██║ ██║ ██║ ██║██╔██╗ ██║█████╗ | |
| ## ██║ ██║██║ ██║ ██║ ██║ ██║██║╚██╗██║██╔══╝ | |
| ## ╚██████╔╝╚██████╔╝ ██║ ███████╗██║██║ ╚████║███████╗ | |
| ## ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝╚═╝ ╚═══╝╚══════╝ | |
| ferramenta_outline() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_outline | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/8\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Outline (ex: outline.sociosdigitales.pro): \e[0m" && read -r url_outline | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/8\e[0m" | |
| echo -e "$amarelo--> Caso não tiver crie em: https://console.cloud.google.com/welcome" | |
| echo -en "\e[33mDigite o seu ID do Cliente Google (ex: XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com): \e[0m" && read -r id_google_outline | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/8\e[0m" | |
| echo -e "$amarelo--> Caso não tiver crie em: https://console.cloud.google.com/apis/credentials" | |
| echo -en "\e[33mDigite a sua Chave Secreta do Cliente Google (ex: XXXXXX-XXXXXXXXXXXXXXXXXXXXXXXX-XXX): \e[0m" && read -r key_google_outline | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 4/8\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_outline | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 5/8\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_email_outline | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 6/8\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_email_outline | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 7/8\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r smtp_email_outline | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 8/8\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_outline | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_outline" -eq 465 ]; then | |
| smtp_secure_outline=true | |
| else | |
| smtp_secure_outline=false | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_outline | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do outline | |
| echo -e "\e[33mDominio do Outline:\e[97m $url_outline\e[0m" | |
| echo "" | |
| ## Informação sobre URL do outline | |
| echo -e "\e[33mID do Cliente Google:\e[97m $id_google_outline\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail do SMTP:\e[97m $email_outline\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mUsuário do SMTP:\e[97m $usuario_email_outline\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Email | |
| echo -e "\e[33mSenha do Email:\e[97m $senha_email_outline\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP do Email:\e[97m $smtp_email_outline\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPorta SMTP do Email:\e[97m $porta_smtp_outline\e[0m" | |
| echo "" | |
| ## Informação sobre Secure SMTP | |
| echo -e "\e[33mSecure SMTP do Email:\e[97m $smtp_secure_outline\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_outline | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO OUTLINE \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Outline iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cansei já de explicar o que isso faz kkkk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "outline${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "outline${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO outline \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| Key_aleatoria_outline_1=$(openssl rand -hex 32) | |
| Key_aleatoria_outline_2=$(openssl rand -hex 32) | |
| ## Criando a stack outline.yaml | |
| cat > outline${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| outline${1:+_$1}_app: | |
| image: outlinewiki/outline:latest | |
| volumes: | |
| - outline${1:+_$1}_uploads:/var/lib/outline/uploads | |
| networks: | |
| - $nome_rede_interna | |
| environment: | |
| ## Dados de acesso | |
| - URL=https://$url_outline | |
| - PORT=3000 | |
| - ENABLE_EMAIL_SIGNIN=true | |
| - FORCE_HTTPS=true | |
| ## Secret Keys | |
| - SECRET_KEY=$Key_aleatoria_outline_1 | |
| - UTILS_SECRET=$Key_aleatoria_outline_2 | |
| ## Dados do Postgres | |
| - DATABASE_URL=postgres://postgres:$senha_postgres@postgres:5432/outline${1:+_$1}?sslmode=disable | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| ## Dados de armazenamento | |
| - FILE_STORAGE_UPLOAD_LOCAL=true | |
| #- AWS_S3_UPLOAD_BUCKET_URL=https:// | |
| #- AWS_S3_UPLOAD_BUCKET_NAME=outline | |
| #- AWS_ACCESS_KEY_ID= | |
| #- AWS_SECRET_ACCESS_KEY= | |
| #- AWS_REGION=us-east-1 | |
| ## Dados SMTP | |
| - SMTP_FROM_EMAIL=Outline <$email_outline> | |
| - SMTP_USERNAME=$usuario_email_outline | |
| - SMTP_PASSWORD=$senha_email_outline | |
| - SMTP_HOST=$smtp_email_outline | |
| - SMTP_PORT=$porta_smtp_outline | |
| - MAIL_SSL_ENABLE=$smtp_secure_outline | |
| ## Confoigurações Globais | |
| - DEFAULT_LANGUAGE=pt_BR | |
| - WEB_CONCURRENCY=2 | |
| ## Dados Google | |
| - OIDC_CLIENT_ID=$id_google_outline | |
| - OIDC_CLIENT_SECRET=$key_google_outline | |
| - OIDC_AUTH_URI=https://accounts.google.com/o/oauth2/auth | |
| - OIDC_TOKEN_URI=https://accounts.google.com/o/oauth2/token | |
| - OIDC_USERINFO_URI=https://www.googleapis.com/oauth2/v3/userinfo | |
| - OIDC_USERNAME_CLAIM=preferred_username | |
| - OIDC_DISPLAY_NAME=Google | |
| - OIDC_SCOPES=email profile openid | |
| - OIDC_LOGOUT_URI=https://$url_outline | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.outline${1:+_$1}_app.rule=Host(\`$url_outline\`) | |
| - traefik.http.routers.outline${1:+_$1}_app.entrypoints=websecure | |
| - traefik.http.routers.outline${1:+_$1}_app.tls=true | |
| - traefik.http.routers.outline${1:+_$1}_app.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.outline${1:+_$1}_app.service=outline${1:+_$1}_app | |
| - traefik.http.services.outline${1:+_$1}_app.loadbalancer.server.port=3000 | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| outline${1:+_$1}_uploads: | |
| external: true | |
| name: outline${1:+_$1}_uploads | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Outline" | |
| fi | |
| STACK_NAME="outline${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c outline.yaml outline > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do outline" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull outlinewiki/outline:latest | |
| ## Usa o serviço wait_stack "outline" para verificar se o serviço esta online | |
| wait_stack outline${1:+_$1}_outline${1:+_$1}_app | |
| telemetria Outline finalizado | |
| cd dados_vps | |
| cat > dados_outline${1:+_$1} <<EOL | |
| [ OUTLINE ] | |
| Dominio do Outline: https://$url_outline | |
| Usuario: Login é feito com o Google | |
| Senha: Login é feito com o Google | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ OUTLINE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_outline\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Login é feito com o Google\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Login é feito com o Google\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗ ██████╗ ██████╗ █████╗ ██╗ ██████╗ ██████╗ █████╗ ██████╗ ██████╗ | |
| ## ██╔════╝██╔═══██╗██╔════╝██╔══██╗██║ ██╔══██╗██╔═══██╗██╔══██╗██╔══██╗██╔══██╗ | |
| ## █████╗ ██║ ██║██║ ███████║██║ ██████╔╝██║ ██║███████║██████╔╝██║ ██║ | |
| ## ██╔══╝ ██║ ██║██║ ██╔══██║██║ ██╔══██╗██║ ██║██╔══██║██╔══██╗██║ ██║ | |
| ## ██║ ╚██████╔╝╚██████╗██║ ██║███████╗██████╔╝╚██████╔╝██║ ██║██║ ██║██████╔╝ | |
| ## ╚═╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ | |
| ferramenta_focalboard() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_focalboard | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o FocalBoard (ex: focalboard.sociosdigitales.pro): \e[0m" && read -r url_focalboard | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_focalboard | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do focalboard | |
| echo -e "\e[33mDominio do FocalBoard:\e[97m $url_focalboard\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_focalboard | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO FOCALBOARD \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Focalboard iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO FOCALBOARD \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack focalboard.yaml | |
| cat > focalboard${1:+_$1}.yaml <<EOL | |
| version: "3.8" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| focalboard${1:+_$1}: | |
| image: mattermost/focalboard:latest | |
| volumes: | |
| - focalboard${1:+_$1}_data:/opt/focalboard/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - VIRTUAL_HOST=$url_focalboard ## Url da Aplicação | |
| - VIRTUAL_PORT=8000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.focalboard${1:+_$1}.rule=Host(\`$url_focalboard\`) ## Url da Aplicação | |
| - traefik.http.services.focalboard${1:+_$1}.loadBalancer.server.port=8000 | |
| - traefik.http.routers.focalboard${1:+_$1}.service=focalboard${1:+_$1} | |
| - traefik.http.routers.focalboard${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.focalboard${1:+_$1}.tls.certresolver=letsencryptresolver | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| focalboard${1:+_$1}_data: | |
| external: true | |
| name: focalboard${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do focalboard" | |
| fi | |
| STACK_NAME="focalboard${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c focalboard.yaml focalboard > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do focalboard" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull mattermost/focalboard:latest | |
| ## Usa o serviço wait_focalboard para verificar se o serviço esta online | |
| wait_stack focalboard${1:+_$1}_focalboard${1:+_$1} | |
| telemetria Focalboard finalizado | |
| cd dados_vps | |
| cat > dados_focalboard${1:+_$1} <<EOL | |
| [ FOCALBOARD ] | |
| Dominio do FocalBoard: https://$url_focalboard | |
| Usuario: Precisa criar no primeiro acesso do FocalBoard | |
| Senha: Precisa criar no primeiro acesso do FocalBoard | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ FOCALBOARD ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_focalboard\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do FocalBoard\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do FocalBoard\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗ ██████╗ ██╗ | |
| ## ██╔════╝ ██║ ██╔══██╗██║ | |
| ## ██║ ███╗██║ ██████╔╝██║ | |
| ## ██║ ██║██║ ██╔═══╝ ██║ | |
| ## ╚██████╔╝███████╗██║ ██║ | |
| ## ╚═════╝ ╚══════╝╚═╝ ╚═╝ | |
| ferramenta_glpi() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_glpi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o GLPI (ex: glpi.sociosdigitales.pro): \e[0m" && read -r url_glpi | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_glpi | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do glpi | |
| echo -e "\e[33mDominio do GLPI:\e[97m $url_glpi\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_glpi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO GLPI \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria GLPI iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO MYSQL \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cria banco de dados do site no mysql | |
| verificar_container_mysql | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - MySQL já instalado" | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do MySQL" | |
| criar_banco_mysql_da_stack "glpi${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_mysql | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| criar_banco_mysql_da_stack "glpi${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO GLPI \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack glpi.yaml | |
| cat > glpi${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| glpi${1:+_$1}: | |
| image: diouxx/glpi:latest | |
| volumes: | |
| - /etc/timezone:/etc/timezone:ro | |
| - /etc/localtime:/etc/localtime:ro | |
| - glpi${1:+_$1}_glpi:/var/www/html/glpi | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - TIMEZONE=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.glpi${1:+_$1}.rule=Host(\`$url_glpi\`) | |
| - traefik.http.services.glpi${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.glpi${1:+_$1}.service=glpi${1:+_$1} | |
| - traefik.http.routers.glpi${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.glpi${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.glpi${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| glpi${1:+_$1}_glpi: | |
| external: true | |
| name: glpi${1:+_$1}_glpi | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do GLPI" | |
| fi | |
| STACK_NAME="glpi${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c glpi.yaml glpi > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do glpi" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull diouxx/glpi:latest | |
| ## Usa o serviço wait_stack "glpi" para verificar se o serviço esta online | |
| wait_stack glpi${1:+_$1}_glpi${1:+_$1} | |
| telemetria GLPI finalizado | |
| cd dados_vps | |
| cat > dados_glpi${1:+_$1} <<EOL | |
| [ GLPI ] | |
| Dominio do GLPI: https://$url_glpi | |
| Usuario: glpi | |
| Senha: glpi | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ GLPI ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_glpi\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m glpi\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m glpi\e[0m" | |
| echo "" | |
| echo -e "\e[33mEndereço do servidor SQL:\e[97m mysql\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuário SQL:\e[97m root\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha SQL:\e[97m $senha_mysql\e[0m" | |
| echo "" | |
| echo -e "\e[33mBanco de dados:\e[97m glpi${1:+_$1}\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## █████╗ ███╗ ██╗██╗ ██╗████████╗██╗ ██╗██╗███╗ ██╗ ██████╗ ██╗ ██╗ ███╗ ███╗ | |
| ## ██╔══██╗████╗ ██║╚██╗ ██╔╝╚══██╔══╝██║ ██║██║████╗ ██║██╔════╝ ██║ ██║ ████╗ ████║ | |
| ## ███████║██╔██╗ ██║ ╚████╔╝ ██║ ███████║██║██╔██╗ ██║██║ ███╗ ██║ ██║ ██╔████╔██║ | |
| ## ██╔══██║██║╚██╗██║ ╚██╔╝ ██║ ██╔══██║██║██║╚██╗██║██║ ██║ ██║ ██║ ██║╚██╔╝██║ | |
| ## ██║ ██║██║ ╚████║ ██║ ██║ ██║ ██║██║██║ ╚████║╚██████╔╝ ███████╗███████╗██║ ╚═╝ ██║ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ | |
| ferramenta_anythingllm() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_anythingllm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Anything LLM (ex: anythingllm.sociosdigitales.pro): \e[0m" && read -r url_anythingllm | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| read -r ip _ <<<$(hostname -I) | |
| echo -en "\e[33mDigite o dominio do Qdrant (ex: http://$ip:6333 ou http://qdrant.sociosdigitales.pro:6333): \e[0m" && read -r qdrant_anythingllm | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| key_dify_rand=$(openssl rand -hex 16) | |
| echo -en "\e[33mDigite a Api Key do Qdrant (ex: $key_dify_rand): \e[0m" && read -r api_qdrant_anythingllm | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_anythingllm | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do anythingllm | |
| echo -e "\e[33mDominio do Anything LLM:\e[97m $url_anythingllm\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio do Qdrant:\e[97m $qdrant_anythingllm\e[0m" | |
| echo "" | |
| echo -e "\e[33mApi Key do Qdrant:\e[97m $api_qdrant_anythingllm\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_anythingllm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO ANYTHING LLM \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria AnythingLLM iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO ANYTHING LLM \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack anythingllm.yaml | |
| cat > anythingllm${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| anythingllm${1:+_$1}: | |
| image: mintplexlabs/anythingllm:latest | |
| volumes: | |
| - anythingllm${1:+_$1}_storage:/app/server/storage | |
| - anythingllm${1:+_$1}_hotdir:/app/collector/hotdir | |
| - anythingllm${1:+_$1}_outputs:/app/collector/outputs | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - SERVER_PORT=3001 | |
| - STORAGE_DIR=/app/server/storage | |
| - UID=1000 | |
| - GID=1000 | |
| ## Dados Qdrant | |
| - VECTOR_DB=qdrant | |
| - QDRANT_ENDPOINT=$qdrant_anythingllm | |
| - QDRANT_API_KEY=$api_qdrant_anythingllm | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.anythingllm${1:+_$1}.rule=Host(\`$url_anythingllm\`) | |
| - traefik.http.services.anythingllm${1:+_$1}.loadbalancer.server.port=3001 | |
| - traefik.http.routers.anythingllm${1:+_$1}.service=anythingllm${1:+_$1} | |
| - traefik.http.routers.anythingllm${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.anythingllm${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.anythingllm${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| anythingllm${1:+_$1}_storage: | |
| external: true | |
| name: anythingllm${1:+_$1}_storage | |
| anythingllm${1:+_$1}_hotdir: | |
| external: true | |
| name: anythingllm${1:+_$1}_hotdir | |
| anythingllm${1:+_$1}_outputs: | |
| external: true | |
| name: anythingllm${1:+_$1}_outputs | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do anythingllm" | |
| fi | |
| STACK_NAME="anythingllm${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c anythingllm.yaml anythingllm > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do anythingllm" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull mintplexlabs/anythingllm:latest | |
| ## Usa o serviço wait_stack "anythingllm" para verificar se o serviço esta online | |
| wait_stack anythingllm${1:+_$1}_anythingllm${1:+_$1} | |
| telemetria AnythingLLM finalizado | |
| cd dados_vps | |
| cat > dados_anythingllm <<EOL | |
| [ ANYTHING LLM ] | |
| Dominio do Anything LLM: https://$url_anythingllm | |
| Usuario: Precisa criar no primeiro acesso do Anything LLM | |
| Senha: Precisa criar no primeiro acesso do Anything LLM | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ ANYTHING LLM ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_anythingllm\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Anything LLM\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Anything LLM\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗ ██╗ ██████╗ █████╗ ██╗ ██╗██████╗ ██████╗ █████╗ ██╗ ██╗ | |
| ## ██╔════╝╚██╗██╔╝██╔════╝██╔══██╗██║ ██║██╔══██╗██╔══██╗██╔══██╗██║ ██║ | |
| ## █████╗ ╚███╔╝ ██║ ███████║██║ ██║██║ ██║██████╔╝███████║██║ █╗ ██║ | |
| ## ██╔══╝ ██╔██╗ ██║ ██╔══██║██║ ██║██║ ██║██╔══██╗██╔══██║██║███╗██║ | |
| ## ███████╗██╔╝ ██╗╚██████╗██║ ██║███████╗██║██████╔╝██║ ██║██║ ██║╚███╔███╔╝ | |
| ## ╚══════╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚══╝╚══╝ | |
| ferramenta_excalidraw() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_excalidraw | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Excalidraw (ex: excalidraw.sociosdigitales.pro): \e[0m" && read -r url_excalidraw | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_excalidraw | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do excalidraw | |
| echo -e "\e[33mDominio do Excalidraw:\e[97m $url_excalidraw\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_excalidraw | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO EXCALIDRAW \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Excalidraw iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO EXCALIDRAW \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack | |
| cat > excalidraw${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| excalidraw${1:+_$1}: | |
| image: excalidraw/excalidraw:latest | |
| volumes: | |
| - excalidraw${1:+_$1}_data:/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - EXCALIDRAW_PORT=80 | |
| - NODE_ENV=development | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.excalidraw${1:+_$1}.rule=Host(\`$url_excalidraw\`) | |
| - traefik.http.services.excalidraw${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.excalidraw${1:+_$1}.service=excalidraw${1:+_$1} | |
| - traefik.http.routers.excalidraw${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.excalidraw${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.excalidraw${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| excalidraw${1:+_$1}_data: | |
| external: true | |
| name: excalidraw${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do excalidraw" | |
| fi | |
| STACK_NAME="excalidraw${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c excalidraw.yaml excalidraw > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do excalidraw" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull excalidraw/excalidraw:latest | |
| ## Usa o serviço wait_stack "excalidraw" para verificar se o serviço esta online | |
| wait_stack excalidraw${1:+_$1}_excalidraw${1:+_$1} | |
| telemetria Excalidraw finalizado | |
| cd dados_vps | |
| cat > dados_excalidraw${1:+_$1} <<EOL | |
| [ EXCALIDRAW ] | |
| Dominio do Excalidraw: https://$url_excalidraw | |
| Usuario: Precisa criar no primeiro acesso do Excalidraw | |
| Senha: Precisa criar no primeiro acesso do Excalidraw | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ EXCALIDRAW ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_excalidraw\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Excalidraw\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Excalidraw\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗ █████╗ ███████╗██╗ ██╗██╗ | |
| ## ██╔════╝██╔══██╗██╔════╝╚██╗ ██╔╝██║ | |
| ## █████╗ ███████║███████╗ ╚████╔╝ ██║ | |
| ## ██╔══╝ ██╔══██║╚════██║ ╚██╔╝ ╚═╝ | |
| ## ███████╗██║ ██║███████║ ██║ ██╗ | |
| ## ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ | |
| ## | |
| ## █████╗ ██████╗ ██████╗ ██████╗ ██╗███╗ ██╗████████╗███╗ ███╗███████╗███╗ ██╗████████╗███████╗ | |
| ## ██╔══██╗██╔══██╗██╔══██╗██╔═══██╗██║████╗ ██║╚══██╔══╝████╗ ████║██╔════╝████╗ ██║╚══██╔══╝██╔════╝ | |
| ## ███████║██████╔╝██████╔╝██║ ██║██║██╔██╗ ██║ ██║ ██╔████╔██║█████╗ ██╔██╗ ██║ ██║ ███████╗ | |
| ## ██╔══██║██╔═══╝ ██╔═══╝ ██║ ██║██║██║╚██╗██║ ██║ ██║╚██╔╝██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ | |
| ## ██║ ██║██║ ██║ ╚██████╔╝██║██║ ╚████║ ██║ ██║ ╚═╝ ██║███████╗██║ ╚████║ ██║ ███████║ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ | |
| ferramenta_easyappointments() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_easyappointments | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Easy!Appointments (ex: easyappointments.sociosdigitales.pro): \e[0m" && read -r url_easyappointments | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_easyappointments | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do easyappointments | |
| echo -e "\e[33mDominio do Easy!Appointments:\e[97m $url_easyappointments\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_easyappointments | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO EASY!APPOINTMENTS \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Easy!Appointments iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO MYSQL \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| dados | |
| ## Cria banco de dados do site no mysql | |
| verificar_container_mysql | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - MySQL já instalado" | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do MySQL" | |
| criar_banco_mysql_da_stack "easyapointments${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_mysql | |
| pegar_senha_mysql > /dev/null 2>&1 | |
| criar_banco_mysql_da_stack "easyapointments${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO EASY!APPOINTMENTS \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| # Cria o arquivo com o conteúdo desejado | |
| cat > apache-custom.conf << EOL | |
| ServerName $url_easyappointments | |
| EOL | |
| # Cria o diretório, se ainda não existir | |
| mkdir -p /root/easyappointments${1:+_$1} > /dev/null 2>&1 | |
| # Move o arquivo para o diretório de destino | |
| sudo mv apache-custom.conf /root/easyappointments${1:+_$1}/apache-custom.conf | |
| ## Criando a stack | |
| cat > easyappointments${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| easyapointments${1:+_$1}: | |
| image: alextselegidis/easyappointments:latest | |
| volumes: | |
| - easyapointments${1:+_$1}_data:/var/www/html | |
| - /root/easyappointments${1:+_$1}/apache-custom.conf:/etc/apache2/conf-enabled/custom.conf:ro | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de acesso | |
| - BASE_URL=https://$url_easyappointments | |
| - APACHE_SERVER_NAME=$url_easyappointments | |
| ## Dados do banco de dados | |
| - DB_HOST=mysql | |
| - DB_NAME=easyapointments${1:+_$1} | |
| - DB_USERNAME=root | |
| - DB_PASSWORD=$senha_mysql | |
| ## Dados Google Calendar | |
| - GOOGLE_SYNC_FEATURE=false | |
| - GOOGLE_PRODUCT_NAME= | |
| - GOOGLE_CLIENT_ID= | |
| - GOOGLE_CLIENT_SECRET= | |
| - GOOGLE_API_KEY= | |
| ## Modo de Debug | |
| - DEBUG_MODE=TRUE | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.easyapointments${1:+_$1}.rule=Host(\`$url_easyappointments\`) | |
| - traefik.http.services.easyapointments${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.easyapointments${1:+_$1}.service=easyapointments${1:+_$1} | |
| - traefik.http.routers.easyapointments${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.easyapointments${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.easyapointments${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| easyapointments${1:+_$1}_data: | |
| external: true | |
| name: easyapointments${1:+_$1}_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Easy!Appointments" | |
| fi | |
| STACK_NAME="easyappointments${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c easyappointments.yaml easyappointments > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do easyappointments" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull alextselegidis/easyappointments:latest | |
| ## Usa o serviço wait_stack "easyappointments" para verificar se o serviço esta online | |
| wait_stack easyappointments${1:+_$1}_easyapointments${1:+_$1} | |
| telemetria Easy!Appointments finalizado | |
| cd dados_vps | |
| cat > dados_easyappointments${1:+_$1} <<EOL | |
| [ EASY!APPOINTMENTS ] | |
| Dominio do Easy!Appointments: https://$url_easyappointments | |
| Usuario: Precisa criar no primeiro acesso do Easy!Appointments | |
| Senha: Precisa criar no primeiro acesso do Easy!Appointments | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ EASY!APPOINTMENTS ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_easyappointments\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do Easy!Appointments\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Easy!Appointments\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██████╗ ██████╗██╗ ██╗███╗ ███╗███████╗███╗ ██╗███████╗ ██████╗ | |
| ## ██╔══██╗██╔═══██╗██╔════╝██║ ██║████╗ ████║██╔════╝████╗ ██║██╔════╝██╔═══██╗ | |
| ## ██║ ██║██║ ██║██║ ██║ ██║██╔████╔██║█████╗ ██╔██╗ ██║███████╗██║ ██║ | |
| ## ██║ ██║██║ ██║██║ ██║ ██║██║╚██╔╝██║██╔══╝ ██║╚██╗██║╚════██║██║ ██║ | |
| ## ██████╔╝╚██████╔╝╚██████╗╚██████╔╝██║ ╚═╝ ██║███████╗██║ ╚████║███████║╚██████╔╝ | |
| ## ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ | |
| ferramenta_documenso() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_documenso | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio do Builder | |
| echo -e "\e[97mPasso$amarelo 1/8\e[0m" | |
| echo -en "\e[33mDigite o Dominio para o Builder do Documenso (ex: documenso.sociosdigitales.pro): \e[0m" && read -r url_documenso | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 2/8\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_documenso | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 3/8\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_email_documenso | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 4/8\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_email_documenso | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 5/8\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r smtp_email_documenso | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 6/8\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_documenso | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_documenso" -eq 465 ]; then | |
| smtp_secure_documenso=true | |
| else | |
| smtp_secure_documenso=false | |
| fi | |
| ## Pergunta qual é o Access Key do minio | |
| echo -e "\e[97mPasso$amarelo 7/8\e[0m" | |
| echo -en "\e[33mAccess Key Minio: \e[0m" && read -r S3_ACCESS_KEY | |
| echo "" | |
| ## Pergunta qual é a Secret Key do minio | |
| echo -e "\e[97mPasso$amarelo 8/8\e[0m" | |
| echo -en "\e[33mSecret Key Minio: \e[0m" && read -r S3_SECRET_KEY | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_documenso | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do Builder | |
| echo -e "\e[33mDominio do Documenso:\e[97m $url_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail do SMTP:\e[97m $email_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mUsuário do SMTP:\e[97m $usuario_email_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Email | |
| echo -e "\e[33mSenha do Email:\e[97m $senha_email_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP do Email:\e[97m $smtp_email_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPorta SMTP do Email:\e[97m $porta_smtp_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Secure SMTP | |
| echo -e "\e[33mSecure SMTP do Email:\e[97m $smtp_secure_documenso\e[0m" | |
| echo "" | |
| ## Informação sobre Access Key | |
| echo -e "\e[33mAccess Key Minio:\e[97m $S3_ACCESS_KEY\e[0m" | |
| echo "" | |
| ## Informação sobre Secret Key | |
| echo -e "\e[33mSecret Key Minio:\e[97m $S3_SECRET_KEY\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_documenso | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO DOCUMENSO \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Documenso iniciado | |
| ## Nada nada nada.. só para aparecer a mensagem de passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "documenso${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "documenso${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• PEGANDO DADOS DO MINIO \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| pegar_senha_minio | |
| if [ $? -eq 0 ]; then | |
| echo "1/2 - [ OK ] - Pegando Senha do MinIO" | |
| else | |
| echo "1/2 - [ OFF ] - Pegando Senha do MinIO" | |
| echo "Não foi possivel pegar a senha do minio" | |
| fi | |
| pegar_link_s3 | |
| if [ $? -eq 0 ]; then | |
| echo "2/2 - [ OK ] - Pegando URL do S3" | |
| else | |
| echo "2/2 - [ OFF ] - Pegando URL do S3" | |
| echo "Não foi possivel pegar o link do S3" | |
| fi | |
| echo "" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO DOCUMENSO \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando key Aleatória | |
| key_documenso1=$(openssl rand -hex 16) | |
| key_documenso2=$(openssl rand -hex 16) | |
| key_documenso3=$(openssl rand -hex 16) | |
| ## Criando a stack documenso.yaml | |
| cat > documenso${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| documenso${1:+_$1}: | |
| image: documenso/documenso:latest | |
| volumes: | |
| - documenso${1:+_$1}_cert:/opt/documenso/cert.p12 | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de Acesso | |
| - PORT=3000 | |
| - NEXTAUTH_URL=https://$url_documenso | |
| - NEXT_PUBLIC_WEBAPP_URL=https://$url_documenso | |
| - NEXT_PUBLIC_MARKETING_URL=https://sociosdigitales.pro | |
| ## Secret Keys | |
| - NEXTAUTH_SECRET=$key_documenso1 | |
| - NEXT_PRIVATE_ENCRYPTION_KEY=$key_documenso2 | |
| - NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=$key_documenso3 | |
| ## Dados do Google Cloud | |
| #- NEXT_PRIVATE_GOOGLE_CLIENT_ID= | |
| #- NEXT_PRIVATE_GOOGLE_CLIENT_SECRET= | |
| ## Dados Postgres | |
| - NEXT_PRIVATE_DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/documenso${1:+_$1} | |
| - NEXT_PRIVATE_DIRECT_DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/documenso${1:+_$1} | |
| ## Configurações MinIO | |
| - NEXT_PUBLIC_UPLOAD_TRANSPORT=s3 | |
| - NEXT_PRIVATE_UPLOAD_ENDPOINT=https://$url_s3 | |
| - NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE=true | |
| - NEXT_PRIVATE_UPLOAD_REGION=eu-south | |
| - NEXT_PRIVATE_UPLOAD_BUCKET=documenso${1:+-$1} | |
| - NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=$S3_ACCESS_KEY | |
| - NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY=$S3_SECRET_KEY | |
| ## Dados de SMTP | |
| - NEXT_PRIVATE_SMTP_TRANSPORT=smtp-auth | |
| - NEXT_PRIVATE_SMTP_FROM_ADDRESS=$email_documenso | |
| - NEXT_PRIVATE_SMTP_USERNAME=$usuario_email_documenso | |
| - NEXT_PRIVATE_SMTP_PASSWORD=$senha_email_documenso | |
| - NEXT_PRIVATE_SMTP_HOST=$smtp_email_documenso | |
| - NEXT_PRIVATE_SMTP_PORT=$porta_smtp_documenso | |
| - NEXT_PRIVATE_SMTP_SECURE=$smtp_secure_documenso | |
| - NEXT_PRIVATE_SMTP_FROM_NAME=Suporte | |
| ## Configurações | |
| - NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT=10 | |
| - NEXT_PUBLIC_DISABLE_SIGNUP=false | |
| - NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=/opt/documenso/cert.p12 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.documenso${1:+_$1}.rule=Host(\`$url_documenso\`) | |
| - traefik.http.services.documenso${1:+_$1}.loadbalancer.server.port=3000 | |
| - traefik.http.routers.documenso${1:+_$1}.service=documenso${1:+_$1} | |
| - traefik.http.routers.documenso${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.documenso${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.documenso${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| documenso${1:+_$1}_cert: | |
| external: true | |
| name: documenso${1:+_$1}_cert | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do documenso" | |
| fi | |
| STACK_NAME="documenso${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c documenso.yaml documenso > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack do documenso" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull documenso/documenso:latest | |
| ## Usa o serviço wait_stack "documenso" para verificar se o serviço esta online | |
| wait_stack documenso${1:+_$1}_documenso${1:+_$1} | |
| telemetria Documenso finalizado | |
| cd dados_vps | |
| cat > dados_documenso${1:+_$1} <<EOL | |
| [ DOCUMENSO ] | |
| Dominio do Documenso: https://$url_documenso | |
| Email: Precisa criar no primeiro acesso do Documenso | |
| Senha: Precisa criar no primeiro acesso do Documenso | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ DOCUMENSO ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_documenso\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m Precisa criar no primeiro acesso do Documenso\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do Documenso\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███╗ ███╗ ██████╗ ██████╗ ██████╗ ██╗ ███████╗ | |
| ## ████╗ ████║██╔═══██╗██╔═══██╗██╔══██╗██║ ██╔════╝ | |
| ## ██╔████╔██║██║ ██║██║ ██║██║ ██║██║ █████╗ | |
| ## ██║╚██╔╝██║██║ ██║██║ ██║██║ ██║██║ ██╔══╝ | |
| ## ██║ ╚═╝ ██║╚██████╔╝╚██████╔╝██████╔╝███████╗███████╗ | |
| ## ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ | |
| ferramenta_moodle() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_moodle | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/10\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Moodle (ex: moodle.sociosdigitales.pro): \e[0m" && read -r url_moodle | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/10\e[0m" | |
| echo -en "\e[33mDigite o nome para o projeto (ex: SociosPro): \e[0m" && read -r project_name_moodle | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/10\e[0m" | |
| echo -en "\e[33mDigite um Nome de Usuario (ex: sociospro): \e[0m" && read -r user_moodle | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 4/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$" | |
| echo -en "\e[33mDigite uma Senha para o Usuario (ex: @Senha123_): \e[0m" && read -r pass_moodle | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 5/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$" | |
| echo -en "\e[33mDigite um Email para o Usuario (ex: contacto@sociosdigitales.pro): \e[0m" && read -r mail_moodle | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 6/10\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contacto@sociosdigitales.pro): \e[0m" && read -r email_smtp_moodle | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 7/10\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_smtp_moodle | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 8/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_smtp_moodle | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 9/10\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_moodle | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 10/10\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_moodle | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_typebot" -eq 465 ]; then | |
| smtp_secure_smtp_moodle=ssl | |
| else | |
| smtp_secure_smtp_moodle=tls | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_moodle | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mDominio do Moodle:\e[97m $url_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mNome do Projeto:\e[97m $project_name_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mUsuario:\e[97m $user_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mSenha:\e[97m $pass_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mEmail:\e[97m $mail_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mUsuario SMTP:\e[97m $usuario_smtp_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mHost SMTP\e[97m $host_smtp_moodle\e[0m" | |
| echo "" | |
| ## Informação sobre URL do moodle | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_moodle\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_moodle | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO MOODLE \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Moodle iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO MOODLE \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| senha_marinadb=$(openssl rand -hex 16) | |
| ## Criando a stack | |
| cat > moodle${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| moodle${1:+_$1}_app: | |
| image: bitnami/moodle:latest | |
| volumes: | |
| - moodle${1:+_$1}_app_apache_conf:/opt/bitnami/apache/conf | |
| - moodle${1:+_$1}_app_apache:/bitnami/apache/conf | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados do projeto | |
| - MOODLE_SITE_NAME=$project_name_moodle | |
| ## Dados de acesso | |
| - MOODLE_HOST=$url_moodle | |
| - MOODLE_USERNAME=$user_moodle | |
| - MOODLE_PASSWORD=$pass_moodle | |
| - MOODLE_EMAIL=$mail_moodle | |
| ## Dados SMTP | |
| - MOODLE_SMTP_USER=$usuario_smtp_moodle | |
| - MOODLE_SMTP_PASSWORD=$senha_smtp_moodle | |
| - MOODLE_SMTP_HOST=$host_smtp_moodle | |
| - MOODLE_SMTP_PORT_NUMBER=$porta_smtp_moodle | |
| - MOODLE_SMTP_PROTOCOL=$smtp_secure_smtp_moodle ## 587 = tls ou plain | 465 = ssl | |
| ## Idioma | |
| - MOODLE_LANG=pt | |
| ## Dados MarinaDB | |
| - MOODLE_DATABASE_HOST=moodle${1:+_$1}_mariadb | |
| - MOODLE_DATABASE_PORT_NUMBER=3306 | |
| - MOODLE_DATABASE_USER=orion_moodle | |
| - MOODLE_DATABASE_PASSWORD=$senha_marinadb | |
| - MOODLE_DATABASE_NAME=orionbase_moodle | |
| - ALLOW_EMPTY_PASSWORD=no | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.moodle${1:+_$1}.rule=Host(\`$url_moodle\`) | |
| - traefik.http.services.moodle${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.routers.moodle${1:+_$1}.service=moodle${1:+_$1} | |
| - traefik.http.routers.moodle${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.moodle${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.moodle${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| moodle${1:+_$1}_mariadb: | |
| image: bitnami/mariadb:latest | |
| volumes: | |
| - moodle${1:+_$1}_mariadb_data:/bitnami/mariadb | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados MarinaDB | |
| - MARIADB_USER=orion_moodle | |
| - MARIADB_ROOT_PASSWORD=$senha_marinadb | |
| - MARIADB_DATABASE=orionbase_moodle | |
| - MARIADB_PASSWORD=$senha_marinadb | |
| - MARIADB_CHARACTER_SET=utf8mb4 | |
| - MARIADB_COLLATE=utf8mb4_unicode_ci | |
| - ALLOW_EMPTY_PASSWORD=no | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| moodle${1:+_$1}_app_apache_conf: | |
| external: true | |
| name: moodle${1:+_$1}_app_apache_conf | |
| moodle${1:+_$1}_app_apache: | |
| external: true | |
| name: moodle${1:+_$1}_app_apache | |
| moodle${1:+_$1}_mariadb_data: | |
| external: true | |
| name: moodle${1:+_$1}_mariadb_data | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do Moodle" | |
| fi | |
| STACK_NAME="moodle${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c moodle.yaml moodle > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do moodle" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull bitnami/moodle:latest bitnami/mariadb:latest | |
| ## Baixando imagens: | |
| pull bitnami/moodle:latest bitnami/mariadb:latest | |
| ## Usa o serviço wait_stack "moodle" para verificar se o serviço esta online | |
| wait_stack moodle${1:+_$1}_moodle${1:+_$1}_app moodle${1:+_$1}_moodle${1:+_$1}_mariadb | |
| sleep 120 | |
| telemetria Moodle finalizado | |
| cd dados_vps | |
| cat > dados_moodle${1:+_$1} <<EOL | |
| [ MOODLE ] | |
| Dominio do moodle: https://$url_moodle | |
| Usuario: $user_moodle | |
| Senha: $pass_moodle | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ MOODLE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_moodle\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_moodle\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $pass_moodle\e[0m" | |
| echo "" | |
| echo -e "\e[97mObservação:\e[33m Esta é uma ferramenta que pode demorar para iniciar na primeira vez\e[0m" | |
| echo -e "\e[33mrecomendo aguardar alguns instantes antes de tentar abrir para não prejudicar\e[0m" | |
| echo -e "\e[33ma sua instalação que já foi realizado.\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ████████╗ ██████╗ ██████╗ ██╗ ██╗███████╗████████╗ | |
| ## ╚══██╔══╝██╔═══██╗██╔═══██╗██║ ██║██╔════╝╚══██╔══╝ | |
| ## ██║ ██║ ██║██║ ██║██║ ██║█████╗ ██║ | |
| ## ██║ ██║ ██║██║ ██║██║ ██ ██║██╔══╝ ██║ | |
| ## ██║ ╚██████╔╝╚██████╔╝███████╗╚█████╔╝███████╗ ██║ | |
| ## ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚════╝ ╚══════╝ ╚═╝ | |
| ferramenta_tooljet() { | |
| ## Verifica os recursos | |
| recursos 2 4 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_tooljet | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para aplicação | |
| echo -e "\e[97mPasso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mDigite o Dominio para a ToolJet (ex: tooljet.sociosdigitales.pro): \e[0m" && read -r url_tooljet | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_smtp_tooljet | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_smtp_tooljet | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_smtp_tooljet | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r host_smtp_tooljet | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_tooljet | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_tooljet | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL | |
| echo -e "\e[33mDominio da ToolJet:\e[97m $url_tooljet\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_smtp_tooljet\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mUser SMTP:\e[97m $usuario_smtp_tooljet\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_smtp_tooljet\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mHost SMTP:\e[97m $host_smtp_tooljet\e[0m" | |
| echo "" | |
| ## Informação sobre URL | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_tooljet\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_tooljet | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DA TOOLJET \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria ToolJet iniciado | |
| ## Literalmente nada, apenas um espaço vazio caso precisar de adicionar alguma coisa | |
| ## Antes.. | |
| ## E claro, para aparecer a mensagem do passo.. | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres Instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "tooljet${1:+_$1}_app" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "tooljet${1:+_$1}_app" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO A TOOLJET \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui de fato vamos iniciar a instalação da tooljet | |
| ## Criando uma Global Key Aleatória | |
| master_key=$(openssl rand -hex 16) | |
| secret_key=$(openssl rand -hex 16) | |
| jwt_key=$(openssl rand -hex 16) | |
| ## Criando a stack tooljet.yaml | |
| cat > tooljet${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| tooljet${1:+_$1}_app: | |
| image: tooljet/tooljet:ee-lts-latest | |
| command: npm run start:prod | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Configuração básica | |
| - TOOLJET_HOST=https://$url_tooljet | |
| - SERVE_CLIENT=true | |
| - PORT=80 | |
| ## Desativar novas inscrições | |
| - DISABLE_SIGNUPS=false | |
| ## Ativar perguntas no Onboarding | |
| - ENABLE_ONBOARDING_QUESTIONS_FOR_ALL_SIGN_UPS=true | |
| ## Chaves de segurança | |
| - LOCKBOX_MASTER_KEY=$master_key | |
| - SECRET_KEY_BASE=$secret_key | |
| ## Configuração do banco de dados principal | |
| - DATABASE_URL=postgres://postgres:$senha_postgres@postgres:5432/tooljet${1:+_$1}_app?sslmode=disable | |
| ## Configuração do banco interno do ToolJet | |
| - ENABLE_TOOLJET_DB=true | |
| - TOOLJET_DB=tooljet${1:+_$1} | |
| - TOOLJET_DB_USER=postgres | |
| - TOOLJET_DB_HOST=postgres | |
| - TOOLJET_DB_PASS=$senha_postgres | |
| ## Configuração do PostgREST | |
| - PGRST_HOST=tooljet_postgrest${1:+_$1} | |
| - PGRST_JWT_SECRET=$jwt_key | |
| ## Configuração do Redis | |
| - REDIS_HOST=redis | |
| - REDIS_PORT=6379 | |
| ## Configurações do Chroma | |
| - CHROMA_DB_URL=http://tooljet${1:+_$1}_chroma:8000 | |
| ## Configuração do SMTP | |
| - DEFAULT_FROM_EMAIL=$email_smtp_tooljet | |
| - SMTP_USERNAME=$usuario_smtp_tooljet | |
| - SMTP_PASSWORD=$senha_smtp_tooljet | |
| - SMTP_DOMAIN=$host_smtp_tooljet | |
| - SMTP_PORT=$porta_smtp_tooljet | |
| ## Features do ToolJet | |
| - COMMENT_FEATURE_ENABLE=true | |
| - ENABLE_MULTIPLAYER_EDITING=true | |
| - ENABLE_MARKETPLACE_FEATURE=true | |
| ## Atualizações e expiração de sessão | |
| - CHECK_FOR_UPDATES=false | |
| - USER_SESSION_EXPIRY=120 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 4096M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.tooljet${1:+_$1}.rule=Host(\`$url_tooljet\`) | |
| - traefik.http.services.tooljet${1:+_$1}.loadbalancer.server.port=80 | |
| - traefik.http.routers.tooljet${1:+_$1}.service=tooljet${1:+_$1} | |
| - traefik.http.routers.tooljet${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.tooljet${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.tooljet${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| tooljet${1:+_$1}_postgrest: | |
| image: postgrest/postgrest:v12.0.2 | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - PGRST_SERVER_PORT=80 | |
| - PGRST_DB_URI=postgres://postgres:$senha_postgres@postgres:5432/tooljet${1:+_$1}_app?sslmode=disable | |
| - PGRST_DB_SCHEMA=public | |
| - PGRST_DB_ANON_ROLE=anon | |
| - PGRST_JWT_SECRET=$jwt_key | |
| - PGRST_JWT_AUD=tooljet${1:+_$1} | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| tooljet${1:+_$1}_chroma: | |
| image: chromadb/chroma:latest | |
| volumes: | |
| - tooljet_chromadb${1:+_$1}:/chroma | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - CHROMA_HOST_PORT=8000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| tooljet_chromadb${1:+_$1}: | |
| external: true | |
| name: tooljet_chromadb${1:+_$1} | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack da TOOLJET" | |
| fi | |
| STACK_NAME="tooljet${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c tooljet.yaml tooljet > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel subir a stack da tooljet" | |
| #fi | |
| sleep 10 | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull tooljet/tooljet:ee-lts-latest postgrest/postgrest:v12.0.2 chromadb/chroma:latest | |
| ## Usa o serviço wait_stack "tooljet" para verificar se o serviço esta online | |
| wait_stack tooljet${1:+_$1}_tooljet${1:+_$1}_app tooljet${1:+_$1}_tooljet${1:+_$1}_postgrest tooljet${1:+_$1}_tooljet${1:+_$1}_chroma | |
| telemetria ToolJet finalizado | |
| cd dados_vps | |
| cat > dados_tooljet${1:+_$1} <<EOL | |
| [ TOOLJET ] | |
| Dominio: https://$url_tooljet | |
| Usuario: Precisa de criar no primeiro acesso ao ToolJet | |
| Senha: Precisa de criar no primeiro acesso ao ToolJet | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ TOOLJET ]\e[0m" | |
| echo "" | |
| echo -e "\e[97mDominio:\e[33m https://$url_tooljet\e[0m" | |
| echo "" | |
| echo -e "\e[97mUsuario:\e[33m Precisa de criar no primeiro acesso ao ToolJet\e[0m" | |
| echo "" | |
| echo -e "\e[97mSenha:\e[33m Precisa de criar no primeiro acesso ao ToolJet\e[0m" | |
| echo "" | |
| echo "> Aguarde aproximadamente 5 minutos antes de acessar devido à migração em andamento." | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗████████╗██╗██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗ | |
| ## ██╔════╝╚══██╔══╝██║██╔══██╗██║ ██║████╗ ██║██╔════╝ ██╔══██╗██╔══██╗██╔════╝ | |
| ## ███████╗ ██║ ██║██████╔╝██║ ██║██╔██╗ ██║██║ ███╗ ██████╔╝██║ ██║█████╗ | |
| ## ╚════██║ ██║ ██║██╔══██╗██║ ██║██║╚██╗██║██║ ██║ ██╔═══╝ ██║ ██║██╔══╝ | |
| ## ███████║ ██║ ██║██║ ██║███████╗██║██║ ╚████║╚██████╔╝ ██║ ██████╔╝██║ | |
| ## ╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ | |
| ferramenta_stirlingpdf() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_stirlingpdf | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Stirling PDF (ex: stirlingpdf.sociosdigitales.pro): \e[0m" && read -r url_stirlingpdf | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mDigite o nome para o App (ex: OrionPDF): \e[0m" && read -r name_stirlingpdf | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -en "\e[33mDigite uma descrição para o App (ex: Meu app de PDF): \e[0m" && read -r desc_stirlingpdf | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_stirlingpdf | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do stirlingpdf | |
| echo -e "\e[33mDominio do Stirling PDF:\e[97m $url_stirlingpdf\e[0m" | |
| echo "" | |
| ## Informação sobre URL do stirlingpdf | |
| echo -e "\e[33mNome do App:\e[97m $name_stirlingpdf\e[0m" | |
| echo "" | |
| ## Informação sobre URL do stirlingpdf | |
| echo -e "\e[33mDescrição do App:\e[97m $desc_stirlingpdf\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_stirlingpdf | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO STIRLING PDF \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria StirlingPDF iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO stirlingpdf \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack stirlingpdf.yaml | |
| cat > stirlingpdf${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| stirlingpdf${1:+_$1}: | |
| image: frooodle/s-pdf:latest ## Versão da aplicação | |
| volumes: | |
| - stirlingpdf${1:+_$1}_data:/usr/share/tessdata | |
| - stirlingpdf${1:+_$1}_config:/configs | |
| - stirlingpdf${1:+_$1}_logs:/logs | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Liberar cadastros | |
| - SECURITY_ENABLELOGIN=true | |
| ## Branding | |
| - UI_APPNAME=$name_stirlingpdf | |
| - UI_APPNAMENAVBAR=$name_stirlingpdf | |
| - UI_HOMEDESCRIPTION=$desc_stirlingpdf | |
| ## Configurações | |
| - DOCKER_ENABLE_SECURITY=false | |
| - SYSTEM_MAXFILESIZE=100 | |
| - LANGS=en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID | |
| - SYSTEM_DEFAULTLOCALE=BR | |
| - METRICS_ENABLED=true | |
| - SYSTEM_GOOGLEVISIBILITY=false | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.stirlingpdf${1:+_$1}.rule=Host(\`$url_stirlingpdf\`) ## Url da aplicação | |
| - traefik.http.services.stirlingpdf${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.routers.stirlingpdf${1:+_$1}.service=stirlingpdf${1:+_$1} | |
| - traefik.http.routers.stirlingpdf${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.stirlingpdf${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.stirlingpdf${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| stirlingpdf${1:+_$1}_data: | |
| external: true | |
| name: stirlingpdf${1:+_$1}_data | |
| stirlingpdf${1:+_$1}_config: | |
| external: true | |
| name: stirlingpdf${1:+_$1}_config | |
| stirlingpdf${1:+_$1}_logs: | |
| external: true | |
| name: stirlingpdf${1:+_$1}_logs | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| external: true | |
| name: $nome_rede_interna ## Nome da rede interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do stirlingpdf" | |
| fi | |
| STACK_NAME="stirlingpdf${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c stirlingpdf.yaml stirlingpdf > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do stirlingpdf" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull frooodle/s-pdf:latest | |
| ## Usa o serviço wait_stirlingpdf para verificar se o serviço esta online | |
| wait_stack stirlingpdf${1:+_$1}_stirlingpdf${1:+_$1} | |
| telemetria StirlingPDF finalizado | |
| cd dados_vps | |
| cat > dados_stirlingpdf${1:+_$1} <<EOL | |
| [ STIRLING PDF ] | |
| Dominio do stirlingpdf: https://$url_stirlingpdf | |
| Usuario: Precisa criar no primeiro acesso do stirlingpdf | |
| Senha: Precisa criar no primeiro acesso do stirlingpdf | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ STIRLING PDF ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_stirlingpdf\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa criar no primeiro acesso do stirlingpdf\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa criar no primeiro acesso do stirlingpdf\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗██╗ ██╗ ██████╗██╗ ██╗██╗ ██╗ ██████╗ ██╗ ██╗███████╗███████╗ | |
| ## ██╔════╝██║ ██║██╔════╝██║ ██╔╝██║ ██║██╔═══██╗██║ ██║██╔════╝██╔════╝ | |
| ## ██║ ██║ ██║██║ █████╔╝ ███████║██║ ██║██║ ██║███████╗█████╗ | |
| ## ██║ ██║ ██║██║ ██╔═██╗ ██╔══██║██║ ██║██║ ██║╚════██║██╔══╝ | |
| ## ╚██████╗███████╗██║╚██████╗██║ ██╗██║ ██║╚██████╔╝╚██████╔╝███████║███████╗ | |
| ## ╚═════╝╚══════╝╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ | |
| ferramenta_clickhouse() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_clickhouse | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/3\e[0m" | |
| echo -en "\e[33mDigite o dominio para o ClickHouse (ex: clickhouse.sociosdigitales.pro): \e[0m" && read -r url_clickhouse | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/3\e[0m" | |
| echo -en "\e[33mDigite um nome de usuario para o ClickHouse (ex: admin): \e[0m" && read -r user_clickhouse | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/3\e[0m" | |
| echo -en "\e[33mDigite uma senha para o usuario (ex: @Senha123_): \e[0m" && read -r pass_clickhouse | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_clickhouse | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do clickhouse | |
| echo -e "\e[33mDominio do ClickHouse:\e[97m $url_clickhouse\e[0m" | |
| echo "" | |
| ## Informação sobre URL do clickhouse | |
| echo -e "\e[33mUsuario:\e[97m $user_clickhouse\e[0m" | |
| echo "" | |
| ## Informação sobre URL do clickhouse | |
| echo -e "\e[33mSenha:\e[97m $pass_clickhouse\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_clickhouse | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO CLICKHOUSE \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria ClickHouse iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO CLICKHOUSE \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack clickhouse.yaml | |
| cat > clickhouse${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| clickhouse${1:+_$1}: | |
| image: clickhouse/clickhouse-server:23.8.8.20-alpine | |
| volumes: | |
| - clickhouse${1:+_$1}_data:/var/lib/clickhouse | |
| - clickhouse${1:+_$1}_log:/var/log/clickhouse-server | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| #ports: | |
| # - "8123:8123" | |
| # - "9000:9000" | |
| # - "9009:9009" | |
| environment: | |
| - CLICKHOUSE_DB=default | |
| - CLICKHOUSE_USER=$user_clickhouse | |
| - CLICKHOUSE_PASSWORD=$pass_clickhouse | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.clickhouse${1:+_$1}.rule=Host(\`$url_clickhouse\`) | |
| - traefik.http.services.clickhouse${1:+_$1}.loadbalancer.server.port=8123 | |
| - traefik.http.routers.clickhouse${1:+_$1}.service=clickhouse${1:+_$1} | |
| - traefik.http.routers.clickhouse${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.services.clickhouse${1:+_$1}.loadbalancer.passHostHeader=true | |
| - traefik.http.routers.clickhouse${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.clickhouse${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| clickhouse${1:+_$1}_data: | |
| external: true | |
| name: clickhouse${1:+_$1}_data | |
| clickhouse${1:+_$1}_log: | |
| external: true | |
| name: clickhouse${1:+_$1}_log | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do clickhouse" | |
| fi | |
| STACK_NAME="clickhouse${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c clickhouse.yaml clickhouse > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do clickhouse" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull clickhouse/clickhouse-server:23.8.8.20-alpine | |
| ## Usa o serviço wait_clickhouse para verificar se o serviço esta online | |
| wait_stack clickhouse${1:+_$1}_clickhouse${1:+_$1} | |
| telemetria ClickHouse finalizado | |
| cd dados_vps | |
| cat > dados_clickhouse${1:+_$1} <<EOL | |
| [ CLICKHOUSE ] | |
| Dashboard do clickhouse: https://$url_clickhouse/dashboard | |
| API do clickhouse: https://$url_clickhouse | |
| Usuario: $user_clickhouse | |
| Senha: $pass_clickhouse | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ CLICKHOUSE ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_clickhouse\e[0m" | |
| echo "" | |
| echo -e "\e[33mDashboard:\e[97m https://$url_clickhouse/dashboard\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_clickhouse\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $pass_clickhouse\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ███████╗██████╗ ██╗███████╗██╗███╗ ██╗███████╗██╗ ██████╗ ██╗ ██╗████████╗ | |
| ## ██╔══██╗██╔════╝██╔══██╗██║██╔════╝██║████╗ ██║██╔════╝██║██╔════╝ ██║ ██║╚══██╔══╝ | |
| ## ██████╔╝█████╗ ██║ ██║██║███████╗██║██╔██╗ ██║███████╗██║██║ ███╗███████║ ██║ | |
| ## ██╔══██╗██╔══╝ ██║ ██║██║╚════██║██║██║╚██╗██║╚════██║██║██║ ██║██╔══██║ ██║ | |
| ## ██║ ██║███████╗██████╔╝██║███████║██║██║ ╚████║███████║██║╚██████╔╝██║ ██║ ██║ | |
| ## ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚══════╝╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ | |
| ferramenta_redisinsight() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_redisinsight | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o RedisInsight (ex: redisinsight.sociosdigitales.pro): \e[0m" && read -r url_redisinsight | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_redisinsight | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do redisinsight | |
| echo -e "\e[33mDominio do redisInsight:\e[97m $url_redisinsight\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_redisinsight | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO REDISINSIGHT \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria RedisInsight iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO REDISINSIGHT \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack redisinsight.yaml | |
| cat > redisinsight${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| redisinsight${1:+_$1}: | |
| image: redislabs/redisinsight:latest | |
| volumes: | |
| - redisinsight${1:+_$1}_data:/db | |
| - redisinsight${1:+_$1}_logs:/data/logs | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - RI_APP_PORT=5540 | |
| - RI_APP_HOST=0.0.0.0 | |
| - RI_ENCRYPTION_KEY=$key_redisinsight | |
| - RI_LOG_LEVEL=info | |
| - RI_FILES_LOGGER=false | |
| - RI_STDOUT_LOGGER=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.redisinsight${1:+_$1}.rule=Host(\`$url_redisinsight\`) ## Dominio do RedisInsight | |
| - traefik.http.services.redisinsight${1:+_$1}.loadbalancer.server.port=5540 | |
| - traefik.http.routers.redisinsight${1:+_$1}.service=redisinsight${1:+_$1} | |
| - traefik.http.routers.redisinsight${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.redisinsight${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.redisinsight${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| redisinsight${1:+_$1}_data: | |
| external: true | |
| name: redisinsight${1:+_$1}_data | |
| redisinsight${1:+_$1}_logs: | |
| external: true | |
| name: redisinsight${1:+_$1}_logs | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do RedisInsight" | |
| fi | |
| STACK_NAME="redisinsight${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c redisinsight.yaml redisinsight > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do redisinsight" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull redislabs/redisinsight:latest | |
| ## Usa o serviço wait_redisinsight para verificar se o serviço esta online | |
| wait_stack redisinsight${1:+_$1}_redisinsight${1:+_$1} | |
| telemetria RedisInsight finalizado | |
| cd dados_vps | |
| cat > dados_redisinsight${1:+_$1} <<EOL | |
| [ REDISINSIGHT ] | |
| Dominio do redisInsight: https://$url_redisinsight | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ REDISINSIGHT ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_redisinsight\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa de criar no primeiro acesso do RedisInsight\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa de criar no primeiro acesso do RedisInsight\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ████████╗██████╗ █████╗ ██████╗ ██████╗ █████╗ ██████╗ | |
| ## ╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗ | |
| ## ██║ ██████╔╝███████║██║ ██║ ███████║██████╔╝ | |
| ## ██║ ██╔══██╗██╔══██║██║ ██║ ██╔══██║██╔══██╗ | |
| ## ██║ ██║ ██║██║ ██║╚██████╗╚██████╗██║ ██║██║ ██║ | |
| ## ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_traccar() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_traccar | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Traccar (ex: traccar.sociosdigitales.pro): \e[0m" && read -r url_traccar | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_traccar | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do traccar | |
| echo -e "\e[33mDominio do Traccar:\e[97m $url_traccar\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_traccar | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO TRACCAR \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Traccar iniciado | |
| docker pull traccar/traccar:latest > /dev/null 2>&1 | |
| cd | |
| cd | |
| mkdir -p /opt/traccar${1:+_$1}/logs | |
| cat > traccar.xml <<EOL | |
| EOL | |
| mv traccar.xml /opt/traccar${1:+_$1}/ | |
| cd | |
| cd | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO TRACCAR \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Criando a stack traccar.yaml | |
| cat > traccar${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| traccar${1:+_$1}: | |
| image: traccar/traccar:latest | |
| volumes: | |
| - /opt/traccar${1:+_$1}/logs:/opt/traccar${1:+_$1}/logs:rw | |
| - /opt/traccar${1:+_$1}/traccar.xml:/opt/traccar${1:+_$1}/conf/traccar.xml:ro | |
| - traccar${1:+_$1}_data:/opt/traccar/ | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - JAVA_OPTS=-Xms1g -Xmx1g -Djava.net.preferIPv4Stack=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.traccar${1:+_$1}.rule=Host(\`$url_traccar\`) | |
| - traefik.http.services.traccar${1:+_$1}.loadbalancer.server.port=8082 | |
| - traefik.http.routers.traccar${1:+_$1}.service=traccar${1:+_$1} | |
| - traefik.http.routers.traccar${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.traccar${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.traccar${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| traccar${1:+_$1}_db: | |
| image: mysql:8.0 | |
| volumes: | |
| - traccar${1:+_$1}_db:/var/lib/mysql | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - MYSQL_ROOT_PASSWORD=rootpassword | |
| - MYSQL_DATABASE=traccar | |
| - MYSQL_USER=traccar | |
| - MYSQL_PASSWORD=$gerar_senha_mysql | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| traccar${1:+_$1}_data: | |
| external: true | |
| name: traccar${1:+_$1}_data | |
| traccar${1:+_$1}_db: | |
| external: true | |
| name: traccar${1:+_$1}_db | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do traccar" | |
| fi | |
| STACK_NAME="traccar${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c traccar.yaml traccar > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do traccar" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull traccar/traccar:latest mysql:8.0 | |
| ## Usa o serviço wait_traccar para verificar se o serviço esta online | |
| wait_stack traccar${1:+_$1}_traccar${1:+_$1} traccar${1:+_$1}_traccar${1:+_$1}_db | |
| telemetria Traccar finalizado | |
| cd dados_vps | |
| cat > dados_traccar${1:+_$1} <<EOL | |
| [ TRACCAR ] | |
| Dominio do Traccar: https://$url_traccar | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ TRACCAR ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_traccar\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Precisa de criar no primeiro acesso do traccar\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m Precisa de criar no primeiro acesso do traccar\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ███████╗██╗██████╗ ███████╗ ██████╗██████╗ █████╗ ██╗ ██╗██╗ | |
| ## ██╔════╝██║██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗██║ ██║██║ | |
| ## █████╗ ██║██████╔╝█████╗ ██║ ██████╔╝███████║██║ █╗ ██║██║ | |
| ## ██╔══╝ ██║██╔══██╗██╔══╝ ██║ ██╔══██╗██╔══██║██║███╗██║██║ | |
| ## ██║ ██║██║ ██║███████╗╚██████╗██║ ██║██║ ██║╚███╔███╔╝███████╗ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚══╝╚══╝ ╚══════╝ | |
| ferramenta_firecrawl() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_firecrawl | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/2\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Firecrawl (ex: firecrawl.sociosdigitales.pro): \e[0m" && read -r url_firecrawl | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/2\e[0m" | |
| echo -en "\e[33mDigite uma ApiKey da OpenAI: \e[0m" && read -r api_firecrawl | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_firecrawl | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do firecrawl | |
| echo -e "\e[33mDominio do Firecrawl:\e[97m $url_firecrawl\e[0m" | |
| echo "" | |
| ## Informação sobre URL do firecrawl | |
| echo -e "\e[33mApiKey OpenAi:\e[97m $api_firecrawl\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_firecrawl | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO FIRECRAWL \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Firecrawl iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO FIRECRAWL \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| apikey_firecrawl="fc-$(cat /dev/urandom | tr -dc 'a-f0-9' | head -c 32)" | |
| ## Criando a stack firecrawl.yaml | |
| cat > firecrawl${1:+_$1}.yaml <<EOL | |
| version: "3.8" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| firecrawl${1:+_$1}_api: | |
| image: oriondesign/firecrawl-api:latest | |
| command: [ "pnpm", "run", "start:production" ] | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Credencial | |
| - FIRECRAWL_API_KEY=$apikey_firecrawl | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| - REDIS_RATE_LIMIT_URL=redis://redis:6379 | |
| ## Dados da OpenAI | |
| - OPENAI_API_KEY=$api_firecrawl | |
| - OPENAI_BASE_URL=https://api.openai.com/v1 | |
| - MODEL_NAME=gpt-4o | |
| # Dados do ScrapingBee | |
| - SCRAPING_BEE_API_KEY= | |
| - HOST=0.0.0.0 | |
| # Dados do Webhook e Debug | |
| - SELF_HOSTED_WEBHOOK_URL= | |
| - LOGGING_LEVEL=DEBUG | |
| ## Dados do Supabase | |
| - USE_DB_AUTHENTICATION=false | |
| #- SUPABASE_URL= | |
| #- SUPABASE_ANON_TOKEN= | |
| #- SUPABASE_SERVICE_TOKEN= | |
| ## Outras configurações | |
| - PORT=3002 | |
| - NUM_WORKERS_PER_QUEUE=8 | |
| - FLY_PROCESS_GROUP=app | |
| - PLAYWRIGHT_MICROSERVICE_URL=http://firecrawl${1:+_$1}_playwright:3000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.firecrawl${1:+_$1}_api.rule=Host(\`$url_firecrawl\`) | |
| - traefik.http.services.firecrawl${1:+_$1}_api.loadbalancer.server.port=3002 | |
| - traefik.http.routers.firecrawl${1:+_$1}_api.service=firecrawl${1:+_$1}_api | |
| - traefik.http.routers.firecrawl${1:+_$1}_api.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.firecrawl${1:+_$1}_api.entrypoints=websecure | |
| - traefik.http.routers.firecrawl${1:+_$1}_api.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| firecrawl${1:+_$1}_worker: | |
| image: oriondesign/firecrawl-api:latest | |
| command: [ "pnpm", "run", "workers" ] | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Credencial | |
| - FIRECRAWL_API_KEY=$apikey_firecrawl | |
| ## Dados do Redis | |
| - REDIS_URL=redis://redis:6379 | |
| - REDIS_RATE_LIMIT_URL=redis://redis:6379 | |
| ## Dados da OpenAI | |
| - OPENAI_API_KEY=$api_firecrawl | |
| - OPENAI_BASE_URL=https://api.openai.com/v1 | |
| - MODEL_NAME=gpt-4o | |
| # Dados do ScrapingBee | |
| - SCRAPING_BEE_API_KEY= | |
| - HOST=0.0.0.0 | |
| # Dados do Webhook e Debug | |
| - SELF_HOSTED_WEBHOOK_URL= | |
| - LOGGING_LEVEL=DEBUG | |
| ## Dados do Supabase | |
| - USE_DB_AUTHENTICATION=false | |
| #- SUPABASE_URL= | |
| #- SUPABASE_ANON_TOKEN= | |
| #- SUPABASE_SERVICE_TOKEN= | |
| ## Outras configurações | |
| - PORT=3002 | |
| - NUM_WORKERS_PER_QUEUE=8 | |
| - FLY_PROCESS_GROUP=worker | |
| - PLAYWRIGHT_MICROSERVICE_URL=http://firecrawl${1:+_$1}_playwright:3000 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| firecrawl${1:+_$1}_playwright: | |
| image: oriondesign/firecrawl-playwright-service:latest | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - PORT=3000 | |
| - PROXY_SERVER=http://proxy-server.com:3128 | |
| - PROXY_USERNAME=admin | |
| - PROXY_PASSWORD=admin | |
| - BLOCK_MEDIA=true | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do firecrawl" | |
| fi | |
| STACK_NAME="firecrawl${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c firecrawl.yaml firecrawl > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do firecrawl" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull oriondesign/firecrawl-api:latest oriondesign/firecrawl-api:latest oriondesign/firecrawl-playwright-service:latest | |
| ## Usa o serviço wait_firecrawl para verificar se o serviço esta online | |
| wait_stack firecrawl${1:+_$1}_firecrawl${1:+_$1}_api firecrawl${1:+_$1}_firecrawl${1:+_$1}_worker firecrawl${1:+_$1}_firecrawl${1:+_$1}_playwright | |
| telemetria Firecrawl finalizado | |
| cd dados_vps | |
| cat > dados_firecrawl${1:+_$1} <<EOL | |
| [ FIRECRAWL ] | |
| Dominio do firecrawl: https://$url_firecrawl | |
| API Key: $apikey_firecrawl | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ FIRECRAWL ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio da API:\e[97m https://$url_firecrawl\e[0m" | |
| echo "" | |
| echo -e "\e[33mAPI Key:\e[97m $apikey_firecrawl\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗██╗ ██╗███████╗ █████╗ ██████╗ ██╗ | |
| ## ██║ ██║██║ ██║╚══███╔╝██╔══██╗██╔══██╗██║ | |
| ## ██║ █╗ ██║██║ ██║ ███╔╝ ███████║██████╔╝██║ | |
| ## ██║███╗██║██║ ██║ ███╔╝ ██╔══██║██╔═══╝ ██║ | |
| ## ╚███╔███╔╝╚██████╔╝███████╗██║ ██║██║ ██║ | |
| ## ╚══╝╚══╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_wuzapi() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_wuzapi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Wuzapi (ex: wuzapi.sociosdigitales.pro): \e[0m" && read -r url_wuzapi | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_wuzapi | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do wuzapi | |
| echo -e "\e[33mDominio do wuzapi:\e[97m $url_wuzapi\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_wuzapi | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO WUZAPI \e[33m[1/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Wuzapi iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Aqui vamos fazer uma verificação se já existe Postgres e redis instalado | |
| ## Se tiver ele vai criar um banco de dados no postgres ou perguntar se deseja apagar o que já existe e criar outro | |
| ## Verifica container postgres e cria banco no postgres | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "wuzapi${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "wuzapi${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO WUZAPI \e[33m[3/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| apikey_wuzapi=$(openssl rand -hex 16) | |
| encryption_key=$(openssl rand -hex 16) | |
| ## Criando a stack wuzapi.yaml | |
| cat > wuzapi${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| wuzapi${1:+_$1}: | |
| image: setupautomatizado/wuzapi-server:latest | |
| volumes: | |
| - wuzapi${1:+_$1}_dbdata:/app/dbdata | |
| - wuzapi${1:+_$1}_files:/app/files | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Credencial | |
| - WUZAPI_ADMIN_TOKEN=$apikey_wuzapi | |
| - SECRET_KEY=$encryption_key | |
| ## Dados do postgres | |
| - DB_HOST=postgres | |
| - DB_USER=postgres | |
| - DB_PASSWORD=$senha_postgres | |
| - DB_NAME=wuzapi${1:+_$1} | |
| - DB_PORT=5432 | |
| - DB_DRIVER=postgres | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| #resources: | |
| # limits: | |
| # cpus: "1" | |
| # memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.wuzapi${1:+_$1}.rule=Host(\`$url_wuzapi\`) | |
| - traefik.http.services.wuzapi${1:+_$1}.loadbalancer.server.port=8080 | |
| - traefik.http.routers.wuzapi${1:+_$1}.service=wuzapi${1:+_$1} | |
| - traefik.http.routers.wuzapi${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.wuzapi${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.wuzapi${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| wuzapi${1:+_$1}_dbdata: | |
| external: true | |
| name: wuzapi${1:+_$1}_dbdata | |
| wuzapi${1:+_$1}_files: | |
| external: true | |
| name: wuzapi${1:+_$1}_files | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do wuzapi" | |
| fi | |
| STACK_NAME="wuzapi${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c wuzapi.yaml wuzapi > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do wuzapi" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[4/4]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull ruben18salazar/wuzapi:api | |
| ## Usa o serviço wait_wuzapi para verificar se o serviço esta online | |
| wait_stack wuzapi${1:+_$1}_wuzapi${1:+_$1} | |
| telemetria Wuzapi finalizado | |
| cd dados_vps | |
| cat > dados_wuzapi${1:+_$1} <<EOL | |
| [ WUZAPI ] | |
| Dominio do wuzapi: https://$url_wuzapi | |
| Apikey: $apikey_wuzapi | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ WUZAPI ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_wuzapi\e[0m" | |
| echo "" | |
| echo -e "\e[33mDocumentação:\e[97m https://$url_wuzapi/api\e[0m" | |
| echo "" | |
| echo -e "\e[33mAPI Key:\e[97m $apikey_wuzapi\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗██████╗ █████╗ ██╗ ██╗██╗███╗ ██╗ ██████╗██████╗ ███╗ ███╗ | |
| ## ██║ ██╔╝██╔══██╗██╔══██╗╚██╗ ██╔╝██║████╗ ██║ ██╔════╝██╔══██╗████╗ ████║ | |
| ## █████╔╝ ██████╔╝███████║ ╚████╔╝ ██║██╔██╗ ██║ ██║ ██████╔╝██╔████╔██║ | |
| ## ██╔═██╗ ██╔══██╗██╔══██║ ╚██╔╝ ██║██║╚██╗██║ ██║ ██╔══██╗██║╚██╔╝██║ | |
| ## ██║ ██╗██║ ██║██║ ██║ ██║ ██║██║ ╚████║ ╚██████╗██║ ██║██║ ╚═╝ ██║ | |
| ## ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_krayincrm() { | |
| ## Verifica os recursos | |
| recursos 2 4 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_krayincrm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPaso$amarelo 1/6\e[0m" | |
| echo -en "\e[33mIngrese el dominio para Krayin CRM (ej: krayincrm.sociosdigitales.pro): \e[0m" && read -r url_krayincrm | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPaso$amarelo 2/6\e[0m" | |
| echo -en "\e[33mIngrese el Email para SMTP (ej: contacto@sociosdigitales.pro): \e[0m" && read -r email_krayincrm | |
| echo "" | |
| ## Sepera dominio | |
| dominio_smtp=$(echo "$email_krayincrm" | cut -d'@' -f2) | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPaso$amarelo 3/6\e[0m" | |
| echo -e "$amarelo--> Si no tiene un usuario de correo, use el propio correo a continuación" | |
| echo -en "\e[33mIngrese el Usuario para SMTP (ej: sociosdigitales o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_email_krayincrm | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPaso$amarelo 4/6\e[0m" | |
| echo -e "$amarelo--> Sin caracteres especiales: \!#$ | Si usa Gmail utilice la contraseña de aplicación" | |
| echo -en "\e[33mIngrese la Contraseña SMTP del Email (ej: @Contraseña123_): \e[0m" && read -r senha_email_krayincrm | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPaso$amarelo 5/6\e[0m" | |
| echo -en "\e[33mIngrese el Host SMTP del Email (ej: smtp.hostinger.com): \e[0m" && read -r smtp_email_krayincrm | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPaso$amarelo 6/6\e[0m" | |
| echo -en "\e[33mIngrese el puerto SMTP del Email (ej: 465): \e[0m" && read -r porta_smtp_krayincrm | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_krayincrm" -eq 465 ]; then | |
| smtp_secure_krayincrm=ssl | |
| else | |
| smtp_secure_krayincrm=tls | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_krayincrm | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do krayincrm | |
| echo -e "\e[33mDominio de Krayin CRM:\e[97m $url_krayincrm\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mEmail del SMTP:\e[97m $email_krayincrm\e[0m" | |
| echo "" | |
| ## Informação sobre Email | |
| echo -e "\e[33mUsuario del SMTP:\e[97m $usuario_email_krayincrm\e[0m" | |
| echo "" | |
| ## Informação sobre Senha do Email | |
| echo -e "\e[33mContraseña del Email:\e[97m $senha_email_krayincrm\e[0m" | |
| echo "" | |
| ## Informação sobre Host SMTP | |
| echo -e "\e[33mHost SMTP del Email:\e[97m $smtp_email_krayincrm\e[0m" | |
| echo "" | |
| ## Informação sobre Porta SMTP | |
| echo -e "\e[33mPuerto SMTP del Email:\e[97m $porta_smtp_krayincrm\e[0m" | |
| echo "" | |
| ## Informação sobre Secure SMTP | |
| echo -e "\e[33mSecure SMTP del Email:\e[97m $smtp_secure_krayincrm\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "¿Las respuestas son correctas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_krayincrm | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO LA INSTALACIÓN DE KRAYIN CRM \e[33m[1/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria "Krayin CRM" "iniciado" | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO KRAYIN CRM \e[33m[2/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| secret_key="base64:$(openssl rand -base64 32)" | |
| senha_postgres_krayin=$(openssl rand -hex 16) | |
| ## Criando a stack krayincrm.yaml | |
| cat > krayincrm${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| krayincrm${1:+_$1}_app: | |
| image: francisbreit/crmk:v2.0.5-fr | |
| volumes: | |
| - krayincrm${1:+_$1}_data:/var/www/html/ | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| ## Dados de Acesso (URLs e domínios) | |
| - APP_URL=https://$url_krayincrm | |
| - SANCTUM_STATEFUL_DOMAINS=https://$url_krayincrm/public | |
| - krayin_PUBLIC_URL=https://$url_krayincrm | |
| - krayin_CADDY_ADDRESSES=:80 | |
| ## Configurações Globais da Aplicação | |
| - APP_NAME=Krayin CRM - Orion | |
| - APP_LOCALE=pt_BR | |
| - APP_CURRENCY=BRL | |
| - APP_TIMEZONE=America/Sao_Paulo | |
| - LOG_CHANNEL=stack | |
| - LOG_LEVEL=debug | |
| - APP_DEBUG=false | |
| - BROADCAST_DRIVER=log | |
| ## Configurações Adicionais de Cache e Sessões | |
| - CACHE_DRIVER=file | |
| - QUEUE_CONNECTION=sync | |
| - SESSION_DRIVER=file | |
| - SESSION_LIFETIME=120 | |
| ## Configurações de Email | |
| - MAIL_MAILER=smtp | |
| - MAIL_FROM_ADDRESS=$email_krayincrm | |
| - MAIL_DOMAIN=$dominio_smtp | |
| - MAIL_USERNAME=$usuario_email_krayincrm | |
| - MAIL_PASSWORD=$senha_email_krayincrm | |
| - MAIL_HOST=$smtp_email_krayincrm | |
| - MAIL_PORT=$porta_smtp_krayincrm | |
| - MAIL_ENCRYPTION=$smtp_secure_krayincrm | |
| - MAIL_FROM_NAME=Krayin CRM | |
| ## Configurações do Banco de Dados | |
| - DB_CONNECTION=mysql | |
| - DB_HOST=krayin${1:+_$1}_db | |
| - DB_PORT=3306 | |
| - DB_DATABASE=krayincrm${1:+_$1} | |
| - DB_USERNAME=root | |
| - DB_PREFIX= | |
| - DB_PASSWORD=$senha_postgres_krayin | |
| ## Configurações do Redis | |
| - REDIS_HOST=krayin${1:+_$1}_redis | |
| - REDIS_PASSWORD=null | |
| - REDIS_PORT=6379 | |
| - MEMCACHED_HOST=127.0.0.1 | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "2" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.krayincrm${1:+_$1}_app.rule=Host(\`$url_krayincrm\`) && PathPrefix(\`/\`) ## Url do Krayin | |
| - traefik.http.services.krayincrm${1:+_$1}_app.loadbalancer.server.port=80 | |
| - traefik.http.routers.krayincrm${1:+_$1}_app.service=krayincrm${1:+_$1}_app | |
| - traefik.http.routers.krayincrm${1:+_$1}_app.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.krayincrm${1:+_$1}_app.entrypoints=websecure | |
| - traefik.http.routers.krayincrm${1:+_$1}_app.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| krayin${1:+_$1}_db: | |
| image: percona/percona-server:latest | |
| command: | |
| - --character-set-server=utf8mb4 | |
| - --collation-server=utf8mb4_general_ci | |
| - --sql-mode= | |
| - --default-authentication-plugin=mysql_native_password | |
| - --max-allowed-packet=512MB | |
| - --expire_logs_days=7 | |
| - --max_binlog_size=100M | |
| volumes: | |
| - krayin${1:+_$1}_db:/var/lib/mysql | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| environment: | |
| - MYSQL_ROOT_PASSWORD=$senha_postgres_krayin | |
| - MYSQL_DATABASE=krayincrm${1:+_$1} | |
| - TZ=America/Sao_Paulo | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| krayin${1:+_$1}_redis: | |
| image: redis:latest | |
| command: > | |
| redis-server | |
| --port 6379 | |
| --appendonly yes | |
| --save 900 1 | |
| --save 300 10 | |
| --save 60 10000 | |
| --appendfsync everysec | |
| volumes: | |
| - krayin${1:+_$1}_redis:/data | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| krayincrm${1:+_$1}_data: | |
| external: true | |
| name: krayincrm${1:+_$1}_data | |
| krayin${1:+_$1}_db: | |
| external: true | |
| name: krayin${1:+_$1}_db | |
| krayin${1:+_$1}_redis: | |
| external: true | |
| name: krayin${1:+_$1}_redis | |
| networks: | |
| $nome_rede_interna: | |
| external: true | |
| name: $nome_rede_interna | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Creando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Creando Stack" | |
| echo "No se pudo crear el stack de Krayin CRM" | |
| fi | |
| STACK_NAME="krayincrm${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c krayincrm.yaml krayincrm > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "No se pudo desplegar el stack de Krayin CRM" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVICIO \e[33m[3/3]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull francisbreit/crmk:v2.0.5-fr percona/percona-server:latest redis:latest | |
| ## Usa o serviço wait_krayincrm para verificar se o serviço esta online | |
| wait_stack krayincrm${1:+_$1}_krayincrm${1:+_$1}_app krayincrm${1:+_$1}_krayin${1:+_$1}_db krayincrm${1:+_$1}_krayin${1:+_$1}_redis | |
| telemetria "Krayin CRM" "finalizado" | |
| cd dados_vps | |
| cat > dados_krayincrm${1:+_$1} <<EOL | |
| [ KRAYIN CRM ] | |
| Dominio de Krayin CRM: https://$url_krayincrm | |
| Usuario: Debe crearlo en el primer acceso a Krayin CRM | |
| Contraseña: Debe crearla en el primer acceso a Krayin CRM | |
| Documentación: https://$url_krayincrm/api/documentation | |
| ---- | |
| Host Mysql: krayin${1:+_$1}_db | |
| Puerto Mysql: 3306 | |
| Usuario Mysql: root | |
| Contraseña Mysql: $senha_postgres_krayin | |
| Database Mysql: krayincrm${1:+_$1} | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ KRAYIN CRM ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_krayincrm\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m Debe crearlo en el primer acceso a Krayin CRM\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña:\e[97m Debe crearla en el primer acceso a Krayin CRM\e[0m" | |
| echo "" | |
| echo -e "\e[33mDocumentación:\e[97m https://$url_krayincrm/api/documentation\e[0m" | |
| echo "" | |
| echo -e "\e[33mHost Mysql:\e[97m krayin${1:+_$1}_db\e[0m" | |
| echo "" | |
| echo -e "\e[33mPuerto Mysql:\e[97m 3306\e[0m" | |
| echo "" | |
| echo -e "\e[33mDatabase Mysql:\e[97m krayincrm${1:+_$1}\e[0m" | |
| echo "" | |
| echo -e "\e[33mPrefijo:\e[97m vacío${1:+_$1}\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario Mysql:\e[97m root\e[0m" | |
| echo "" | |
| echo -e "\e[33mContraseña Mysql:\e[97m $senha_postgres_krayin\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██████╗ ██╗ █████╗ ███╗ ██╗██╗ ██╗ █████╗ | |
| ## ██╔══██╗██║ ██╔══██╗████╗ ██║██║ ██╔╝██╔══██╗ | |
| ## ██████╔╝██║ ███████║██╔██╗ ██║█████╔╝ ███████║ | |
| ## ██╔═══╝ ██║ ██╔══██║██║╚██╗██║██╔═██╗ ██╔══██║ | |
| ## ██║ ███████╗██║ ██║██║ ╚████║██║ ██╗██║ ██║ | |
| ## ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝ | |
| ferramenta_planka() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_planka | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/10\e[0m" | |
| echo -en "\e[33mDigite o dominio para o Planka (ex: planka.sociosdigitales.pro): \e[0m" && read -r url_planka | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 2/10\e[0m" | |
| echo -en "\e[33mDigite o nome do usuario administrador (ex: Willian): \e[0m" && read -r nome_adm_planka | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 3/10\e[0m" | |
| echo -en "\e[33mDigite o email do administrador (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_adm_planka | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 4/10\e[0m" | |
| echo -en "\e[33mDigite o usuario do administrador (ex: admin): \e[0m" && read -r user_adm_planka | |
| echo "" | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 5/10\e[0m" | |
| echo -en "\e[33mDigite a senha do administrador (ex: @Senha123_): \e[0m" && read -r senha_adm_planka | |
| echo "" | |
| ##Pergunta o Email SMTP | |
| echo -e "\e[97mPasso$amarelo 6/10\e[0m" | |
| echo -en "\e[33mDigite o Email para SMTP (ex: contato@sociosdigitales.pro): \e[0m" && read -r email_planka | |
| echo "" | |
| ##Pergunta o usuário do Email SMTP | |
| echo -e "\e[97mPasso$amarelo 7/10\e[0m" | |
| echo -e "$amarelo--> Caso não tiver um usuario do email, use o proprio email abaixo" | |
| echo -en "\e[33mDigite o Usuário para SMTP (ex: sociospro o contacto@sociosdigitales.pro): \e[0m" && read -r usuario_email_planka | |
| echo "" | |
| ## Pergunta a senha do SMTP | |
| echo -e "\e[97mPasso$amarelo 8/10\e[0m" | |
| echo -e "$amarelo--> Sem caracteres especiais: \!#$ | Se estiver usando gmail use a senha de app" | |
| echo -en "\e[33mDigite a Senha SMTP do Email (ex: @Senha123_): \e[0m" && read -r senha_email_planka | |
| echo "" | |
| ## Pergunta o Host SMTP do email | |
| echo -e "\e[97mPasso$amarelo 9/10\e[0m" | |
| echo -en "\e[33mDigite o Host SMTP do Email (ex: smtp.hostinger.com): \e[0m" && read -r smtp_email_planka | |
| echo "" | |
| ## Pergunta a porta SMTP do email | |
| echo -e "\e[97mPasso$amarelo 10/10\e[0m" | |
| echo -en "\e[33mDigite a porta SMTP do Email (ex: 465): \e[0m" && read -r porta_smtp_planka | |
| echo "" | |
| ## Verifica se a porta é 465, se sim deixa o ssl true, se não, deixa false | |
| if [ "$porta_smtp_planka" -eq 465 ]; then | |
| smtp_secure_planka=true | |
| tls_reject=false | |
| else | |
| smtp_secure_planka=false | |
| tls_reject=true | |
| fi | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_planka | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mDominio do Planka:\e[97m $url_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mNome do usuario:\e[97m $nome_adm_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mEmail do Usuario:\e[97m $email_adm_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mUsuario do Admin:\e[97m $user_adm_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mSenha do Admin:\e[97m $senha_adm_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mEmail SMTP:\e[97m $email_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mUsuario SMTP:\e[97m $usuario_email_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mSenha SMTP:\e[97m $senha_email_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mHost SMTP:\e[97m $smtp_email_planka\e[0m" | |
| echo "" | |
| ## Informação sobre URL do planka | |
| echo -e "\e[33mPorta SMTP:\e[97m $porta_smtp_planka\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_planka | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Volta para o inicio do loop com as perguntas | |
| fi | |
| done | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INICIANDO A INSTALAÇÃO DO PLANKA \e[33m[1/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| telemetria Planka iniciado | |
| ## Nadaaaaa | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO POSTGRES \e[33m[2/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Cansei já de explicar o que isso faz kkkk | |
| verificar_container_postgres | |
| if [ $? -eq 0 ]; then | |
| echo "1/3 - [ OK ] - Postgres já instalado" | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| echo "2/3 - [ OK ] - Copiando senha do Postgres" | |
| criar_banco_postgres_da_stack "planka${1:+_$1}" | |
| echo "3/3 - [ OK ] - Criando banco de dados" | |
| echo "" | |
| else | |
| ferramenta_postgres | |
| pegar_senha_postgres > /dev/null 2>&1 | |
| criar_banco_postgres_da_stack "planka${1:+_$1}" | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO/INSTALANDO REDIS \e[33m[3/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Verifica/instala o Redis | |
| verificar_container_redis | |
| if [ $? -eq 0 ]; then | |
| echo "1/1 - [ OK ] - Redis já instalado" | |
| echo "" | |
| else | |
| ferramenta_redis | |
| fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• INSTALANDO PLANKA \e[33m[4/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| secret_key=$(openssl rand -hex 16) | |
| ## Criando a stack planka.yaml | |
| cat > planka${1:+_$1}.yaml <<EOL | |
| version: "3.7" | |
| services: | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| planka${1:+_$1}: | |
| image: ghcr.io/plankanban/planka:latest | |
| networks: | |
| - $nome_rede_interna ## Nome da rede interna | |
| volumes: | |
| - planka${1:+_$1}_avatars:/app/public/user-avatars | |
| - planka${1:+_$1}_backgrounds:/app/public/project-background-images | |
| - planka${1:+_$1}_attachments:/app/private/attachments | |
| environment: | |
| ## Dados de acesso | |
| - BASE_URL=https://$url_planka | |
| - DEFAULT_ADMIN_NAME=$nome_adm_planka | |
| - DEFAULT_ADMIN_USERNAME=$user_adm_planka | |
| - DEFAULT_ADMIN_PASSWORD=$senha_adm_planka | |
| - DEFAULT_ADMIN_EMAIL=$email_adm_planka | |
| ## Dados do SMTP | |
| - DATABASE_URL=postgresql://postgres:$senha_postgres@postgres:5432/planka${1:+_$1} | |
| ## Secret Keys | |
| - SECRET_KEY=$secret_key | |
| ## Configurações do Planaka | |
| - ALLOW_ALL_TO_CREATE_PROJECTS=true ## true = Permite que qualquer usuário crie projetos | |
| ## Dados SMTP | |
| - SMTP_NAME=Planka | |
| - SMTP_FROM=Planka <$email_planka> | |
| - SMTP_USER=$usuario_email_planka | |
| - SMTP_PASSWORD=$senha_email_planka | |
| - SMTP_HOST=$smtp_email_planka | |
| - SMTP_PORT=$porta_smtp_planka | |
| - SMTP_SECURE=$smtp_secure_planka | |
| - SMTP_TLS_REJECT_UNAUTHORIZED=$tls_reject | |
| ## Configurar Webhook Global | |
| #- WEBHOOKS=[{ | |
| #- "url": "https://webhook.dominio.com", | |
| #- "accessToken": "token_se_tiver", | |
| #- "events": ["cardCreate", "cardUpdate", "cardDelete"], | |
| #- "excludedEvents": ["notificationCreate", "notificationUpdate"] | |
| #- }] | |
| deploy: | |
| mode: replicated | |
| replicas: 1 | |
| placement: | |
| constraints: | |
| - node.role == manager | |
| resources: | |
| limits: | |
| cpus: "1" | |
| memory: 1024M | |
| labels: | |
| - traefik.enable=true | |
| - traefik.http.routers.planka${1:+_$1}.rule=Host(\`$url_planka\`) | |
| - traefik.http.services.planka${1:+_$1}.loadbalancer.server.port=1337 | |
| - traefik.http.routers.planka${1:+_$1}.service=planka${1:+_$1} | |
| - traefik.http.routers.planka${1:+_$1}.tls.certresolver=letsencryptresolver | |
| - traefik.http.routers.planka${1:+_$1}.entrypoints=websecure | |
| - traefik.http.routers.planka${1:+_$1}.tls=true | |
| ## -------------------- SOCIOS DIGITALES -------------------- ## | |
| volumes: | |
| planka${1:+_$1}_avatars: | |
| external: true | |
| name: planka${1:+_$1}_avatars | |
| planka${1:+_$1}_backgrounds: | |
| external: true | |
| name: planka${1:+_$1}_backgrounds | |
| planka${1:+_$1}_attachments: | |
| external: true | |
| name: planka${1:+_$1}_attachments | |
| networks: | |
| $nome_rede_interna: ## Nome da rede interna | |
| name: $nome_rede_interna ## Nome da rede interna | |
| external: true | |
| EOL | |
| if [ $? -eq 0 ]; then | |
| echo "1/10 - [ OK ] - Criando Stack" | |
| else | |
| echo "1/10 - [ OFF ] - Criando Stack" | |
| echo "Não foi possivel criar a stack do planka" | |
| fi | |
| STACK_NAME="planka${1:+_$1}" | |
| stack_editavel # > /dev/null 2>&1 | |
| #docker stack deploy --prune --resolve-image always -c planka.yaml planka > /dev/null 2>&1 | |
| #if [ $? -eq 0 ]; then | |
| # echo "2/2 - [ OK ] - Deploy Stack" | |
| #else | |
| # echo "2/2 - [ OFF ] - Deploy Stack" | |
| # echo "Não foi possivel Subir a stack do planka" | |
| #fi | |
| ## Mensagem de Passo | |
| echo -e "\e[97m• VERIFICANDO SERVIÇO \e[33m[5/5]\e[0m" | |
| echo "" | |
| sleep 1 | |
| ## Baixando imagens: | |
| pull ghcr.io/plankanban/planka:latest | |
| ## Usa o serviço wait_planka para verificar se o serviço esta online | |
| wait_stack planka${1:+_$1}_planka${1:+_$1} | |
| telemetria Planka finalizado | |
| cd dados_vps | |
| cat > dados_planka${1:+_$1} <<EOL | |
| [ PLANKA ] | |
| Dominio do Planka: https://$url_planka | |
| Usuario: $user_adm_planka | |
| Email: $email_adm_planka | |
| Senha: $senha_adm_planka | |
| EOL | |
| cd | |
| cd | |
| ## Espera 30 segundos | |
| wait_30_sec | |
| ## Mensagem de finalizado | |
| instalado_msg | |
| ## Mensagem de Guarde os Dados | |
| guarde_os_dados_msg | |
| ## Dados da Aplicação: | |
| echo -e "\e[32m[ PLANKA ]\e[0m" | |
| echo "" | |
| echo -e "\e[33mDominio:\e[97m https://$url_planka\e[0m" | |
| echo "" | |
| echo -e "\e[33mUsuario:\e[97m $user_adm_planka\e[0m" | |
| echo "" | |
| echo -e "\e[33mEmail:\e[97m $email_adm_planka\e[0m" | |
| echo "" | |
| echo -e "\e[33mSenha:\e[97m $senha_adm_planka\e[0m" | |
| ## Creditos do instalador | |
| creditos_msg | |
| ## Pergunta se deseja instalar outra aplicação | |
| requisitar_outra_instalacao | |
| } | |
| ## ██╗ ██╗██████╗ ██████╗ ██████╗ ██████╗ ███╗ ██╗███╗ ██╗███████╗ ██████╗████████╗ | |
| ## ██║ ██║██╔══██╗██╔══██╗ ██╔════╝██╔═══██╗████╗ ██║████╗ ██║██╔════╝██╔════╝╚══██╔══╝ | |
| ## ██║ █╗ ██║██████╔╝██████╔╝ ██║ ██║ ██║██╔██╗ ██║██╔██╗ ██║█████╗ ██║ ██║ | |
| ## ██║███╗██║██╔═══╝ ██╔═══╝ ██║ ██║ ██║██║╚██╗██║██║╚██╗██║██╔══╝ ██║ ██║ | |
| ## ╚███╔███╔╝██║ ██║ ╚██████╗╚██████╔╝██║ ╚████║██║ ╚████║███████╗╚██████╗ ██║ | |
| ## ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═╝ | |
| ferramenta_wppconnect() { | |
| ## Verifica os recursos | |
| recursos 1 1 && continue || return | |
| ## Limpa o terminal | |
| clear | |
| ## Ativa a função dados para pegar os dados da vps | |
| dados | |
| ## Mostra o nome da aplicação | |
| nome_wppconnect | |
| ## Mostra mensagem para preencher informações | |
| preencha_as_info | |
| ## Inicia um Loop até os dados estarem certos | |
| while true; do | |
| ##Pergunta o Dominio para a ferramenta | |
| echo -e "\e[97mPasso$amarelo 1/1\e[0m" | |
| echo -en "\e[33mDigite o dominio do WPPConnect (ex: wppconnect.sociosdigitales.pro): \e[0m" && read -r url_wppconnect | |
| echo "" | |
| ## Limpa o terminal | |
| clear | |
| ## Mostra o nome da aplicação | |
| nome_wppconnect | |
| ## Mostra mensagem para verificar as informações | |
| conferindo_as_info | |
| ## Informação sobre URL do wppconnect | |
| echo -e "\e[33mDominio do WppConnect:\e[97m $url_wppconnect_front\e[0m" | |
| echo "" | |
| ## Pergunta se as respostas estão corretas | |
| read -p "As respostas estão corretas? (Y/N): " confirmacao | |
| if [ "$confirmacao" = "Y" ] || [ "$confirmacao" = "y" ]; then | |
| ## Digitou Y para confirmar que as informações estão corretas | |
| ## Limpar o terminal | |
| clear | |
| ## Mostrar mensagem de Instalando | |
| instalando_msg | |
| ## Sai do Loop | |
| break | |
| else | |
| ## Digitou N para dizer que as informações não estão corretas. | |
| ## Limpar o terminal | |
| clear | |
| ## Mostra o nome da ferramenta | |
| nome_wppconnect | |
| ## Mostra mensagem para preencher inform |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment