Configuration
QScan is configured entirely through environment variables. There is no configuration file to manage.
Environment Variables
Required
REGISTRATION_TOKEN
Authentication token from app.qpoint.io (Settings -> API Tokens). Used for Pulse API authentication and, when using Qpoint-managed S3 storage, as the S3 access key.
Pulse Connectivity
PULSE_ENDPOINT
https://api-pulse.qpoint.io
Pulse API endpoint URL. Override only for on-premises Pulse deployments.
Worker Pool
NUM_POLLERS
1
Number of concurrent threads polling Pulse for scan jobs.
NUM_SCANNERS
1
Number of concurrent threads running PII detection models.
MEMORY_LIMIT_FRACTION
0.9
Fraction of available memory QScan is allowed to use before throttling.
Metrics
METRICS_PORT
9090
Port for the Prometheus metrics and health check HTTP endpoint. We recommend setting this to 8080 in container deployments for compatibility with Cloud Run and common ingress defaults.
S3 Storage
S3_ENDPOINT_URL
https://s3.warehouse.qpoint.io
S3-compatible endpoint URL. Set this when using your own storage (AWS S3, GCS, MinIO).
S3_BUCKET_NAME
assets
Name of the S3 bucket where Qtap stores artifacts.
S3_REGION_NAME
us-east-1
S3 region.
AWS_ACCESS_KEY_ID
(derived from REGISTRATION_TOKEN when using default endpoint)
S3 access key. When using Qpoint-managed storage, this is set automatically from the registration token.
AWS_SECRET_ACCESS_KEY
unset
S3 secret key. Required when using your own S3 storage.
Logging
LOG_LEVEL
(not set)
Log verbosity: debug, info, warning, error.
LOG_ENCODING
(not set)
Log format: json for structured logging, omit for plain text.
S3 Storage Configuration
QScan supports any S3-compatible object storage:
Qpoint-managed storage (default) -- No additional configuration needed. The registration token is used as the S3 access key automatically.
AWS S3 -- Set
S3_ENDPOINT_URLto your S3 endpoint (or omit to use the AWS default), and provideAWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEY.Google Cloud Storage -- Use the S3-compatible endpoint:
https://storage.googleapis.com. Provide HMAC keys as the access and secret keys.MinIO / Garage / other S3-compatible -- Set
S3_ENDPOINT_URLto your endpoint and provide credentials.
The S3 configuration in QScan must match the object store configured in your Qtap deployment. QScan reads artifacts that Qtap writes, so both must point to the same bucket and endpoint.
Qtap-Side Configuration
To enable PII scanning, add the qscan plugin to a stack in your Qtap configuration (YAML mode) or via Qplane (Stacks and Plugins):
Qtap Plugin Options
record_document
false
Whether to record the full document content alongside PII findings.
cache_ttl
24h
How long to cache scan results for repeated requests to the same endpoint.
cache_size
4096
Maximum number of entries in the scan result cache.
sample_baseline
10
Number of initial requests to always scan before applying the sample rate.
sample_rate
0.1
Fraction of requests to scan after the baseline (0.0 to 1.0).
qscan_cloud
false
Set to true to use Qpoint's hosted QScan cloud service instead of a self-hosted QScan deployment. When enabled, Qtap sends artifacts to Qpoint's cloud for scanning.
monitors
(none)
List of PII types to detect. Each entry specifies a type and whether to record_value.
Monitor Types
Supported PII types for the monitors list:
PERSON, EMAIL_ADDRESS, PHONE_NUMBER, LOCATION, US_SSN, STREET_ADDRESS, CREDIT_CARD, US_BANK_NUMBER, US_DRIVER_LICENSE, ORGANIZATION
Setting record_value: false reports the detection without storing the actual sensitive value.
Scaling Guidance
Pollers vs Scanners
Pollers fetch scan jobs from Pulse. Increasing pollers helps when job queue depth is high.
Scanners run the ML models. Increasing scanners improves throughput but requires proportionally more memory and CPU.
Recommended Configurations
Light (< 100 scans/hour)
1
1
12 GB
2 vCPUs
Moderate (100-1000 scans/hour)
2
2
24 GB
6 vCPUs
Heavy (> 1000 scans/hour)
2
2
16 GB + GPU
4 vCPUs + 1 GPU
For heavy workloads, horizontal scaling (multiple QScan instances) is more effective than increasing pollers and scanners on a single instance. Each scanner thread loads its own copy of the ML models, so memory usage scales linearly with NUM_SCANNERS.
Last updated