ajuste da conexão com redis para contemplar usuarios que usam senha no redis ou redis cloud

This commit is contained in:
Fábio Cavalcanti 2025-01-17 19:06:53 -03:00
parent 0b5ad96508
commit 0745132b98
9 changed files with 236 additions and 64 deletions

View File

@ -1,12 +1,54 @@
#-----------------------------------------------
# Configurações do Servidor
#-----------------------------------------------
# Configurações do UVICORN
UVICORN_PORT=8005
UVICORN_HOST=0.0.0.0
UVICORN_RELOAD=true
UVICORN_WORKERS=1
# Domínios da Aplicação
API_DOMAIN=seu.dominio.com # Subdomínio para a API (ex: api.seudominio.com)
MANAGER_DOMAIN=manager.seu.dominio.com # Subdomínio para o Manager (ex: manager.seudominio.com)
# Debug e Logs # Debug e Logs
DEBUG_MODE=false DEBUG_MODE=false
LOG_LEVEL=INFO LOG_LEVEL=INFO
# Credenciais do Gerenciador #-----------------------------------------------
MANAGER_USER=admin # Credenciais de Acesso
MANAGER_PASSWORD=impacteai2024 #-----------------------------------------------
# Credenciais do Painel Administrativo
MANAGER_USER=seu_usuario_admin # Username para acessar o painel admin
MANAGER_PASSWORD=sua_senha_segura # Senha para acessar o painel admin
# Configurações do Servidor #-----------------------------------------------
FASTAPI_PORT=8005 # Configurações do Redis
STREAMLIT_PORT=8501 #-----------------------------------------------
HOST=0.0.0.0 # Configurações Básicas
REDIS_HOST=redis-transcrevezap # Host do Redis (use redis-transcrevezap para docker-compose)
REDIS_PORT=6380 # Porta do Redis
REDIS_DB=0 # Número do banco de dados Redis
# Autenticação Redis (opcional)
REDIS_USERNAME= # Deixe em branco se não usar autenticação
REDIS_PASSWORD= # Deixe em branco se não usar autenticação
#-----------------------------------------------
# Configurações de Rede
#-----------------------------------------------
# Nome da Rede Docker Externa
NETWORK_NAME=sua_rede_externa # Nome da sua rede Docker externa
#-----------------------------------------------
# Configurações do Traefik (se estiver usando)
#-----------------------------------------------
# Certificados SSL
SSL_RESOLVER=letsencryptresolver # Resolvedor SSL do Traefik
SSL_ENTRYPOINT=websecure # Entrypoint SSL do Traefik
#-----------------------------------------------
# Portas da Aplicação
#-----------------------------------------------
API_PORT=8005 # Porta para a API FastAPI
MANAGER_PORT=8501 # Porta para o Streamlit Manager

View File

