Indexul jurnaluluiDockup / notă de teren
Note / self-host-ntfy

Cum găzduiești singur ntfy în 2026: topicuri, controlul accesului și livrarea

Ghid practic pentru găzduirea ntfy, cu Docker, porturi, date persistente, TLS, securitate, backupuri și problemele care împiedică utilizarea în producție. Pas cu pas.

Majoritatea notițelor despre instalarea ntfy se opresc după prima încărcare a paginii. Este prea devreme: cache-ul este efemer sau conexiunile WebSocket/SSE expiră la proxy. Un test util pentru producție este mai exigent — publică un mesaj cu curl, primește-l prin abonamente HTTP și WebSocket, atașează un fișier și testează un topic autentificat.

Rolul ntfy este simplu: trimite notificări printr-o solicitare HTTP simplă. Limitele sale operaționale includ mai mult decât procesul web, așa că dependența, starea stocată și ruta publică trebuie specificate explicit înainte de sosirea datelor reale.

Configurația ntfy pentru producție

Procesul HTTP ntfy ascultă pe portul 80; păstrează acest port în rețeaua aplicației și publică doar ruta platformei. Cerința locală de runtime este un volum pentru configurare și, opțional, o bază de date pentru autentificare. Testează această limită înainte de publicare și din nou după înlocuirea unui container.

Notează limita sub forma unui contract scurt: cine deține cerința, ce credential este folosit, ce timeout este acceptabil și cum se manifestă o eroare. Apoi rulează această tranzacție: publică un mesaj cu curl, primește-l prin abonamente HTTP și WebSocket, atașează un fișier și testează un topic autentificat. Monitorizează conexiunile persistente ale abonaților, dimensiunea atașamentelor, retenția cache-ului și relay-urile push către exterior în timpul rulării, deoarece acest volum de lucru oferă o dimensiune inițială mai utilă decât un container inactiv.

Pornește ntfy fără să ascunzi componentele importante

Folosește containerul ca runtime înlocuibil, nu ca sursă de adevăr.

docker run -d \
  --name ntfy \
  --restart unless-stopped \
  -p 127.0.0.1:80:80 \
  -v ntfy-data:/var/cache/ntfy \
  -e NTFY_BASE_URL=https://app.example.com \
  binwiederhier/ntfy:latest serve

Confirmă cerința locală înainte de expunere: un volum pentru configurare și, opțional, o bază de date pentru autentificare. Inspectează utilizatorul containerului, căile care permit scrierea și listenerul asociat înainte de a-l expune. Rulează acțiunea completă — publică un mesaj cu curl, primește-l prin abonamente HTTP și WebSocket, atașează un fișier și testează un topic autentificat — și salvează referința exactă a imaginii care a produs rezultatul.

Oferă-i ntfy o singură adresă canonică

Setează base-url la originea publică HTTPS utilizată de publisheri și abonați. Direcționează hostname-ul ales către portul 80 al containerului, transmite hostul original și schema HTTPS și evită publicarea unei a doua origini directe.

Testează ntfy de pe un client extern curat. Separă problemele de ingress de limita cunoscută a aplicației — cache-ul este efemer sau conexiunile WebSocket/SSE expiră la proxy. O eroare de certificat, DNS sau 502 aparține rutării; o solicitare care ajunge la ntfy și eșuează ulterior ține de starea aplicației, capacitate sau cerința sa de suport. Ghidul pentru TLS automat cu domeniu personalizat acoperă primul grup.

Demonstrează că ntfy supraviețuiește înlocuirii

Protejează starea ntfy înainte de a optimiza containerul. Setul necesar include configurarea, baza de date pentru autentificare și atașamentele care trebuie păstrate. Montează /var/cache/ntfy înainte de bootstrap, scrie date de test inofensive și înlocuiește containerul pentru a demonstra că acea cale este într-adevăr persistentă. Dacă mai multe sisteme de stocare trebuie să rămână sincronizate, documentează ordinea în care sunt suspendate scrierile și sunt realizate backupurile.

Păstrează copii în afara serverului de deployment și criptează materialele care conțin credentiale sau conținut privat. Recuperarea reușește atunci când utilizatorii, ACL-urile, configurarea și atașamentele păstrate reapar, iar un abonat autentificat primește un mesaj nou. Diferența dintre un mount persistent și o copie independentă este prezentată în stocarea persistentă și snapshoturile.

Nu-i oferi ntfy acces la întregul host

Pentru ntfy, suprafața valoroasă nu este neapărat pagina de întâmpinare. Greșeala principală este permiterea ghicirii topicurilor publice atunci când mesajele conțin detalii operaționale. Contracarează deliberat acest risc: folosește ACL-uri pentru topicuri, deoarece numele de topicuri imposibil de ghicit nu reprezintă o autorizare solidă pentru mesajele operaționale.

NTFY_BASE_URL este configurare, nu un secret; păstrează-i valoarea explicită, protejând în același timp credentialele separate folosite de ntfy. Folosește un utilizator de container fără privilegii atunci când imaginea oferă această opțiune și nu monta credentiale fără legătură. Aplică limite de rată sau dimensiune la ingress, acolo unde activitatea neîncrezătoare poate consuma conexiuni persistente ale abonaților, dimensiunea atașamentelor, retenția cache-ului și relay-urile push către exterior.

