Skip to content

Kubernetes (Helm)

recon-web ships with a Helm chart at helm/recon-web/ that deploys the API server, web frontend, and optional scheduled scanner as Kubernetes workloads.

  • Kubernetes 1.25+
  • Helm 3.10+
  • kubectl configured to talk to your cluster
  1. Clone the repository (or add the chart from a Helm registry if published):

    Terminal window
    git clone https://github.com/brunoafk/recon-web.git
    cd recon-web
  2. Install with default values:

    Terminal window
    helm install recon-web ./helm/recon-web
  3. Port-forward to access the UI locally:

    Terminal window
    kubectl port-forward svc/recon-web-web 8080:80
  4. Open http://localhost:8080.

Create a values-override.yaml to configure the deployment for your environment:

values-override.yaml
ingress:
enabled: true
className: nginx
host: recon.example.com
tls: true
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
auth:
enabled: true
token: "your-secret-token-at-least-32-chars-long"
api:
env:
GOOGLE_CLOUD_API_KEY: "AIza..."
VIRUSTOTAL_API_KEY: "abcdef..."
MAX_CONCURRENCY: "4"
scanner:
enabled: true
schedule: "0 */6 * * *"
urls:
- https://example.com
- https://another-site.com
notifications:
telegram:
enabled: true
botToken: "123456789:ABCdefGHI..."
chatId: "123456789"
email:
enabled: true
smtpHost: smtp.gmail.com
smtpPort: "587"
smtpUser: alerts@example.com
smtpPass: "abcd efgh ijkl mnop"
notifyEmail: team@example.com
persistence:
enabled: true
size: 5Gi
storageClass: gp3

Install with the override file:

Terminal window
helm install recon-web ./helm/recon-web -f values-override.yaml
ComponentCPU requestCPU limitMemory requestMemory limit
API100m1000m256Mi1Gi
Web50m200m64Mi128Mi

Override these under api.resources and web.resources in your values file.

To use images from a private registry:

api:
image:
repository: registry.example.com/recon-web/api
tag: "1.0.0"
pullPolicy: IfNotPresent
web:
image:
repository: registry.example.com/recon-web/web
tag: "1.0.0"
pullPolicy: IfNotPresent

The API server stores scan history in a SQLite database backed by a PersistentVolumeClaim.

SettingDefaultDescription
persistence.enabledtrueCreate a PVC for scan data
persistence.size1GiVolume size
persistence.storageClass(cluster default)Storage class to use
persistence.accessModeReadWriteOncePVC access mode

The Helm chart can deploy a Kubernetes CronJob that runs the CLI image on a schedule:

scanner:
enabled: true
schedule: "0 0 * * *"
urls:
- https://example.com
image:
repository: ghcr.io/brunoafk/recon-web/cli
tag: latest

This is an alternative to the built-in scheduler (SCHEDULE_ENABLED). The Kubernetes CronJob approach gives you native retry policies, resource limits, and pod-level observability.

Terminal window
helm upgrade recon-web ./helm/recon-web -f values-override.yaml
Terminal window
helm uninstall recon-web