
Moteur de découverte réseau et de recherche auto-hébergé avec scan de ports continu, sondage approfondi de protocoles sur ~100 services, mise en correspondance locale de CVE, et recherche en texte intégral pour l'inventaire d'infrastructure et la surveillance des risques.
Découverte réseau et recherche auto-hébergée — votre propre Shodan, sur votre matériel.
Scan TCP/UDP · ~100 sondes de protocole · Empreintes TLS/JARM · Correspondance CVE · Recherche en texte intégral · Suivi des différences · Alertes
Démarrage rapide · Fonctionnalités · Architecture · Documentation · Production
Important. Scannez uniquement les réseaux que vous possédez ou pour lesquels vous avez une autorisation écrite. UltraViolet effectue une reconnaissance passive des services — il n'exploite pas de vulnérabilités.
Monolocataire, une seule pile Docker Compose, contrôle total de vos données.
Découverte
SCAN_ALLOWED_CIDRS avec limites d'hôtes et de portsSondes approfondies (~100 protocoles)
robots.txt, security.txt, pile technologiqueEnrichissement
CVE et risque
Opérations
viewer / operator / admin), JWT + jetons de rafraîchissement/metrics, profil Grafana optionnelflowchart 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
L'image de l'interface de publication fait proxy vers /api/ et /realtime vers uv-api — origine unique, pas de reconstruction du frontend par URL d'API.
Règles de développement backend : CLAUDE.md.
Prérequis : Docker Engine ≥ 24, ~4 Go de RAM, Linux amd64 pour les images de production.
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 | Objectif |
|---|---|
| http://localhost:3000 | Interface utilisateur (API via nginx /api/) |
| http://localhost:8080 | API directement |
Amorçage développement : admin / admin (uniquement quand APP_ENV≠production).
Guide complet — VitePress dans service-documentation-frontend/docs/ :
make docs-dev # → http://localhost:5173
En production, activez le profil docs :
cd service-env && docker compose --profile docs up -d
# → http://localhost:${UV_DOCUMENTATION_PORT:-3002}
Sections clés : installation · scan · API · déploiement · installation hors ligne.
make dev # compose production + override développement, recompilation à chaud
make dev-db # PostgreSQL uniquement sur :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
Frontend : cd service-frontend && npm run dev (Vite proxy /api → :8080, /realtime → :8081).
cd service-env && make geoip-download # IPLocate MMDB → geoip/
make -C service-env cve-catalog-dump # Vidage CVE (nécessite postgres en cours)
make build && make lint && make frontend-build && make docs-build
Plateforme cible : linux/amd64. Sur Apple Silicon, définissez DOCKER_PLATFORM=linux/amd64 pour les archives hors ligne.
git tag v0.1.0
make release VERSION=v0.1.0
make release-promote VERSION=v0.1.0 # :latest — étape séparée
| Archive | Contenu |
|---|---|
ultraviolet-vX.Y.Z.tar.gz | compose, scripts, .env.example (~50 Ko, en ligne) |
ultraviolet-vX.Y.Z-offline.tar.gz | + images Docker amd64 |
ultraviolet-vX.Y.Z-offline-full.tar.gz | + seed CVE + GeoIP MMDB |
En ligne : extraire → cp .env.example .env → ./install.sh (tirer du registre).
Hors ligne : ./install.sh (docker load, pas de pull). Mise à niveau : conservez .env, secrets/ et le volume Postgres → ./upgrade.sh.
Variables : UV_REGISTRY (par défaut docker.io/ultraviolet), DRY_RUN=1 — construction locale sans pousser.
# depuis la machine de construction
scp dist/ultraviolet-v0.1.0-offline.tar.gz user@host:~/
# sur le serveur (Docker ≥ 24, amd64)
tar xzf ultraviolet-v0.1.0-offline.tar.gz && cd ultraviolet-v0.1.0
cp .env.example .env
./install.sh
Mise à niveau (préserver les données) :
docker compose -f docker-compose.yml down
# sauvegarder .env + secrets/, extraire la nouvelle archive, lancer ./upgrade.sh
Gardez le nom du répertoire (ultraviolet-v0.1.0) stable — le volume Docker postgres-data y est lié.
secrets/, jamais dans git.CORS_ALLOWED_ORIGINS aux seules origines réelles de l'UI.SCAN_ALLOWED_CIDRS et les limites d'hôtes/ports.AUTH_JWT_SECRET (install.sh rejette les placeholders).APP_ENV=production — uv-api refuse admin/admin et les mots de passe de moins de 8 caractères.service-env/examples/nginx-tls.conf.AUDIT_TRUST_PROXY_HEADERS=true.service-env/scripts/backup.sh + cron ; upgrade.sh crée aussi un dump.Terminaison TLS sur nginx externe — liez l'UI uniquement sur 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
Sous-chemin (/ultraviolet/) :
VITE_BASE_PATH=/ultraviolet/ make frontend-build
# UV_BASE_PATH=/ultraviolet/ dans compose — doit correspondre à VITE_BASE_PATH
Cron de sauvegarde (quotidien, rétention 14 jours) :
0 3 * * * cd /opt/ultraviolet/service-env && ./scripts/backup.sh && find backups -name 'uv-*.dump' -mtime +14 -delete
Rafraîchissement GeoIP (1er de chaque mois) :
0 4 1 * * cd /opt/ultraviolet/service-env && ./scripts/geoip-refresh.sh >> /var/log/uv-geoip.log 2>&1
Après POST /v1/auth/login, vous recevez un access_token (Bearer) et un refresh_token (/v1/auth/refresh).
| Rôle | Capacités |
|---|---|
viewer | Lecture des hôtes, recherche, CVE, tableau de bord |
operator | + lancer et gérer les scans |
admin | + utilisateurs, audit, paramètres |
GET /v1/me · GET /v1/version · GET /readyz (santé + version + commit).
Voir CONTRIBUTING.md. Rapports de sécurité : SECURITY.md. Normes communautaires : CODE_OF_CONDUCT.md.
UltraViolet est publié sous la Licence MIT.
UltraViolet — découvrez ce que vous possédez, comprenez ce qui a changé, gardez-le sur votre réseau.
| Cas d'usage | Ce que vous obtenez |
|---|
| Inventaire et périmètre | Découverte continue des ports ouverts et des services sur des plages CIDR |
| Recherche infrastructure | Recherche en texte intégral sur les corps HTTP, bannières, TLS, DNS et CVE |
| Risque et conformité | Correspondance NVD locale + CISA KEV et EPSS — aucune dépendance cloud |
| Déploiements isolés | Archive hors ligne avec images Docker, seed CVE et GeoIP MMDB sur disque |
| Suivi des changements | Différences entre scans, événements WebSocket, alertes sur recherches sauvegardées |
| Répertoire | Objectif |
|---|
service-api/ | Go : uv-api (API HTTP, WebSocket, workers) + uv-scanner (pipeline) |
service-frontend/ | React 19 + Vite + RTK — scans, hôtes, recherche, tableau de bord |
service-documentation-frontend/ | VitePress — documentation utilisateur et opérateur |
service-env/ | docker-compose, secrets, install.sh / upgrade.sh / sauvegarde |
| http://localhost:9090/metrics | Prometheus |
:9090/metrics ; Grafana via le profil observability.service-env/scripts/geoip-refresh.sh selon un cron mensuel.