initial commit
This commit is contained in:
311
docs/user-guide/configuration/index.md
Normal file
311
docs/user-guide/configuration/index.md
Normal file
@ -0,0 +1,311 @@
|
||||
# Configuration
|
||||
|
||||
Learn how to configure your FastAPI Boilerplate application for different environments and use cases. Everything is configured through environment variables and Python settings classes.
|
||||
|
||||
## What You'll Learn
|
||||
|
||||
- **[Environment Variables](environment-variables.md)** - Configure through `.env` files
|
||||
- **[Settings Classes](settings-classes.md)** - Python-based configuration management
|
||||
- **[Docker Setup](docker-setup.md)** - Container and service configuration
|
||||
- **[Environment-Specific](environment-specific.md)** - Development, staging, and production configs
|
||||
|
||||
## Quick Start
|
||||
|
||||
The boilerplate uses environment variables as the primary configuration method:
|
||||
|
||||
```bash
|
||||
# Copy the example file
|
||||
cp src/.env.example src/.env
|
||||
|
||||
# Edit with your values
|
||||
nano src/.env
|
||||
```
|
||||
|
||||
Essential variables to set:
|
||||
|
||||
```env
|
||||
# Application
|
||||
APP_NAME="My FastAPI App"
|
||||
SECRET_KEY="your-super-secret-key-here"
|
||||
|
||||
# Database
|
||||
POSTGRES_USER="your_user"
|
||||
POSTGRES_PASSWORD="your_password"
|
||||
POSTGRES_DB="your_database"
|
||||
|
||||
# Admin Account
|
||||
ADMIN_EMAIL="admin@example.com"
|
||||
ADMIN_PASSWORD="secure_password"
|
||||
```
|
||||
|
||||
## Configuration Architecture
|
||||
|
||||
The configuration system has three layers:
|
||||
|
||||
```
|
||||
Environment Variables (.env files)
|
||||
↓
|
||||
Settings Classes (Python validation)
|
||||
↓
|
||||
Application Configuration (Runtime)
|
||||
```
|
||||
|
||||
### Layer 1: Environment Variables
|
||||
Primary configuration through `.env` files:
|
||||
```env
|
||||
POSTGRES_USER="myuser"
|
||||
POSTGRES_PASSWORD="mypassword"
|
||||
REDIS_CACHE_HOST="localhost"
|
||||
SECRET_KEY="your-secret-key"
|
||||
```
|
||||
|
||||
### Layer 2: Settings Classes
|
||||
Python classes that validate and structure configuration:
|
||||
```python
|
||||
class PostgresSettings(BaseSettings):
|
||||
POSTGRES_USER: str
|
||||
POSTGRES_PASSWORD: str = Field(min_length=8)
|
||||
POSTGRES_SERVER: str = "localhost"
|
||||
POSTGRES_PORT: int = 5432
|
||||
POSTGRES_DB: str
|
||||
```
|
||||
|
||||
### Layer 3: Application Use
|
||||
Configuration injected throughout the application:
|
||||
```python
|
||||
from app.core.config import settings
|
||||
|
||||
# Use anywhere in your code
|
||||
DATABASE_URL = f"postgresql+asyncpg://{settings.POSTGRES_USER}:{settings.POSTGRES_PASSWORD}@{settings.POSTGRES_SERVER}:{settings.POSTGRES_PORT}/{settings.POSTGRES_DB}"
|
||||
```
|
||||
|
||||
## Key Configuration Areas
|
||||
|
||||
### Security Settings
|
||||
```env
|
||||
SECRET_KEY="your-super-secret-key-here"
|
||||
ALGORITHM="HS256"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=30
|
||||
REFRESH_TOKEN_EXPIRE_DAYS=7
|
||||
```
|
||||
|
||||
### Database Configuration
|
||||
```env
|
||||
POSTGRES_USER="your_user"
|
||||
POSTGRES_PASSWORD="your_password"
|
||||
POSTGRES_SERVER="localhost"
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_DB="your_database"
|
||||
```
|
||||
|
||||
### Redis Services
|
||||
```env
|
||||
# Cache
|
||||
REDIS_CACHE_HOST="localhost"
|
||||
REDIS_CACHE_PORT=6379
|
||||
|
||||
# Background jobs
|
||||
REDIS_QUEUE_HOST="localhost"
|
||||
REDIS_QUEUE_PORT=6379
|
||||
|
||||
# Rate limiting
|
||||
REDIS_RATE_LIMIT_HOST="localhost"
|
||||
REDIS_RATE_LIMIT_PORT=6379
|
||||
```
|
||||
|
||||
### Application Settings
|
||||
```env
|
||||
APP_NAME="Your App Name"
|
||||
APP_VERSION="1.0.0"
|
||||
ENVIRONMENT="local" # local, staging, production
|
||||
DEBUG=true
|
||||
```
|
||||
|
||||
### Rate Limiting
|
||||
```env
|
||||
DEFAULT_RATE_LIMIT_LIMIT=100
|
||||
DEFAULT_RATE_LIMIT_PERIOD=3600 # 1 hour in seconds
|
||||
```
|
||||
|
||||
### Admin User
|
||||
```env
|
||||
ADMIN_NAME="Admin User"
|
||||
ADMIN_EMAIL="admin@example.com"
|
||||
ADMIN_USERNAME="admin"
|
||||
ADMIN_PASSWORD="secure_password"
|
||||
```
|
||||
|
||||
## Environment-Specific Configurations
|
||||
|
||||
### Development
|
||||
```env
|
||||
ENVIRONMENT="local"
|
||||
DEBUG=true
|
||||
POSTGRES_SERVER="localhost"
|
||||
REDIS_CACHE_HOST="localhost"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=60 # Longer for development
|
||||
```
|
||||
|
||||
### Staging
|
||||
```env
|
||||
ENVIRONMENT="staging"
|
||||
DEBUG=false
|
||||
POSTGRES_SERVER="staging-db.example.com"
|
||||
REDIS_CACHE_HOST="staging-redis.example.com"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=30
|
||||
```
|
||||
|
||||
### Production
|
||||
```env
|
||||
ENVIRONMENT="production"
|
||||
DEBUG=false
|
||||
POSTGRES_SERVER="prod-db.example.com"
|
||||
REDIS_CACHE_HOST="prod-redis.example.com"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=15
|
||||
# Use custom ports for security
|
||||
POSTGRES_PORT=5433
|
||||
REDIS_CACHE_PORT=6380
|
||||
```
|
||||
|
||||
## Docker Configuration
|
||||
|
||||
### Basic Setup
|
||||
Docker Compose automatically loads your `.env` file:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
web:
|
||||
env_file:
|
||||
- ./src/.env
|
||||
environment:
|
||||
- DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
|
||||
```
|
||||
|
||||
### Service Overview
|
||||
```yaml
|
||||
services:
|
||||
web: # FastAPI application
|
||||
db: # PostgreSQL database
|
||||
redis: # Redis for caching/queues
|
||||
worker: # Background task worker
|
||||
```
|
||||
|
||||
## Common Configuration Patterns
|
||||
|
||||
### Feature Flags
|
||||
```python
|
||||
# In settings class
|
||||
class FeatureSettings(BaseSettings):
|
||||
ENABLE_CACHING: bool = True
|
||||
ENABLE_ANALYTICS: bool = False
|
||||
ENABLE_BACKGROUND_JOBS: bool = True
|
||||
|
||||
# Use in code
|
||||
if settings.ENABLE_CACHING:
|
||||
cache_result = await get_from_cache(key)
|
||||
```
|
||||
|
||||
### Environment Detection
|
||||
```python
|
||||
@app.get("/docs", include_in_schema=False)
|
||||
async def custom_swagger_ui():
|
||||
if settings.ENVIRONMENT == "production":
|
||||
raise HTTPException(404, "Documentation not available")
|
||||
return get_swagger_ui_html(openapi_url="/openapi.json")
|
||||
```
|
||||
|
||||
### Health Checks
|
||||
```python
|
||||
@app.get("/health")
|
||||
async def health_check():
|
||||
return {
|
||||
"status": "healthy",
|
||||
"environment": settings.ENVIRONMENT,
|
||||
"version": settings.APP_VERSION,
|
||||
"database": await check_database_health(),
|
||||
"redis": await check_redis_health()
|
||||
}
|
||||
```
|
||||
|
||||
## Quick Configuration Tasks
|
||||
|
||||
### Generate Secret Key
|
||||
```bash
|
||||
# Generate a secure secret key
|
||||
openssl rand -hex 32
|
||||
```
|
||||
|
||||
### Test Configuration
|
||||
```python
|
||||
# test_config.py
|
||||
from app.core.config import settings
|
||||
|
||||
print(f"App: {settings.APP_NAME}")
|
||||
print(f"Environment: {settings.ENVIRONMENT}")
|
||||
print(f"Database: {settings.POSTGRES_DB}")
|
||||
```
|
||||
|
||||
### Environment File Templates
|
||||
```bash
|
||||
# Development
|
||||
cp src/.env.example src/.env.development
|
||||
|
||||
# Staging
|
||||
cp src/.env.example src/.env.staging
|
||||
|
||||
# Production
|
||||
cp src/.env.example src/.env.production
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Security
|
||||
- Never commit `.env` files to version control
|
||||
- Use different secret keys for each environment
|
||||
- Disable debug mode in production
|
||||
- Use secure passwords and keys
|
||||
|
||||
### Performance
|
||||
- Configure appropriate connection pool sizes
|
||||
- Set reasonable token expiration times
|
||||
- Use Redis for caching in production
|
||||
- Configure proper rate limits
|
||||
|
||||
### Maintenance
|
||||
- Document all custom environment variables
|
||||
- Use validation in settings classes
|
||||
- Test configurations in staging first
|
||||
- Monitor configuration changes
|
||||
|
||||
### Testing
|
||||
- Use separate test environment variables
|
||||
- Mock external services in tests
|
||||
- Validate configuration on startup
|
||||
- Test with different environment combinations
|
||||
|
||||
## Getting Started
|
||||
|
||||
Follow this path to configure your application:
|
||||
|
||||
### 1. **[Environment Variables](environment-variables.md)** - Start here
|
||||
Learn about all available environment variables, their purposes, and recommended values for different environments.
|
||||
|
||||
### 2. **[Settings Classes](settings-classes.md)** - Validation layer
|
||||
Understand how Python settings classes validate and structure your configuration with type hints and validation rules.
|
||||
|
||||
### 3. **[Docker Setup](docker-setup.md)** - Container configuration
|
||||
Configure Docker Compose services, networking, and environment-specific overrides.
|
||||
|
||||
### 4. **[Environment-Specific](environment-specific.md)** - Deployment configs
|
||||
Set up configuration for development, staging, and production environments with best practices.
|
||||
|
||||
## What's Next
|
||||
|
||||
Each guide provides practical examples and copy-paste configurations:
|
||||
|
||||
1. **[Environment Variables](environment-variables.md)** - Complete reference and examples
|
||||
2. **[Settings Classes](settings-classes.md)** - Custom validation and organization
|
||||
3. **[Docker Setup](docker-setup.md)** - Service configuration and overrides
|
||||
4. **[Environment-Specific](environment-specific.md)** - Production-ready configurations
|
||||
|
||||
The boilerplate provides sensible defaults - just customize what you need!
|
||||
Reference in New Issue
Block a user