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 krokuKrok 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.