Audyt Jakości Specyfikacji v3: Browser-VPN SaaS

Data audytu: 2026-07-22

Dokument: docs/superpowers/specs/2026-07-22-browser-vpn-v3-design.md (278 linii, 14 sekcji)

Cel biznesowy: Poprawiona specyfikacja produktu Browser-VPN — hostowanego SaaS z anonimowym dostępem przez krypto-płatności, z wirtualną przeglądarką w kontenerze Docker.

Audyty bazowe: v1 (CEO, 6.3/10), v2 (s_1 MOA, 6/10), v3 (s_2 MOA, 6/10), v4 (s_3 MOA, 6.5/10), v5 (s_2 MOA, 7.7/10)

Publikacja: https://10s.pl/v6-private-browser/


1. Wprowadzenie

Niniejszy raport stanowi szósty audyt jakości (v6) specyfikacji Browser-VPN SaaS. Ocenia dokument v3 — poprawioną wersję po audycie v5 (który ocenił v2 na 7.7/10). Dokument v3 adresuje 14 z 15 problemów zidentyfikowanych w raporcie v5, wprowadzając m.in. BTCPay integrację z detalami, secrets management, SLO/SLA, kryteria akceptacji dla 7 przepływów, admin panel z endpointami, rate limiting, Trivy scanning, PostgreSQL, seccomp profil, monitoring, CI/CD, API versioning i backup off-site.

Zakres audytu:


2. Podsumowanie wykonawcze i ocena ogólna

Specyfikacja v3 to znacząca poprawa względem v2 i najdokładniejsza wersja do tej pory. Adresuje 14 z 15 problemów z raportu v5 — od krytycznych (BTCPay detale, Selkies streaming) przez ważne (SLO, kryteria akceptacji, secrets management, admin panel, rate limiting, image scanning, CI/CD) po kosmetyczne (monitoring, seccomp, API versioning, backup frequency, database). Dokument jest konkretny, dobrze ustrukturyzowany i zawiera tabele, kod i przykłady konfiguracji.

Mimo to, dokument nie osiąga deklarowanej samooceny 8.8/10. Głównym problemem jest nieweryfikowana premisa architektoniczna: v3 deklaruje, że obrazy linuxserver.io (chrome, brave, firefox, mullvad-browser) mają wbudowany "WebRTC streaming przez Selkies-GStreamer" i "Port 3001 dla WebRTC (WebSocket)". Historycznie obrazy linuxserver.io używały KasmVNC/noVNC (port 3000), nie Selkies-GStreamer. Selkies-GStreamer to osobny projekt (github.com/selkies-project/selkies-gstreamer) wymagający własnej instalacji. Niezależnie od tego, czy nowsze wersje baseimages linuxserver.io zmigrowały na Selkies-GStreamer, premisa wymaga weryfikacji dla konkretnych tagów obrazów użytych w v3. Jeśli premisa jest błędna, cała architektura streamingu opiera się na nieistniejącej funkcjonalności.

Ponadto v3 wprowadza nowe luki niewystępujące w v5: brak polityki retencji danych (krytyczne dla produktu "total privacy"), brak opisu izolacji sieciowej między kontenerami, brak zarządzania konfiguracjami WireGuard, oraz sprzeczność w seccomp (profil "dołączony" ale "dla v2, nie MVP").

Scorecard — ocena wg wymiarów (skala 1-10)

WymiarOcenaKomentarz
Kompletność8.5/10Adresuje 14/15 problemów z v5. Brak ERD. Nowe luki: retencja danych, izolacja sieciowa, VPN config management
Spójność7.0/10Selkies "dane" — nieweryfikowana premisa. Seccomp sprzeczność (profil "dla v2"). Traefik port 3001 bez konfiguracji. API versioning v1.1 niejasny
Mierzalność8.0/10SLO zdefiniowane, kryteria akceptacji dla 7 flowów, rate limity konkretne. Ale metodologia pomiaru SLO bez Prometheus niejasna
Wykonalność7.0/10BTCPay na single server z 30 kontenerami = ryzyko zasobów. SLO 99.5% na single server ambitne. Selkies claim wymaga weryfikacji
Bezpieczeństwo7.5/10Secrets management, Trivy, audit log dodane. Ale brak izolacji sieciowej, brak retencji danych, brak supply chain verification
Ocena ogólna7.6/10Najlepsza wersja do tej pory, blisko implementacji — wymaga weryfikacji premisy Selkies + 3 doprecyzowań

