mirror of
https://github.com/FuzzingLabs/fuzzforge_ai.git
synced 2026-08-28 14:10:23 +02:00
docs: Apply global fixes for v0.7.0 Temporal architecture
- Replace docker-compose.temporal.yaml → docker-compose.yml - Replace Temporal UI port :8233 → :8080 - Replace repository URL fuzzforge.git → fuzzforge_ai.git Affected files: - concept/docker-containers.md - concept/resource-management.md - concept/sarif-format.md - how-to/create-workflow.md - how-to/debugging.md - how-to/troubleshooting.md - tutorial/getting-started.md
This commit is contained in:
@@ -0,0 +1,321 @@
|
|||||||
|
# FuzzForge v0.7.0: Temporal Orchestration & Vertical Workers Architecture
|
||||||
|
|
||||||
|
We're excited to announce **FuzzForge v0.7.0**, a major release featuring two significant improvements:
|
||||||
|
|
||||||
|
1. **Architectural Foundation**: Complete migration from Prefect to **Temporal** orchestration with **vertical workers** - pre-built containers for instant deployment
|
||||||
|
2. **AI-Powered Secret Detection**: New workflows achieving 84% recall on obfuscated secrets using LLM semantic analysis
|
||||||
|
|
||||||
|
This release transforms how security workflows are built, deployed, and scaled.
|
||||||
|
|
||||||
|
<!-- truncate -->
|
||||||
|
|
||||||
|
## 🚀 Flagship Features
|
||||||
|
|
||||||
|
### Temporal Orchestration: Production-Ready Workflow Engine
|
||||||
|
|
||||||
|
We've fully migrated from Prefect to [Temporal](https://temporal.io), bringing enterprise-grade workflow orchestration to FuzzForge:
|
||||||
|
|
||||||
|
**Why Temporal?**
|
||||||
|
|
||||||
|
- ✅ **Reliability**: Automatic retries, timeouts, and failure handling built-in
|
||||||
|
- ✅ **Observability**: World-class UI for monitoring workflow execution, logs, and debugging
|
||||||
|
- ✅ **Scalability**: Horizontal scaling across workers with intelligent load balancing
|
||||||
|
- ✅ **Developer Experience**: Type-safe workflows, versioning, and zero downtime deployments
|
||||||
|
|
||||||
|
**What This Means for You:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start FuzzForge with Temporal
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Monitor workflows in real-time
|
||||||
|
open http://localhost:8080 # Temporal UI
|
||||||
|
|
||||||
|
# Submit workflows - everything just works
|
||||||
|
cd your_project/
|
||||||
|
ff workflow run security_assessment .
|
||||||
|
```
|
||||||
|
|
||||||
|
The Temporal UI gives you complete visibility into workflow execution:
|
||||||
|
|
||||||
|
- Live activity timelines
|
||||||
|
- Detailed logs for every step
|
||||||
|
- Retry history and failure analysis
|
||||||
|
- Performance metrics and bottleneck detection
|
||||||
|
|
||||||
|
### Vertical Workers: Pre-Built Security Toolchains
|
||||||
|
|
||||||
|
FuzzForge now uses **vertical workers** - long-lived containers pre-built with security toolchains for different languages and platforms:
|
||||||
|
|
||||||
|
| Worker | Toolchain | Status | Available Workflows |
|
||||||
|
| ----------- | ----------------------------- | ------------- | ------------------------------------- |
|
||||||
|
| **python** | Gitleaks, TruffleHog, Atheris | ✅ Production | Secret detection, security assessment |
|
||||||
|
| **rust** | cargo-fuzz | ⚠️ Early Dev | Rust fuzzing |
|
||||||
|
| **ossfuzz** | OSS-Fuzz infrastructure | ⚠️ Heavy Dev | Continuous fuzzing campaigns |
|
||||||
|
|
||||||
|
**Note:** Additional workers (web, android, Go) are planned but not yet available.
|
||||||
|
|
||||||
|
**Key Benefits:**
|
||||||
|
|
||||||
|
1. **Zero Build Time**: Workflows start instantly - no container builds per workflow
|
||||||
|
2. **Instant Code Changes**: Modify workflow code, restart worker, done
|
||||||
|
3. **Consistent Environment**: Same toolchain versions across all runs
|
||||||
|
4. **Resource Efficiency**: Share workers across multiple concurrent workflows
|
||||||
|
|
||||||
|
**Example: Running Secret Detection**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Worker is already running with Gitleaks, TruffleHog installed
|
||||||
|
ff workflow run gitleaks_detection .
|
||||||
|
|
||||||
|
# Behind the scenes:
|
||||||
|
# 1. CLI uploads project to MinIO
|
||||||
|
# 2. Temporal schedules on python-worker
|
||||||
|
# 3. Worker downloads from MinIO
|
||||||
|
# 4. Gitleaks runs (already installed!)
|
||||||
|
# 5. Results returned as SARIF
|
||||||
|
```
|
||||||
|
|
||||||
|
### MinIO Storage: Unified File Handling
|
||||||
|
|
||||||
|
We've replaced volume mounts with **MinIO** (S3-compatible object storage):
|
||||||
|
|
||||||
|
**Old Way (Volume Mounts):**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Had to mount directories, manage paths, cleanup manually
|
||||||
|
volumes:
|
||||||
|
- ./my_project:/target
|
||||||
|
```
|
||||||
|
|
||||||
|
**New Way (MinIO):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# CLI handles everything automatically
|
||||||
|
ff workflow run security_assessment .
|
||||||
|
# ✓ Creates tarball
|
||||||
|
# ✓ Uploads to MinIO
|
||||||
|
# ✓ Passes target_id to workflow
|
||||||
|
# ✓ Worker downloads and extracts
|
||||||
|
# ✓ Cleanup handled automatically
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
|
||||||
|
- ✅ No path conflicts or permissions issues
|
||||||
|
- ✅ Works seamlessly with remote Temporal clusters
|
||||||
|
- ✅ Automatic cleanup and caching
|
||||||
|
- ✅ Supports large targets (GB+)
|
||||||
|
|
||||||
|
## 🔍 AI-Powered Secret Detection: Also in v0.7.0
|
||||||
|
|
||||||
|
Alongside the architectural improvements, we're releasing a comprehensive **secret detection** system with three workflows:
|
||||||
|
|
||||||
|
### Benchmark Results
|
||||||
|
|
||||||
|
We tested on a controlled dataset of **32 documented secrets** (12 Easy, 10 Medium, 10 Hard):
|
||||||
|
|
||||||
|
| Tool | Recall | Secrets Found | Speed | Best For |
|
||||||
|
| --------------------- | --------- | ------------- | ----- | --------------------------- |
|
||||||
|
| **LLM (gpt-5-mini)** | **84.4%** | 41 | 618s | Obfuscated & hidden secrets |
|
||||||
|
| **LLM (gpt-4o-mini)** | 56.2% | 30 | 297s | Balanced speed/accuracy |
|
||||||
|
| **Gitleaks** | 37.5% | 12 | 5s | Fast pattern-based scanning |
|
||||||
|
| **TruffleHog** | 0.0% | 1 | 5s | Entropy analysis |
|
||||||
|
|
||||||
|
📊 [Full benchmark methodology and results →](https://github.com/FuzzingLabs/fuzzforge_ai/blob/dev/backend/benchmarks/by_category/secret_detection/results/comparison_report.md)
|
||||||
|
|
||||||
|
### Why LLM-Based Detection Wins
|
||||||
|
|
||||||
|
**Obfuscated Secrets (Medium Difficulty):**
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Gitleaks: ❌ Missed (no pattern match)
|
||||||
|
# LLM: ✅ Found (semantic understanding)
|
||||||
|
aws_key = base64.b64decode("QUtJQUlPU0ZPRE5ON0VYQU1QTEU=").decode()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Well-Hidden Secrets (Hard Difficulty):**
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Gitleaks: ❌ Missed (no pattern)
|
||||||
|
# LLM: ✅ Found (understands XOR + join)
|
||||||
|
secret = ''.join(chr(ord(c) ^ 0x42) for c in "\x0b\x15\x04\x1b...")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Standard Secrets (Easy Difficulty):**
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Both find these:
|
||||||
|
AWS_ACCESS_KEY = "AKIAIOSFODNN7EXAMPLE"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Try It Yourself
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start FuzzForge
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Run secret detection on your code
|
||||||
|
cd your_project/
|
||||||
|
ff workflow run gitleaks_detection . # Fast pattern-based
|
||||||
|
ff workflow run trufflehog_detection . # Entropy analysis
|
||||||
|
ff workflow run llm_secret_detection . # AI semantic analysis
|
||||||
|
|
||||||
|
# Get SARIF output
|
||||||
|
ff finding <run-id>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Real-World Impact
|
||||||
|
|
||||||
|
**Before v0.7.0 (Pattern-Only Detection):**
|
||||||
|
|
||||||
|
- Found: Standard API keys, simple patterns
|
||||||
|
- Missed: Base64-encoded secrets, obfuscated credentials, split secrets
|
||||||
|
|
||||||
|
**After v0.7.0 (LLM + Patterns):**
|
||||||
|
|
||||||
|
- **84% recall** on comprehensive benchmark
|
||||||
|
- Detects novel obfuscation techniques
|
||||||
|
- Understands code context (not just regex)
|
||||||
|
- Catches secrets in:
|
||||||
|
- Base64/hex encoding
|
||||||
|
- String concatenation
|
||||||
|
- XOR/ROT13 obfuscation
|
||||||
|
- Template strings
|
||||||
|
- Binary literals
|
||||||
|
|
||||||
|
## 🔄 Migration Guide
|
||||||
|
|
||||||
|
### What Changed
|
||||||
|
|
||||||
|
**Docker Compose:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Old (Prefect)
|
||||||
|
docker-compose up
|
||||||
|
|
||||||
|
# New (Temporal)
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Workflow Submission:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Old (volume mounts)
|
||||||
|
ff workflow run security_assessment --volume ./project
|
||||||
|
|
||||||
|
# New (automatic upload)
|
||||||
|
ff workflow run security_assessment .
|
||||||
|
# CLI handles upload automatically!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Worker Management:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Old (per-workflow containers)
|
||||||
|
# Each workflow built its own container
|
||||||
|
|
||||||
|
# New (vertical workers)
|
||||||
|
docker compose up -d # All workers start
|
||||||
|
# Workflows share workers - much faster!
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
Set up AI workflows with API keys:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp volumes/env/.env.example volumes/env/.env
|
||||||
|
# Edit .env and add your API keys (OpenAI, Anthropic, etc.)
|
||||||
|
```
|
||||||
|
|
||||||
|
Required for:
|
||||||
|
|
||||||
|
- `llm_secret_detection` workflow
|
||||||
|
- AI agent features (`ff ai agent`)
|
||||||
|
|
||||||
|
Basic security workflows (gitleaks, trufflehog, security_assessment) work without this.
|
||||||
|
|
||||||
|
## 🏗️ Architecture Overview
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐
|
||||||
|
│ User CLI │ Upload → MinIO
|
||||||
|
└──────┬──────┘
|
||||||
|
↓ Submit
|
||||||
|
┌─────────────┐
|
||||||
|
│ Temporal │ Schedule → Task Queue
|
||||||
|
└──────┬──────┘
|
||||||
|
↓ Execute
|
||||||
|
┌─────────────┐
|
||||||
|
│ Vertical │ Download from MinIO → Run Tools → Upload Results
|
||||||
|
│ Workers │
|
||||||
|
└─────────────┘
|
||||||
|
rust, python, web, android, ossfuzz
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
|
||||||
|
- 🔄 Automatic retries and timeouts (Temporal)
|
||||||
|
- 📦 No file path management (MinIO)
|
||||||
|
- ⚡ Zero container build time (Vertical Workers)
|
||||||
|
- 📈 Horizontal scaling ready (Temporal + Workers)
|
||||||
|
|
||||||
|
## 🎯 Workflow Stability Status
|
||||||
|
|
||||||
|
### ✅ Stable & Production-Ready
|
||||||
|
|
||||||
|
- **Secret Detection**: `gitleaks_detection`, `trufflehog_detection`, `llm_secret_detection`
|
||||||
|
- **Security Assessment**: `security_assessment`
|
||||||
|
- Temporal orchestration with python worker
|
||||||
|
- MinIO file storage
|
||||||
|
|
||||||
|
### ⚠️ Early Development (Functional but not production-ready)
|
||||||
|
|
||||||
|
- **Fuzzing workflows**:
|
||||||
|
- `atheris_fuzzing` - Python fuzzing with Atheris
|
||||||
|
- `cargo_fuzzing` - Rust fuzzing with cargo-fuzz
|
||||||
|
- **OSS-Fuzz integration**: `ossfuzz_campaign` (under heavy active development)
|
||||||
|
|
||||||
|
**Important:** Fuzzing workflows are functional for testing but not recommended for production use yet.
|
||||||
|
|
||||||
|
## 📚 Resources
|
||||||
|
|
||||||
|
- 🌐 [Website](https://fuzzforge.ai)
|
||||||
|
- 📖 [Documentation](https://docs.fuzzforge.ai)
|
||||||
|
- 💬 [Discord Community](https://discord.gg/8XEX33UUwZ)
|
||||||
|
- 🎓 [FuzzingLabs Academy](https://academy.fuzzinglabs.com/?coupon=GITHUB_FUZZFORGE)
|
||||||
|
- 📊 [Secret Detection Benchmarks](https://github.com/FuzzingLabs/fuzzforge_ai/blob/dev/backend/benchmarks/by_category/secret_detection/results/comparison_report.md)
|
||||||
|
|
||||||
|
## 🙏 Acknowledgments
|
||||||
|
|
||||||
|
Special thanks to:
|
||||||
|
|
||||||
|
- [Temporal](https://temporal.io) for the amazing workflow engine
|
||||||
|
- Our community for feedback during the migration
|
||||||
|
|
||||||
|
## 🚀 Get Started
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone and install
|
||||||
|
git clone https://github.com/fuzzinglabs/fuzzforge_ai.git
|
||||||
|
cd fuzzforge_ai
|
||||||
|
uv tool install --python python3.12 .
|
||||||
|
|
||||||
|
# Start FuzzForge with Temporal
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Run your first workflow
|
||||||
|
cd test_projects/vulnerable_app/
|
||||||
|
fuzzforge init
|
||||||
|
ff workflow run security_assessment .
|
||||||
|
|
||||||
|
# Check Temporal UI
|
||||||
|
open http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**FuzzForge v0.7.0** is a foundational release that sets the stage for scalable, production-ready security automation. Try it today and let us know what you think!
|
||||||
|
|
||||||
|
Star us on [GitHub](https://github.com/FuzzingLabs/fuzzforge_ai) ⭐
|
||||||
@@ -141,7 +141,7 @@ Example build:
|
|||||||
cd workers/rust
|
cd workers/rust
|
||||||
docker build -t fuzzforge-worker-rust:latest .
|
docker build -t fuzzforge-worker-rust:latest .
|
||||||
# Or via docker-compose
|
# Or via docker-compose
|
||||||
docker-compose -f docker-compose.temporal.yaml build worker-rust
|
docker-compose -f docker-compose.yml build worker-rust
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ docker ps -a --filter "name=fuzzforge-worker"
|
|||||||
|
|
||||||
## Level 1: Docker Container Limits (Primary)
|
## Level 1: Docker Container Limits (Primary)
|
||||||
|
|
||||||
Docker container limits are the **primary enforcement mechanism** for CPU and memory resources. These are configured in `docker-compose.temporal.yaml` and enforced by the Docker runtime.
|
Docker container limits are the **primary enforcement mechanism** for CPU and memory resources. These are configured in `docker-compose.yml` and enforced by the Docker runtime.
|
||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
@@ -267,10 +267,10 @@ Check how many workflows are running:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# View worker logs
|
# View worker logs
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "Starting"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "Starting"
|
||||||
|
|
||||||
# Check Temporal UI
|
# Check Temporal UI
|
||||||
# Open http://localhost:8233
|
# Open http://localhost:8080
|
||||||
# Navigate to "Task Queues" → "rust" → See pending/running counts
|
# Navigate to "Task Queues" → "rust" → See pending/running counts
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ class SecurityAssessmentWorkflow:
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Check timeout in Temporal UI:**
|
**Check timeout in Temporal UI:**
|
||||||
1. Open http://localhost:8233
|
1. Open http://localhost:8080
|
||||||
2. Navigate to workflow execution
|
2. Navigate to workflow execution
|
||||||
3. See "Timeout" in workflow details
|
3. See "Timeout" in workflow details
|
||||||
4. If exceeded, status shows "TIMED_OUT"
|
4. If exceeded, status shows "TIMED_OUT"
|
||||||
@@ -383,7 +383,7 @@ Watch for these warning signs:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check for OOM kills
|
# Check for OOM kills
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep -i "oom\|killed"
|
docker-compose -f docker-compose.yml logs worker-rust | grep -i "oom\|killed"
|
||||||
|
|
||||||
# Check for CPU throttling
|
# Check for CPU throttling
|
||||||
docker stats fuzzforge-worker-rust
|
docker stats fuzzforge-worker-rust
|
||||||
@@ -413,7 +413,7 @@ To handle more workflows, scale worker containers horizontally:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Scale rust worker to 3 instances
|
# Scale rust worker to 3 instances
|
||||||
docker-compose -f docker-compose.temporal.yaml up -d --scale worker-rust=3
|
docker-compose -f docker-compose.yml up -d --scale worker-rust=3
|
||||||
|
|
||||||
# Now you can run:
|
# Now you can run:
|
||||||
# - 3 workers × 5 concurrent activities = 15 workflows simultaneously
|
# - 3 workers × 5 concurrent activities = 15 workflows simultaneously
|
||||||
@@ -435,13 +435,13 @@ docker-compose -f docker-compose.temporal.yaml up -d --scale worker-rust=3
|
|||||||
**Diagnosis:**
|
**Diagnosis:**
|
||||||
```bash
|
```bash
|
||||||
# Check worker is alive
|
# Check worker is alive
|
||||||
docker-compose -f docker-compose.temporal.yaml ps worker-rust
|
docker-compose -f docker-compose.yml ps worker-rust
|
||||||
|
|
||||||
# Check worker resource usage
|
# Check worker resource usage
|
||||||
docker stats fuzzforge-worker-rust
|
docker stats fuzzforge-worker-rust
|
||||||
|
|
||||||
# Check for OOM kills
|
# Check for OOM kills
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep -i oom
|
docker-compose -f docker-compose.yml logs worker-rust | grep -i oom
|
||||||
```
|
```
|
||||||
|
|
||||||
**Solution:**
|
**Solution:**
|
||||||
@@ -459,7 +459,7 @@ docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep -i oom
|
|||||||
docker exec fuzzforge-worker-rust env | grep MAX_CONCURRENT_ACTIVITIES
|
docker exec fuzzforge-worker-rust env | grep MAX_CONCURRENT_ACTIVITIES
|
||||||
|
|
||||||
# Check current workload
|
# Check current workload
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "Starting"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "Starting"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Solution:**
|
**Solution:**
|
||||||
@@ -557,10 +557,10 @@ Check cache size and cleanup logs:
|
|||||||
docker exec fuzzforge-worker-rust du -sh /cache
|
docker exec fuzzforge-worker-rust du -sh /cache
|
||||||
|
|
||||||
# Monitor cache evictions
|
# Monitor cache evictions
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "Evicted from cache"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "Evicted from cache"
|
||||||
|
|
||||||
# Check download vs cache hit rate
|
# Check download vs cache hit rate
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep -E "Cache (HIT|MISS)"
|
docker-compose -f docker-compose.yml logs worker-rust | grep -E "Cache (HIT|MISS)"
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [Workspace Isolation](/docs/concept/workspace-isolation) guide for complete details on isolation modes and when to use each.
|
See the [Workspace Isolation](/docs/concept/workspace-isolation) guide for complete details on isolation modes and when to use each.
|
||||||
@@ -588,7 +588,7 @@ FuzzForge's resource management strategy:
|
|||||||
---
|
---
|
||||||
|
|
||||||
**Next Steps:**
|
**Next Steps:**
|
||||||
- Review `docker-compose.temporal.yaml` resource configuration
|
- Review `docker-compose.yml` resource configuration
|
||||||
- Profile your workflows to determine actual resource usage
|
- Profile your workflows to determine actual resource usage
|
||||||
- Adjust limits based on monitoring data
|
- Adjust limits based on monitoring data
|
||||||
- Set up alerts for resource exhaustion
|
- Set up alerts for resource exhaustion
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ Each FuzzForge workflow produces a SARIF "run" containing:
|
|||||||
"driver": {
|
"driver": {
|
||||||
"name": "FuzzForge",
|
"name": "FuzzForge",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"informationUri": "https://github.com/FuzzingLabs/fuzzforge",
|
"informationUri": "https://github.com/FuzzingLabs/fuzzforge_ai",
|
||||||
"organization": "FuzzingLabs",
|
"organization": "FuzzingLabs",
|
||||||
"rules": [ /* Security rules applied */ ]
|
"rules": [ /* Security rules applied */ ]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -397,7 +397,7 @@ class DependencyAnalysisWorkflow:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Start FuzzForge with Temporal
|
# Start FuzzForge with Temporal
|
||||||
docker-compose -f docker-compose.temporal.yaml up -d
|
docker-compose -f docker-compose.yml up -d
|
||||||
|
|
||||||
# Wait for services to initialize
|
# Wait for services to initialize
|
||||||
sleep 10
|
sleep 10
|
||||||
@@ -445,7 +445,7 @@ client.close()
|
|||||||
|
|
||||||
### Check Temporal UI
|
### Check Temporal UI
|
||||||
|
|
||||||
Open http://localhost:8233 to see:
|
Open http://localhost:8080 to see:
|
||||||
- Workflow execution timeline
|
- Workflow execution timeline
|
||||||
- Activity results
|
- Activity results
|
||||||
- Logs and errors
|
- Logs and errors
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ This guide shows you how to debug FuzzForge workflows and modules using Temporal
|
|||||||
|
|
||||||
When something goes wrong:
|
When something goes wrong:
|
||||||
|
|
||||||
1. **Check worker logs** - `docker-compose -f docker-compose.temporal.yaml logs worker-rust -f`
|
1. **Check worker logs** - `docker-compose -f docker-compose.yml logs worker-rust -f`
|
||||||
2. **Check Temporal UI** - http://localhost:8233 (visual execution history)
|
2. **Check Temporal UI** - http://localhost:8080 (visual execution history)
|
||||||
3. **Check MinIO console** - http://localhost:9001 (inspect uploaded files)
|
3. **Check MinIO console** - http://localhost:9001 (inspect uploaded files)
|
||||||
4. **Check backend logs** - `docker-compose -f docker-compose.temporal.yaml logs fuzzforge-backend -f`
|
4. **Check backend logs** - `docker-compose -f docker-compose.yml logs fuzzforge-backend -f`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -41,12 +41,12 @@ When something goes wrong:
|
|||||||
|
|
||||||
4. **Check worker logs for discovery errors:**
|
4. **Check worker logs for discovery errors:**
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "my_workflow"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "my_workflow"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Solution:**
|
**Solution:**
|
||||||
- Ensure `metadata.yaml` has correct `vertical` field
|
- Ensure `metadata.yaml` has correct `vertical` field
|
||||||
- Restart worker to reload: `docker-compose -f docker-compose.temporal.yaml restart worker-rust`
|
- Restart worker to reload: `docker-compose -f docker-compose.yml restart worker-rust`
|
||||||
- Check worker logs for discovery confirmation
|
- Check worker logs for discovery confirmation
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -55,10 +55,10 @@ When something goes wrong:
|
|||||||
|
|
||||||
### Using Temporal Web UI
|
### Using Temporal Web UI
|
||||||
|
|
||||||
The Temporal UI at http://localhost:8233 is your primary debugging tool.
|
The Temporal UI at http://localhost:8080 is your primary debugging tool.
|
||||||
|
|
||||||
**Navigate to a workflow:**
|
**Navigate to a workflow:**
|
||||||
1. Open http://localhost:8233
|
1. Open http://localhost:8080
|
||||||
2. Click "Workflows" in left sidebar
|
2. Click "Workflows" in left sidebar
|
||||||
3. Find your workflow by `run_id` or workflow name
|
3. Find your workflow by `run_id` or workflow name
|
||||||
4. Click to see detailed execution
|
4. Click to see detailed execution
|
||||||
@@ -86,13 +86,13 @@ The Temporal UI at http://localhost:8233 is your primary debugging tool.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Follow logs from rust worker
|
# Follow logs from rust worker
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust -f
|
docker-compose -f docker-compose.yml logs worker-rust -f
|
||||||
|
|
||||||
# Follow logs from all workers
|
# Follow logs from all workers
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust worker-android -f
|
docker-compose -f docker-compose.yml logs worker-rust worker-android -f
|
||||||
|
|
||||||
# Show last 100 lines
|
# Show last 100 lines
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust --tail 100
|
docker-compose -f docker-compose.yml logs worker-rust --tail 100
|
||||||
```
|
```
|
||||||
|
|
||||||
### What Worker Logs Show
|
### What Worker Logs Show
|
||||||
@@ -125,16 +125,16 @@ IndentationError: expected an indented block
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Show only errors
|
# Show only errors
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep ERROR
|
docker-compose -f docker-compose.yml logs worker-rust | grep ERROR
|
||||||
|
|
||||||
# Show workflow discovery
|
# Show workflow discovery
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "Discovered workflow"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "Discovered workflow"
|
||||||
|
|
||||||
# Show specific workflow execution
|
# Show specific workflow execution
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "security_assessment-abc123"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "security_assessment-abc123"
|
||||||
|
|
||||||
# Show activity execution
|
# Show activity execution
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "activity"
|
docker-compose -f docker-compose.yml logs worker-rust | grep "activity"
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -156,7 +156,7 @@ docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep "activity
|
|||||||
curl http://localhost:9000
|
curl http://localhost:9000
|
||||||
|
|
||||||
# List backend logs for upload
|
# List backend logs for upload
|
||||||
docker-compose -f docker-compose.temporal.yaml logs fuzzforge-backend | grep "upload"
|
docker-compose -f docker-compose.yml logs fuzzforge-backend | grep "upload"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Check Worker Cache
|
### Check Worker Cache
|
||||||
@@ -230,12 +230,12 @@ Since toolbox is mounted as a volume, you can edit code on your host and reload:
|
|||||||
|
|
||||||
2. **Restart worker to reload:**
|
2. **Restart worker to reload:**
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml restart worker-rust
|
docker-compose -f docker-compose.yml restart worker-rust
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Check discovery logs:**
|
3. **Check discovery logs:**
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | tail -50
|
docker-compose -f docker-compose.yml logs worker-rust | tail -50
|
||||||
```
|
```
|
||||||
|
|
||||||
### Add Debug Logging
|
### Add Debug Logging
|
||||||
@@ -266,14 +266,14 @@ class MyWorkflow:
|
|||||||
|
|
||||||
Set debug logging:
|
Set debug logging:
|
||||||
```bash
|
```bash
|
||||||
# Edit docker-compose.temporal.yaml
|
# Edit docker-compose.yml
|
||||||
services:
|
services:
|
||||||
worker-rust:
|
worker-rust:
|
||||||
environment:
|
environment:
|
||||||
LOG_LEVEL: DEBUG # Change from INFO to DEBUG
|
LOG_LEVEL: DEBUG # Change from INFO to DEBUG
|
||||||
|
|
||||||
# Restart
|
# Restart
|
||||||
docker-compose -f docker-compose.temporal.yaml restart worker-rust
|
docker-compose -f docker-compose.yml restart worker-rust
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -285,7 +285,7 @@ docker-compose -f docker-compose.temporal.yaml restart worker-rust
|
|||||||
**Debug:**
|
**Debug:**
|
||||||
1. Check Temporal UI for last completed activity
|
1. Check Temporal UI for last completed activity
|
||||||
2. Check worker logs for errors
|
2. Check worker logs for errors
|
||||||
3. Check if worker is still running: `docker-compose -f docker-compose.temporal.yaml ps worker-rust`
|
3. Check if worker is still running: `docker-compose -f docker-compose.yml ps worker-rust`
|
||||||
|
|
||||||
**Solution:**
|
**Solution:**
|
||||||
- Worker may have crashed - restart it
|
- Worker may have crashed - restart it
|
||||||
@@ -315,7 +315,7 @@ docker-compose -f docker-compose.temporal.yaml restart worker-rust
|
|||||||
|
|
||||||
**Solution:**
|
**Solution:**
|
||||||
- Re-upload file via CLI
|
- Re-upload file via CLI
|
||||||
- Check MinIO is running: `docker-compose -f docker-compose.temporal.yaml ps minio`
|
- Check MinIO is running: `docker-compose -f docker-compose.yml ps minio`
|
||||||
- Check MinIO credentials in worker environment
|
- Check MinIO credentials in worker environment
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -337,7 +337,7 @@ docker-compose -f docker-compose.temporal.yaml restart worker-rust
|
|||||||
docker stats fuzzforge-worker-rust
|
docker stats fuzzforge-worker-rust
|
||||||
|
|
||||||
# Check worker logs for memory warnings
|
# Check worker logs for memory warnings
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | grep -i "memory\|oom"
|
docker-compose -f docker-compose.yml logs worker-rust | grep -i "memory\|oom"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Profile Workflow Execution
|
### Profile Workflow Execution
|
||||||
@@ -368,7 +368,7 @@ class MyWorkflow:
|
|||||||
### Enable Temporal Worker Debug Logs
|
### Enable Temporal Worker Debug Logs
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Edit docker-compose.temporal.yaml
|
# Edit docker-compose.yml
|
||||||
services:
|
services:
|
||||||
worker-rust:
|
worker-rust:
|
||||||
environment:
|
environment:
|
||||||
@@ -376,7 +376,7 @@ services:
|
|||||||
LOG_LEVEL: DEBUG
|
LOG_LEVEL: DEBUG
|
||||||
|
|
||||||
# Restart
|
# Restart
|
||||||
docker-compose -f docker-compose.temporal.yaml restart worker-rust
|
docker-compose -f docker-compose.yml restart worker-rust
|
||||||
```
|
```
|
||||||
|
|
||||||
### Inspect Temporal Workflows via CLI
|
### Inspect Temporal Workflows via CLI
|
||||||
@@ -405,7 +405,7 @@ docker exec fuzzforge-worker-rust ping temporal
|
|||||||
docker exec fuzzforge-worker-rust curl http://minio:9000
|
docker exec fuzzforge-worker-rust curl http://minio:9000
|
||||||
|
|
||||||
# From host to services
|
# From host to services
|
||||||
curl http://localhost:8233 # Temporal UI
|
curl http://localhost:8080 # Temporal UI
|
||||||
curl http://localhost:9000 # MinIO
|
curl http://localhost:9000 # MinIO
|
||||||
curl http://localhost:8000/health # Backend
|
curl http://localhost:8000/health # Backend
|
||||||
```
|
```
|
||||||
@@ -431,10 +431,10 @@ If you're still stuck:
|
|||||||
1. **Collect diagnostic info:**
|
1. **Collect diagnostic info:**
|
||||||
```bash
|
```bash
|
||||||
# Save all logs
|
# Save all logs
|
||||||
docker-compose -f docker-compose.temporal.yaml logs > fuzzforge-logs.txt
|
docker-compose -f docker-compose.yml logs > fuzzforge-logs.txt
|
||||||
|
|
||||||
# Check service status
|
# Check service status
|
||||||
docker-compose -f docker-compose.temporal.yaml ps > service-status.txt
|
docker-compose -f docker-compose.yml ps > service-status.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Check Temporal UI** and take screenshots of:
|
2. **Check Temporal UI** and take screenshots of:
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ Before diving into specific errors, let’s check the basics:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check all FuzzForge services
|
# Check all FuzzForge services
|
||||||
docker-compose -f docker-compose.temporal.yaml ps
|
docker-compose -f docker-compose.yml ps
|
||||||
|
|
||||||
# Verify Docker registry config (if using workflow registry)
|
# Verify Docker registry config (if using workflow registry)
|
||||||
docker info | grep -i "insecure registries"
|
docker info | grep -i "insecure registries"
|
||||||
|
|
||||||
# Test service health endpoints
|
# Test service health endpoints
|
||||||
curl http://localhost:8000/health
|
curl http://localhost:8000/health
|
||||||
curl http://localhost:8233 # Temporal Web UI
|
curl http://localhost:8080 # Temporal Web UI
|
||||||
curl http://localhost:9000 # MinIO API
|
curl http://localhost:9000 # MinIO API
|
||||||
curl http://localhost:9001 # MinIO Console
|
curl http://localhost:9001 # MinIO Console
|
||||||
```
|
```
|
||||||
@@ -54,13 +54,13 @@ The registry isn’t running or the port is blocked.
|
|||||||
**How to fix:**
|
**How to fix:**
|
||||||
- Make sure the registry container is up (if using registry for workflow images):
|
- Make sure the registry container is up (if using registry for workflow images):
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml ps registry
|
docker-compose -f docker-compose.yml ps registry
|
||||||
```
|
```
|
||||||
- Check logs for errors:
|
- Check logs for errors:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml logs registry
|
docker-compose -f docker-compose.yml logs registry
|
||||||
```
|
```
|
||||||
- If port 5001 is in use, change it in `docker-compose.temporal.yaml` and your Docker config.
|
- If port 5001 is in use, change it in `docker-compose.yml` and your Docker config.
|
||||||
|
|
||||||
**Note:** With Temporal architecture, target files use MinIO (port 9000), not the registry.
|
**Note:** With Temporal architecture, target files use MinIO (port 9000), not the registry.
|
||||||
|
|
||||||
@@ -85,11 +85,11 @@ File upload to MinIO failed or worker can't download target.
|
|||||||
**How to fix:**
|
**How to fix:**
|
||||||
- Check MinIO is running:
|
- Check MinIO is running:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml ps minio
|
docker-compose -f docker-compose.yml ps minio
|
||||||
```
|
```
|
||||||
- Check MinIO logs:
|
- Check MinIO logs:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml logs minio
|
docker-compose -f docker-compose.yml logs minio
|
||||||
```
|
```
|
||||||
- Verify MinIO is accessible:
|
- Verify MinIO is accessible:
|
||||||
```bash
|
```bash
|
||||||
@@ -106,13 +106,13 @@ File upload to MinIO failed or worker can't download target.
|
|||||||
**How to fix:**
|
**How to fix:**
|
||||||
- Check worker logs for details:
|
- Check worker logs for details:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml logs worker-rust | tail -50
|
docker-compose -f docker-compose.yml logs worker-rust | tail -50
|
||||||
```
|
```
|
||||||
- Check Temporal Web UI at http://localhost:8233 for detailed execution history
|
- Check Temporal Web UI at http://localhost:8080 for detailed execution history
|
||||||
- Restart services:
|
- Restart services:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml down
|
docker-compose -f docker-compose.yml down
|
||||||
docker-compose -f docker-compose.temporal.yaml up -d
|
docker-compose -f docker-compose.yml up -d
|
||||||
```
|
```
|
||||||
- Reduce the number of concurrent workflows if your system is resource-constrained.
|
- Reduce the number of concurrent workflows if your system is resource-constrained.
|
||||||
|
|
||||||
@@ -125,18 +125,18 @@ File upload to MinIO failed or worker can't download target.
|
|||||||
**How to fix:**
|
**How to fix:**
|
||||||
- Check if the service is running:
|
- Check if the service is running:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml ps fuzzforge-backend
|
docker-compose -f docker-compose.yml ps fuzzforge-backend
|
||||||
docker-compose -f docker-compose.temporal.yaml ps temporal
|
docker-compose -f docker-compose.yml ps temporal
|
||||||
```
|
```
|
||||||
- View logs for errors:
|
- View logs for errors:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml logs fuzzforge-backend --tail 50
|
docker-compose -f docker-compose.yml logs fuzzforge-backend --tail 50
|
||||||
docker-compose -f docker-compose.temporal.yaml logs temporal --tail 20
|
docker-compose -f docker-compose.yml logs temporal --tail 20
|
||||||
```
|
```
|
||||||
- Restart the affected service:
|
- Restart the affected service:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml restart fuzzforge-backend
|
docker-compose -f docker-compose.yml restart fuzzforge-backend
|
||||||
docker-compose -f docker-compose.temporal.yaml restart temporal
|
docker-compose -f docker-compose.yml restart temporal
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -216,9 +216,9 @@ File upload to MinIO failed or worker can't download target.
|
|||||||
```
|
```
|
||||||
- Recreate the network:
|
- Recreate the network:
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml down
|
docker-compose -f docker-compose.yml down
|
||||||
docker network prune -f
|
docker network prune -f
|
||||||
docker-compose -f docker-compose.temporal.yaml up -d
|
docker-compose -f docker-compose.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -245,9 +245,9 @@ File upload to MinIO failed or worker can't download target.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
export TEMPORAL_LOGGING_LEVEL=DEBUG
|
export TEMPORAL_LOGGING_LEVEL=DEBUG
|
||||||
docker-compose -f docker-compose.temporal.yaml down
|
docker-compose -f docker-compose.yml down
|
||||||
docker-compose -f docker-compose.temporal.yaml up -d
|
docker-compose -f docker-compose.yml up -d
|
||||||
docker-compose -f docker-compose.temporal.yaml logs fuzzforge-backend -f
|
docker-compose -f docker-compose.yml logs fuzzforge-backend -f
|
||||||
```
|
```
|
||||||
|
|
||||||
### Collect diagnostic info
|
### Collect diagnostic info
|
||||||
@@ -258,12 +258,12 @@ Save and run this script to gather info for support:
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
echo "=== FuzzForge Diagnostics ==="
|
echo "=== FuzzForge Diagnostics ==="
|
||||||
date
|
date
|
||||||
docker-compose -f docker-compose.temporal.yaml ps
|
docker-compose -f docker-compose.yml ps
|
||||||
docker info | grep -A 5 -i "insecure registries"
|
docker info | grep -A 5 -i "insecure registries"
|
||||||
curl -s http://localhost:8000/health || echo "Backend unhealthy"
|
curl -s http://localhost:8000/health || echo "Backend unhealthy"
|
||||||
curl -s http://localhost:8233 >/dev/null && echo "Temporal UI healthy" || echo "Temporal UI unhealthy"
|
curl -s http://localhost:8080 >/dev/null && echo "Temporal UI healthy" || echo "Temporal UI unhealthy"
|
||||||
curl -s http://localhost:9000 >/dev/null && echo "MinIO healthy" || echo "MinIO unhealthy"
|
curl -s http://localhost:9000 >/dev/null && echo "MinIO healthy" || echo "MinIO unhealthy"
|
||||||
docker-compose -f docker-compose.temporal.yaml logs --tail 10
|
docker-compose -f docker-compose.yml logs --tail 10
|
||||||
```
|
```
|
||||||
|
|
||||||
### Still stuck?
|
### Still stuck?
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Before we begin, ensure you have the following installed:
|
|||||||
First, let's clone the FuzzForge repository:
|
First, let's clone the FuzzForge repository:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/FuzzingLabs/fuzzforge.git
|
git clone https://github.com/FuzzingLabs/fuzzforge_ai.git
|
||||||
cd fuzzforge
|
cd fuzzforge
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ docker pull localhost:5001/hello-world 2>/dev/null || echo "Registry not accessi
|
|||||||
Start all FuzzForge services:
|
Start all FuzzForge services:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose -f docker-compose.temporal.yaml up -d
|
docker-compose -f docker-compose.yml up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
This will start 6+ services:
|
This will start 6+ services:
|
||||||
@@ -101,7 +101,7 @@ Wait for all services to be healthy (this may take 2-3 minutes on first startup)
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check service health
|
# Check service health
|
||||||
docker-compose -f docker-compose.temporal.yaml ps
|
docker-compose -f docker-compose.yml ps
|
||||||
|
|
||||||
# Verify FuzzForge is ready
|
# Verify FuzzForge is ready
|
||||||
curl http://localhost:8000/health
|
curl http://localhost:8000/health
|
||||||
@@ -228,7 +228,7 @@ Example output:
|
|||||||
|
|
||||||
You can monitor workflow execution in real-time using the Temporal Web UI:
|
You can monitor workflow execution in real-time using the Temporal Web UI:
|
||||||
|
|
||||||
1. Open http://localhost:8233 in your browser
|
1. Open http://localhost:8080 in your browser
|
||||||
2. Navigate to "Workflows" to see workflow executions
|
2. Navigate to "Workflows" to see workflow executions
|
||||||
3. Click on a workflow to see detailed execution history and activity results
|
3. Click on a workflow to see detailed execution history and activity results
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user