Skip to content

Instantly share code, notes, and snippets.

@Santosl2
Created July 10, 2025 21:50
Show Gist options
  • Select an option

  • Save Santosl2/be7f694ccfd7df9598b0ba64087d7f7a to your computer and use it in GitHub Desktop.

Select an option

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.
#!/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
## Email
- 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
## Email
- 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