
محرك اكتشاف وبحث للشبكات ذاتي الاستضافة مع مسح مستمر للمنافذ، وفحص عميق للبروتوكولات عبر حوالي 100 خدمة، ومطابقة محلية لـ CVE، وبحث نصي كامل لجرد البنية التحتية ومراقبة المخاطر.
اكتشاف وبحث شبكي ذاتي الاستضافة — نسختك الخاصة من Shodan، على أجهزتك.
فحص TCP/UDP · ~100 فحص بروتوكول · بصمات TLS/JARM · مطابقة CVE · بحث نصي كامل · تتبع الفروقات · تنبيهات
بدء سريع · الميزات · البنية · الوثائق · قائمة التحقق للإنتاج
مهم. افحص فقط الشبكات التي تملكها أو لديك إذن كتابي لفحصها. ينفّذ UltraViolet استطلاعًا سلبيًا للخدمات — فهو لا يستغل الثغرات.
| حالة الاستخدام |
|---|
مستأجر واحد، ومكدّس Docker Compose واحد، وسيطرة كاملة على بياناتك.
الاكتشاف
SCAN_ALLOWED_CIDRS مع حدود للمضيفات والمنافذفحوصات عميقة (~100 بروتوكول)
robots.txt وsecurity.txt ومكدّس التقنياتالإثراء
الثغرات (CVE) والمخاطر
العمليات
viewer / operator / admin)، JWT + رموز التحديث/metrics، وملف Grafana اختياريflowchart TB
Browser["Browser"]
FE["service-frontend<br/>React + nginx"]
API["uv-api<br/>REST · WS · metrics"]
PG[("PostgreSQL 16")]
SCAN["uv-scanner<br/>probe pipeline"]
Browser --> FE
FE -->|"/api"| API
FE -->|"/realtime"| API
API <--> PG
SCAN <--> PG
API -.->|LISTEN/NOTIFY| API
صورة واجهة المستخدم في الإصدار توجّه /api/ و/realtime إلى uv-api — أصل واحد، دون إعادة بناء للواجهة الأمامية لكل عنوان API.
قواعد تطوير الواجهة الخلفية: CLAUDE.md.
المتطلبات: Go 1.25+ ومحرك Docker ≥ 24 وذاكرة ~4 جيجابايت RAM. صور الإنتاج موجهة لنظام Linux amd64.
مسار المبتدئين — اسحب الصور المنشورة باستخدام
service-env/docker-compose.registry.yml:
cd service-env
cp env.registry.example .env
# set POSTGRES_PASSWORD, AUTH_JWT_SECRET, AUTH_BOOTSTRAP_PASSWORD
mkdir -p geoip catalog-seed
docker compose -f docker-compose.registry.yml pull
docker compose -f docker-compose.registry.yml up -d
# UI → http://localhost:3000
انظر Docker Registry في موقع الوثائق.
تنسخ صور الواجهة البرمجية والماسح الضوئي الملفات الثنائية المجمّعة مسبقًا من service-api/bin/ (لا تُجمَّع داخل Docker). يشغّل make dev الأمر make -C service-api build-linux قبل docker compose … --build.
git clone https://github.com/yakushstanislav/UltraViolet.git
cd UltraViolet/service-env
cp .env.example .env
mkdir -p secrets
openssl rand -hex 32 > secrets/postgres_password
openssl rand -hex 32 > secrets/auth_jwt_secret
cd ..
make dev
| URL | الغرض |
|---|---|
| http://localhost:3000 | واجهة المستخدم (API عبر nginx /api/) |
| http://localhost:8080 | API مباشرة |
الإقلاع التطويري: admin / admin (فقط عندما APP_ENV≠production).
الدليل الكامل — VitePress في service-documentation-frontend/docs/:
make docs-dev # → http://localhost:5173
في بيئة الإنتاج، فعّل ملف docs:
cd service-env && docker compose --profile docs up -d
# → http://localhost:${UV_DOCUMENTATION_PORT:-3002}
الأقسام الرئيسية: التثبيت · الفحص · API · النشر · التثبيت دون اتصال.
make dev # build-linux → compose prod + dev override --build
أعد بناء ملفات Go الثنائية بعد تغييرات الواجهة الخلفية (make -C service-api build-linux)، ثم أعد التشغيل أو أعد تنفيذ make dev.
make dev-db # PostgreSQL only on :5432
cd service-api && make build
export LOGGER_NAME=uv-api LOGGER_DEBUG=true
export SERVER_ADDR=0.0.0.0 SERVER_PORT=8080
export METRICS_ADDR=0.0.0.0 METRICS_PORT=9090
export REALTIME_ADDR=0.0.0.0 REALTIME_PORT=8081
export POSTGRES_ADDR=localhost POSTGRES_PORT=5432
export POSTGRES_USERNAME=ultraviolet
export POSTGRES_PASSWORD="$(cat ../service-env/secrets/postgres_password)"
export POSTGRES_DATABASE=ultraviolet
export POSTGRES_SCHEMA_PATH="$(pwd)/deploy/migrations"
export AUTH_JWT_SECRET="$(cat ../service-env/secrets/auth_jwt_secret)"
./bin/uv-api
الواجهة الأمامية: cd service-frontend && npm run dev (يوجّه Vite طلبات /api إلى :8080 و/realtime إلى :8081).
cd service-env && make geoip-download # IPLocate MMDB → geoip/
make -C service-env cve-catalog-dump # CVE dump (requires running postgres)
make build && make lint && make frontend-build && make docs-build
المنصة المستهدفة: linux/amd64. على أجهزة Apple Silicon، اضبط DOCKER_PLATFORM=linux/amd64 للأرشيفات دون اتصال.
git tag v0.1.0
make release VERSION=v0.1.0
make release-promote VERSION=v0.1.0 # :latest — required for local releases; GitHub Actions does this automatically
| الأرشيف | المحتويات |
|---|---|
ultraviolet-vX.Y.Z.tar.gz | compose والسكربتات و.env.example (~50 كيلوبايت، عبر الإنترنت) |
ultraviolet-vX.Y.Z-offline.tar.gz | + صور Docker لـ amd64 |
ultraviolet-vX.Y.Z-offline-full.tar.gz | + بذرة CVE + GeoIP MMDB |
عبر الإنترنت: فك الضغط ← cp .env.example .env ← ./install.sh (سحب من السجل).
دون اتصال: ./install.sh (docker load، بدون سحب). الترقية: احتفظ بـ .env وsecrets/ ووحدة تخزين Postgres ← ./upgrade.sh.
المتغيرات: UV_REGISTRY (الافتراضي docker.io/styakush)، DRY_RUN=1 — بناء تجريبي محلي دون رفع.
# from the build machine
scp dist/ultraviolet-v0.1.0-offline.tar.gz user@host:~/
# on the server (Docker ≥ 24, amd64)
tar xzf ultraviolet-v0.1.0-offline.tar.gz && cd ultraviolet-v0.1.0
cp .env.example .env
./install.sh
الترقية (الحفاظ على البيانات):
docker compose -f docker-compose.yml down
# back up .env + secrets/, extract the new archive, run ./upgrade.sh
أبقِ اسم الدليل (ultraviolet-v0.1.0) ثابتًا — إذ ترتبط به وحدة تخزين Docker postgres-data.
secrets/، ولا تضعها أبدًا في git.CORS_ALLOWED_ORIGINS على نطاقات واجهة المستخدم الفعلية فقط.SCAN_ALLOWED_CIDRS وحدود المضيف/المنفذ.AUTH_JWT_SECRET (يرفض install.sh القيم النائبة).APP_ENV=production — يرفض uv-api admin/admin وكلمات المرور الأقصر من 8 أحرف.service-env/examples/nginx-tls.conf.AUDIT_TRUST_PROXY_HEADERS=true.service-env/scripts/backup.sh + cron؛ وينشئ upgrade.sh أيضًا تفريغًا للبيانات.إنهاء TLS على nginx خارجي — اربط واجهة المستخدم بالحلقة المحلية (loopback) فقط:
# docker-compose.override.yml
services:
service-frontend:
ports:
- "127.0.0.1:3000:8080"
CORS_ALLOWED_ORIGINS=https://ultraviolet.example.com
AUDIT_TRUST_PROXY_HEADERS=true
المسار الفرعي (/ultraviolet/):
VITE_BASE_PATH=/ultraviolet/ make frontend-build
# UV_BASE_PATH=/ultraviolet/ in compose — must match VITE_BASE_PATH
مهمة cron للنسخ الاحتياطي (يوميًا، مع احتفاظ لمدة 14 يومًا):
0 3 * * * cd /opt/ultraviolet/service-env && ./scripts/backup.sh && find backups -name 'uv-*.dump' -mtime +14 -delete
تحديث GeoIP (الأول من كل شهر):
0 4 1 * * cd /opt/ultraviolet/service-env && ./scripts/geoip-refresh.sh >> /var/log/uv-geoip.log 2>&1
بعد تنفيذ POST /v1/auth/login تستلم access_token (Bearer) وrefresh_token (/v1/auth/refresh).
| الدور | الصلاحيات |
|---|---|
viewer | قراءة المضيفين، البحث، الثغرات (CVEs)، لوحة المعلومات |
operator | + بدء وإدارة عمليات الفحص |
admin | + المستخدمون، التدقيق، الإعدادات |
GET /v1/me · GET /v1/version · GET /readyz (الصحة + الإصدار + الالتزام).
انظر CONTRIBUTING.md. تقارير الأمان: SECURITY.md. معايير المجتمع: CODE_OF_CONDUCT.md.
UltraViolet مُتاح بموجب رخصة MIT.
UltraViolet — اكتشف ما تملكه، وافهم ما تغيّر، وأبقِه على شبكتك.
| ما الذي تحصل عليه |
|---|
| حدود الشبكة والجرد | اكتشاف مستمر للمنافذ والخدمات المفتوحة عبر نطاقات CIDR |
| البحث في البنية التحتية | بحث نصي كامل عبر محتوى HTTP واللافتات وTLS وDNS والثغرات (CVEs) |
| المخاطر والامتثال | مطابقة محلية مع NVD بالإضافة إلى CISA KEV وEPSS — دون الاعتماد على السحابة |
| النشر المعزول (Air-gapped) | أرشيف دون اتصال يشمل صور Docker وبذرة CVE وملف GeoIP MMDB على القرص |
| تتبع التغييرات | الفروقات بين عمليات الفحص، وأحداث WebSocket، وتنبيهات على عمليات البحث المحفوظة |
| الدليل | الغرض |
|---|
service-api/ | Go: uv-api (واجهة HTTP API وWebSocket والعمال) + uv-scanner (خط المعالجة) |
service-frontend/ | React 19 + Vite + RTK — الفحوصات والمضيفون والبحث ولوحة المعلومات |
service-documentation-frontend/ | VitePress — وثائق المستخدم والمشغّل |
service-env/ | docker-compose والأسرار وinstall.sh / upgrade.sh / النسخ الاحتياطي |
| http://localhost:9090/metrics |
| Prometheus |
:9090/metrics؛ Grafana عبر ملف observability.service-env/scripts/geoip-refresh.sh عبر مهمة cron شهرية.