Werdykt: Approve with conditions — dokument zatwierdzić do implementacji warunkowo, pod warunkiem: (1) weryfikacji czy linuxserver.io obrazy faktycznie dostarczają Selkies-GStreamer WebRTC, (2) doprecyzowania izolacji sieciowej między kontenerami, (3) dodania polityki retencji danych.


3. Analiza szczegółowa wg 5 kryteriów

3.1 Kompletność (8.5/10)

Co jest pokryte (nowe w v3):

Czego brakuje (pozostałe z v5):

Czego brakuje (nowe luki w v3):

3.2 Spójność (7.0/10)

Mocne strony:

Krytyczne niespójności:

3.3 Mierzalność (8.0/10)

Co jest mierzalne (nowe w v3):

Czego brakuje:

3.4 Wykonalność (7.0/10)

Technologie znane i sprawdzone:

Obszary ryzyka:

3.5 Bezpieczeństwo (7.5/10)

Silne strony (nowe w v3):

Słabe strony / luki:


4. Lista problemów

KRYTYCZNY (blokuje implementację)

#ProblemStatus w v5
K1Selkies "dane" — nieweryfikowana premisa — v3 deklaruje że obrazy linuxserver.io mają "WebRTC streaming przez Selkies-GStreamer" i "Port 3001 dla WebRTC". Historycznie obrazy linuxserver.io używały KasmVNC/noVNC, nie Selkies-GStreamer. Jeśli premisa jest błędna, cała architektura streamingu opiera się na nieistniejącej funkcjonalności i wymaga przebudowy.Rozwiązany w v3 (K2 z v5) — ale rozwiązanie może być błędne
K2Brak izolacji sieciowej między kontenerami — dla produktu "total privacy" brak opisu jak kontenery są izolowane sieciowo. Wspólny Docker bridge = jeden skompromitowany kontener może sniff'ować ruch innego.Nowy (nie występował w v5)

WAŻNY (istotne ryzyko)

#ProblemStatus w v5
W1Brak polityki retencji danych — produkt "total privacy" nie definiuje jakie dane są przechowywane, jak długo, prawo do usunięcia.Nowy (nie występował w v5)
W2Seccomp sprzeczność — "dołączony profil" ale "custom seccomp dla v2, nie MVP". Niejasne czy profil jest używany czy nie.Częściowo rozwiązany (C3 z v5) — ale z sprzecznością
W3Traefik port 3001 bez konfiguracji — WebRTC na port 3001 wspomniany, ale Traefik labels konfigurują tylko port 3000. WebRTC UDP nie jest proxy'owane przez Traefik.Nowy (wynik z decyzji Selkies "dane")
W4BTCPay na single server — ryzyko zasobów — BTCPay z pełnym Bitcoin node wymaga ~500 GB dysku + 4-8 GB RAM. Na serwerze z 30 kontenerami może nie wystarczyć.Częściowo rozwiązany (K1 z v5) — ale z nowym ryzykiem
W5SLO 99.5% na single server — ambitne — bez HA, bez failover, każdy restart = downtime. 99.5% = ~44h downtime/rok.Rozwiązany w v3 (W1 z v5) — ale wykonalność wątpliwa
W6Docker secrets bez Swarm mode — jeśli stack używa docker-compose (nie Swarm), Docker secrets nie są dostępne.Rozwiązany w v3 (W3 z v5) — ale implementacja wątpliwa
W7Metodologia pomiaru SLO bez Prometheus — jak mierzyć container startup time P95 i streaming latency bez Prometheus? Traefik metrics tego nie capture'uje.Częściowo rozwiązany (W1 z v5) — ale metodologia brak

