Enviar arquivos para "/"
This commit is contained in:
@@ -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
16
app.py
@@ -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",
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user