Commercial layer quickstart¶
Audience: DevOps and platform engineers running PrivaCI after subscribing on AWS Marketplace.
When you are done: You have run a masked job in your VPC using the official commercial container image and generated a signed compliance report.
Delivery model: PrivaCI commercial ships as a container image bundled
with the public engine. You subscribe on AWS Marketplace, pull the image into
your registry or runtime, and run it as a one-shot batch job in your VPC.
You do not clone this repository or pip install anything in production.
Public engine concepts (salt, mask-rules.yaml, CLI): see the public docs first
if you are new to PrivaCI:
| Public doc | Why |
|---|---|
| Deployment | Container model, Helm chart, read-only root |
| Configuration | mask-rules.yaml reference — start with privaci init |
| CLI reference | Scaffold and review config from your source DB |
| Quickstart (evaluation) | Try the engine locally with masked data |
Prerequisites¶
- Active AWS Marketplace subscription (Standard or Compliance tier)
- Network path from the job to source and target PostgreSQL (in-VPC)
- Container runtime (ECS, EKS, Batch, Kubernetes CronJob) or
docker runfor a smoke test mask-rules.yamlfromprivaci init(not hand-written from scratch) — see Create mask-rules.yaml below- Secrets for DB URLs, salt, and (optionally) report signing — see Licensing and Signed reports
Create mask-rules.yaml¶
Use privaci init, then privaci plan. Do not copy a blank template or invent
column lists by hand. Run the Marketplace image against your source database
(no target writes):
export SOURCE_DB_URL='postgresql://user:pass@source-host:5432/app'
docker run --rm --read-only --tmpfs /tmp \
-e SOURCE_DB_URL \
-v "$(pwd):/work" \
-w /work \
ghcr.io/boundarylogic/privaci-commercial:<tag> \
init --source "$SOURCE_DB_URL" --output /work/mask-rules.yaml
docker run --rm --read-only --tmpfs /tmp \
-e SOURCE_DB_URL \
-v "$(pwd)/mask-rules.yaml:/config/mask-rules.yaml:ro" \
ghcr.io/boundarylogic/privaci-commercial:<tag> \
plan --config /config/mask-rules.yaml --source "$SOURCE_DB_URL"
Review the plan, edit uncertain columns in mask-rules.yaml, then
validate before your first ECS/Docker run. Details: public
privaci init and
configuration.
1. Get the container image¶
After subscribing, AWS Marketplace provides the image URI and entitlement fulfillment instructions on your subscription page.
docker pull ghcr.io/boundarylogic/privaci-commercial:<tag>
Pin to a stable tag (not :beta or :edge) in production. The commercial
layer is baked into this image — no separate install step.
Image properties match the public engine container — see public
Deployment — container image:
Python 3.12, non-root user privaci (UID 10001), entrypoint privaci,
read-only root compatible.
2. Configure entitlement¶
Your tier is discovered at job start via AWS License Manager
CheckoutLicense against your Marketplace subscription. The published image
already knows its ProductSKU, so there is no product code or license ARN to set.
A Marketplace run needs only:
AWS_REGION— the region where you subscribed- an IAM task role allowing
license-manager:CheckoutLicenseandCheckInLicense(credentials come from the task/instance role — no static keys)
export AWS_REGION='us-east-1' # region where you subscribed
# AWS credentials via task/instance role — no static keys in the image
See Licensing & entitlement for the task-role policy and the tier → capability map.
Optional offline JWT (air-gapped or contract deployments, no AWS calls):
export PRIVACI_LICENSE_KEY='eyJ...'
export PRIVACI_LICENSE_PUBLIC_KEY="$(cat license-public.pem)"
3. Run masking (one-shot batch job)¶
Mount your config read-only. Pass DB URLs and salt via env vars or your secrets manager (never bake secrets into the image).
docker run --rm --read-only --tmpfs /tmp \
-e SOURCE_DB_URL='postgresql://user:pass@source-host:5432/app' \
-e TARGET_DB_URL='postgresql://user:pass@target-host:5432/staging' \
-e ANONYMIZATION_SALT="$(openssl rand -hex 32)" \
-e AWS_REGION='us-east-1' \
-v "$(pwd)/mask-rules.yaml:/config/mask-rules.yaml:ro" \
ghcr.io/boundarylogic/privaci-commercial:<tag> \
run --config /config/mask-rules.yaml
Expected stdout ends with:
Run <uuid> succeeded: N table(s), M row(s).
State is written to _privaci on the target database — see public
state schema.
Dry run first (no writes):
docker run --rm --read-only --tmpfs /tmp \
-e SOURCE_DB_URL='…' \
-v "$(pwd)/mask-rules.yaml:/config/mask-rules.yaml:ro" \
ghcr.io/boundarylogic/privaci-commercial:<tag> \
dry-run --config /config/mask-rules.yaml --report /tmp/autodetect.md
Kubernetes / scheduled runs: use the public Helm chart — see
Deployment — Helm chart.
Set commercial env vars via extraEnv or Secret refs.
4. Generate a signed compliance report¶
Generate a signing keypair once per environment — see Signed reports. Store the private key in AWS Secrets Manager (or equivalent); mount or inject at job runtime.
docker run --rm --read-only --tmpfs /tmp \
-e TARGET_DB_URL='postgresql://…/staging' \
-e PRIVACI_REPORT_SIGNING_KEY_PEM="$(aws secretsmanager get-secret-value …)" \
-e PRIVACI_OPERATOR_ID='prod-nightly-cron' \
-e PRIVACI_REPORT_SUMMARY_MD='/tmp/run-summary.md' \
ghcr.io/boundarylogic/privaci-commercial:<tag> \
report --run <run-uuid-from-step-3> --format json --output /tmp/report.json
Copy /tmp/report.json (and the Markdown sidecar) to your evidence store.
Details: Signed reports · Compliance evidence workflow
5. Verify the report¶
Run on a CI worker or auditor workstation — public key only, no private key:
python - <<'PY'
from pathlib import Path
from privaci_commercial.report_verify import verify_report_file
payload = verify_report_file(
Path("report.json"),
public_key_pem=Path("report-signing.pub.pem").read_bytes(),
)
print(payload["summary"]["verdict"]["status"])
PY
The verify helper ships in the commercial image. Auditors can also use a BoundaryLogic-provided verify script without Marketplace subscription — contact support for auditor tooling.
FAQ¶
Do I need to clone any GitHub repo?
No. Subscribe on AWS Marketplace, pull the image, configure env vars, run.
Community vs commercial image?
The public GHCR image (ghcr.io/boundarylogic/privaci) runs in community
mode (no license enforcement, unsigned reports). The Marketplace image
includes the commercial layer. Production paid deployments use the Marketplace
image only.
Where does data go?
Nowhere outside your VPC. The container reads source Postgres, writes masked
rows to target Postgres, and exits. See public
architecture overview.
Which salt env var?
Production uses ANONYMIZATION_SALT or global_salt in YAML — see public
error code 4.
Next steps¶
| Goal | Doc |
|---|---|
| Choose ECS vs Docker | Deployment options |
| License tiers & exit 5 | Licensing & entitlement |
| Signing keys & CI verify | Signed reports |
| Schema drift gate | Drift detection |
| One tenant to staging | Data subsetting — multi-tenant staging |
| Errors | Troubleshooting |
| Helm / CronJob patterns | Public Deployment |