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:

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.ioarrow-up-right (Settings -> API Tokens)

  • Basic familiarity with YAML configuration

circle-info

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.0 scans every captured request. In production, lower this to reduce cost and load.

  • sample_baseline: 10 ensures the first 10 requests to each endpoint are always scanned, regardless of sample rate.

  • record_value: false on each monitor means QScan reports that PII was found, but does not store the actual sensitive values.

circle-info

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:

circle-exclamation

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):

circle-info

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:

  1. Qtap captures the requests and writes artifacts to MinIO

  2. Pulse receives metadata and schedules scan jobs

  3. 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.ioarrow-up-right and navigate to your environment. You should see:

  • PII findings associated with the httpbin.org endpoint

  • Detected 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:9001arrow-up-right (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_rate for production traffic and rely on sample_baseline to ensure coverage of new endpoints. See QScan Configurationarrow-up-right.

  • 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 qscan plugin 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 dashboardarrow-up-right.

Last updated