NetSendo
Platform Updates

NetSendo v2.11.4: naprawa healthchecka kontenera webserver

NetSendo Team6 min czytania

Monitoring zgłasza, że webserver NetSendo nie działa, a przecież kampanie wychodzą, panel się ładuje i przybywa subskrybentów. Co się dzieje? Jeśli uruchamiasz NetSendo przez Docker Compose, możesz to znać: docker compose ps pokazywał kontener webserver jako "unhealthy", choć wszystko inne działało.

NetSendo v2.11.4 to naprawia. Zmiana jest mała, ale dotyczy każdej instalacji. Ma też większe znaczenie, niż się wydaje, bo fałszywy sygnał o stanie kontenera sprawia, że alerty tracą sens, i blokuje usługi zależne od zdrowego webservera.

TL;DR: Healthcheck webservera odpytywał http://localhost/. W obrazie nginx ta nazwa najpierw rozwiązuje się do adresu IPv6 ::1, a nginx nasłuchuje tylko na IPv4, więc każde sprawdzenie kończyło się odmową połączenia. Wersja v2.11.4 zmienia adres na http://127.0.0.1/. Poprawka jest tylko w docker-compose.yml, więc samo pobranie nowego obrazu jej nie wprowadzi. Musisz zaktualizować plik compose (patrz README → Updates) albo samodzielnie poprawić healthcheck, a potem uruchomić docker compose up -d.

🚀 Co nowego w v2.11.4

Problem: healthcheck pukał do niewłaściwych drzwi

Healthchecki Dockera co jakiś czas uruchamiają polecenie wewnątrz kontenera. Jeśli polecenie się nie powiedzie, Docker oznacza kontener jako unhealthy. Healthcheck webservera NetSendo wysyłał zapytanie na http://localhost/, co wydaje się rozsądne.

Haczyk tkwi w rozwiązywaniu nazw. W obrazie nginx localhost wskazuje zarówno na 127.0.0.1 (IPv4), jak i na ::1 (IPv6), a klient najpierw próbuje ::1. Nginx w NetSendo nasłuchuje tylko na IPv4. Każde sprawdzenie trafiało więc pod adres IPv6, na którym nic nie nasłuchiwało. Połączenie było odrzucane, a Docker zapisywał kolejną porażkę.

ℹ️ Analogia: Wyobraź sobie budynek z dwoma wejściami: IPv4 i IPv6. Recepcjonista (nginx) pracuje tylko przy drzwiach IPv4. Healthcheck pukał do drzwi IPv6, nikt nie otwierał, więc zgłaszał, że nikogo nie ma. W tym czasie prawdziwi goście swobodnie wchodzili drzwiami IPv4.

Poprawka: jawny adres

Healthcheck odpytuje teraz bezpośrednio http://127.0.0.1/. Nie ma rozwiązywania nazwy ani zgadywania między IPv4 a IPv6, więc sprawdzenie trafia pod adres, na którym nginx faktycznie nasłuchuje.

🩺

Prawidłowy status

Webserver zgłasza "healthy", gdy faktycznie działa.

📈

Wiarygodny monitoring

Narzędzia czytające stan z Dockera przestają podnosić fałszywe alarmy.

🧩

Usługa MCP startuje

Opcjonalna usługa mcp, która czeka na zdrowy webserver, może się teraz uruchomić.

⚠️ Ważne: W tym wydaniu aplikacja się nie zmieniła. Zmienił się tylko docker-compose.yml. Jeśli uruchomisz wyłącznie docker compose pull, kontenery nadal będą "unhealthy", bo stary healthcheck wciąż jest w Twoim lokalnym pliku compose.

💼 Dlaczego to ważne: scenariusze z praktyki

🛒

E-commerce: alerty, którym można ufać

Gdy sekwencje porzuconych koszyków i wiadomości po zakupie działają na NetSendo, musisz od razu wiedzieć, jeśli webserver naprawdę padnie. Kontener, który zawsze pokazuje "unhealthy", uczy zespół ignorować alerty, a wtedy przeoczy też prawdziwą awarię. Po poprawce:

  • Panele uptime czytające stan z Dockera świecą na zielono, gdy usługa działa
  • Alerty znów coś znaczą
  • Prawdziwa awaria wyraźnie odróżnia się od szumu
🤖

SaaS: odblokowanie usługi MCP

Zespoły, które włączyły opcjonalną usługę mcp do przepływów wspieranych przez AI, np. automatyzacji onboardingu czy zapobiegania odejściom klientów, zauważyły, że nigdy się nie uruchamiała. Czeka ona na zdrowy webserver, a webserver nigdy nie osiągał tego stanu. Po wdrożeniu poprawki mcp startuje zgodnie z oczekiwaniami.

🏢

Agencje: porządek w wielu instancjach

Jeśli prowadzisz osobne instancje NetSendo dla wielu klientów, fałszywy status "unhealthy" na każdej z nich zaśmieca widok całej floty. Gdy wdrożysz zaktualizowany plik compose we wszystkich instancjach, od razu zobaczysz, którzy klienci naprawdę wymagają uwagi.

