On-Premise Deployment
DeepIntShield Enterprise supports on-premise deployments for environments that cannot use cloud-native identity federation. Images are pulled from GCP Artifact Registry using username/password authentication.
Architecture
Section titled “Architecture”flowchart LR subgraph OnPrem[On-Premise Environment] subgraph K8s[Kubernetes Cluster] Pod[DeepIntShield Pod] Secret[imagePullSecret] end Docker[Docker Daemon] end
subgraph GCP[GCP] AR[Artifact Registry<br/>DeepIntShield Images] end
Secret -->|Credentials| Pod Pod -->|Pull| AR Docker -->|Pull| AR AR -->|Image| Pod AR -->|Image| DockerPrerequisites
Section titled “Prerequisites”- Kubernetes cluster (v1.23+) or Docker runtime
- Network access to
us-central1-docker.pkg.dev(or your designated region) - Docker credentials provided by DeepIntShield team
Credentials
Section titled “Credentials”The DeepIntShield team will provide you with:
| Credential | Description |
|---|---|
| Username | _json_key (fixed value for GCP Artifact Registry) |
| Password | Service account JSON key (base64 encoded or raw JSON) |
| Registry | REGION-docker.pkg.dev (e.g., us-central1-docker.pkg.dev) |
| Repository | REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG |
Docker Deployment
Section titled “Docker Deployment”Step 1: Login to Registry
Section titled “Step 1: Login to Registry”# Using the JSON key filecat deepintshield-credentials.json | docker login -u _json_key --password-stdin https://REGION-docker.pkg.dev
# Or using the password directlydocker login -u _json_key -p "$(cat deepintshield-credentials.json)" https://REGION-docker.pkg.devStep 2: Pull the Image
Section titled “Step 2: Pull the Image”docker pull REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latestStep 3: Run DeepIntShield
Section titled “Step 3: Run DeepIntShield”docker run -d \ --name deepintshield \ -p 8080:8080 \ -v /path/to/config.json:/app/data/config.json:ro \ -v /path/to/data:/app/data \ REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latestKubernetes Deployment
Section titled “Kubernetes Deployment”Step 1: Create Namespace
Section titled “Step 1: Create Namespace”kubectl create namespace deepintshieldStep 2: Create imagePullSecret
Section titled “Step 2: Create imagePullSecret”kubectl create secret docker-registry deepintshield-pull-secret \ --docker-server=REGION-docker.pkg.dev \ --docker-username=_json_key \ --docker-password="$(cat deepintshield-credentials.json)" \ --namespace=deepintshield# If you received a base64-encoded keykubectl create secret docker-registry deepintshield-pull-secret \ --docker-server=REGION-docker.pkg.dev \ --docker-username=_json_key \ --docker-password="$(echo 'BASE64_ENCODED_KEY' | base64 -d)" \ --namespace=deepintshieldapiVersion: v1kind: Secretmetadata: name: deepintshield-pull-secret namespace: deepintshieldtype: kubernetes.io/dockerconfigjsondata: .dockerconfigjson: <BASE64_ENCODED_DOCKER_CONFIG>Generate the base64-encoded config:
# Create docker configcat <<EOF > docker-config.json{ "auths": { "REGION-docker.pkg.dev": { "username": "_json_key", "password": "$(cat deepintshield-credentials.json | tr -d '\n')", "auth": "$(echo -n '_json_key:'$(cat deepintshield-credentials.json | tr -d '\n') | base64 -w 0)" } }}EOF
# Base64 encode for secretcat docker-config.json | base64 -w 0Step 3: Create DeepIntShield Configuration
Section titled “Step 3: Create DeepIntShield Configuration”apiVersion: v1kind: Secretmetadata: name: deepintshield-config namespace: deepintshieldtype: OpaquestringData: config.json: | { "config_store": { "enabled": true, "type": "postgres", "config": { "host": "postgres.deepintshield.svc.cluster.local", "port": "5432", "user": "deepintshield", "password": "YOUR_PASSWORD", "db_name": "deepintshield", "ssl_mode": "disable" } }, "logs_store": { "enabled": true, "type": "postgres", "config": { "host": "postgres.deepintshield.svc.cluster.local", "port": "5432", "user": "deepintshield", "password": "YOUR_PASSWORD", "db_name": "deepintshield", "ssl_mode": "disable" } } }Step 4: Deploy DeepIntShield
Section titled “Step 4: Deploy DeepIntShield”apiVersion: apps/v1kind: Deploymentmetadata: name: deepintshield namespace: deepintshieldspec: replicas: 2 selector: matchLabels: app: deepintshield template: metadata: labels: app: deepintshield spec: imagePullSecrets: - name: deepintshield-pull-secret containers: - name: deepintshield image: REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latest ports: - containerPort: 8080 name: http resources: requests: cpu: "250m" memory: "512Mi" limits: cpu: "1000m" memory: "2Gi" livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 volumeMounts: - name: config mountPath: /app/data/config.json subPath: config.json - name: data mountPath: /app/data volumes: - name: config secret: secretName: deepintshield-config - name: data persistentVolumeClaim: claimName: deepintshield-data---apiVersion: v1kind: Servicemetadata: name: deepintshield namespace: deepintshieldspec: selector: app: deepintshield ports: - port: 80 targetPort: 8080 protocol: TCP type: ClusterIP---apiVersion: v1kind: PersistentVolumeClaimmetadata: name: deepintshield-data namespace: deepintshieldspec: accessModes: - ReadWriteOnce resources: requests: storage: 10GiStep 5: Expose DeepIntShield (Optional)
Section titled “Step 5: Expose DeepIntShield (Optional)”apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: deepintshield namespace: deepintshield annotations: nginx.ingress.kubernetes.io/proxy-body-size: "50m"spec: ingressClassName: nginx rules: - host: deepintshield.your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: deepintshield port: number: 80 tls: - hosts: - deepintshield.your-domain.com secretName: deepintshield-tlsapiVersion: v1kind: Servicemetadata: name: deepintshield-lb namespace: deepintshieldspec: selector: app: deepintshield ports: - port: 80 targetPort: 8080 protocol: TCP type: LoadBalancerapiVersion: v1kind: Servicemetadata: name: deepintshield-nodeport namespace: deepintshieldspec: selector: app: deepintshield ports: - port: 80 targetPort: 8080 nodePort: 30080 protocol: TCP type: NodePortDocker Compose Deployment
Section titled “Docker Compose Deployment”For simpler deployments without Kubernetes:
version: '3.8'
services: deepintshield: image: REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latest container_name: deepintshield ports: - "8080:8080" volumes: - ./config.json:/app/data/config.json:ro - deepintshield-data:/app/data environment: - DEEPINTSHIELD_LOG_LEVEL=info healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s restart: unless-stopped
postgres: image: postgres:15-alpine container_name: deepintshield-postgres environment: - POSTGRES_USER=deepintshield - POSTGRES_PASSWORD=YOUR_PASSWORD - POSTGRES_DB=deepintshield volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U deepintshield"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped
volumes: deepintshield-data: postgres-data:Login to registry before running:
cat deepintshield-credentials.json | docker login -u _json_key --password-stdin https://REGION-docker.pkg.devdocker compose up -dAir-Gapped Environments
Section titled “Air-Gapped Environments”For environments without internet access, you can mirror the image to your internal registry.
Step 1: Pull Image (Internet-Connected Machine)
Section titled “Step 1: Pull Image (Internet-Connected Machine)”# Login and pullcat deepintshield-credentials.json | docker login -u _json_key --password-stdin https://REGION-docker.pkg.devdocker pull REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latest
# Save to tar filedocker save REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latest > deepintshield-image.tarStep 2: Transfer and Load (Air-Gapped Machine)
Section titled “Step 2: Transfer and Load (Air-Gapped Machine)”# Load imagedocker load < deepintshield-image.tar
# Tag for internal registrydocker tag REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latest \ internal-registry.company.com/deepintshield:latest
# Push to internal registrydocker push internal-registry.company.com/deepintshield:latestStep 3: Update Kubernetes Manifests
Section titled “Step 3: Update Kubernetes Manifests”Update the image reference in your deployment:
containers:- name: deepintshield image: internal-registry.company.com/deepintshield:latestCredential Rotation
Section titled “Credential Rotation”When the DeepIntShield team rotates your credentials:
Update Docker Login
Section titled “Update Docker Login”cat new-credentials.json | docker login -u _json_key --password-stdin https://REGION-docker.pkg.devUpdate Kubernetes Secret
Section titled “Update Kubernetes Secret”# Delete old secretkubectl delete secret deepintshield-pull-secret -n deepintshield
# Create new secretkubectl create secret docker-registry deepintshield-pull-secret \ --docker-server=REGION-docker.pkg.dev \ --docker-username=_json_key \ --docker-password="$(cat new-credentials.json)" \ --namespace=deepintshield
# Restart deployment to pick up new secretkubectl rollout restart deployment/deepintshield -n deepintshieldVerifying Access
Section titled “Verifying Access”Test Docker Authentication
Section titled “Test Docker Authentication”# Verify logindocker login -u _json_key -p "$(cat deepintshield-credentials.json)" https://REGION-docker.pkg.dev
# Test pulldocker pull REGION-docker.pkg.dev/DEEPINTSHIELD_PROJECT/YOUR_HUB_SLUG/deepintshield:latestVerify Kubernetes Secret
Section titled “Verify Kubernetes Secret”# Check secret existskubectl get secret deepintshield-pull-secret -n deepintshield
# Verify secret content (base64 encoded)kubectl get secret deepintshield-pull-secret -n deepintshield -o jsonpath='{.data.\.dockerconfigjson}' | base64 -dTroubleshooting
Section titled “Troubleshooting”ImagePullBackOff Errors
Section titled “ImagePullBackOff Errors”# Check pod eventskubectl describe pod -l app=deepintshield -n deepintshield
# Common issues:# - "unauthorized": Invalid credentials - check username/password# - "not found": Wrong repository path - verify with DeepIntShield team# - "connection refused": Network issue - check firewall rulesNetwork Connectivity
Section titled “Network Connectivity”# Test DNS resolutionnslookup REGION-docker.pkg.dev
# Test HTTPS connectivitycurl -v https://REGION-docker.pkg.dev/v2/
# Required outbound access:# - REGION-docker.pkg.dev:443# - oauth2.googleapis.com:443 (for token refresh)Credential Issues
Section titled “Credential Issues”# Verify JSON key formatcat deepintshield-credentials.json | jq .
# Check key hasn't expiredcat deepintshield-credentials.json | jq '.private_key_id'
# Contact DeepIntShield team if credentials are invalidSecurity Best Practices
Section titled “Security Best Practices”- Store credentials securely: Use a secrets manager (Vault, AWS Secrets Manager) for credential storage
- Limit access: Only grant imagePullSecret access to required namespaces
- Rotate regularly: Request credential rotation from DeepIntShield team periodically
- Audit access: Monitor image pull logs for unauthorized access attempts
- Network isolation: Restrict outbound access to only required registry endpoints
Next Steps
Section titled “Next Steps”- Configure DeepIntShield settings for your use case
- Set up observability for monitoring
- Enable clustering for high availability