Bezpieczeństwo i własność danych
QuoteNode jest stworzony dla organizacji, które traktują dane handlowe jako strategiczny zasób. Każda decyzja architektoniczna stawia na izolację, audytowalność i kontrolę.
Izolacja Single-Tenant
Każda instancja QuoteNode działa w pełnej izolacji. Twoja baza danych, Twoje pliki, Twój proces aplikacji — nic z tego nie jest współdzielone z innymi klientami. Bez mieszania danych między tenantami, bez wspólnych pul połączeń, bez ryzyka wycieku danych.
To nie jest marketingowe hasło o “logicznej separacji.” To fizyczna izolacja na każdej warstwie.
Wdrożenie Self-Hosted
Ty wybierasz, gdzie żyją Twoje dane. Wdrażaj na laptopie do ewaluacji, na serwerze LAN, na publicznym VPS albo przez platformę taką jak Coolify. QuoteNode może działać bez telemetrii, callbacków analitycznych i pingowania serwera licencji.
System dostarczany jest jako kontenery Docker z szablonami Docker Compose. Kontrolujesz infrastrukturę, topologię sieci, strategię kopii zapasowych, DNS, TLS i granicę dostępu.
Wskazówki dla konkretnych topologii znajdziesz w Opcjach instalacji.
Uwierzytelnianie i kontrola dostępu
- Kontrola dostępu oparta na rolach (RBAC) z pięcioma rolami: Admin, Manager, Handlowiec, Widz i Publiczny (dla linków do ofert).
- Weryfikacja uprawnień per endpoint — każde wywołanie API jest autoryzowane względem roli użytkownika.
- Uwierzytelnianie sesyjne z szyfrowanymi ciasteczkami i konfigurowalnym czasem sesji.
- Uwierzytelnianie dwuskładnikowe (TOTP) — opcjonalne dla wszystkich, wymuszalne dla administratorów.
- Ochrona przed brute-force — blokada konta po 5 nieudanych próbach logowania (30-minutowy cooldown).
- Kontrole funkcji operacyjnych — administratorzy mogą włączać lub wyłączać funkcje workflow, takie jak lejek deali i tablica zadań, na poziomie tenanta.
Dziennik audytu
Każda mutacja w systemie jest rejestrowana w niemodyfikowalnym dzienniku audytu:
- Kto wykonał akcję (ID użytkownika, rola, adres IP)
- Co się zmieniło (typ encji, ID encji, stan przed/po)
- Kiedy to nastąpiło (znacznik czasu po stronie serwera)
Dziennik audytu jest niemodyfikowalny — wpisów nie można edytować ani usuwać, nawet przez administratorów. Zapewnia to weryfikowalny łańcuch odpowiedzialności dla każdej oferty, rekordu klienta i zmiany konfiguracji.
Bezpieczeństwo linków ofertowych
Publiczne linki do ofert są chronione wieloma warstwami:
- Kryptograficzne tokeny — 256-bitowe losowe tokeny, przechowywane wyłącznie jako skróty SHA-256. Token jawny jest zwracany raz i nigdy nie jest zapisywany.
- Opcjonalna ochrona hasłem — linki mogą wymagać PIN-u zahaszowanego bcryptem.
- Odwoływalny dostęp — każdy link może zostać natychmiast unieważniony przez handlowca.
- Limitowanie zapytań — limity per-token i per-IP zapobiegają nadużyciom (60 otwarć/godz., 5 akcji/godz.).
- Progresywna blokada — nieudane próby wpisania hasła lub PIN-u uruchamiają narastające opóźnienia: 30 sekund po 3 błędach, 5 minut po 5, a po wielokrotnym nadużyciu — pełna blokada. Właściciel oferty otrzymuje powiadomienie o podejrzanych próbach dostępu.
- Weryfikacja e-mail — dla ofert skierowanych do konkretnego klienta dostęp przez link może wymagać weryfikacji adresu e-mail. Jednorazowy kod jest wysyłany na zarejestrowany e-mail klienta, co zapobiega nieautoryzowanemu dostępowi nawet gdy URL linku zostanie udostępniony lub przekazany dalej.
- Wykrywanie botów — walidacja czasowa i pola honeypot odrzucają automatyczne zgłoszenia.
- Śledzenie interakcji — każde otwarcie, pobranie, odpowiedź i decyzja są logowane z anonimizowanym IP i kodem kraju GeoIP.
Bezpieczeństwo nadal zależy od topologii wdrożenia. Link wygenerowany dla localhost nie jest użyteczny dla zewnętrznego klienta. Link LAN działa tylko w tej sieci lub VPN. Linki dla klientów zewnętrznych wymagają publicznej domeny, HTTPS oraz poprawnej konfiguracji reverse proxy i firewalla.
Ochrona danych
- Szyfrowanie w tranzycie — TLS dla wszystkich połączeń (reverse proxy przez Caddy z automatycznym HTTPS).
- Szyfrowanie w spoczynku — delegowane do Twojej infrastruktury (szyfrowanie dysków, zaszyfrowane wolumeny).
- Opcjonalne szyfrowanie PII na poziomie kolumn — po włączeniu (
ENCRYPT_PII=true) dane osobowe (imiona, nazwiska, adresy e-mail, numery telefonów, NIP-y) są szyfrowane algorytmem AES-256-GCM na warstwie aplikacji przed zapisem do bazy danych. Indeksy ślepe (HMAC-SHA256) zachowują możliwość wyszukiwania dokładnych dopasowań bez ujawniania tekstu jawnego. Walidator startowy zapobiega uszkodzeniu danych w przypadku niezgodności kluczy lub przypadkowej zmiany flagi. - Anonimizacja IP — konfigurowalny job haszujący adresy IP po N dniach dla zgodności z RODO.
- Brak zewnętrznych zależności — bez analityki firm trzecich, pikseli śledzących czy zależności CDN w domyślnej konfiguracji.
- Kontrola retencji danych — konfigurowalne okresy przechowywania dla dokumentów, logów audytu i danych śledzenia.
Chroń .env i sekrety platformy. Utrata DB_ENCRYPTION_KEY może uniemożliwić odzyskanie zaszyfrowanych pól, jeśli szyfrowanie aplikacyjne jest włączone. Rotacja sekretów linków publicznych i timing tokens może unieważnić istniejące tokeny bezpieczeństwa lub sesje.
Kopie zapasowe i odzyskiwanie po awarii
Twoje dane są bezpieczne tylko wtedy, gdy jesteś w stanie je odzyskać:
- Automatyczne codzienne kopie zapasowe — zaplanowane dumpy bazy danych i archiwa plików wykonywane bez przestojów (konfigurowalne przez
BACKUP_CRON). - Szyfrowanie GPG w spoczynku — kopie zapasowe mogą być zaszyfrowane przed zapisem, zapewniając, że nawet dostawca storage nie może odczytać danych.
- Zdalne przechowywanie — automatyczny upload do S3, SFTP, Google Cloud Storage, Azure lub dowolnego z 70+ dostawców obsługiwanych przez rclone.
- Weryfikacja integralności — każda kopia zawiera manifest sum kontrolnych SHA-256 do wykrywania manipulacji.
- Pobieranie jednym kliknięciem — administratorzy mogą pobierać archiwa kopii zapasowych bezpośrednio z panelu administracyjnego.
- Polityka retencji — automatyczne czyszczenie starych kopii utrzymuje przewidywalne zużycie dysku (domyślnie: 7 najnowszych kopii).
- Odzyskiwanie po awarii — dedykowany skrypt restore odtwarza kompletną instancję z pliku kopii zapasowej na nowym serwerze jednym poleceniem.
- Monitoring — panel administracyjny ostrzega, jeśli kopie zapasowe są wyłączone lub jeśli żadna udana kopia nie została wykonana w ciągu ostatnich 48 godzin.
Pełny przewodnik po kopiach zapasowych i przywracaniu znajdziesz w wiki Backup i Recovery.
Niemodyfikowalne snapshoty ofert
Po wysłaniu oferty system tworzy kompletny, niemodyfikowalny snapshot: dane klienta, wszystkie pozycje, ceny, kursy walut, branding i warunki handlowe. Ten snapshot jest źródłem prawdy dla generowania PDF i celów audytowych.
Snapshotów nie można modyfikować po utworzeniu. Przy ponownym wysłaniu oferty tworzony jest nowy snapshot z nowym numerem wersji. Zapewnia to weryfikowalny zapis tego, co zostało zaofertowane i kiedy.
Ostrożność przy dokumentach operacyjnych
QuoteNode może generować dokumenty operacyjne po akceptacji, takie jak potwierdzenia sprzedaży, zamówienia zakupu do dostawców i eksperymentalne faktury proforma.
W becie faktury proforma trzeba traktować jako moduł eksperymentalny. Wygenerowane proformy nie zastępują systemów księgowych, podatkowych, VAT, fiskalnych ani e-fakturowania. Operatorzy są odpowiedzialni za sprawdzenie lokalnych wymagań prawnych przed wysłaniem ich klientom.
Bezpieczeństwo licencji
Licencje QuoteNode to pliki z podpisem Ed25519, weryfikowane całkowicie offline. Żaden zewnętrzny serwer nie jest kontaktowany w celu walidacji licencji. Płatne licencje są roczne — po wygaśnięciu wszystkie funkcje działają normalnie. Jedyną widoczną zmianą jest plakietka “Powered by QuoteNode” na powierzchniach widocznych dla klientów i przypomnienie o odnowieniu w interfejsie. Żadna funkcjonalność nie jest wyłączana.
Nie włączaj LICENSE_SKIP_SIGNATURE_CHECK=true w prawdziwych wdrożeniach beta ani publicznych. To ustawienie wyłącza weryfikację autentyczności licencji i jest akceptowalne tylko w jednorazowych lokalnych środowiskach developerskich.
Świadomość wydań
Gdy funkcja jest włączona, widok licencji administratora może sprawdzać publiczny manifest wydań, np. https://quotenode.dev/releases/latest.json, i pokazywać, że dostępna jest nowsza wersja. To mechanizm informacyjny o wersji, nie telemetria: instancja odczytuje publiczny plik JSON i nie musi identyfikować się wobec QuoteNode.