thecr3w-dev/scripts/discovery/diagnose_vps.sh

150 lines
5.2 KiB
Bash

#!/usr/bin/env bash
# ==============================================================================
# TheCr3w-dev — Stage 0 Infrastructure Discovery Script (READ-ONLY)
# ==============================================================================
# Cel: Zebranie podstawowych, bezpiecznych (read-only) informacji o stanie VPS,
# kontenerach Docker, sieciach, Caddy oraz usługach.
#
# ZASADA BEZPIECZEŃSTWA:
# Skrypt NIE modyfikuje żadnych plików, NIE zatrzymuje kontenerów, NIE zbiera
# haseł, tokenów, kluczy prywatnych ani plików .env.
# ==============================================================================
set -o pipefail
OUT_FILE="thecr3w_discovery_report_$(date +%Y%m%d_%H%M%S).txt"
exec > >(tee -a "${OUT_FILE}") 2>&1
echo "=============================================================================="
echo " THECR3W-DEV — AUDYT INFRASTRUKTURY (STAGE 0: READ-ONLY)"
echo " Data wykonania: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
echo "=============================================================================="
echo ""
echo "--- 1. SYSTEM OPERACYJNY I ZASOBY HOSTA ---"
echo "[OS Release]"
if command -v lsb_release &>/dev/null; then
lsb_release -a
elif [ -f /etc/os-release ]; then
cat /etc/os-release
else
uname -a
fi
echo ""
echo "[Kernel]"
uname -r
echo ""
echo "[Pamięć RAM i Swap]"
free -h
echo ""
echo "[Dysk / Przestrzeń magazynowa]"
df -hT -x tmpfs -x devtmpfs -x overlay
echo ""
echo "[Uptime i obciążenie]"
uptime
echo ""
echo "--- 2. DOCKER & DOCKER COMPOSE ---"
if command -v docker &>/dev/null; then
echo "[Docker Version]"
docker --version
echo ""
echo "[Docker Info - Storage & Security]"
docker info --format 'ServerVersion: {{.ServerVersion}}, StorageDriver: {{.Driver}}, CgroupDriver: {{.CgroupDriver}}, RootDir: {{.DockerRootDir}}'
echo ""
echo "[Aktywne i zatrzymane kontenery]"
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "[Sieci Docker]"
docker network ls
echo ""
echo "[Wolumeny Docker]"
docker volume ls
else
echo "UWAGA: Polecenie 'docker' nie jest dostępne w PATH."
fi
echo ""
echo "[Docker Compose]"
if docker compose version &>/dev/null; then
docker compose version
elif command -v docker-compose &>/dev/null; then
docker-compose --version
else
echo "Docker Compose nie został wykryty."
fi
echo ""
echo "--- 3. REVERSE PROXY — CADDY ---"
if docker ps --format '{{.Names}}' | grep -q "^caddy$"; then
echo "Kontener 'caddy': ZNALEZIONY i URUCHOMIONY."
echo "[Caddy Image]: $(docker inspect caddy --format '{{.Config.Image}}')"
echo "[Caddy Networks]: $(docker inspect caddy --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}')"
echo "[Caddy Mounts / Volumes]:"
docker inspect caddy --format '{{range .Mounts}}{{.Type}} -> Source: {{.Source}} | Dest: {{.Destination}} | RW: {{.RW}}{{"\n"}}{{end}}'
else
echo "Kontener o nazwie 'caddy' NIE jest aktualnie uruchomiony."
docker ps -a --filter "name=caddy" --format "table {{.Names}}\t{{.Status}}"
fi
echo ""
echo "[Weryfikacja /opt/proxy/Caddyfile]"
if [ -f "/opt/proxy/Caddyfile" ]; then
echo "Plik /opt/proxy/Caddyfile istnieje."
echo "--- Fragment reguł (zanonimizowany, pierwsze 60 linii bez sekretów) ---"
# Wyświetlamy strukturę bloków domenowych bez ewentualnych wrażliwych nagłówków/haseł
grep -E '^[a-zA-Z0-9\.\_\:\-]+[[:space:]]*\{|reverse_proxy|import|tls' /opt/proxy/Caddyfile || head -n 40 /opt/proxy/Caddyfile
else
echo "Plik /opt/proxy/Caddyfile NIE istnieje w tej ścieżce."
echo "Wyszukiwanie Caddyfile w standardowych lokalizacjach:"
find /opt /etc -maxdepth 3 -name "Caddyfile" 2>/dev/null || true
fi
echo ""
echo "--- 4. HISTORYCZNY KONTENER 'app-app-1' ---"
if docker ps -a --format '{{.Names}}' | grep -q "^app-app-1$"; then
echo "Kontener 'app-app-1' znaleziony:"
docker inspect app-app-1 --format 'Image: {{.Config.Image}}, Status: {{.State.Status}}, Created: {{.Created}}'
else
echo "Kontener 'app-app-1' nie istnieje."
fi
echo ""
echo "--- 5. PORTY NASŁUCHUJĄCE NA HOŚCIE (LSOF / SS) ---"
if command -v ss &>/dev/null; then
ss -tulpn | grep -E ':(80|443|22|5432|8080|3000|9000)' || ss -tulpn
elif command -v netstat &>/dev/null; then
netstat -tulpn
fi
echo ""
echo "--- 6. WERYFIKACJA SIECIOWA DOMEN Z POZIOMU VPS (DNS & HTTP) ---"
DOMAINS=("thecr3wnet.com" "login.thecr3wnet.com" "git.thecr3wnet.com" "app.thecr3wnet.com" "download.thecr3wnet.com")
for d in "${DOMAINS[@]}"; do
echo "[$d]"
if command -v dig &>/dev/null; then
echo " DNS A: $(dig +short "$d" | tr '\n' ' ')"
elif command -v host &>/dev/null; then
host "$d" | head -n 2
fi
# Sprawdzenie odpowiedzi HTTP z nagłówkami
HTTP_STATUS=$(curl -k -s -o /dev/null -w "%{http_code}" --connect-timeout 3 "https://$d" 2>/dev/null || echo "CONNECT_FAIL")
echo " HTTPS Status: $HTTP_STATUS"
done
echo ""
echo "=============================================================================="
echo " AUDYT ZAKOŃCZONY."
echo " Wynik zapisano w pliku: ${OUT_FILE}"
echo " Przejrzyj plik, upewnij się, że nie ma w nim sekretów, i przekaż wyniki."
echo "=============================================================================="