KOSMETYCZNY (drobne poprawki)

#ProblemStatus w v5
C1Brak diagramu ERD — relacje między tabelami nadal bez wizualizacji.Pozostał z v5 (C1)
C2API versioning v1.1 niejasny — "minor bump (v1.1)" ale URL prefix /api/v1/. Jak v1.1 manifestuje się w URL?Rozwiązany w v3 (C4 z v5) — ale z niejasnością
C3Smoke tests niezdefiniowane — CI/CD mówi "run smoke tests" ale nie definiuje frameworka, asercji, co stanowi passing test.Rozwiązany w v3 (W7 z v5) — ale niedospecyfikowane
C4Brak supply chain verification — Trivy skanuje podatności, ale brak Cosign/Notary podpisów obrazów.Nowy (rozszerzenie W6 z v5)
C5Database encryption at rest — backup szyfrowany (GPG), ale baza na dysku nie. Brak LUKS/TDE.Pozostał z v5 (część W3)
C6Zarządzanie WireGuard configs — admin panel ma endpoint /vpn-configs ale brak opisu lifecycle (generacja, rotacja, dystrybucja).Nowy

5. Porównanie: v2 vs v3 — mapa problemów

Problemy rozwiązane (v2 → v3)

Problem v5Rozwiązanie w v3Ocena
K1: Brak detali BTCPayPełna sekcja: webhook (4 eventy), failover flow z kodem, wspierane kryptowaluty, architektura✅ W pełni rozwiązany
K2: Selkies niedospecyfikowanyDecyzja "dane" — linuxserver images z noVNC + WebRTC⚠️ Rozwiązany formalnie, ale premisa może być błędna (K1 nowy)
W1: Brak SLO/SLA4 metryki: uptime 99.5%, start <60s, API <500ms, streaming <2s✅ Rozwiązany (ale wykonalność W5 nowy)
W2: Brak kryteriów akceptacji7 flowów × 3 kryteria każda✅ W pełni rozwiązany
W3: Secrets managementTabela 7 sekretów + Docker secrets + .env + rotacja co 90 dni✅ Rozwiązany (ale Docker secrets bez Swarm — W6 nowy)
W4: Admin panel niedospecyfikowany14 endpointów API + audit log✅ W pełni rozwiązany
W5: Rate limiting za restrykcyjny10 req/min + per-endpoint (orders 5/h, tickets 3/h, admin 30/min)✅ W pełni rozwiązany
W6: Brak skanowania obrazówTrivy weekly + alert + auto-rebuild✅ Rozwiązany (ale brak podpisów — C4 nowy)
W7: Brak CI/CDGitHub Actions: build → migrate → staging → smoke → prod✅ Rozwiązany (ale smoke tests niedospecyfikowane — C3)
C2: Brak monitoringu7 metryk co 30s + 10 alertów Telegram z progami✅ W pełni rozwiązany
C3: Brak profilu seccompLista syscalli (clone, futex, eventfd2, set_robust_list, prctl)⚠️ Rozwiązany formalnie, ale sprzeczność "dla v2" (W2 nowy)
C4: Brak wersjonowania APIv1 prefix + minor/major bump + deprecation 3 miesiące✅ Rozwiązany (ale v1.1 niejasny — C2 nowy)
C5: Częstotliwość backupu off-siteCo 6h, retention 7/30 dni✅ W pełni rozwiązany
C6: Brak bazy danychPostgreSQL + migracje SQL + backup pg_dump + GPG✅ W pełni rozwiązany

Problemy pozostałe (v2 → v3 nadal nierozwiązane)

Problem v5Status w v3Uwaga
C1: Brak diagramu ERD❌ Nadal brakJedyny nierozwiązany problem z v5