@ -1,41 +1,46 @@
# Usar uma imagem oficial do Python como base # Imagem base do Python 3.10-slim
FROM python:3.10-slim FROM python:3.10-slim
# Instalar dependências do sistema, incluindo redis-tools e tzdata para fuso horário # Configuração básica de timezone
ENV TZ=America/Sao_Paulo
# Instalação de dependências mínimas necessárias
RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \
redis-tools \ redis-tools \
tzdata \ tzdata \
&& apt-get clean && rm -rf /var/lib/apt/lists/* dos2unix \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
# Configurar o fuso horário # Configuração do ambiente de trabalho
ENV TZ=America/Sao_Paulo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# Definir o diretório de trabalho
WORKDIR /app WORKDIR /app
# Copiar o arquivo requirements.txt e instalar dependências # Instalação das dependências Python
COPY requirements.txt . COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt RUN pip install --no-cache-dir -r requirements.txt
# Copiar todo o código da aplicação # Copia dos arquivos da aplicação
COPY . . COPY . .
# Garantir que o diretório static existe # Preparação do diretório de estáticos
RUN mkdir -p /app/static RUN mkdir -p /app/static && \
if [ -d "static" ]; then cp -r static/* /app/static/ 2>/dev/null || true; fi
# Copiar arquivos estáticos para o diretório apropriado # Configuração do script de inicialização
COPY static/ /app/static/ RUN chmod +x start.sh && \
dos2unix start.sh && \
apt-get purge -y dos2unix && \
apt-get autoremove -y
# Garantir permissões de execução ao script inicial # Portas da aplicação
COPY start.sh .
RUN chmod +x start.sh
# Converter possíveis caracteres de retorno de carro do Windows
RUN apt-get update && apt-get install -y dos2unix && dos2unix start.sh && apt-get remove -y dos2unix && apt-get autoremove -y && apt-get clean
# Expor as portas usadas pela aplicação
EXPOSE 8005 8501 EXPOSE 8005 8501
# Definir o comando inicial # Valores padrão para Redis
ENV REDIS_HOST=redis-transcrevezap \
REDIS_PORT=6380 \
REDIS_DB=0
# Comando de inicialização
CMD ["/bin/bash", "/app/start.sh"] CMD ["/bin/bash", "/app/start.sh"]

View File

@ -1,6 +1,7 @@
import logging import logging
import redis import redis
import os import os
from utils import create_redis_client
# Configuração de logging com cores e formatação melhorada # Configuração de logging com cores e formatação melhorada
class ColoredFormatter(logging.Formatter): class ColoredFormatter(logging.Formatter):
@ -30,12 +31,7 @@ logger.addHandler(handler)
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
# Conexão com o Redis # Conexão com o Redis
redis_client = redis.Redis( redis_client = create_redis_client()
host=os.getenv('REDIS_HOST', 'localhost'),
port=int(os.getenv('REDIS_PORT', 6380)),
db=int(os.getenv('REDIS_DB', '0')),
decode_responses=True
)
class Settings: class Settings:
"""Classe para gerenciar configurações do sistema.""" """Classe para gerenciar configurações do sistema."""

View File

@ -21,6 +21,9 @@ services:
- REDIS_HOST=redis-transcrevezap - REDIS_HOST=redis-transcrevezap
- REDIS_PORT=6380 # Porta personalizada para o Redis do TranscreveZAP - REDIS_PORT=6380 # Porta personalizada para o Redis do TranscreveZAP
- REDIS_DB=0 # Opcional: pode ser removida para usar o valor padrão - REDIS_DB=0 # Opcional: pode ser removida para usar o valor padrão
# Autenticação Redis (opcional - descomente se necessário, se estiver usando autenticação)
# - REDIS_USERNAME=${REDIS_USERNAME:-} # Nome do usuário definido no comando do Redis
# - REDIS_PASSWORD=${REDIS_PASSWORD:-} # Senha definida no comando do Redis (sem o '>')
depends_on: depends_on:
- redis-transcrevezap - redis-transcrevezap
deploy: deploy:
@ -49,7 +52,20 @@ services:
redis-transcrevezap: redis-transcrevezap:
image: redis:6 image: redis:6
command: redis-server --port 6380 --appendonly yes # 1. Configuração SEM autenticação (padrão):
command: redis-server --port 6380 --appendonly yes
# 2. Configuração COM autenticação (descomente e ajuste se necessário):
# command: >
# redis-server
# --port 6380
# --appendonly yes
# --user seuusuario on '>minhasenha' '~*' '+@all'
# # Explicação dos parâmetros:
# # --user seuusuario: nome do usuário
# # on: indica início da configuração do usuário
# # '>minhasenha': senha do usuário (mantenha o '>')
# # '~*': permite acesso a todas as chaves
# # '+@all': concede todas as permissões
volumes: volumes:
- redis_transcrevezap_data:/data - redis_transcrevezap_data:/data
networks: networks:

View File

@ -6,6 +6,7 @@ from storage import StorageHandler
import plotly.express as px import plotly.express as px
import os import os
import redis import redis
from utils import create_redis_client
# 1. Primeiro: Configuração da página # 1. Primeiro: Configuração da página
st.set_page_config( st.set_page_config(
@ -16,11 +17,7 @@ st.set_page_config(
) )
# 2. Depois: Inicialização do Redis # 2. Depois: Inicialização do Redis
redis_client = redis.Redis( redis_client = create_redis_client()
host=os.getenv('REDIS_HOST', 'localhost'),
port=int(os.getenv('REDIS_PORT', 6380)),
decode_responses=True
)
# 3. Funções de sessão (atualizado para usar st.query_params) # 3. Funções de sessão (atualizado para usar st.query_params)
def init_session(): def init_session():

View File

@ -40,40 +40,70 @@ Antes de começar, certifique-se de ter os seguintes requisitos:
version: "3.7" version: "3.7"
services: services:
# Serviço principal do TranscreveZAP
tcaudio: tcaudio:
image: impacteai/transcrevezap:latest image: impacteai/transcrevezap:latest
build: build:
context: . context: .
ports: ports:
- 8005:8005 # Porta para FastAPI - "8005:8005" # API FastAPI - Use esta porta para configurar o webhook
- 8501:8501 # Porta para Streamlit - "8501:8501" # Interface Web Streamlit - Acesse o painel por esta porta
environment: environment:
# Configurações do Servidor
- UVICORN_PORT=8005 - UVICORN_PORT=8005
- UVICORN_HOST=0.0.0.0 - UVICORN_HOST=0.0.0.0
- UVICORN_RELOAD=true - UVICORN_RELOAD=true
- UVICORN_WORKERS=1 - UVICORN_WORKERS=1
- API_DOMAIN=localhost - API_DOMAIN=localhost # Para uso local mantenha localhost
# Modo Debug e Logs
- DEBUG_MODE=false - DEBUG_MODE=false
- LOG_LEVEL=INFO - LOG_LEVEL=INFO
# Credenciais do Painel Admin (ALTERE ESTAS CREDENCIAIS!)
- MANAGER_USER=admin - MANAGER_USER=admin
- MANAGER_PASSWORD=sua_senha_aqui - MANAGER_PASSWORD=sua_senha_aqui
- REDIS_HOST=redis-transcrevezap
- REDIS_PORT=6380 # Porta personalizada para o Redis do TranscreveZAP # Configurações do Redis
- REDIS_DB=0 # Opcional: pode ser removida para usar o valor padrão - REDIS_HOST=redis-transcrevezap # Nome do serviço Redis
- REDIS_PORT=6380 # Porta do Redis
- REDIS_DB=0 # Banco de dados Redis
# Autenticação Redis (opcional - descomente se necessário)
# - REDIS_USERNAME=seu_usuario # Nome do usuário Redis
# - REDIS_PASSWORD=sua_senha # Senha do Redis
depends_on: depends_on:
- redis-transcrevezap - redis-transcrevezap
command: ./start.sh command: ./start.sh
# Serviço Redis para armazenamento de dados
redis-transcrevezap: redis-transcrevezap:
image: redis:6 image: redis:6
# Escolha UMA das configurações do Redis abaixo:
# 1. Configuração simples SEM autenticação:
command: redis-server --port 6380 --appendonly yes command: redis-server --port 6380 --appendonly yes
# 2. Configuração COM autenticação (descomente e ajuste se necessário):
# command: >
# redis-server
# --port 6380
# --appendonly yes
# --user admin on '>sua_senha' '~*' '+@all'
volumes: volumes:
- redis_transcrevezap_data:/data - redis_transcrevezap_data:/data # Persistência dos dados
# Volumes para persistência
volumes: volumes:
redis_transcrevezap_data: redis_transcrevezap_data:
driver: local driver: local
# Instruções de Uso:
# 1. Salve este arquivo como docker-compose.yml
# 2. Execute com: docker compose up -d
# 3. Acesse o painel em: http://localhost:8501
# 4. Configure o webhook da Evolution API para: http://localhost:8005/transcreve-audios
``` ```
2. Inicie os serviços: 2. Inicie os serviços:
@ -172,6 +202,9 @@ services:
- REDIS_HOST=redis-transcrevezap - REDIS_HOST=redis-transcrevezap
- REDIS_PORT=6380 # Porta personalizada para o Redis do TranscreveZAP - REDIS_PORT=6380 # Porta personalizada para o Redis do TranscreveZAP
- REDIS_DB=0 # Opcional: pode ser removida para usar o valor padrão - REDIS_DB=0 # Opcional: pode ser removida para usar o valor padrão
# Autenticação Redis (opcional - descomente se necessário, se estiver usando autenticação)
# - REDIS_USERNAME=${REDIS_USERNAME:-} # Nome do usuário definido no comando do Redis
# - REDIS_PASSWORD=${REDIS_PASSWORD:-} # Senha definida no comando do Redis (sem o '>')
depends_on: depends_on:
- redis-transcrevezap - redis-transcrevezap
deploy: deploy:
@ -200,7 +233,20 @@ services:
redis-transcrevezap: redis-transcrevezap:
image: redis:6 image: redis:6
command: redis-server --port 6380 --appendonly yes # 1. Configuração SEM autenticação (padrão):
command: redis-server --port 6380 --appendonly yes
# 2. Configuração COM autenticação (descomente e ajuste se necessário):
# command: >
# redis-server
# --port 6380
# --appendonly yes
# --user seuusuario on '>minhasenha' '~*' '+@all'
# # Explicação dos parâmetros:
# # --user seuusuario: nome do usuário
# # on: indica início da configuração do usuário
# # '>minhasenha': senha do usuário (mantenha o '>')
# # '~*': permite acesso a todas as chaves
# # '+@all': concede todas as permissões
volumes: volumes:
- redis_transcrevezap_data:/data - redis_transcrevezap_data:/data
networks: networks:

View File

@ -1,22 +1,47 @@
#!/bin/bash #!/bin/bash
# Função para inicializar configurações no Redis se não existirem # Função para construir o comando redis-cli com autenticação condicional
build_redis_cli_cmd() {
cmd="redis-cli -h ${REDIS_HOST:-localhost} -p ${REDIS_PORT:-6380}"
if [ ! -z "$REDIS_USERNAME" ]; then
cmd="$cmd --user $REDIS_USERNAME"
fi
if [ ! -z "$REDIS_PASSWORD" ]; then
cmd="$cmd -a $REDIS_PASSWORD"
fi
if [ ! -z "$REDIS_DB" ]; then
cmd="$cmd -n $REDIS_DB"
fi
echo "$cmd"
}
# Função para inicializar configurações no Redis
initialize_redis_config() { initialize_redis_config() {
redis-cli -h $REDIS_HOST -p $REDIS_PORT SET GROQ_API_KEY "sua_api_key_aqui" NX redis_cmd=$(build_redis_cli_cmd)
redis-cli -h $REDIS_HOST -p $REDIS_PORT SET BUSINESS_MESSAGE "*Impacte AI* Premium Services" NX
redis-cli -h $REDIS_HOST -p $REDIS_PORT SET PROCESS_GROUP_MESSAGES "false" NX $redis_cmd SET GROQ_API_KEY "sua_api_key_aqui" NX
redis-cli -h $REDIS_HOST -p $REDIS_PORT SET PROCESS_SELF_MESSAGES "true" NX $redis_cmd SET BUSINESS_MESSAGE "*Impacte AI* Premium Services" NX
redis-cli -h $REDIS_HOST -p $REDIS_PORT SET API_DOMAIN "$API_DOMAIN" NX $redis_cmd SET PROCESS_GROUP_MESSAGES "false" NX
$redis_cmd SET PROCESS_SELF_MESSAGES "true" NX
$redis_cmd SET API_DOMAIN "$API_DOMAIN" NX
} }
# Aguardar o Redis estar pronto # Aguardar o Redis estar pronto
echo "Aguardando o Redis ficar disponível..." echo "Aguardando o Redis ficar disponível..."
until redis-cli -h $REDIS_HOST -p $REDIS_PORT PING; do redis_cmd=$(build_redis_cli_cmd)
until $redis_cmd PING 2>/dev/null; do
echo "Redis não está pronto - aguardando..." echo "Redis não está pronto - aguardando..."
sleep 5 sleep 5
done done
# Inicializar configurações no Redis (apenas se não existirem) echo "Redis disponível!"
# Inicializar configurações
initialize_redis_config initialize_redis_config
# Iniciar o FastAPI em background # Iniciar o FastAPI em background

View File

@ -5,6 +5,7 @@ from datetime import datetime, timedelta
import traceback import traceback
import logging import logging
import redis import redis
from utils import create_redis_client
class StorageHandler: class StorageHandler:
def __init__(self): def __init__(self):
@ -20,12 +21,7 @@ class StorageHandler:
self.logger.info("StorageHandler inicializado.") self.logger.info("StorageHandler inicializado.")
# Conexão com o Redis # Conexão com o Redis
self.redis = redis.Redis( self.redis = create_redis_client()
host=os.getenv('REDIS_HOST', 'localhost'),
port=int(os.getenv('REDIS_PORT', 6380)),
db=int(os.getenv('REDIS_DB', '0')),
decode_responses=True
)
# Retenção de logs e backups # Retenção de logs e backups
self.log_retention_hours = int(os.getenv('LOG_RETENTION_HOURS', 48)) self.log_retention_hours = int(os.getenv('LOG_RETENTION_HOURS', 48))

49
utils.py Normal file
View File

@ -0,0 +1,49 @@
import os
import redis
import logging
logger = logging.getLogger("TranscreveZAP")
def get_redis_connection_params():
"""
Retorna os parâmetros de conexão do Redis baseado nas variáveis de ambiente.
Retira parâmetros de autenticação se não estiverem configurados.
"""
params = {
'host': os.getenv('REDIS_HOST', 'localhost'),
'port': int(os.getenv('REDIS_PORT', 6380)),
'db': int(os.getenv('REDIS_DB', '0')),
'decode_responses': True
}
# Adiciona credenciais apenas se estiverem configuradas
username = os.getenv('REDIS_USERNAME')
password = os.getenv('REDIS_PASSWORD')
if username and username.strip():
params['username'] = username
if password and password.strip():
params['password'] = password
return params
def create_redis_client():
"""
Cria e testa a conexão com o Redis.
Retorna o cliente Redis se bem sucedido.
"""
try:
params = get_redis_connection_params()
client = redis.Redis(**params)
client.ping() # Testa a conexão
logger.info("Conexão com Redis estabelecida com sucesso!")
return client
except redis.exceptions.AuthenticationError:
logger.error("Falha de autenticação no Redis. Verifique as credenciais.")
raise
except redis.exceptions.ConnectionError as e:
logger.error(f"Erro de conexão com Redis: {e}")
raise
except Exception as e:
logger.error(f"Erro ao configurar Redis: {e}")
raise