Actualizează ntfy fără presupuneri

Folosește publicarea unui mesaj cu curl, primirea lui prin abonamente HTTP și WebSocket, atașarea unui fișier și testarea unui topic autentificat ca smoke test ntfy după fiecare deployment. Metricile de suport sunt conexiunile persistente ale abonaților, dimensiunea atașamentelor, retenția cache-ului și relay-urile push către exterior; configurează alerte atunci când aceste resurse se apropie de un nivel care degradează acțiunea utilizatorului.

Principalul risc al schimbării este că cheile de configurare, migrările bazei de date pentru autentificare și așteptările clienților trebuie verificate înainte de actualizarea ntfy. O versiune sigură pornește de la un snapshot care poate fi restaurat și validează orice schimbare de stare unidirecțională înainte ca traficul să fie mutat. Atunci când cache-ul este efemer sau conexiunile WebSocket/SSE expiră la proxy, păstrează containerul defect suficient timp pentru a-i citi configurarea și prima eroare.

Criteriile de lansare pentru ntfy

Un release candidate ntfy primește trafic după ce finalizează un scenariu fix: publică un mesaj cu curl, primește-l prin abonamente HTTP și WebSocket, atașează un fișier și testează un topic autentificat. Capturează digestul imaginii, configurarea efectivă care nu conține secrete, originea publică și timestampurile pentru acel scenariu. Datele de test trebuie să poată fi eliminate, dar să fie suficient de realiste pentru a exercita aceeași rută ca în cazul utilizatorilor.

Rulează testul după înlocuirea runtime-ului, apoi reconstruiește serviciul din configurare, baza de date pentru autentificare și atașamentele care trebuie păstrate. Recuperarea trece atunci când utilizatorii, ACL-urile, configurarea și atașamentele păstrate reapar, iar un abonat autentificat primește un mesaj nou. Compară măsurătorile de resurse pentru conexiunile persistente ale abonaților, dimensiunea atașamentelor, retenția cache-ului și relay-urile push către exterior cu versiunea anterioară și investighează diferențele semnificative înainte de promovare.

În cele din urmă, exersează acest eșec controlat: trimite date inofensive aproape de limita de resurse sau format asociată acestei granițe: cache-ul este efemer sau conexiunile WebSocket/SSE expiră la proxy. Verifică dacă ntfy explică eșecul, nu deteriorează starea existentă și își reia funcționarea după revenirea condiției valide. Salvează un fragment de log anonimizat și timpul de recuperare. Împreună, aceste verificări acoperă comportamentul, durabilitatea și operabilitatea, nu doar uptime-ul procesului.

Păstrează ntfy explicit, iar Dockup se ocupă de rutare

Rutarea, certificatele, înlocuirea serviciilor și stocarea atașată sunt ținte rezonabile pentru automatizare. Dockup se ocupă de acestea pentru ntfy și poate furniza baza de date gestionată asociată sau se poate conecta la servicii de pe serverul propriu al clientului.

Ceea ce nu ar trebui să inventeze este politica de încredere a ntfy. După deployment, setează base-url la originea publică HTTPS utilizată de publisheri și abonați, aplică această regulă — folosește ACL-uri pentru topicuri, deoarece numele de topicuri imposibil de ghicit nu reprezintă o autorizare solidă pentru mesajele operaționale — și verifică rezultatul acestui scenariu: publică un mesaj cu curl, primește-l prin abonamente HTTP și WebSocket, atașează un fișier și testează un topic autentificat. Rezultatul este o infrastructură disponibilă cu un singur click și un test de acceptanță specific aplicației.

Întrebări frecvente

De ce are nevoie ntfy pentru un deployment în producție?

Direcționează containerul ntfy de pe portul 80 printr-o singură origine HTTPS. Cerința locală de runtime este un volum pentru configurare și, opțional, o bază de date pentru autentificare. Nu considera ntfy pregătit până când nu poți publica un mesaj cu curl, nu-l poți primi prin abonamente HTTP și WebSocket, nu poți atașa un fișier și nu poți testa un topic autentificat.

Ce date ntfy trebuie incluse într-un backup?

Păstrează /var/cache/ntfy și include configurarea, baza de date pentru autentificare și atașamentele care trebuie păstrate în același manifest de recuperare. O restaurare ntfy curată trece doar atunci când utilizatorii, ACL-urile, configurarea și atașamentele păstrate reapar, iar un abonat autentificat primește un mesaj nou.

Are ntfy nevoie de HTTPS în spatele unui reverse proxy?

Folosește HTTPS pentru originea publică ntfy și păstrează portul 80 pe ruta internă. Aplică corect setarea ntfy: setează base-url la originea publică HTTPS utilizată de publisheri și abonați. Pentru ntfy, HTTPS protejează credentialele sau conținutul utilizatorilor în tranzit și păstrează consecvența comportamentului clientului sensibil la origine.

Cum trebuie testat un upgrade ntfy?

Restaurează starea ntfy curentă într-un deployment izolat, aplică versiunea candidată și repetă tranzacția de acceptanță. Acordă o atenție deosebită acestui pas, deoarece cheile de configurare, migrările bazei de date pentru autentificare și așteptările clienților trebuie verificate înainte de actualizarea ntfy. Păstrează imaginea ntfy anterioară până când limitele migrării datelor și ale rollbackului sunt clare.