554 lines
11 KiB
Markdown
554 lines
11 KiB
Markdown
# Configuration Troubleshooting Guide
|
|
|
|
This guide helps you troubleshoot common configuration issues with Attune.
|
|
|
|
## Quick Diagnostics
|
|
|
|
### Check Configuration is Valid
|
|
|
|
```bash
|
|
# Test configuration loading
|
|
cargo run --bin attune-api -- --help
|
|
|
|
# Enable debug logging to see config details
|
|
ATTUNE__LOG__LEVEL=debug cargo run --bin attune-api
|
|
```
|
|
|
|
### Verify Configuration Files Exist
|
|
|
|
```bash
|
|
# Check for config files
|
|
ls -la config*.yaml
|
|
|
|
# View current configuration
|
|
cat config.yaml
|
|
```
|
|
|
|
### Test Environment Variables
|
|
|
|
```bash
|
|
# List all Attune environment variables
|
|
env | grep ATTUNE
|
|
|
|
# Test a specific variable
|
|
echo $ATTUNE__DATABASE__URL
|
|
```
|
|
|
|
## Common Issues
|
|
|
|
### 1. Encryption Key Must Be At Least 32 Characters
|
|
|
|
**Error:**
|
|
```
|
|
Error: Validation error: Encryption key must be at least 32 characters
|
|
```
|
|
|
|
**Cause:** The `encryption_key` in your configuration is less than 32 characters.
|
|
|
|
**Solution:**
|
|
|
|
Generate a proper encryption key:
|
|
```bash
|
|
# Generate a 32-byte key (base64 encoded = ~44 characters)
|
|
openssl rand -base64 32
|
|
|
|
# Example output:
|
|
# R3mHJ8qP5xK2nB9vW7tY4uZ1aE6cF0dG8hI2jK4lM5n=
|
|
```
|
|
|
|
Update your configuration:
|
|
```yaml
|
|
security:
|
|
encryption_key: R3mHJ8qP5xK2nB9vW7tY4uZ1aE6cF0dG8hI2jK4lM5n=
|
|
```
|
|
|
|
Or use an environment variable:
|
|
```bash
|
|
export ATTUNE__SECURITY__ENCRYPTION_KEY=$(openssl rand -base64 32)
|
|
```
|
|
|
|
**Note:** The key must be **at least 32 characters** after base64 decoding. A 32-byte random value base64-encoded is typically 44 characters.
|
|
|
|
### 2. JWT Secret Required
|
|
|
|
**Error:**
|
|
```
|
|
Error: Validation error: JWT secret is required when authentication is enabled
|
|
```
|
|
|
|
**Cause:** Authentication is enabled but no JWT secret is configured.
|
|
|
|
**Solution Option 1 - Provide a JWT secret:**
|
|
```yaml
|
|
security:
|
|
jwt_secret: your-secret-here
|
|
enable_auth: true
|
|
```
|
|
|
|
Generate a secure secret:
|
|
```bash
|
|
openssl rand -base64 64
|
|
```
|
|
|
|
**Solution Option 2 - Disable authentication (dev only):**
|
|
```yaml
|
|
security:
|
|
enable_auth: false
|
|
```
|
|
|
|
### 3. Configuration File Not Found
|
|
|
|
**Error:**
|
|
```
|
|
Error: Configuration error: ...
|
|
```
|
|
|
|
**Cause:** The application can't find `config.yaml`.
|
|
|
|
**Solution:**
|
|
|
|
Check if the file exists:
|
|
```bash
|
|
ls -la config.yaml
|
|
```
|
|
|
|
If missing, create it from the example:
|
|
```bash
|
|
cp config.example.yaml config.yaml
|
|
nano config.yaml
|
|
```
|
|
|
|
Or specify a custom path:
|
|
```bash
|
|
export ATTUNE_CONFIG=/path/to/config.yaml
|
|
cargo run --bin attune-api
|
|
```
|
|
|
|
### 4. Database Connection Failed
|
|
|
|
**Error:**
|
|
```
|
|
Error: Database error: connection refused
|
|
Error: Database error: password authentication failed
|
|
```
|
|
|
|
**Cause:** Cannot connect to PostgreSQL database.
|
|
|
|
**Solution:**
|
|
|
|
1. **Verify PostgreSQL is running:**
|
|
```bash
|
|
pg_isready -h localhost -p 5432
|
|
```
|
|
|
|
2. **Check connection string:**
|
|
```yaml
|
|
database:
|
|
url: postgresql://username:password@host:port/database
|
|
```
|
|
|
|
3. **Test connection manually:**
|
|
```bash
|
|
psql postgresql://postgres:postgres@localhost:5432/attune
|
|
```
|
|
|
|
4. **Verify database exists:**
|
|
```bash
|
|
psql -U postgres -c "SELECT datname FROM pg_database WHERE datname='attune';"
|
|
```
|
|
|
|
5. **Create database if needed:**
|
|
```bash
|
|
createdb -U postgres attune
|
|
```
|
|
|
|
### 5. Invalid Log Level
|
|
|
|
**Error:**
|
|
```
|
|
Error: Invalid log level: TRACE. Must be one of: ["trace", "debug", "info", "warn", "error"]
|
|
```
|
|
|
|
**Cause:** Log level must be lowercase.
|
|
|
|
**Solution:**
|
|
```yaml
|
|
log:
|
|
level: debug # Use lowercase
|
|
```
|
|
|
|
Not:
|
|
```yaml
|
|
log:
|
|
level: DEBUG # Wrong - uppercase not allowed
|
|
```
|
|
|
|
### 6. YAML Syntax Error
|
|
|
|
**Error:**
|
|
```
|
|
Error: Configuration error: invalid type: string "true", expected a boolean
|
|
Error: while parsing a block mapping
|
|
```
|
|
|
|
**Cause:** Invalid YAML syntax.
|
|
|
|
**Common mistakes:**
|
|
|
|
**Wrong - Quotes around boolean:**
|
|
```yaml
|
|
enable_auth: "true" # This is a string, not a boolean
|
|
```
|
|
|
|
**Correct:**
|
|
```yaml
|
|
enable_auth: true
|
|
```
|
|
|
|
**Wrong - Mixed spaces and tabs:**
|
|
```yaml
|
|
database:
|
|
url: postgresql://... # Tab used for indentation
|
|
```
|
|
|
|
**Correct - Use spaces only:**
|
|
```yaml
|
|
database:
|
|
url: postgresql://... # 2 spaces
|
|
```
|
|
|
|
**Wrong - Missing space after colon:**
|
|
```yaml
|
|
level:debug # No space after colon
|
|
```
|
|
|
|
**Correct:**
|
|
```yaml
|
|
level: debug # Space after colon
|
|
```
|
|
|
|
**Validate YAML syntax:**
|
|
```bash
|
|
# Using Python
|
|
python3 -c "import yaml; yaml.safe_load(open('config.yaml'))"
|
|
|
|
# Using yq
|
|
yq eval config.yaml
|
|
|
|
# Using Ruby
|
|
ruby -ryaml -e "YAML.load_file('config.yaml')"
|
|
```
|
|
|
|
### 7. Environment Variable Not Working
|
|
|
|
**Error:** Configuration value not being overridden by environment variable.
|
|
|
|
**Cause:** Incorrect environment variable format.
|
|
|
|
**Correct format:**
|
|
```bash
|
|
ATTUNE__SECTION__KEY=value
|
|
```
|
|
|
|
**Common mistakes:**
|
|
|
|
**Wrong - Single underscore:**
|
|
```bash
|
|
ATTUNE_DATABASE_URL=... # Wrong
|
|
```
|
|
|
|
**Correct - Double underscore:**
|
|
```bash
|
|
ATTUNE__DATABASE__URL=... # Correct
|
|
```
|
|
|
|
**Wrong - Missing ATTUNE prefix:**
|
|
```bash
|
|
DATABASE__URL=... # Wrong
|
|
```
|
|
|
|
**Correct - With ATTUNE prefix:**
|
|
```bash
|
|
ATTUNE__DATABASE__URL=... # Correct
|
|
```
|
|
|
|
**Wrong - Incorrect case:**
|
|
```bash
|
|
attune__database__url=... # Wrong (lowercase prefix)
|
|
```
|
|
|
|
**Correct - ATTUNE in uppercase:**
|
|
```bash
|
|
ATTUNE__DATABASE__URL=... # Correct
|
|
```
|
|
|
|
**For arrays (comma-separated):**
|
|
```bash
|
|
ATTUNE__SERVER__CORS_ORIGINS="http://localhost:3000,http://localhost:5173"
|
|
```
|
|
|
|
### 8. Port Already in Use
|
|
|
|
**Error:**
|
|
```
|
|
Error: Address already in use (os error 98)
|
|
```
|
|
|
|
**Cause:** Another process is using port 8080.
|
|
|
|
**Solution:**
|
|
|
|
1. **Find the process:**
|
|
```bash
|
|
lsof -i :8080
|
|
# Or
|
|
netstat -tulpn | grep 8080
|
|
```
|
|
|
|
2. **Kill the process:**
|
|
```bash
|
|
kill <PID>
|
|
```
|
|
|
|
3. **Or change the port:**
|
|
```yaml
|
|
server:
|
|
port: 8081
|
|
```
|
|
|
|
Or with environment variable:
|
|
```bash
|
|
ATTUNE__SERVER__PORT=8081 cargo run --bin attune-api
|
|
```
|
|
|
|
### 9. CORS Issues
|
|
|
|
**Error in browser console:**
|
|
```
|
|
Access to fetch at 'http://localhost:8080/api/v1/...' from origin 'http://localhost:3000'
|
|
has been blocked by CORS policy
|
|
```
|
|
|
|
**Cause:** Frontend origin not in allowed CORS origins.
|
|
|
|
**Solution:**
|
|
|
|
Add your frontend URL to CORS origins:
|
|
```yaml
|
|
server:
|
|
cors_origins:
|
|
- http://localhost:3000
|
|
- http://localhost:5173 # Vite default
|
|
```
|
|
|
|
Or use environment variable:
|
|
```bash
|
|
export ATTUNE__SERVER__CORS_ORIGINS="http://localhost:3000,http://localhost:5173"
|
|
```
|
|
|
|
### 10. Configuration Changes Not Taking Effect
|
|
|
|
**Cause:** Cached binary or incorrect environment.
|
|
|
|
**Solution:**
|
|
|
|
1. **Rebuild the application:**
|
|
```bash
|
|
cargo clean
|
|
cargo build --bin attune-api
|
|
```
|
|
|
|
2. **Check which config file is being loaded:**
|
|
```bash
|
|
ATTUNE__LOG__LEVEL=debug cargo run --bin attune-api 2>&1 | grep -i config
|
|
```
|
|
|
|
3. **Verify environment:**
|
|
```bash
|
|
env | grep ATTUNE
|
|
```
|
|
|
|
4. **Use explicit config file:**
|
|
```bash
|
|
ATTUNE_CONFIG=./config.development.yaml cargo run --bin attune-api
|
|
```
|
|
|
|
## Advanced Diagnostics
|
|
|
|
### Debug Configuration Loading
|
|
|
|
Enable debug logging to see configuration details:
|
|
|
|
```bash
|
|
ATTUNE__LOG__LEVEL=debug cargo run --bin attune-api 2>&1 | tee debug.log
|
|
```
|
|
|
|
Look for lines containing:
|
|
- "Configuration loaded"
|
|
- "Environment:"
|
|
- "Loaded configuration from"
|
|
|
|
### Verify Configuration Merging
|
|
|
|
Test the configuration priority:
|
|
|
|
1. **Base config only:**
|
|
```bash
|
|
cargo run --bin attune-api
|
|
```
|
|
|
|
2. **With environment-specific config:**
|
|
```bash
|
|
ATTUNE__ENVIRONMENT=development cargo run --bin attune-api
|
|
```
|
|
|
|
3. **With environment variable override:**
|
|
```bash
|
|
ATTUNE__SERVER__PORT=9999 cargo run --bin attune-api
|
|
```
|
|
|
|
### Check Database Connection
|
|
|
|
Test database connectivity separately:
|
|
|
|
```bash
|
|
# Using psql
|
|
psql -U postgres -h localhost -d attune -c "SELECT version();"
|
|
|
|
# Using sqlx-cli
|
|
sqlx database create --database-url postgresql://postgres:postgres@localhost/attune
|
|
sqlx migrate run --database-url postgresql://postgres:postgres@localhost/attune
|
|
```
|
|
|
|
### Validate All Configuration Values
|
|
|
|
```bash
|
|
# Dump configuration (be careful - may contain secrets!)
|
|
ATTUNE__LOG__LEVEL=debug cargo run --bin attune-api 2>&1 | grep -A 50 "Configuration loaded"
|
|
```
|
|
|
|
## Security Checklist
|
|
|
|
When troubleshooting, ensure:
|
|
|
|
- [ ] Secrets are not logged or displayed
|
|
- [ ] Configuration files with secrets are in `.gitignore`
|
|
- [ ] Production secrets use environment variables
|
|
- [ ] File permissions are restrictive (`chmod 600 config.yaml`)
|
|
- [ ] JWT secrets are cryptographically strong (64+ bytes)
|
|
- [ ] Encryption keys are at least 32 characters
|
|
|
|
## Getting More Help
|
|
|
|
### Enable Verbose Logging
|
|
|
|
```bash
|
|
RUST_LOG=debug,attune_common=trace cargo run --bin attune-api
|
|
```
|
|
|
|
### Check Application Logs
|
|
|
|
```bash
|
|
# If logging to file
|
|
tail -f /var/log/attune/attune.log
|
|
|
|
# With pretty formatting
|
|
ATTUNE__LOG__FORMAT=pretty cargo run --bin attune-api
|
|
```
|
|
|
|
### Validate Configuration Programmatically
|
|
|
|
Create a test file `check_config.rs`:
|
|
|
|
```rust
|
|
use attune_common::config::Config;
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
let config = Config::load()?;
|
|
config.validate()?;
|
|
println!("✓ Configuration is valid");
|
|
println!("Environment: {}", config.environment);
|
|
println!("Database URL: {}", config.database.url);
|
|
println!("Server: {}:{}", config.server.host, config.server.port);
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
Run it:
|
|
```bash
|
|
cargo run --bin check_config
|
|
```
|
|
|
|
## Reference
|
|
|
|
- [Configuration Guide](configuration.md) - Complete reference
|
|
- [Migration Guide](env-to-yaml-migration.md) - Migrating from .env
|
|
- [Quick Start](quick-start.md) - Getting started
|
|
- [CONFIG_README.md](../CONFIG_README.md) - Quick reference
|
|
|
|
## Common Configuration Patterns
|
|
|
|
### Development Setup
|
|
|
|
```yaml
|
|
environment: development
|
|
database:
|
|
url: postgresql://postgres:postgres@localhost:5432/attune
|
|
log_statements: true
|
|
server:
|
|
host: 127.0.0.1
|
|
port: 8080
|
|
log:
|
|
level: debug
|
|
format: pretty
|
|
security:
|
|
jwt_secret: dev-secret-change-in-production
|
|
encryption_key: dev-key-at-least-32-characters-long
|
|
enable_auth: true
|
|
```
|
|
|
|
### Production Setup
|
|
|
|
```yaml
|
|
environment: production
|
|
database:
|
|
url: postgresql://user:pass@db.example.com/attune
|
|
max_connections: 100
|
|
server:
|
|
host: 0.0.0.0
|
|
cors_origins:
|
|
- https://app.example.com
|
|
log:
|
|
level: info
|
|
format: json
|
|
file: /var/log/attune/attune.log
|
|
```
|
|
|
|
With environment variables:
|
|
```bash
|
|
export ATTUNE__SECURITY__JWT_SECRET=$(cat /run/secrets/jwt_secret)
|
|
export ATTUNE__SECURITY__ENCRYPTION_KEY=$(cat /run/secrets/encryption_key)
|
|
```
|
|
|
|
### Testing Setup
|
|
|
|
```yaml
|
|
environment: test
|
|
database:
|
|
url: postgresql://postgres:postgres@localhost:5432/attune_test
|
|
server:
|
|
port: 0 # Random port
|
|
log:
|
|
level: warn
|
|
security:
|
|
jwt_secret: test-secret-not-secure
|
|
encryption_key: test-key-at-least-32-characters-long
|
|
```
|
|
|
|
---
|
|
|
|
If you continue to experience issues, please check the [GitHub Issues](https://github.com/yourusername/attune/issues) or open a new issue with:
|
|
1. Error message
|
|
2. Your configuration (with secrets redacted)
|
|
3. Output of `cargo --version` and `rustc --version`
|
|
4. Operating system and PostgreSQL version |