🛠️ Krok po kroku: wdrożenie poprawki

Możesz skorzystać z jednej z dwóch metod. Zalecamy metodę A, bo utrzymuje Twój plik compose w zgodzie z wersją główną projektu.

Metoda A: pobierz nowy docker-compose.yml

  1. Zrób kopię obecnego pliku compose

    Zanim go zastąpisz, zachowaj kopię, żeby móc przywrócić lokalne zmiany.

    cp docker-compose.yml docker-compose.yml.bak
  2. Postępuj według README → Updates

    README NetSendo ma sekcję Updates, która wyjaśnia, jak pobrać najnowszy docker-compose.yml. Postępuj zgodnie z nią, aby pobrać wersję z v2.11.4.

  3. Przenieś swoje modyfikacje

    Porównaj nowy plik z kopią i ponownie wprowadź własne zmiany, np. porty, wolumeny czy dodatkowe usługi.

    diff docker-compose.yml.bak docker-compose.yml
  4. Odtwórz kontenery
    docker compose up -d

Metoda B: popraw healthcheck ręcznie

  1. Otwórz docker-compose.yml

    Znajdź usługę webserver i jej blok healthcheck.

  2. Zamień localhost na 127.0.0.1

    W poleceniu test healthchecka zmień http://localhost/ na http://127.0.0.1/. Resztę polecenia zostaw bez zmian. Schematycznie zmiana wygląda tak:

    # przed
    healthcheck:
      test: [ ... "http://localhost/" ... ]
    
    # po
    healthcheck:
      test: [ ... "http://127.0.0.1/" ... ]
  3. Zastosuj zmianę
    docker compose up -d

    Compose wykryje, że konfiguracja usługi się zmieniła, i odtworzy kontener webserver.

Sprawdź, czy zadziałało

Po upływie interwału healthchecka sprawdź status:

docker compose ps

Webserver powinien teraz pokazywać (healthy). Jeśli chcesz zobaczyć szczegóły, możesz sprawdzić ostatni log stanu kontenera:

docker inspect --format '{{json .State.Health}}' $(docker compose ps -q webserver)

Typowe pułapki

  • Samo pobieranie obrazów: docker compose pull nie zmienia pliku compose, więc stary healthcheck zostaje.
  • Zbyt wczesne sprawdzanie: zaraz po restarcie status przez chwilę brzmi "starting". Odczekaj co najmniej jeden interwał healthchecka.
  • Zbyt szerokie wyszukaj-i-zamień: globalny sed na localhost może zmienić inne usługi, które go potrzebują. Edytuj tylko healthcheck webservera.

🎯 Wskazówki ekspertów

1
Używaj jawnych adresów loopback w healthcheckach

We własnych kontenerach używaj 127.0.0.1 (albo [::1], jeśli usługa nasłuchuje na IPv6) zamiast localhost. Unikniesz niespodzianek związanych z kolejnością rozwiązywania nazw w różnych obrazach bazowych.

2
Trzymaj modyfikacje w pliku override

Umieść lokalne zmiany w docker-compose.override.yml. Wtedy przy każdej aktualizacji możesz przyjąć oryginalny docker-compose.yml bez ręcznego scalania.

3
Szukaj w release notes zmian w pliku compose

Gdy wydanie informuje, że zmienił się tylko docker-compose.yml, potraktuj to jako krok ręczny. Dodaj do procedury aktualizacji porównanie pliku compose.

4
Alarmuj przy zmianie stanu, a nie przy pojedynczym błędzie

Ustaw monitoring tak, żeby reagował na zmianę stanu z healthy na unhealthy. Dzięki temu alerty pozostają użyteczne, a teraz, gdy healthcheck działa poprawnie, to podejście sprawdza się dobrze.

✅ Podsumowanie

  • ✅ Healthcheck webservera odpytuje teraz 127.0.0.1 i zgłasza prawidłowy status
  • ✅ Monitoring czytający stan z Dockera przestaje pokazywać fałszywe awarie
  • ✅ Opcjonalna usługa mcp znów może się uruchomić
  • ✅ Brak zmian w aplikacji, więc aktualizacja nie stwarza ryzyka dla danych ani kampanii

Pamiętaj, że poprawka jest w docker-compose.yml. Zaktualizuj plik albo popraw tę jedną linię, a potem uruchom docker compose up -d. NetSendo działa na Twoim serwerze, więc masz pełną kontrolę nad całym stosem, a takie drobne poprawki sprawiają, że raportuje on swój stan rzetelnie. Więcej o uruchamianiu NetSendo produkcyjnie znajdziesz w dokumentacji. Zajrzyj też do listy dostępnych integracji.

Zadbaj o zdrowie swojego stosu NetSendo

Zaktualizuj do v2.11.4 i zyskaj statusy Dockera, którym możesz ufać:

Podoba Ci się to, co tworzymy? Daj NetSendo gwiazdkę na GitHubie ⭐

#docker#healthcheck#nginx#self-hosted#bugfix#devops
Udostępnij