Jak uruchomić prosty monitoring dostępności strony internetowej

Jak monitorować wybrane adresy internetowe

Dzwoniła dzisiaj do mnie Pani od jednego z największych dostawców z propozycją monitoringu strony interentowej. W raze niedostępności dostaję maila i SMSa. Zainspirowało mnie to zbudowania własnego bieda rozwiązania. Poczte mam na telefonie, smsy nie są więc potrzebne, skrypt miał więc wysłać maila gdy coś nie halo. Zapraszam do zapoznania z instrukcją krok po kroku

Krok 0: Zamów hosting Bieda15

Hosting kosztuje 15 PLN na rok i powinien wystarczyć do tego zastosowania, musisz tylko pakować logi. Ale to juz rozkminisz sam :)

Krok 1: Przygotuj skrypt monitorujący

Pierwszy krok to oczywiście przygotowanie skryptu monitorującego. Możesz napisać go sam, lub wygenerować wiadomo gdzie. Skrypt mozesz sobie dowolnie zmieniać i dostosowywać do swoich potrzeb. A później testować na biedahostingu. Plik umieść poza folderem public_html - to miejsce dla stron www. W skrypcie zmień adres, który chcesz monitorować w polu "URLS_TO_CHECK". Oto mój przykład:


import requests
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from datetime import datetime
import sys

# Konfiguracja
URLS_TO_CHECK = [
    "https://biedahosting.pl"]

LOG_FILE = "url_monitor.log"

# Konfiguracja email
SMTP_SERVER = "smtp_host"
SMTP_PORT = 465
SMTP_USERNAME = "twoj.email@twojadomena.pl"  # Nazwa użytkownika do logowania SMTP
EMAIL_FROM = "twoj.email@twojadomena.pl"
EMAIL_PASSWORD = "twoje_haslo"
EMAIL_TO = "odbiorca@example.com"

TIMEOUT = 10  # Timeout w sekundach

def log_message(message):
    """Zapisuje wiadomość do pliku log z timestampem"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_entry = f"[{timestamp}] {message}\n"
    
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(log_entry)
    
    print(log_entry.strip())

def send_email(subject, body):
    """Wysyła email z powiadomieniem"""
    try:
        msg = MIMEMultipart()
        msg['From'] = EMAIL_FROM
        msg['To'] = EMAIL_TO
        msg['Subject'] = subject
        
        msg.attach(MIMEText(body, 'plain', 'utf-8'))
        
        log_message(f"Łączenie z serwerem SMTP: {SMTP_SERVER}:{SMTP_PORT}")
        # Dla portu 465 używamy SMTP_SSL zamiast SMTP + starttls
        server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT, timeout=30)
        
        log_message(f"Loguję jako: {SMTP_USERNAME}")
        server.login(SMTP_USERNAME, EMAIL_PASSWORD)
        
        log_message("Wysyłam wiadomość...")
        server.send_message(msg)
        server.quit()
        
        log_message(f"✓ Email wysłany pomyślnie do {EMAIL_TO}")
        return True
        
    except smtplib.SMTPAuthenticationError as e:
        log_message(f"✗ BŁĄD AUTORYZACJI: Sprawdź login i hasło - {str(e)}")
        return False
    except smtplib.SMTPException as e:
        log_message(f"✗ BŁĄD SMTP: {str(e)}")
        return False
    except Exception as e:
        log_message(f"✗ BŁĄD wysyłania emaila: {str(e)}")
        return False

def check_url(url):
    """Sprawdza dostępność URL"""
    try:
        log_message(f"Sprawdzanie URL: {url}")
        
        response = requests.get(url, timeout=TIMEOUT)
        
        if response.status_code == 200:
            log_message(f"✓ URL działa poprawnie (status: {response.status_code})")
            return True
        else:
            log_message(f"✗ URL zwrócił nieprawidłowy status: {response.status_code}")
            return False
            
    except requests.exceptions.Timeout:
        log_message(f"✗ Przekroczono limit czasu ({TIMEOUT}s)")
        return False
        
    except requests.exceptions.ConnectionError:
        log_message(f"✗ Błąd połączenia - nie można połączyć się z serwerem")
        return False
        
    except requests.exceptions.RequestException as e:
        log_message(f"✗ Błąd żądania: {str(e)}")
        return False
        
    except Exception as e:
        log_message(f"✗ Nieoczekiwany błąd: {str(e)}")
        return False

def main():
    log_message("=" * 50)
    log_message("Uruchomienie skryptu monitorującego URL")
    
    failed_urls = []
    
    for url in URLS_TO_CHECK:
        is_working = check_url(url)
        
        if not is_working:
            failed_urls.append(url)
    
    # Wysyłamy email tylko jeśli jakiś URL nie działa
    if failed_urls:
        subject = f"⚠️ ALERT: {len(failed_urls)} strona/stron nie działa!"
        body = f"""Wykryto problem z dostępnością następujących stron:

"""
        for url in failed_urls:
            body += f"❌ {url}\n"
        
        body += f"""
Czas: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}

Sprawdź logi w pliku {LOG_FILE} po więcej szczegółów.
"""
        send_email(subject, body)
    else:
        log_message("✓ Wszystkie sprawdzone adresy URL działają poprawnie")
    
    log_message("Zakończenie działania skryptu")
    log_message("=" * 50)

if __name__ == "__main__":
    main()

       

Krok 2: Przygotuj dane do logowania do serwera poczty

Do wysyłki maili mozesz użyc darmowych serwerów poczty, albo założyć sobie konto pocztowe na biedahostngu. To drugie rozwiązanie jest fajniejsze, ale wymaga zakupu domeny. Do uzupełnienia masz dane:

# Konfiguracja email
SMTP_SERVER = "smtp_host"
SMTP_PORT = 465
SMTP_USERNAME = "twoj.email@twojadomena.pl"  # Nazwa użytkownika do logowania SMTP
EMAIL_FROM = "twoj.email@twojadomena.pl"
EMAIL_PASSWORD = "twoje_haslo"
EMAIL_TO = "odbiorca@example.com"

Krok 3: Przetestuj działanie skryptu

Zaloguj do panelu na przesłane dane i wybierz Informacje o systemie i pliki -> Terminal. W terminalu przejdź do katalogu, w kórym umieściłeś skrypt i uruchom go

python3 nazwa_skryptu.py

Krok 4: Uruchom cykliczne sprawdzanie - czyli zadania cron

Przejdz do Funkcje zaawansowane -> zadania cron. Wybierz utwórz nowe zadanie cron i je skonfiguruj. Mozesz wybrać sprawdzanie co pare minut, godzin lub jak chcesz. Bez problemu znajdziesz generatory wyrażeń cron lub dokumentację tego narzędzia. W polu komenda wpisujesz polecenie odpalenia naszego skryptu na przykład:

 cd lokalizacja_skryptu && python3 nazwa_skryptu.py

Krok 5: co dalej?

Rozwiązanie jest bardzo proste, nieprodukcyjne i pewnie wymaga dopracowania. Oczywisce mozesz zmienić skrypt, przygotować go na nieprzewidziane sytuacje itd. Polecam zrobić pakowanie logów, kóre zapobiegnie zapchaniu Twojego bieda serwera. Jak ?? Sam wymyślisz!! Kolejny pomysł - nie trzymaj haseł w pliku, zastosuj jakieś inne rozwiązanie

Dlaczego to działa na tanim hostingu?

Do takiego monitoringu nie potrzebujesz VPS-a ani chmury. Wystarczy: Python zadanie cron wysyłka maila Właśnie do takich małych automatów powstał BiedaHosting — prosty, tani i bez umów.