3.3 KiB
Configuration
All server configuration is done via environment variables or a .env file in the project root.
Example .env
PORT=8080
API_KEY=your-secret-api-key
CORS_ORIGINS=https://yourdomain.com,https://app.yourdomain.com
LOG_FORMAT=json
Copy .env.example to get started:
cp .env.example .env
Environment Variables
| Variable | Default | Required | Description |
|---|---|---|---|
PORT |
8080 |
No | Port the HTTP server listens on. |
API_KEY |
— | No* | Shared secret for API key auth. Auth is disabled when empty — do not leave empty in production. |
CORS_ORIGINS |
http://localhost:3000 |
No | Comma-separated list of allowed CORS origins. |
LOG_FORMAT |
text |
No | text for human-readable, json for structured logging (recommended for production). |
API Key Authentication
The Go server uses a shared API key. This is intentional: the server is an internal service called only by the Next.js backend, not directly by end users.
When API_KEY is set, every request (except GET /health) must include:
X-API-Key: your-secret-api-key
Requests with a missing or incorrect key get 401 UNAUTHORIZED:
{
"error": "missing or invalid API key",
"code": "UNAUTHORIZED"
}
Calling from Next.js
const res = await fetch(`${process.env.DNS_SERVER_URL}/api/v1/dns/lookup`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.DNS_API_KEY!,
},
body: JSON.stringify({ domain, types }),
});
Store DNS_API_KEY as a secret environment variable in your Next.js deployment. Never expose it client-side.
CORS
CORS is handled by go-chi/cors. Configure allowed origins via CORS_ORIGINS.
# Development
CORS_ORIGINS=http://localhost:3000
# Production (single domain)
CORS_ORIGINS=https://app.yourdomain.com
# Production (multiple domains)
CORS_ORIGINS=https://app.yourdomain.com,https://yourdomain.com
Since the Go server is an internal API called server-side by Next.js, CORS is mostly relevant for development. In production, only your Next.js server IP/domain needs access.
Rate Limiting
Rate limiting is provided by go-chi/httprate and is enabled by default.
- Rate limiting is applied per IP address.
- Limits are enforced at the router middleware level.
- Requests exceeding the limit receive
429 Too Many Requests.
Per-API-key rate limiting (planned)
When billing tiers are added, rate limits will be enforced per API key:
| Tier | Limit |
|---|---|
| Free | Limited requests per day, daily checks |
| Pro | Higher limits, hourly checks |
| Team | Highest limits, shared across org |
Redis Caching (planned)
DNS result caching via Redis is on the roadmap. When available, the server will check Redis before querying upstream DNS, storing results with TTL-based expiry.
Planned configuration:
REDIS_URL=redis://localhost:6379
REDIS_TTL=300 # seconds
The cache layer will use go-redis as middleware before DNS resolution. A docker-compose.yml bundling the Go server with Redis will be provided for self-hosting. See self-hosting.md for the planned compose configuration.