Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Portal Overview

The Rockfish Portal is a self-service web application that combines the marketing website with license management. It provides:

  • Marketing pages — product information, features, pricing
  • Shop — dynamic pricing from Stripe with tier comparison
  • Registration — passwordless email-based authentication (magic links)
  • License management — purchase, download, and manage licenses
  • Stripe integration — payment processing with webhook support
  • License server integration — delegates license signing to the license server

Architecture

User → Portal (Axum) → Stripe (payments)
                     → License Server (signing)
                     → S3 (data persistence)
                     → SMTP (email)

The portal is a single Rust binary (rockfish-portal) that serves both the static marketing site and the dynamic commerce functionality.

URL Structure

PathDescriptionAuth
/Marketing landing pagePublic
/features.htmlFeature overviewPublic
/shopDynamic pricing (from Stripe)Public
/enterEmail entry / loginPublic
/auth?token=...Magic link authenticationPublic
/dashboardLicense listLogged in
/dashboard/buyPurchase a licenseLogged in
/checkoutStripe checkout redirectLogged in
/webhook/stripeStripe payment webhookStripe
/termsTerms & ConditionsPublic
/privacyPrivacy PolicyPublic

Authentication

The portal uses passwordless magic link authentication:

  1. User enters email at /enter
  2. If email is new → account created automatically
  3. Magic link sent via SMTP
  4. User clicks link → session cookie set
  5. First-time users complete profile (name, company, accept terms)
  6. New users → redirected to Buy tab
  7. Returning users → redirected to Licenses tab

License Flow

  1. User selects a tier on the Buy tab
  2. Enters an Installation Name (min 5 characters, identifies the Suricata instance)
  3. Redirected to Stripe Checkout
  4. On payment confirmation:
    • Stripe sends webhook to /webhook/stripe
    • Portal asynchronously requests license from the license server
    • License stored in DuckDB and synced to S3
    • User can download or copy the license JSON from their dashboard

Licensing

Every tier requires a valid signed license — there is no unlicensed mode. The engine resolves each license to exactly the tier it was issued for; there is no trial auto-bump. Licenses are annual with a 30-day grace period, and the engine re-checks the license once per day.

The Basic tier is $0 but still requires registration. It is issued directly by the license server with no Stripe/payment step; Professional and Enterprise are purchased through Stripe checkout.

Tiers

TierPriceEvents/minFeatures
Basic$0/yr10,000Full platform minus the ML lenses
Professional$99/yr60,000+ Anomaly & Behavioral (ML) lenses
Enterprise$999/yrUnlimited+ swimlane/topology, MQTT/Kafka, threat intel, custom branding

Basic and Professional are feature-identical except for the ML detection lenses and the throughput cap. Every tier is per-sensor. Paid prices are fetched dynamically from Stripe and cached for 8 hours.

Portal Control

  • PORTAL_DISABLED=true — shows “Coming Soon” page, allows pre-registration but disables purchasing
  • When disabled, users can still log in and view existing licenses

Data Persistence

The portal uses DuckDB locally and syncs to S3 after every write:

  • New user registration
  • Profile completion
  • License issuance

On startup, data is loaded from S3 into local DuckDB. This supports ephemeral environments like DigitalOcean App Platform.

CLI Commands

# Run the portal server
rockfish-portal

# List registered users
rockfish-portal --list-users

# List licenses
rockfish-portal --list-licenses

# Verbose mode
rockfish-portal -v