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_SERVER_HEADLESS=true
ENV STREAMLIT_BROWSER_GATHER_USAGE_STATS=false 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 # Instalar dependências do sistema
RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \
curl \ curl \

16
app.py
View File

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

View File

@@ -3,6 +3,7 @@ import requests
import smtplib import smtplib
from email.mime.text import MIMEText from email.mime.text import MIMEText
from datetime import datetime from datetime import datetime
import pytz
from dotenv import load_dotenv from dotenv import load_dotenv
# Carregar variáveis de ambiente # Carregar variáveis de ambiente
@@ -21,6 +22,14 @@ SMTP_EMAIL = os.getenv("SMTP_EMAIL")
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD") SMTP_PASSWORD = os.getenv("SMTP_PASSWORD")
EMAIL_TO = os.getenv("EMAIL_TO") 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(): def get_headers():
return { return {
"apikey": EVOLUTION_API_TOKEN, "apikey": EVOLUTION_API_TOKEN,
@@ -31,8 +40,9 @@ def get_headers():
def send_email_error(error_details): def send_email_error(error_details):
"""Envia email de erro caso algo falhe.""" """Envia email de erro caso algo falhe."""
try: try:
now = get_now()
subject = "🚨 ERRO - Monitor Evolution API" 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 = MIMEText(body)
msg['Subject'] = subject msg['Subject'] = subject
@@ -62,7 +72,7 @@ def send_whatsapp_success():
try: try:
url = f"{EVOLUTION_API_URL}/message/sendText/{EVOLUTION_SENDER_INSTANCE}" url = f"{EVOLUTION_API_URL}/message/sendText/{EVOLUTION_SENDER_INSTANCE}"
now = datetime.now() now = get_now()
message_text = ( message_text = (
f"✅ *MONITOR OK*\n\n" f"✅ *MONITOR OK*\n\n"
f"📅 Data: {now.strftime('%d/%m/%Y')}\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.""" """Realiza um teste detalhado do Webhook N8N para diagnóstico."""
try: try:
url = N8N_WEBHOOK_URL url = N8N_WEBHOOK_URL
payload = {"check": "diagnosis_ping", "timestamp": str(datetime.now())} now = get_now()
payload = {"check": "diagnosis_ping", "timestamp": str(now)}
# Preparar log # Preparar log
log = { log = {

View File

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