Skip to content

Connection security

Reference environment variables in connection strings:

adapters:
production_db:
connector: postgres
connection_string: '{{ env.DATABASE_URL }}'

Or construct from multiple variables:

adapters:
production_db:
connector: postgres
connection_string: 'postgresql://{{ env.DB_USER }}:{{ env.DB_PASS }}@{{ env.DB_HOST }}:5432/{{ env.DB_NAME }}'

Local development:

Terminal window
export DATABASE_URL="postgresql://dev:dev@localhost:5432/myapp"
hyperterse dev -f config.terse

Using .env files:

Hyperterse automatically loads .env files from the current directory when starting:

.env
DATABASE_URL=postgresql://dev:dev@localhost:5432/myapp
Terminal window
# No need to source - .env is loaded automatically
hyperterse -f config.terse

In Docker:

ENV DATABASE_URL=postgresql://user:pass@db:5432/app

We recommend ensuring all production connections are encrypted.

adapters:
production_db:
connector: postgres
connection_string: 'postgresql://user:pass@host:5432/db?sslmode=require'

SSL modes:

ModeDescriptionUse Case
disableNo SSLNon-production only
requireSSL required, no verificationCloud databases
verify-caVerify CA certificateHigh security
verify-fullVerify CA and hostnameHighest security
adapters:
production_db:
connector: mysql
connection_string: 'user:pass@tcp(host:3306)/db?tls=true'

Use rediss:// for TLS:

adapters:
cache:
connector: redis
connection_string: 'rediss://:password@host:6379/0'

Create database users with minimal permissions:

-- Create read-only user
CREATE USER hyperterse WITH PASSWORD 'secure_password';
-- Grant only SELECT on specific tables
GRANT SELECT ON users, products, orders TO hyperterse;
-- For new tables
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO hyperterse;
-- Read-only access
CREATE USER 'hyperterse'@'%' IDENTIFIED BY 'secure_password';
GRANT SELECT ON myapp.* TO 'hyperterse'@'%';

Keep databases on private networks:

┌─────────────────────────────────────────────────────┐
│ Private VPC │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Hyperterse │────────▶│ Database │ │
│ │ Server │ Private │ │ │
│ └──────▲──────┘ Net └─────────────┘ │
│ │ │
└─────────┼───────────────────────────────────────────┘
│ Public
┌─────┴─────┐
│ Clients │
└───────────┘
  • Allow Hyperterse to connect to database ports
  • Block direct database access from the internet
  • Restrict Hyperterse port (8080) to expected sources

AWS:

  • Use RDS in a private subnet
  • Security groups allowing Hyperterse instances only
  • Deploy Hyperterse in the same VPC

GCP:

  • Use Cloud SQL with private IP
  • VPC network for Hyperterse
  • Firewall rules restricting access

For production, use a secrets manager:

Terminal window
# Fetch secret at runtime
export DATABASE_URL=$(aws secretsmanager get-secret-value \
--secret-id prod/db/hyperterse \
--query SecretString --output text)
hyperterse run -f config.terse
Terminal window
export DATABASE_URL=$(vault kv get -field=url secret/database)
hyperterse run -f config.terse
apiVersion: v1
kind: Secret
metadata:
name: hyperterse-secrets
stringData:
DATABASE_URL: postgresql://user:pass@db:5432/app
---
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: hyperterse
envFrom:
- secretRef:
name: hyperterse-secrets

Configure connection pools appropriately:

adapters:
production_db:
connector: postgres
connection_string: '{{ env.DATABASE_URL }}'
options:
max_connections: '10' # Match expected concurrency

Sizing guidelines:

  • Start with 5-10 connections per Hyperterse instance
  • Monitor database connection usage
  • Increase if you see connection wait times

Plan for credential rotation:

  1. Create new database user with new password
  2. Update secrets manager
  3. Restart Hyperterse (connections are re-established)
  4. Revoke old credentials

For zero-downtime rotation, use multiple Hyperterse instances with rolling restarts.