Nowe problemy (v3)

ProblemKategoriaUwaga
Selkies "dane" — nieweryfikowana premisaKRYTYCZNYWynik z decyzji "dane"
Brak izolacji sieciowej między konteneramiKRYTYCZNYNowa luka security
Brak polityki retencji danychWAŻNYNowa luka privacy
Seccomp sprzeczność (profil "dla v2")WAŻNYWynik z niedoprecyzowania
Traefik port 3001 bez konfiguracjiWAŻNYWynik z decyzji Selkies
BTCPay na single server — ryzyko zasobówWAŻNYWynik z architektury
SLO 99.5% na single server — ambitneWAŻNYWynik z braku HA
Docker secrets bez Swarm modeWAŻNYWynik z technologii
Metodologia pomiaru SLO bez PrometheusWAŻNYWynik z "po MVP"
API versioning v1.1 niejasnyKOSMETYCZNYNiedoprecyzowanie
Smoke tests niezdefiniowaneKOSMETYCZNYNiedoprecyzowanie
Brak supply chain verification (Cosign)KOSMETYCZNYRozszerzenie image scanning
Database encryption at restKOSMETYCZNYPozostały z v5
Zarządzanie WireGuard configsKOSMETYCZNYNowa luka

6. Weryfikacja samooceny v3 (8.8/10)

v3 deklaruje "Szacowana ocena: 8.8/10". Niniejszy audyt ocenia v3 na 7.6/10. Różnica 1.2 punktu wynika z:

  1. Samoocena nie weryfikuje premisy Selkies — v3 traktuje "linuxserver images mają Selkies-GStreamer" jako fakt, bez weryfikacji. Jeśli premisa jest błędna, cała architektura streamingu wymaga przebudowy.
  2. Samoocena nie identyfikuje nowych luk — brak izolacji sieciowej, brak retencji danych, brak WireGuard config management to nowe problemy niewystępujące w v5.
  3. Samoocena nie ocenia wykonalności SLO — 99.5% na single server bez HA jest ambitne, ale v3 traktuje to jako rozwiązane.
  4. Samoocena nie zauważa sprzeczności — seccomp "dla v2", Traefik port 3001 bez konfiguracji, API versioning v1.1 niejasny.

Werdykt: Samoocena 8.8/10 jest przeszacowana o ~1.2 punktu. Dokument jest znaczącą poprawą, ale wymaga krytycznej weryfikacji przed implementacją.


7. Glosariusz

TerminDefinicja
BTCPay ServerSelf-hostowany procesor płatności kryptowalut (BTC/Lightning, altcoiny przez pluginy)
Capabilities (Linux)Podział uprawnień roota na niezależne jednostki (np. NET_ADMIN, SYS_ADMIN)
CSP (Content Security Policy)Nagłówek HTTP ograniczający źródła zasobów (skrypty, style, obrazy)
CosignNarzędzie do podpisywania obrazów kontenerów (supply chain security)
Docker secretsMechanizm zarządzania sekretami w Docker Swarm — pliki montowane w /run/secrets/
Docker SwarmTryb orkiestracji kontenerów w Docker — wymagany dla Docker secrets
ERDEntity-Relationship Diagram — wizualizacja relacji między tabelami bazy danych
GPG/ageNarzędzia do szyfrowania plików (GNU Privacy Guard / age)
HSTSHTTP Strict-Transport-Security — wymusza HTTPS dla wszystkich połączeń
httpOnly cookieCiasteczko niedostępne z JavaScript (ochrona przed XSS)
KasmVNCImplementacja VNC używana w obrazach linuxserver.io — nie Selkies-GStreamer
LUKSLinux Unified Key Setup — pełne szyfrowanie dysku
Magic linkJednorazowy URL dający dostęp do sesji przeglądarki
NET_ADMINLinux capability — zarządzanie siecią (WireGuard, iptables)
no-new-privilegesSecurity option Docker — blokada eskalacji uprawnień
noVNCKlient VNC działający w przeglądarce przez WebSocket
OpenAPIStandard specyfikacji REST API
PostgreSQLRelacyjna baza danych open-source z zaawansowanymi funkcjami bezpieczeństwa
PrometheusSystem monitoringu i alerting z Time Series Database
SeccompLinux security module — filtrowanie syscalli
Selkies-GStreamerFramework do streamowania desktopu/ekranu przez WebRTC — osobny projekt, nie wbudowany w linuxserver.io
SLO/SLAService Level Objective / Agreement — cele jakościowe usługi
SPoFSingle Point of Failure — pojedynczy punkt awarii
SYS_PTRACELinux capability — debugowanie procesów (trace, ptrace wymagany przez GStreamer)
TOTPTime-based One-Time Password — dwuskładnikowe uwierzytelnianie
TraefikReverse proxy i load balancer z automatycznym HTTPS i Docker provider
Trocador AnonPayAggregator krypto-płatności wspierający Monero
TrivySkaner podatności obrazów kontenerów (Aqua Security)
WebRTCProtokół real-time communication w przeglądarce — używa UDP, nie proxy'owany przez Traefik
WireGuardLekki, nowoczesny protokół VPN w jądrze Linux

