Infrastruktura DevOps: Od środowiska lokalnego (WSL2: Ubuntu / Kali / Oracle Linux) do Oracle Cloud (ARM64 Ampere / AMD64) zgodna z normą ISO 27001, wytycznymi CIS Benchmark, zasadą PoLP (Principle of Least Privilege) i architekturą Zero Trust.
[ Internet / Zewnętrzni Użytkownicy & Witryny Klienckie (FuegoLingua, KatoSalsaHub, TwojaStronaWWW) ]
│
▼ (Tunel szyfrowany TLS / QUIC - Porty zaporowe 80/443 pozostają ZAMKNIĘTE)
[ Cloudflare Zero Trust (cloudflared: ai.twojastronawww.pl & monitoring.twojastronawww.pl) ]
│
▼
┌────────────────────────────────────────────────────────────────────────┐
│ HOST VPS (Oracle Ampere ARM64) │
│ │
│ [ Strefa 1: Sieć wewnętrzna `devops_internal_network` ] │
│ ┌─────────────────┐ ┌───────────────┐ ┌────────────────────────────┐ │
│ │ Uptime Kuma │ │ Prometheus │ │ Grafana (Viewer PoLP) │ │
│ │ (10 monitorów) │ │ (TSDB 15d) │ │ (3 Dashboardy & Alerting) │ │
│ │ 127.0.0.1:3001 │ │ 127.0.0.1:9090│ │ 127.0.0.1:3000 │ │
│ └────────┬────────┘ └───────▲───────┘ └─────────────┬──────────────┘ │
│ │ │ │ │
│ └────── metrics ───┤ │ │
│ │ │ │
│ ┌─────────────────┐ │ │ │
│ │ AI Router RAG ├─────────┤ (/metrics, /health, │ │
│ │ (Cache <5ms + │ │ /analytics, WAF L7) │ │
│ │ 11-Model Casc) │ │ │ │
│ │ 127.0.0.1:8085 │ │ │ │
│ └─────────────────┘ │ │ │
│ ┌─────────────────┐ │ │ │
│ │ Node Exporter ├─────────┤ (*.prom: backup/audit)│ │
│ └─────────────────┘ │ │ │
│ ┌─────────────────┐ │ │ │
│ │ cAdvisor ├─────────┤ (Docker stats) │ │
│ └─────────────────┘ │ │ │
│ ┌─────────────────┐ │ │ │
│ │ GitHub Exporter ├─────────┘ (CI/CD Actions) │ │
│ └─────────────────┘ ┌───────────────────────┴──────────────┐ │
│ ┌─────────────────┐ │ Dozzle: Logi Kontenerów w Przeglądarce│ │
│ │ OCI Keepalive │ │ 127.0.0.1:8888 │ │
│ │ (+20% / 4.8 GB) │ └──────────────────────────────────────┘ │
│ └─────────────────┘ │
│ │
│ [ Strefa 2: Odseparowana sieć CI/CD `devops_runners_network` ] │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 3 Runnery GitHub Actions ARM64 (brak dostępu L3 do monitoringu) │ │
│ │ • runner-zeslownikiem-unified • runner-twojastronawww-unified │ │
│ │ • runner-gal-anonim-web │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ Trwałe wolumeny, Autonomiczny Strażnik 24/7 & Kopia Offsite: │
│ ├── devops-audit.timer (co 15 min) ──> IoC/WAF + Dual-AI 120B (08:00) │
│ ├── devops-backup.timer (03:00 UTC) ──> AES-256 + Restore Drill ──> R2│
│ └── backup-websites-lh.sh (FTPS TLS + mysqldump) ──> Cloudflare R2 │
└────────────────────────────────────────────────────────────────────────┘
Wszystkie mechanizmy obronne są wdrażane automatycznie przez skrypt scripts/01-harden-os.sh:
- Codzienna instalacja łatek CVE (OS + Docker CE): System automatycznie pobiera i instaluje krytyczne poprawki bezpieczeństwa z oficjalnych repozytoriów (
Ubuntu:noble-security,Ubuntu:noble-updatesorazDocker CE:noble), a autonomiczny strażnikaudit-server.shco 15 minut monitoruje kolejkę APT (devops_apt_upgradable_packages) i automatycznie instaluje oczekujące łatki w tle (Auto-Patching), eliminując podatności typu zero-day bez konieczności ręcznego logowania administratora. - Higiena pakietów i logów: Automatyczne usuwanie zbędnych zależności (
Remove-Unused-Kernel-Packages: true) oraz twardy limitSystemMaxUse=200Mna logi systemowesystemd-journald.
- Blokada konta root i biała lista użytkowników:
PermitRootLogin no,AllowUsers ubuntuoraz blokada powłoki odziedziczonego kontaopc(/usr/sbin/nologin) uniemożliwiają logowanie na jakiekolwiek inne konto. - Wyłączenie uwierzytelniania hasłem:
PasswordAuthentication nocałkowicie eliminuje podatność na ataki słownikowe i zgadywanie haseł. Dozwolone są wyłącznie silne klucze asymetryczne (Ed25519). - Limit prób i pełny dziennik audytowy:
MaxAuthTries 3,AllowAgentForwarding noorazLogLevel VERBOSE(logowanie odcisków kluczy SSH zgodnie z CIS Benchmark). - Wyłączenie zbędnych demonów sieciowych:
X11Forwarding nooraz całkowite zamaskowanierpcbind.service/rpcbind.socket(port 111). - Kryminalistyczna kontrola śladów włamania (IoC —
devops_security_ioc_clean): Co 15 minut skryptaudit-server.shweryfikuje dziennikjournalctl -u sshpod kątem zerowej liczby logowań hasłem/rootem, sprawdza brak obcych kontUID 0w/etc/passwd, brak procesów uruchomionych z/tmpi/dev/shm, integralność/etc/cron*oraz kontroluje liczbę kluczy w~/.ssh/authorized_keys.
- Progresywny Ban SSH (Fail2Ban IPS): Po 3 nieudanych próbach logowania w oknie 10 minut adres IP agresora zostaje zablokowany na zaporze UFW na 1 godzinę (
bantime = 1h), a dla recydywistów czas blokady rośnie wykładniczo (bantime.increment = true,bantime.factor = 2) aż do 7 dni (7d). Statystyki banów (devops_fail2ban_banned_total,devops_fail2ban_currently_banned) są wizualizowane na żywo w Grafanie. - Strażnik WAF Warstwy 7 + 15-Minutowy IP Penalty Box (
chat-router.php): Każde zapytanie do bramki AI jest skanowane przed wywołaniem modelu LLM pod kątem ataków Prompt Injection, Jailbreak, XSS (<script>), SQL Injection (UNION SELECT,DROP TABLE) oraz Path Traversal / LFI (../etc/passwd). Wykryty atak jest natychmiast odrzucany kodemHTTP 403(0 zużytych tokenów), a IP agresora trafia na 15 minut do Penalty Box (banClientIp).
- Polityka domyślna: Całkowita blokada ruchu przychodzącego (
default deny incoming) oraz zezwolenie na ruch wychodzący (default allow outgoing). - SSH Rate Limiting: Reguła
ufw limit 22/tcpodrzuca połączenia od hostów, które próbują zainicjować 6 lub więcej połączeń w ciągu 30 sekund. - Brak otwartych portów webowych: W modelu Cloudflare Zero Trust porty 80 i 443 pozostają zamknięte na zaporze serwera.
- Ochrona przed SYN Flood DoS:
net.ipv4.tcp_syncookies = 1chroni przed przepełnieniem tablicy połączeń TCP fałszywymi pakietami SYN. - Anti-Spoofing (RP Filter):
net.ipv4.conf.all.rp_filter = 1weryfikuje trasę powrotną pakietów, odrzucając pakiety z podrobionym adresem źródłowym (IP Spoofing). - Blokada ataków MITM (ICMP Redirects): Wyłączenie akceptowania i wysyłania przekierowań ICMP (
accept_redirects = 0). - Ochrona przed atakiem Smurf:
icmp_echo_ignore_broadcasts = 1ignoruje zapytania ICMP wysyłane na adresy rozgłoszeniowe. - Utwardzenie wskaźników jądra i eBPF JIT:
kernel.kptr_restrict = 2,kernel.dmesg_restrict = 1,kernel.unprivileged_bpf_disabled = 2oraznet.core.bpf_jit_harden = 2.
- Montowanie pamięci
/dev/shmz flagaminoexec,nosuid,nodevw/etc/fstabuniemożliwia uruchamianie złośliwych skryptów i binariów w pamięci podręcznej.
- Binding wyłącznie do localhosta +
DOCKER-USERWAN Guard: Porty usług nasłuchują wyłącznie na127.0.0.1, a łańcuchDOCKER-USERwiptableswymusza blokadę nowych połączeń przychodzących z interfejsu WAN (enp0s6 -> DROP), uniemożliwiając ominięcie zapory UFW przez demona Docker. - Separacja sieciowa Runnerów CI/CD: Runnery GitHub Actions działają w odizolowanej sieci
devops_runners_network, nie mając dostępu sieciowego do wewnętrznej siecidevops_internal_network. - PoLP (Zasada Najmniejszych Przywilejów) & Piaskownica PHP (
99-security-hardening.ini):- Prometheus działa jako użytkownik
nobody(UID65534). - Grafana działa jako użytkownik
grafana(UID472) z domyślną roląViewerdla dostępu bez logowania przez tunel SSH (GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer). - Uptime Kuma ma wymuszone logowanie (
DISABLE_AUTH=false) i jest dostępna przez tunel SSH (127.0.0.1:3001). - AI Router działa jako użytkownik
nobodyz 4 workerami PHP (PHP_CLI_SERVER_WORKERS=4), wyłączonymi funkcjami powłoki (disable_functions = exec,passthru,shell_exec,system,proc_open,popen,...), wyłączonymfile_uploadsorazopen_basedir = /app:/tmp.
- Prometheus działa jako użytkownik
- Flaga bezpieczeństwa:
security_opt: [no-new-privileges:true]uniemożliwia eskalację uprawnień z wnętrza któregokolwiek z 13 kontenerów. - Pliki konfiguracyjne w trybie tylko do odczytu:
prometheus.yml,rules/,provisioning/oraz bazy wiedzydata/montowane z uprawnieniem:ro. - Prewencja zapełnienia dysku: Rotacja logów kontenerów w
/etc/docker/daemon.json(max-size: 10m,max-file: 3).
.
├── .github/
│ ├── ISSUE_TEMPLATE/ # Szablony incydentów i zadań infrastrukturalnych
│ ├── pull_request_template.md # Quality Gate checklist dla zmian infra
│ ├── dependabot.yml # Comiesięczny nadzór nad wersjami akcji i obrazów Docker
│ └── workflows/
│ ├── lint-compose.yml # Quality Gate: walidacja Compose, składni skryptów i higieny
│ ├── deploy.yml # Automatyczny deploy po SSH + flush DNS nscd + audyt powykonawczy
│ └── external-watchdog.yml # Zewnętrzny Dead Man's Switch (WAN Watchdog z chmury GitHub -> Ntfy.sh)
├── .githooks/
│ ├── pre-commit # Git hook blokujący wycieki sekretów (.env, .env.bak*, *.pem, *.key)
│ └── commit-msg # Git hook wymuszający format Conventional Commits
├── compose/
│ ├── docker-compose.yml # Stos (devops_internal_network): Prometheus, Grafana, Kuma, Node Exporter, cAdvisor, Dozzle, AI Router, GitHub Exporter, OCI Keepalive Buffer
│ ├── extensions.yml # Tunel Cloudflare Zero Trust (cloudflared)
│ └── runners.yml # Runnery GitHub Actions ARM64 w odseparowanej sieci (devops_runners_network)
├── config/
│ ├── prometheus/
│ │ ├── prometheus.yml # Scrape: Kuma, Node Exporter, cAdvisor, GitHub Exporter, AI Router (/metrics co 5s)
│ │ └── rules/
│ │ └── ai-router.yml # 21 reguł alertów Prometheusa (kaskada AI, WAF, Fail2Ban IPS, IoC, CPU, Inodes, NTP, certyfikaty, dysk, RAM, backupy)
│ └── grafana/
│ └── provisioning/
│ ├── datasources/ # Automatyczne podpinanie Prometheus API (uid: prometheus)
│ └── dashboards/ # 3 pulpity: Centrum Monitoringu + AI Router + Analityka Ruchu WWW & SEO (Cookieless)
├── docs/
│ ├── AI_ROUTER_RAPORT.md # Dokumentacja telemetrii, metryk, cache'u RAG, WAF, Analityki WWW i raportowania AI Routera
│ └── CLOUDFLARE_STAGING_GUIDE.md# Poradnik testowania stagingu bez publicznych subdomen
├── scripts/
│ ├── 01-harden-os.sh # Skrypt pełnego hardeningu systemu Ubuntu (ISO 27001, Fail2ban 1h->7d, TCP BBR, inotify, NTP, SWAP 2GB, DOCKER-USER systemd hook, journald 200M)
│ ├── 02-install-docker.sh # Instalacja Docker CE i Compose v2 z optymalizacją pod VPS
│ ├── ai-router-report.sh/.ps1 # Narzędzia CLI do generowania raportów skuteczności, cache'u i kaskady AI Routera
│ ├── audit-server.sh # 5-warstwowy audyt (78 testów, IoC/SUID/IPS/WAF, NTP, BBR, SWAP, AMMS Zero-Trust, Web Analytics v3, 24h Log Hunter) + poranny raport 08:00 (Dual-AI HIGH Reasoning $0.00 + eskalacja Claude 4.6)
│ ├── backup-offsite.sh # Snapshot wolumenów (weryfikacja tar -tzf + SQLite + AES-256 + nocny Restore Drill) do chmury R2
│ ├── backup-volumes.sh # Bezpieczny lokalny backup wolumenów :ro z retencją 7 dni
│ ├── backup-websites-lh.sh # Backup serwisów WWW z hostingu LH.pl (FTPS TLS + mysqldump + tar -tzf + AES-256)
│ ├── restore-backup.sh # Automatyczne odtwarzanie (Disaster Recovery) i test Restore Drill (--verify-only)
│ ├── open-dashboard.ps1/.cmd # Błyskawiczny launcher 1-klik (cichy tunel SSH + otwarcie 3x Grafana, Dozzle, Uptime Kuma i AMMS)
│ ├── open-amms-assistant.ps1/.cmd# 1-klikowy launcher Asystenta Eksperckiego AMMS & Oracle DBA (Microsoft Teams UI przez tunel SSH)
│ ├── pack-amms-portable.ps1 # Generator przenośnej paczki ZIP (Portable) dla Asystenta AMMS i Monitoringu na drugi komputer
│ ├── preview-tunnel.ps1/.sh # Quick Tunnel – natychmiastowy szyfrowany link HTTPS dla stagingu
│ ├── setup-audit-timer.sh # Idempotentna instalacja strażnika systemd 24/7 (devops-audit.timer co 15 min)
│ ├── setup-backup-timer.sh # Idempotentna instalacja harmonogramu backupów systemd (devops-backup.timer 03:00 UTC)
│ ├── setup-kuma.js # Idempotentna rejestracja 10 monitorowanych witryn i AI Routera w Uptime Kuma
│ ├── setup-ntfy.js # Konfiguracja kanału powiadomień Ntfy
│ ├── sync-gsc-keywords.sh # Bezciasteczkowa synchronizacja słów kluczowych Google Search Console API + Sitemap Refresh + IndexNow
│ ├── verify-remote.ps1/.cmd # Zdalny wyzwalacz audytu VPS z poziomu Windows (npm run audit)
│ ├── warm-ai-cache.sh # Idempotentny pre-warming pamięci podręcznej RAG (Quick Prompts) po wdrożeniu
│ └── runners/ # Skrypty sterowania runnerami CI/CD
├── services/
│ └── ai-router/ # Scentralizowany mikro-router AI & Analityki WWW (PHP 8.3 Alpine + PDO SQLite FTS5, Multi-Provider RAG, Cache <5ms, WAF L7)
│ ├── Dockerfile # Izolowany kontener non-root, minimalny footprint (~12 MB RAM, 4 workery PHP)
│ ├── src/
│ │ ├── chat-router.php # Obsługa POST, CORS whitelist, WAF L7 + 15m Penalty Box, Cache RAG (<5ms), Leady Ntfy 1-Klik, 11-modelowa kaskada LLM, /amms, /analytics
│ │ ├── amms-rag-search.php# Silnik Dual-Stream SQLite FTS5 BM25 (314 PDF + 69 plików bazy Oracle AMMS) + Smart Reasoning Tiering (LOW/HIGH)
│ │ ├── amms-teams.html # Interfejs Asystenta AMMS & Oracle DBA w stylu Microsoft Teams z wizualnymi zrzutami stron (Page Snapshots)
│ │ ├── ai-stats.php # Moduł telemetrii Prometheus (AI + Cookieless Web Analytics v3), Cooldownu modeli i limitów RPD
│ │ └── widget.js # Uniwersalny widget czatu AI + Cookieless Web Analytics serwowany przez GET /widget.js
│ ├── data/ # Bazy wiedzy RAG montowane :ro (fuegolingua, katosalsahub, twojastronawww, amms-knowledge.txt + amms-knowledge.sqlite)
│ ├── storage/ # Trwały wolumen na pliki rate-limit, cache RAG (/app/storage/cache) oraz ai_stats.json
│ └── public-test/ # Tester frontendu (Vanilla HTML + JS + CSS)
├── tests/
│ └── unit/
│ ├── repo-hygiene.test.js # 26 testów higieny repozytorium, walidacji 3 dashboardów JSON, telemetrii AI/WWW, AMMS i kontraktu _site-template
│ └── security-regression.test.js # 16 testów regresji bezpieczeństwa OWASP / ISO 27001 / Zero Trust / WAF / Analytics / AMMS (łącznie 42 testy)
├── AGENTS.md / GEMINI.md # Wytyczne architektoniczne dla modeli AI i rygor Always Free
├── DISASTER_RECOVERY.md # Procedura odtworzenia środowiska z kopii w < 15 minut
├── README.md # Główna dokumentacja architektury i bezpieczeństwa
├── SECURITY.md # Polityka bezpieczeństwa ISO 27001 i Responsible Disclosure
├── LICENSE # Licencja TwojaStronaWWW
├── .editorconfig # Standard kodowania LF, UTF-8 i wcięć
├── .gitattributes # Wymuszenie zakończeń linii LF (ochrona przed CRLF)
├── .gitignore # Rygor ISO 27001: wykluczenie kluczy, certyfikatów, haseł, .env i .env.bak*
└── package.json # Skrypty jakościowe (npm test, npm run check, npm run audit)
Dzięki wdrożeniu tuneli Cloudflare możesz całkowicie skasować subdomeny test.nazwastrony.pl w swoim panelu DNS:
-
Podgląd natychmiastowy (Ad-Hoc Preview):
# W Windows (PowerShell): pwsh scripts/preview-tunnel.ps1 -Target "http://localhost:3000" # W Linuksie / WSL2: ./scripts/preview-tunnel.sh http://localhost:3000
Generuje tymczasowy, szyfrowany adres HTTPS (np.
https://random-word.trycloudflare.com). Zero wpisów w DNS, poCtrl+Ctunel znika. -
Stały Staging z Kontrolą Dostępu: Szczegółowa konfiguracja routingu wewnętrznego i polityki Cloudflare Zero Trust (autoryzacja kodem PIN na e-mail) znajduje się w przewodniku
docs/CLOUDFLARE_STAGING_GUIDE.md.
Runnery CI/CD działają w kontenerach Docker na architekturze ARM64 wewnątrz wydzielonej sieci mostkowej devops_runners_network, dzięki czemu zadania budowania kodu nie mają dostępu do wewnętrznej sieci usług monitoringu (devops_internal_network):
runner-zeslownikiem-unified(Organizacja:zeslownikiem):- Obsługuje repozytoria organizacji
zeslownikiem(gal-anonymitd.). - Etykiety:
self-hosted,linux,arm64,ARM64,vps,unified.
- Obsługuje repozytoria organizacji
runner-twojastronawww-unified(Organizacja:TwojaStronaWWW):- Automatycznie obsługuje:
devops-stack,twojastronawww,katosalsahub,raricart,hd-osticket-helpdeskoraz szablony witryn_site-template. - Etykiety:
self-hosted,linux,arm64,ARM64,vps,unified,twojastronawww.
- Automatycznie obsługuje:
runner-gal-anonim-web(Repozytorium:zeslownikiem/gal-anonim-web):- Dedykowany runner dla aplikacji webowej
gal-anonim-web. - Etykiety:
self-hosted,linux,arm64,ARM64,vps,unified.
- Dedykowany runner dla aplikacji webowej
cd /opt/devops-stack/compose
docker compose --env-file /opt/devops-stack/.env -f runners.yml up -dW przypadku popularnych regionów (np. Paryż eu-paris-1), darmowe procesory ARM Ampere A1 (VM.Standard.A1.Flex - 4 OCPU, 24 GB RAM) bywają tymczasowo wyczerpane ("Out of host capacity").
Do automatycznego „upolowania” maszyny służy skrypt scripts/oracle-arm-hunter.sh:
- Konfiguracja OCI CLI w WSL2:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)" -- --accept-all-defaults exec -l $SHELL
- Automatyczne wykrycie identyfikatorów konta:
./scripts/oracle-arm-hunter.sh --discover
- Uruchomienie łowcy w tle (z powiadomieniami Ntfy na telefon):
nohup ./scripts/oracle-arm-hunter.sh > oracle-hunter.log 2>&1 & tail -f oracle-hunter.log
-
Połączenie SSH z serwerem:
ssh -i ~/.ssh/id_ed25519 ubuntu@89.168.62.31 -
Klonowanie repozytorium do katalogu docelowego:
sudo git clone https://github.com/TwojaStronaWWW/devops-stack.git /opt/devops-stack sudo chown -R ubuntu:ubuntu /opt/devops-stack cd /opt/devops-stack -
Wykonanie hardeningu systemu i instalacja silnika Dockera:
sudo bash scripts/01-harden-os.sh sudo bash scripts/02-install-docker.sh newgrp docker
-
Konfiguracja zmiennych środowiskowych i poświadczeń:
cp .env.example .env chmod 600 .env nano .env
Uzupełnij:
CLOUDFLARE_TUNNEL_TOKEN,RUNNER_ORG_TOKEN,GITHUB_TOKEN,GEMINI_API_KEY,GROQ_API_KEY,OPENROUTER_API_KEYoraz hasła do Grafany i Uptime Kuma.Utwórz zabezpieczony plik poświadczeń dla scrapera Prometheusa (UID 65534):
echo -n "TwojeHasloKuma" > config/prometheus/kuma_password sudo chown 65534:ubuntu config/prometheus/kuma_password sudo chmod 640 config/prometheus/kuma_password
-
Uruchomienie pełnego stosu produkcyjnego, pre-warming Cache RAG oraz aktywacja strażnika 24/7 i nocnych backupów:
cd /opt/devops-stack/compose docker compose --env-file /opt/devops-stack/.env -f docker-compose.yml -f extensions.yml -f runners.yml up -d --build bash /opt/devops-stack/scripts/warm-ai-cache.sh sudo bash /opt/devops-stack/scripts/setup-audit-timer.sh sudo bash /opt/devops-stack/scripts/setup-backup-timer.sh -
Weryfikacja stanu usług (5-warstwowy audyt):
bash /opt/devops-stack/scripts/audit-server.sh
Aby wyeliminować konieczność manualnego otwierania terminala i zestawiania tuneli SSH, wdrożono zautomatyzowany mechanizm 1-Klik:
- Lokalizacja skryptu:
scripts/open-dashboard.ps1/scripts/open-dashboard.cmd - Zdalny audyt 1 komendą:
npm run audit(scripts/verify-remote.ps1)
- Sprawdza, czy porty lokalne (3000, 3001, 8888, 9090) są już aktywne.
- Jeśli tunel nie działa, cicho uruchamia proces SSH w tle z asymetrycznym kluczem
id_ed25519:ssh -N -L 3000:127.0.0.1:3000 -L 3001:127.0.0.1:3001 -L 8888:127.0.0.1:8888 -L 9090:127.0.0.1:9090 ubuntu@89.168.62.31
- Po ustabilizowaniu portów automatycznie otwiera domyślną przeglądarkę z gotowymi kartami:
- Grafana (
http://127.0.0.1:3000): Działa w trybie podglądu Anonymous Viewer (GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer) zgodnie z zasadą PoLP (ISO 27001), chroniąc dashboardy przed przypadkowym usunięciem. Pełna edycja wymaga zalogowania na konto administratora. - Uptime Kuma (
http://127.0.0.1:3001): Panel statusu 10 monitorowanych witryn i usług. - Dozzle (
http://127.0.0.1:8888): Podgląd logów wszystkich 12 kontenerów w czasie rzeczywistym.
- Grafana (
Często Zadawane Pytanie Bezpieczeństwa:
„Jeśli to repozytorium jest publiczne na GitHubie, czy ktokolwiek z internetu może sklonować kod i uzyskać dostęp do serwera, kontenerów lub monitorowanych usług?”
Infrastruktura została zaprojektowana w oparciu o wojskowy rygor Defense-in-Depth (Obrona w głąb) oraz normę ISO 27001. Posiadanie kodu źródłowego repozytorium nie daje atakującemu żadnej ścieżki wejścia na serwer.
| Warstwa Bezpieczeństwa | Mechanizm Obronny | Skutek dla Atakującego z Internetu |
|---|---|---|
| 1. Sieciowa (WAN) | Wszystkie porty aplikacji (3000, 3001, 8085, 8888, 9090) są powiązane wyłącznie z 127.0.0.1 (loopback). Brak mapowania na 0.0.0.0. |
Porty aplikacji są niewidoczne i nieosiągalne z internetu. Skany Nmap wskazują porty jako zamknięte/odfiltrowane. |
| 2. Firewall (UFW & OCI) | Porty 80 i 443 oraz wszystkie porty aplikacji są zablokowane na zaporze UFW i listach OCI Security Lists. | Nawet celowe zapytania pod publiczny adres IP 89.168.62.31 są natychmiast odrzucane na poziomie jądra (DROP). |
| 3. Tożsamość & SSH | Port 22 ma wyłączone uwierzytelnianie hasłem (PasswordAuthentication no) oraz zablokowane konto roota (PermitRootLogin no). |
Zgadnięcie lub złamanie hasła jest niemożliwe. Wejście wymaga prywatnego klucza id_ed25519, który znajduje się wyłącznie na Twoim fizycznym dysku i nigdy nie trafił do Git. |
| 4. Ochrona Brute-Force & WAF | UFW rate-limiting (limit 22/tcp) + Fail2ban IPS (progresywny ban 1h -> 7d) + WAF Warstwy 7 z 15-min IP Penalty Box. |
Automatyczny ban na zaporze po 3 błędach SSH oraz natychmiastowa blokada HTTP 403 prób Prompt Injection / XSS / SQLi / LFI. |
| 5. Higiena Sekretów | Rygor .gitignore wyklucza pliki .env, .env.bak*, klucze *.pem, *.key, id_*, certyfikaty oraz pliki haseł kuma_password. |
W publicznym repozytorium znajdują się wyłącznie zanonimizowane szablony (.env.example). Zero realnych tokenów w historii gita. |
| 6. Git Hooks (Pre-commit) | Skrypt .githooks/pre-commit skanuje każdy commit i blokuje wysłanie plików o wrażliwych rozszerzeniach. |
Ochrona przed przypadkowym wysłaniem klucza lub hasła przez administratora. |
| 7. Separacja Sieci i PoLP | Runnery CI/CD są odizolowane w devops_runners_network, a usługi działają z no-new-privileges:true (nobody:65534, grafana:472). |
Nawet w hipotetycznym scenariuszu kompromitacji zadania CI/CD atakujący nie ma dostępu do wewnętrznej sieci usług ani roota hosta. |
Serwer VPS pełni funkcję Centralnego Sejfu i Węzła Disaster Recovery dla całej infrastruktury TwojaStronaWWW:
- Tworzy spójne snapshoty wszystkich 7 wolumenów (
uptime_kuma_data,grafana_data,prometheus_data,ai_router_storage,runner_zeslownikiem_data,runner_twojastronawww_data,runner_gal_anonim_web_data) montowanych w trybie tylko do odczytu (:ro) wraz z weryfikacją baz SQLite (PRAGMA quick_check). - Automatycznie weryfikuje integralność wygenerowanego archiwum (
tar -tzf) przed dalszym przetwarzaniem i eksportuje metrykędevops_backup_verified. - Szyfruje archiwum symetrycznie algorytmem AES-256-CBC (PBKDF2) (
BACKUP_ENCRYPTION_KEY) i przesyła do Cloudflare R2 / S3 z kroczącą retencją 30 dni lokalnie na VPS oraz 14 dni w chmurze R2 (rclone delete --min-age 14d, mieszcząc się w 100% w darmowym limicie 10 GB R2). - Automatyczny Nocny Restore Drill (
restore-backup.sh --verify-only): Po wysłaniu kopii do R2 skrypt automatycznie pobiera paczkę z chmury, odszyfrowuje ją w izolowanym katalogu tymczasowym i testuje odtwarzalność archiwów oraz spójność baz SQLite, wystawiając metrykędevops_backup_restore_drill_verified.
- Łączy się ze zdalnym hostingiem LH.pl przez szyfrowany kanał FTPS TLS (
ftp:ssl-allow true,ftp:ssl-protect-data true). - Pobiera strukturę plików witryn (
public_html) z normalizacją uprawnień (--no-perms+chown), oraz wykonuje zrzut baz MySQL (mysqldump --single-transaction). - Weryfikuje integralność archiwum (
tar -tzf, metrykidevops_backup_websites_verifiedorazdevops_backup_websites_db_verified), szyfruje AES-256-CBC i przesyła do Cloudflare R2 (${S3_BUCKET}/websites/) z automatyczną rotacją 30 dni lokalnie oraz 14 dni w R2.
devops-backup.timer(scripts/setup-backup-timer.sh): Uruchamiany codziennie o 03:00 UTC (05:00 rano czasu polskiego) — wykonuje pełny backup wolumenów, stron LH.pl oraz automatyczny Restore Drill.devops-audit.timer(scripts/setup-audit-timer.sh): Uruchamiany co 15 minut (0 zapytań AI w rutynowych przebiegach) — wykonuje 5-warstwowy audyt bezpieczeństwa i zdrowia (audit-server.sh, 68 testów), kontroluje ślady włamań IoC (devops_security_ioc_clean), blokady WAF L7 (devops_waf_blocked_total), ochronę Zero-Trust i bazę FTS5 Asystenta AMMS (/amms), telemetrię Cookieless Web Analytics v3 & GSC Sync, skaner wyjątków 24h (devops_log_critical_24h_total) i statystyki Fail2Ban (devops_fail2ban_banned_total), odświeża telemetrięaudit.prom, wykonuje samonaprawę DNSnscdw Uptime Kuma i wysyła natychmiastowy alert Push na telefon (Ntfy.sh) w razie jakiejkolwiek awarii lub aktywnego alarmu Prometheusa. Ponadto raz dziennie o 08:00 czasu polskiego wysyła poranny raport stanu infrastruktury wzbogacony o 24-godzinny Rentgen (--since 24h) weryfikowany krzyżowo przez dwa darmowe modele w trybie głębokiego myślenia (Groq/Cerebras GPT-OSS-120B reasoning: HIGH+Gemini 3.5 Flash thinking: HIGH, koszt$0.00), z automatyczną eskalacją doClaude Sonnet 4.6wyłącznie w razie wykrycia anomalii/błędów.
W celu zapewnienia bezwzględnej zgodności z normą ISO 27001 oraz uniknięcia jakichkolwiek wycieków poświadczeń, wdrożono Dwuwarstwowy Model Zarządzania Sekretami:
- Warstwa Główna: Baza KeePass Password Safe (
Databasekpoczatek.kdbx):- Wszystkie poświadczenia produkcyjne są scentralizowane w zaszyfrowanej bazie KeePass w dedykowanej grupie
VPS - TwojaStronaWWW. - Obejmuje: hasła administracyjne Grafana, Uptime Kuma, dane klucza SSH Ed25519, tokeny Cloudflare Zero Trust, klucze Cloudflare R2, dane FTPS LH.pl, tokeny rejestracyjne runnerów CI/CD oraz 6 kluczy API dla AI Routera (
GEMINI_API_KEY,GROQ_API_KEY,CEREBRAS_API_KEY,CF_AI_API_TOKEN,OPENROUTER_API_KEY,ANTHROPIC_API_KEY).
- Wszystkie poświadczenia produkcyjne są scentralizowane w zaszyfrowanej bazie KeePass w dedykowanej grupie
- Warstwa Automatyzacji: GitHub Actions Secrets:
- Zmienne używane w potokach wdrożeniowych (
VPS_HOST,VPS_USER,VPS_SSH_KEY,FTP_*) są zdefiniowane wyłącznie w GitHub Secrets.
- Zmienne używane w potokach wdrożeniowych (
- Warstwa Hosta VPS: Izolowany Plik
.env:- Na serwerze VPS zmienne środowiskowe znajdują się w pliku
/opt/devops-stack/.envzabezpieczonym uprawnieniemchmod 600(właścicielubuntu), trwale wykluczonym przez.gitignore(wraz z.env.bak*).
- Na serwerze VPS zmienne środowiskowe znajdują się w pliku
Serwer VPS udostępnia scentralizowany mikro-router AI oraz kolektor bezciasteczkowej analityki WWW (services/ai-router/src/chat-router.php) obsługujący witryny platformy (Fuego Lingua, Kato Salsa Hub, TwojaStronaWWW) pod adresem https://ai.twojastronawww.pl.
- Obszar 3 (AI z bazą wiedzy firmy RAG) + Enterprise High-Availability: Dynamiczny dobór bazy wiedzy po parametrze
site_id(services/ai-router/data/<site_id>-knowledge.txtmontowane w trybie:ro), pamięć konwersacji Multi-Turn (historydo 8 wiadomości) oraz twarde reguły anty-halucynacyjne (Guardrails). - WAF Warstwy 7 + 15-Minutowy IP Penalty Box (
security_blocked): Blokuje próby Prompt Injection, Jailbreak, XSS, SQLi oraz Path Traversal kodemHTTP 403przed wywołaniem modelu AI i nakłada 15-minutową blokadę na IP agresora. - Bezciasteczkowa Analityka Ruchu WWW & SEO (
POST /analytics&/collect— 100% Cookieless RODO / Zero-PII): Rejestruje unikalnych odwiedzających dziś (anonimowy dzienny skrót SHA-256 bez zapisu IP i bez ciasteczek), odsłony podstron, źródła wejść (Google,Bezpośrednie,Facebook,Instagram), urządzenia (SmartfonvsKomputer), kraje (CF-IPCountryz flagami) oraz wyszukiwane hasła w Salsopedii, prezentując je na 3. dashboardzie Grafany (web-analytics-overview.json). - Inteligentny Cache odpowiedzi RAG (
~1.8 ms/0tokenów) + Automatyczny Pre-warming (scripts/warm-ai-cache.sh): Powtarzalne pytania o ofertę i cennik są serwowane z atomowej pamięci podręcznej/app/storage/cachew niecałe 2 milisekundy, bez zużywania dziennych limitów API. Klucz cache normalizuje interpunkcji i wielkość liter oraz uwzględniafilemtimepliku wiedzy, a skryptscripts/warm-ai-cache.shautomatycznie rozgrzewa przyciski Quick Prompts podczas każdego wdrożenia CI/CD (deploy.yml). - Ochrona przed ucinaniem zdań i ukrytymi tokenami myślenia (
thoughtsTokenCount/reasoning_tokens): Router wymuszamaxOutputTokens: 2048, przekazuje'thinkingLevel' => 'MINIMAL'dlagemini-3.5-*(lub'LOW'dlagemini-3.7/3.8),'reasoning_effort' => 'low'/'disable_reasoning' => truedla Cerebras WSE,'reasoning' => ['effort' => 'none']dla OpenRoutera, wykorzystuje domyślnie wyłączone Extended Thinking + Prompt Caching (ephemeral-90%) w Claude Haiku 4.5 oraz odrzuca odpowiedzi zfinishReason === 'MAX_TOKENS'(length/max_tokens). - Detektor „Gorącego Leada” i Natychmiastowa Ekstrakcja Telefonu / E-maila (Zero-PII na dysku): Gdy klient poda w rozmowie numer telefonu lub adres e-mail (
event=contact_lead_captured), router automatycznie wyciąga i formatuje numer (📞 TELEFON: +48 ...) oraz adres (✉️ E-MAIL: ...), umieszcza je bezpośrednio w tytule powiadomienia i w pierwszych linijkach wiadomości Ntfy.sh (wraz z wcześniejszymi pytaniami z sesji) oraz dodaje natywne przyciski akcji 1-Klik (Zadzwoń tel:.../Napisz e-mail mailto:...). Przy 4. pytaniu klienta w jednej sesji (count($sanitizedHistory) === 6) wysyła ponadto sygnałevent=hot_lead_detected. - 0 MB wag modeli na serwerze VPS: Wszystkie 11 modeli LLM działa w chmurze zewnętrznych dostawców. Sam kontener
ai-router(PHP 8.3 Alpine,PHP_CLI_SERVER_WORKERS=4) zużywa jedynie ~14 MiB RAM oraz 0,00 PLN / mies. kosztów utrzymania.
Router posiada skonfigurowanych 6 niezależnych kluczy API, nakłada wydłużony cooldown na przeciążone modele (600 s po timeoucie 4s, 180 s po HTTP 503) i wykonuje natychmiastowy Fast-Fail do Groq LPU (~0.6 s) / Cerebras WSE (~0.15 s) po pierwszym timeoucie sieciowym lub gdy
| Pozycja w kaskadzie | Dostawca (Zmienna Klucza) | Model LLM | Domyślny Limit RPD (Free Tier) | Rola w architekturze |
|---|---|---|---|---|
| 0 (Primary) | Google AI Studio (GEMINI_API_KEY) |
gemini-3.5-flash (MINIMAL) |
500 / doba |
Najszybszy i najstabilniejszy model główny (~1.5 s, 0 ukrytych myśli) |
| 1 (Fallback 1) | Google AI Studio (GEMINI_API_KEY) |
gemini-3.5-flash-lite (MINIMAL) |
1 500 / doba |
Ultralekki model o wysokim limicie RPD |
| 2 (Fallback 2) | Google AI Studio (GEMINI_API_KEY) |
gemini-3.7-flash (LOW) |
500 / doba |
Druga pula modelu Gemini Flash |
| 3 (Fallback 3) | Google AI Studio (GEMINI_API_KEY) |
gemini-3.8-flash (LOW) |
500 / doba |
Najnowsza generacja Gemini Flash |
| 4 (Fallback 4) | Google AI Studio (GEMINI_API_KEY) |
gemma-4-31b-it |
14 400 / doba |
Otwarty model Google o dużej puli dziennej |
| 5 (Fallback 5) | Groq Cloud (GROQ_API_KEY) |
openai/gpt-oss-120b |
1 000 / doba |
Zewnętrzny ultra-szybki fallback na układach LPU (~0.6 s, Fast-Fail) |
| 6 (Fallback 6) | Cerebras WSE (CEREBRAS_API_KEY) |
gpt-oss-120b (low) |
2 400 / doba |
Wafer-Scale Engine (~2000 tok/s, odpowiedź w ~0.15 s, 1 mln tok/doba) |
| 7 (Fallback 7) | Cerebras WSE (CEREBRAS_API_KEY) |
qwen-3.8-27b (no-think) |
648 000 / doba |
Gigantyczna pula 648 tys. zapytań/doba (450 RPM, 0 reasoning tokens) |
| 8 (Fallback 8) | Cloudflare Workers AI (CF_AI_API_TOKEN) |
@cf/meta/llama-3.3-70b-instruct-fp8-fast |
1 000 / doba |
Edge AI na sieci Cloudflare (10 000 Neurons/doba, ~7.5 neurona/zapytanie) |
| 9 (Fallback 9) | OpenRouter (OPENROUTER_API_KEY) |
nvidia/nemotron-3-super-120b-a12b:free |
200 / doba |
Niezależny zapasowy klaster chmurowy (:free, reasoning: none) |
| 10 (Bezpiecznik) | Anthropic Claude (ANTHROPIC_API_KEY) |
claude-haiku-4-5 |
1 000 / doba |
Ostatni bezpiecznik Pre-paid $5 (~0.9 s, 0 myśli, Prompt Cache -90%) |
- Endpoint Prometheus (
GET /metricsco 5 s): Eksportuje metryki zapytań, zablokowanych ataków WAF (security_blocked), trafień cache (ai_router_cache_hits_total,ai_router_cache_entries), bezciasteczkowej analityki WWW (web_analytics_*), skuteczności kaskady, prób per model, aktywnych cooldownów, limitów dziennych RPD oraz wyzerowanych serii błędów. Zgodnie z ISO 27001 modułai-stats.phpnigdy nie loguje treści pytań klientów, adresów IP ani kluczy API. - 3 Dashboardy Grafany:
- Centrum Monitoringu Stron WWW & Usług (
uptime-kuma-overview.json): Status 10 witryn, podwójne zegary RAM (Realny vs Sztuczny +20% OCI Buffer), liczniki zablokowanych ataków WAF/Fail2Ban IPS oraz status integralności systemu IoC. - AI Router - Gemini Proxy Monitor (
ai-router-overview.json): Ruch czatu, trafienia Cache RAG<5ms, paski dziennego limitu RPD, błędy i zdrowie wszystkich 11 modeli oraz pozyskane leady. - Analityka Ruchu WWW & SEO (Cookieless) (
web-analytics-overview.json): Unikalni odwiedzający dziś, odsłony podstron, źródła wejść (Google, Bezpośrednie, FB, IG), urządzenia (Smartfon vs Komputer), kraje GeoIP z flagami oraz wyszukiwane hasła w Salsopedii.
- Centrum Monitoringu Stron WWW & Usług (
- 18 Reguł Alertów Prometheusa + Push Ntfy.sh: Plik
config/prometheus/rules/ai-router.ymlmonitoruje warunki krytyczne, adevops-audit.timerco 15 minut weryfikuje stan alarmówfiringw Prometheusie i natychmiast wysyła powiadomienia Push na telefon. - Raporty CLI na żądanie: Skrypty
scripts/ai-router-report.shorazscripts/ai-router-report.ps1(szczegóły wdocs/AI_ROUTER_RAPORT.md).
- Baza wiedzy na VPS: Utwórz plik
services/ai-router/data/<site_id>-knowledge.txti dopisz jego ścieżkę wtests/unit/repo-hygiene.test.js. - CORS na VPS: Dopisz domenę (
https://domena.pl,https://www.domena.pl) doALLOWED_ORIGINSw/opt/devops-stack/.env(oraz.env.example). - Pre-warming Cache RAG: Dopisz 4 pytania startowe (Quick Prompts) witryny do tablicy
PROMPTSwscripts/warm-ai-cache.sh. - Frontend na stronie docelowej (wg wzorca
_site-template):- Skopiuj
assets/js/ai-widget.js(zawierającyAbortController9s timeout oraz lokalny fallbackgetLocalFallbackAnswer(question, siteId)), - W
<head>każdego pliku HTML dodaj<link rel="preconnect" href="https://ai.twojastronawww.pl" crossorigin>, - Przed
</body>dodaj<script type="module" src="assets/js/ai-widget.js" data-site-id="<site_id>" data-title="Asystent ..."></script>, - Jeśli strona posiada pływający przycisk telefonu (
.sticky-call-btn), przesuń go na mobile nabottom: 96px; right: 28px, aby nie kolidował z przyciskiem czatu (.tsw-ai-btnnabottom: 24px; right: 24px).
- Skopiuj