Enviar arquivos para "/"

This commit is contained in:
2025-12-30 22:36:05 -03:00
parent 00f3a643fe
commit 9c913dcc29
4 changed files with 539 additions and 515 deletions

View File

@@ -16,6 +16,10 @@ ENV STREAMLIT_SERVER_ADDRESS=0.0.0.0
ENV STREAMLIT_SERVER_HEADLESS=true
ENV STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
# Timezone padrão (pode ser sobrescrito via variável de ambiente no Coolify)
ENV TIMEZONE=America/Sao_Paulo
ENV TZ=America/Sao_Paulo
# Instalar dependências do sistema
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \

16
app.py
View File

@@ -1,10 +1,16 @@
import streamlit as st
import pandas as pd
import time
import os
from datetime import datetime
import pytz
from apscheduler.schedulers.background import BackgroundScheduler
from monitor_logic import run_monitor_check, diagnose_n8n_webhook
# Carregar timezone da variável de ambiente (padrão: America/Sao_Paulo)
TIMEZONE = os.getenv("TIMEZONE", "America/Sao_Paulo")
tz = pytz.timezone(TIMEZONE)
# ===== Configuração da Página (DEVE ser a primeira chamada Streamlit!) =====
st.set_page_config(
page_title="Monitor Evolution API",
@@ -62,7 +68,8 @@ if 'intervalo_horas' not in st.session_state:
# ===== Função wrapper para o Scheduler gravar logs =====
def scheduled_job():
"""Executa verificação agendada (roda em background thread)."""
print(f"[{datetime.now()}] Executando verificação agendada...")
now = datetime.now(tz)
print(f"[{now}] Executando verificação agendada...")
status, messages, whatsapp_status, email_status = run_monitor_check()
print(f"Status: {status} | WhatsApp: {whatsapp_status} | Email: {email_status}")
print("\n".join(messages))
@@ -70,7 +77,7 @@ def scheduled_job():
# ===== Configurar o Agendador (Singleton via cache_resource) =====
@st.cache_resource
def init_scheduler(intervalo_horas):
scheduler = BackgroundScheduler(timezone="America/Sao_Paulo")
scheduler = BackgroundScheduler(timezone=TIMEZONE)
# Job com intervalo configurável a partir de 00:00
scheduler.add_job(
scheduled_job,
@@ -104,10 +111,11 @@ st.markdown("### Ações")
if st.button("🚀 Executar Verificação Agora", type="primary"):
with st.spinner('Verificando status dos serviços...'):
status, messages, whatsapp_status, email_status = run_monitor_check()
st.session_state['last_run'] = datetime.now().strftime("%H:%M:%S")
now = datetime.now(tz)
st.session_state['last_run'] = now.strftime("%H:%M:%S")
# Adicionar ao histórico de logs
timestamp = datetime.now().strftime("%H:%M:%S")
timestamp = now.strftime("%H:%M:%S")
entry = {
"Hora": timestamp,
"Status": "✅ Sucesso" if status else "❌ Erro",

View File

@@ -3,6 +3,7 @@ import requests
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
import pytz
from dotenv import load_dotenv
# Carregar variáveis de ambiente
@@ -21,6 +22,14 @@ SMTP_EMAIL = os.getenv("SMTP_EMAIL")
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD")
EMAIL_TO = os.getenv("EMAIL_TO")
# Timezone configurável via variável de ambiente
TIMEZONE = os.getenv("TIMEZONE", "America/Sao_Paulo")
tz = pytz.timezone(TIMEZONE)
def get_now():
"""Retorna datetime atual com timezone configurado."""
return datetime.now(tz)
def get_headers():
return {
"apikey": EVOLUTION_API_TOKEN,
@@ -31,8 +40,9 @@ def get_headers():
def send_email_error(error_details):
"""Envia email de erro caso algo falhe."""
try:
now = get_now()
subject = "🚨 ERRO - Monitor Evolution API"
body = f"Falha no monitoramento.\nHorário: {datetime.now().strftime('%d/%m/%Y %H:%M:%S')}\n\nDetalhes do Erro:\n{error_details}"
body = f"Falha no monitoramento.\nHorário: {now.strftime('%d/%m/%Y %H:%M:%S')}\n\nDetalhes do Erro:\n{error_details}"
msg = MIMEText(body)
msg['Subject'] = subject
@@ -62,7 +72,7 @@ def send_whatsapp_success():
try:
url = f"{EVOLUTION_API_URL}/message/sendText/{EVOLUTION_SENDER_INSTANCE}"
now = datetime.now()
now = get_now()
message_text = (
f"✅ *MONITOR OK*\n\n"
f"📅 Data: {now.strftime('%d/%m/%Y')}\n"
@@ -238,7 +248,8 @@ def diagnose_n8n_webhook():
"""Realiza um teste detalhado do Webhook N8N para diagnóstico."""
try:
url = N8N_WEBHOOK_URL
payload = {"check": "diagnosis_ping", "timestamp": str(datetime.now())}
now = get_now()
payload = {"check": "diagnosis_ping", "timestamp": str(now)}
# Preparar log
log = {

View File

@@ -3,3 +3,4 @@ requests>=2.31.0
python-dotenv>=1.0.0
apscheduler>=3.10.0
pandas>=2.0.0
pytz>=2023.3