Self-Hosted Setup: PII Scanning with Local Storage
Set up a complete QScan pipeline on your local machine -- from object storage to PII detections in the Pulse dashboard. This is the fastest way to see QScan in action.
Who This Is For
Use this guide if you want to:
Try QScan for the first time
See the full scanning pipeline working end-to-end
Evaluate PII detection capabilities before a production rollout
Choose something else if you:
Already have Qtap and object storage running -- see the QScan Installation docs
Want production Kubernetes deployment -- see Kubernetes Installation
Time to complete: 30 minutes
Prerequisites
Before you begin, make sure you have:
Docker and Docker Compose installed and running
A registration token from app.qpoint.io (Settings -> API Tokens)
Basic familiarity with YAML configuration
The registration token connects Qtap and QScan to the Pulse service, which coordinates scan jobs and displays results. You can create one from the Settings page in the Qpoint dashboard.
Step 1: Set Up Object Storage
QScan reads captured HTTP artifacts from S3-compatible object storage. For this guide, you will use MinIO as a lightweight local store.
Create a project directory and add a docker-compose.yml:
Add the MinIO service to docker-compose.yml:
Start MinIO:
Create the bucket that Qtap will write artifacts to:
You now have an S3-compatible store running at http://localhost:9000 with a qpoint bucket.
Step 2: Configure Qtap for Artifact Capture
Create a Qtap configuration that captures HTTP traffic and stores artifacts in MinIO with the QScan plugin enabled.
Key configuration choices:
sample_rate: 1.0scans every captured request. In production, lower this to reduce cost and load.sample_baseline: 10ensures the first 10 requests to each endpoint are always scanned, regardless of sample rate.record_value: falseon each monitor means QScan reports that PII was found, but does not store the actual sensitive values.
To use Qpoint's hosted QScan cloud service instead of self-hosted, set qscan_cloud: true in the plugin config. When enabled, Qtap sends artifacts to Qpoint's cloud for scanning -- no QScan deployment needed on your side.
Step 3: Deploy Qtap
Add the Qtap service to your docker-compose.yml:
Start Qtap:
Check that it starts cleanly:
You should see log lines indicating that Qtap has loaded the configuration and is tapping traffic.
Step 4: Deploy QScan
Add the QScan service to your docker-compose.yml:
QScan loads PII detection models into memory. The 12 GB memory limit is recommended for reliable operation. Machines with less available memory may experience out-of-memory errors during scanning.
Start QScan:
Verify it connects and begins polling for scan jobs:
Look for log messages indicating that QScan has connected to Pulse and is polling for work.
Step 5: Generate Test Traffic
With the pipeline running, generate some HTTP requests containing fake PII. Qtap will capture these, store the artifacts in MinIO, and Pulse will schedule scan jobs for QScan.
Run a few curl commands from a container on the host (so Qtap can observe the traffic):
httpbin.org echoes your request body back in the response, so both the request and response will contain PII for QScan to detect.
Wait a minute or two for the pipeline to process:
Qtap captures the requests and writes artifacts to MinIO
Pulse receives metadata and schedules scan jobs
QScan picks up the jobs, downloads artifacts, and runs PII detection
Step 6: Verify PII Detections
Check QScan Logs
Look for log entries showing scan activity -- messages about downloading artifacts, running detection, and reporting results.
Check the Pulse Dashboard
Open app.qpoint.io and navigate to your environment. You should see:
PII findings associated with the
httpbin.orgendpointDetected entity types such as PERSON, EMAIL_ADDRESS, PHONE_NUMBER, US_SSN, and CREDIT_CARD
Confidence scores for each detection
The dashboard shows which endpoints are transmitting sensitive data, what types of PII were found, and how frequently it appears.
Check MinIO (Optional)
You can browse the stored artifacts through the MinIO console at http://localhost:9001 (login with minioadmin / minioadmin). Look in the qpoint bucket for captured request and response data.
Step 7: Next Steps
You now have a working QScan pipeline. Here are paths forward:
Tune sampling rates -- Lower
sample_ratefor production traffic and rely onsample_baselineto ensure coverage of new endpoints. See QScan Configuration.Deploy to production -- Run QScan on Kubernetes or Cloud Run for production workloads.
Add more monitors -- QScan supports additional entity types like LOCATION, STREET_ADDRESS, US_BANK_NUMBER, and US_DRIVER_LICENSE.
Enable GPU acceleration -- For higher throughput scanning, QScan can use GPU resources to accelerate PII detection models.
Target specific endpoints -- Use Qtap's endpoint configuration to apply the
qscanplugin only to specific domains (e.g., AI providers, external APIs).
Complete Docker Compose File
For convenience, here is the full docker-compose.yml with all three services ready to run:
To run the full stack:
Then generate test traffic with the curl commands from Step 5 and check results in the Pulse dashboard.
Last updated