8. Źródła

Pliki źródłowe

Linki zewnętrzne


9. Rekomendacje

Przed implementacją (obowiązkowe)

  1. Zweryfikuj premisę Selkies — sprawdź czy obrazy linuxserver.io (chrome, brave, firefox, mullvad-browser) faktycznie dostarczają Selkies-GStreamer WebRTC na porcie 3001. Jeśli nie: zbuduj własne obrazy z Selkies lub zmień architekturę streamingu na KasmVNC/noVNC (co linuxserver images już mają).
  2. Dodaj izolację sieciową między kontenerami — każdy kontener w osobnej Docker network, brak współdzielenia bridge. Network policy: kontener może komunikować się tylko z WireGuard interface i Traefik proxy.
  3. Dodaj politykę retencji danych — zdefiniuj: jakie dane użytkownika są przechowywane (IP? fingerprint? historia?), jak długo (session data: 30 dni po expiry, potem purge), prawo do usunięcia (endpoint lub automatyczny purge).

W pierwszym sprincie (zalecane)

  1. Rozwiąż seccomp sprzeczność — zdecyduj: custom seccomp profil dla MVP czy --security-opt=seccomp=default? Usuń "dla v2" z dokumentu.
  2. Skonfiguruj Traefik dla WebRTC — jeśli WebRTC jest używane, dodaj konfigurację dla port 3001 (UDP stream). Jeśli Traefik nie wspiera UDP proxy, rozważ bezpośredni dostęp lub STUN/TURN server.
  3. Określ tryb Docker — jeśli używasz docker-compose (nie Swarm), zamień Docker secrets na alternatywę (sops + age-encrypted files, lub Hashicorp Vault).
  4. Zdefiniuj smoke tests — określ framework (pytest? playwright?), asercje (health check 200, order creation 201, payment flow complete), co stanowi passing test.
  5. Zweryfikuj wykonalność BTCPay na single server — oblicz zasoby: Bitcoin node (pruned: ~50 GB, full: ~500 GB) + Lightning + BTCPay app. Jeśli nie mieści się, użyj BTCPay w trybie "pruned" lub zewnętrznego Bitcoin node.

Drugi sprint (nice-to-have)

  1. Diagram ERD dla tabel orders, sessions, tickets, vpn_configs
  2. Dodaj Cosign podpisy obrazów (supply chain verification)
  3. Database encryption at rest (LUKS lub PostgreSQL TDE)
  4. Opisz lifecycle WireGuard configs (generacja, rotacja, dystrybucja do kontenerów)
  5. Prometheus + Grafana dla pomiaru SLO (container startup time, streaming latency)

Koniec raportu v6. 2026-07-22.