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.
423 lines
9.9 KiB
Markdown
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
|