gadget/docs/configuration.md
Rob Colbert 8333672683 platform.apiKey becomes platform.gadgetKey
gadget-drone now presents an ApiClient _id value as the Gadget Key,
allowing gadget-code to reference the client, determine the associated
User, and invoke logic on the User's behalf as an authenticated and
authorized client.
2026-05-05 08:12:34 -04:00

423 lines
9.9 KiB
Markdown

# Gadget Configuration Guide
This document describes how to configure the Gadget Code platform using YAML configuration files.
## Overview
Gadget Code uses YAML configuration files stored in standardized locations. This approach provides:
- **Centralized configuration**: All config in one place
- **Environment variable substitution**: Keep secrets in environment variables
- **System-wide or user-specific**: Install config in `~/.config/gadget/` or `/etc/gadget/`
- **No `.env` files**: Clean, validated configuration
## Configuration File Locations
Configuration files are searched in the following order (first match wins):
1. `~/.config/gadget/{app}.yaml` - User-specific configuration
2. `/etc/gadget/{app}.yaml` - System-wide configuration
### Files
- **gadget-code.yaml** - Configuration for the Gadget Code web server
- **gadget-drone.yaml** - Configuration for Gadget Drone worker processes
## Quick Start
### 1. Create Configuration Directory
```bash
mkdir -p ~/.config/gadget
```
### 2. Create Configuration Files
Copy the example configurations below and customize for your environment.
### 3. Set Environment Variables
For sensitive values, use environment variable substitution:
```bash
export DTP_JWT_SECRET="your-jwt-secret-here"
export DTP_USER_PASSWORD_SALT="your-password-salt-here"
export DTP_SESSION_SECRET="your-session-secret-here"
export GADGET_PLATFORM_KEY="your-platform-api-key-here"
```
### 4. Start the Applications
```bash
# Start Gadget Code web server
gadget-code-web
# Start Gadget Drone worker (from a workspace directory)
cd ~/my-gadget-workspace
gadget-drone
```
## gadget-code.yaml Reference
```yaml
# Basic settings
timezone: "America/New_York"
# Site information
site:
company: "Your Company"
companyShort: "YourCo"
name: "Gadget Code"
shortName: "Gadget"
slogan: "Self-hosted Agentic Engineering Platform"
description: "A self-hosted agentic development environment."
domain: "code.example.com"
domainKey: "code"
host: "code.example.com:3443"
# Authentication (REQUIRED)
auth:
jwtSecret: "${DTP_JWT_SECRET}" # Required
passwordSalt: "${DTP_USER_PASSWORD_SALT}" # Required
# Session configuration (REQUIRED)
session:
secret: "${DTP_SESSION_SECRET}" # Required
trustProxy: true
cookie:
secure: true
sameSite: "strict"
# MongoDB configuration
mongodb:
host: "localhost:27017"
database: "gadget-code"
# Redis configuration
redis:
host: "localhost"
port: 6379
password: "${REDIS_PASSWORD}"
keyPrefix: "gcode:"
lazyConnect: false
# HTTPS configuration
https:
enabled: true
address: "localhost"
port: 3443
backlog: 128
keyFile: "/path/to/ssl/key.pem"
crtFile: "/path/to/ssl/cert.pem"
uploadPath: "/tmp/gadget-code"
# Socket.IO configuration
socket:
maxHttpBufferSize: 10485760 # 10MB
# Logging configuration
logging:
console:
enabled: true
file:
enabled: true
path: "~/.local/state/gadget-code/logs" # Supports ~ for home directory
name: "gadget-code"
https:
enabled: true
name: "gadget-code.https.log"
path: "~/.local/state/gadget-code/logs"
format: "combined"
levels:
debug: true
info: true
warn: true
# Email configuration (optional)
email:
enabled: false
smtp:
host: "smtp.example.com"
port: 587
secure: false
from: "Gadget Code <noreply@example.com>"
user: "smtp-user"
password: "${SMTP_PASSWORD}"
pool:
enabled: true
maxConnections: 5
maxMessages: 100
contact:
to: "Support <support@example.com>"
# MinIO/S3 configuration (optional)
minio:
endpoint: "localhost"
port: 9000
useSsl: false
accessKey: "minio-access-key"
secretKey: "${MINIO_SECRET_KEY}"
buckets:
uploads: "gadget-uploads"
images: "gadget-images"
videos: "gadget-videos"
audios: "gadget-audios"
# User settings
user:
signupEnabled: false
```
## gadget-drone.yaml Reference
```yaml
# Basic settings
timezone: "America/New_York"
# Platform connection (REQUIRED)
platform:
baseUrl: "https://code.example.com:3443" # Required
apiKey: "${GADGET_PLATFORM_KEY}" # Required
# Logging configuration
logging:
console:
enabled: true
file:
enabled: true
path: "~/.local/state/gadget-drone/logs"
name: "gadget-drone"
maxWritesPerFile: 10000
maxFiles: 10
levels:
debug: true
info: true
warn: true
```
## Environment Variable Substitution
Use `${VAR_NAME}` syntax to reference environment variables in your YAML config:
```yaml
auth:
jwtSecret: "${DTP_JWT_SECRET}"
passwordSalt: "${DTP_USER_PASSWORD_SALT}"
```
If an environment variable is referenced but not set, the application will fail to start with a clear error message.
## Log File Locations
By default, logs are written to XDG Base Directory spec locations:
- **gadget-code**: `~/.local/state/gadget-code/logs/`
- **gadget-drone**: `~/.local/state/gadget-drone/logs/`
You can override these in your configuration:
```yaml
logging:
file:
path: "/var/log/gadget-code" # System-wide logs
# or
path: "~/.gadget-logs/code" # Custom location in home
```
## Running the Applications
### Development Mode
When developing on the Gadget platform, use `pnpm` commands from the project directory:
```bash
# Start Gadget Code web server
cd /home/rob/projects/gadget/gadget-code
pnpm dev:backend
# Start Gadget Drone worker (from a workspace directory)
cd /home/rob/projects/gadget/gadget-drone
pnpm dev
```
Environment variables can be set inline or in a shell profile:
```bash
# Set required environment variables for gadget-code
export DTP_JWT_SECRET="your-jwt-secret"
export DTP_USER_PASSWORD_SALT="your-password-salt"
export DTP_SESSION_SECRET="your-session-secret"
# Set required environment variables for gadget-drone
export GADGET_PLATFORM_KEY="your-platform-api-key"
```
### Production Mode
For production deployment, the packages would be published to npm and installed globally:
```bash
# Install from npm (when published)
npm install -g gadget-code @gadget/drone
# Run from anywhere
gadget-code-web
gadget-drone
```
### Local Development with Global Commands
To test the global installation locally during development:
```bash
# From the monorepo root
cd /home/rob/projects/gadget
# Build all packages
pnpm -r build
# Link packages globally (creates symlinks)
cd gadget-code && pnpm link --global
cd ../gadget-drone && pnpm link --global
# Now you can run from anywhere
gadget-code-web
gadget-drone
```
**Note**: When using `pnpm link`, the binaries will reference the source code in your development directory. For a true production test, you would publish to npm or use `npm pack` to create tarballs.
### Multiple Drone Instances
You can run multiple `gadget-drone` instances on the same host, each in a different workspace directory:
```bash
# Terminal 1
cd ~/workspace-1
gadget-drone
# Terminal 2
cd ~/workspace-2
gadget-drone
```
Each drone will:
- Have its own unique workspace ID (stored in `.gadget/workspace.json`)
- Register separately with the platform
- Process work orders independently
**Note**: It is illegal to start more than one drone instance in the same directory.
## Migration from .env Files
If you have existing `.env` files, follow these steps:
### 1. Create YAML Configuration
Copy your `.env` values to the appropriate YAML file using the examples above.
### 2. Convert Variable Names
Map your old `.env` variable names to the new YAML structure:
| Old .env Variable | New YAML Path |
| ------------------------ | -------------------- |
| `DTP_JWT_SECRET` | `auth.jwtSecret` |
| `DTP_USER_PASSWORD_SALT` | `auth.passwordSalt` |
| `DTP_SESSION_SECRET` | `session.secret` |
| `DTP_MONGODB_HOST` | `mongodb.host` |
| `DTP_REDIS_HOST` | `redis.host` |
| `GADGET_PLATFORM_URL` | `platform.baseUrl` |
| `GADGET_PLATFORM_KEY` | `platform.gadgetKey` |
### 3. Set Environment Variables
Move sensitive values to environment variables (recommended):
```bash
# Add to your shell profile (~/.bashrc, ~/.zshrc, etc.)
export DTP_JWT_SECRET="your-secret-here"
export DTP_USER_PASSWORD_SALT="your-salt-here"
export DTP_SESSION_SECRET="your-session-secret-here"
export GADGET_PLATFORM_KEY="your-platform-key-here"
```
### 4. Remove .env Files
Once you've verified the YAML configuration works:
```bash
# In gadget-code directory
rm .env
# In gadget-drone directory
rm .env
```
## Troubleshooting
### Configuration Not Found
If you see an error like:
```
Configuration file not found: gadget-code.yaml
```
Make sure you've created the configuration file in one of the supported locations:
```bash
# Check user config
ls -la ~/.config/gadget/
# Check system config
ls -la /etc/gadget/
```
### Environment Variable Not Set
If you see:
```
Environment variable DTP_JWT_SECRET is not set but referenced in config
```
Set the required environment variable:
```bash
export DTP_JWT_SECRET="your-secret-here"
```
Or add it to your shell profile for persistence.
### Invalid YAML Syntax
YAML files must be valid. Common issues:
- **Indentation**: Use spaces, not tabs
- **Quotes**: String values with special characters should be quoted
- **Colons**: Always followed by a space
Validate your YAML:
```bash
# Using Python
python -c "import yaml; yaml.safe_load(open('~/.config/gadget/gadget-code.yaml'))"
# Using Node.js
node -e "console.log(require('js-yaml').load(require('fs').readFileSync('~/.config/gadget/gadget-code.yaml', 'utf8')))"
```
## Security Best Practices
1. **Use environment variables for secrets**: Never store API keys, passwords, or secrets directly in YAML files
2. **Set appropriate file permissions**:
```bash
chmod 600 ~/.config/gadget/gadget-code.yaml
chmod 600 ~/.config/gadget/gadget-drone.yaml
```
3. **Use HTTPS in production**: Always enable HTTPS for the web server
4. **Restrict database access**: Configure MongoDB and Redis to only accept local connections
5. **Rotate secrets regularly**: Update JWT secrets, password salts, and API keys periodically