15 KiB
TankStopp Configuration Documentation
Overview
TankStopp uses Viper for configuration management, providing a flexible and powerful way to configure the application using:
- Configuration files (YAML, JSON, TOML, etc.)
- Environment variables
- Command-line flags (future feature)
- Default values
This system allows for easy deployment across different environments while maintaining security and flexibility.
Configuration Precedence
Configuration values are loaded in the following order (highest to lowest priority):
- Environment variables (highest priority)
- Configuration files
- Default values (lowest priority)
This means environment variables will always override config file values, providing a secure way to override sensitive settings in production.
Configuration File Locations
The application searches for configuration files in the following locations (in order):
- Explicit path: If
TANKSTOPP_CONFIG_PATHenvironment variable is set - Current directory:
./config.yaml - Config subdirectory:
./config/config.yaml - User home directory:
$HOME/.tankstopp/config.yaml - System directory:
/etc/tankstopp/config.yaml
Environment-Specific Configuration
You can use environment-specific configuration files:
config.development.yaml- Development environmentconfig.production.yaml- Production environmentconfig.test.yaml- Test environment
Set the TANKSTOPP_ENV or ENV environment variable to automatically load the appropriate config file.
Supported File Formats
- YAML (recommended):
config.yaml - JSON:
config.json - TOML:
config.toml - Properties:
config.properties
Configuration Structure
Complete Configuration Example
# Server Configuration
server:
host: "localhost"
port: 8081
read_timeout: 30s
write_timeout: 30s
idle_timeout: 120s
shutdown_timeout: 10s
# Database Configuration
database:
path: "fuel_stops.db"
connection_pool:
max_idle_connections: 10
max_open_connections: 100
connection_max_lifetime: "1h"
connection_max_idle_time: "30m"
logging:
level: "warn" # silent, error, warn, info
slow_query_threshold: "200ms"
debug: false
migration:
auto_migrate: true
drop_tables_first: false
create_batch_size: 1000
performance:
prepare_statements: true
disable_foreign_key_check: false
ignore_relationships_when_migrating: false
query_fields: true
dry_run: false
create_in_batches: 100
# Application Settings
app:
name: "TankStopp"
version: "1.0.0"
environment: "development" # development, production, test
debug: true
# Security Settings
security:
session:
timeout: "24h"
cookie_name: "tankstopp_session"
secure_cookies: false
http_only: true
password:
min_length: 8
require_uppercase: true
require_lowercase: true
require_numbers: true
require_special_chars: false
# Logging Configuration
logging:
level: "info" # debug, info, warn, error
format: "text" # text, json
output: "stdout" # stdout, stderr, file
file_path: "logs/tankstopp.log"
rotation:
enabled: false
max_size: "100MB"
max_age: "30d"
max_backups: 5
# External Services
external_services:
overpass_api:
url: "https://overpass-api.de/api/interpreter"
timeout: "30s"
max_retries: 3
search_radius: 5000
# Feature Flags
features:
fuel_station_search: true
vehicle_management: true
statistics_dashboard: true
data_export: true
api_endpoints: true
# Default Values
defaults:
currency: "EUR"
fuel_type: "Super E5"
distance_unit: "km"
volume_unit: "liters"
Environment Variables
All configuration options can be overridden using environment variables with the TANKSTOPP_ prefix:
Format Convention
Convert the YAML path to an environment variable by:
- Adding
TANKSTOPP_prefix - Converting to uppercase
- Replacing dots (.) with underscores (_)
Examples
| YAML Path | Environment Variable |
|---|---|
server.port |
TANKSTOPP_SERVER_PORT |
database.path |
TANKSTOPP_DATABASE_PATH |
database.connection_pool.max_idle_connections |
TANKSTOPP_DATABASE_CONNECTION_POOL_MAX_IDLE_CONNECTIONS |
app.debug |
TANKSTOPP_APP_DEBUG |
security.session.timeout |
TANKSTOPP_SECURITY_SESSION_TIMEOUT |
Legacy Environment Variables
For backward compatibility, these legacy environment variables are still supported:
| Legacy Variable | New Variable | Description |
|---|---|---|
DB_PATH |
TANKSTOPP_DATABASE_PATH |
Database file path |
DB_MAX_IDLE_CONNS |
TANKSTOPP_DATABASE_CONNECTION_POOL_MAX_IDLE_CONNECTIONS |
Max idle connections |
DB_MAX_OPEN_CONNS |
TANKSTOPP_DATABASE_CONNECTION_POOL_MAX_OPEN_CONNECTIONS |
Max open connections |
DB_DEBUG |
TANKSTOPP_DATABASE_LOGGING_DEBUG |
Debug mode |
ENV |
TANKSTOPP_APP_ENVIRONMENT |
Application environment |
Configuration Options Reference
Server Configuration
| Option | Type | Default | Description |
|---|---|---|---|
server.host |
string | "localhost" |
Server bind address |
server.port |
int | 8081 |
Server port |
server.read_timeout |
duration | "30s" |
HTTP read timeout |
server.write_timeout |
duration | "30s" |
HTTP write timeout |
server.idle_timeout |
duration | "120s" |
HTTP idle timeout |
server.shutdown_timeout |
duration | "10s" |
Graceful shutdown timeout |
Database Configuration
| Option | Type | Default | Description |
|---|---|---|---|
database.path |
string | "fuel_stops.db" |
SQLite database file path |
database.connection_pool.max_idle_connections |
int | 10 |
Maximum idle connections |
database.connection_pool.max_open_connections |
int | 100 |
Maximum open connections |
database.connection_pool.connection_max_lifetime |
duration | "1h" |
Connection max lifetime |
database.connection_pool.connection_max_idle_time |
duration | "30m" |
Connection max idle time |
database.logging.level |
string | "warn" |
Log level: silent, error, warn, info |
database.logging.slow_query_threshold |
duration | "200ms" |
Slow query threshold |
database.logging.debug |
bool | false |
Enable debug logging |
database.migration.auto_migrate |
bool | true |
Auto-run migrations |
database.migration.drop_tables_first |
bool | false |
Drop tables before migration |
database.migration.create_batch_size |
int | 1000 |
Batch size for bulk operations |
Application Configuration
| Option | Type | Default | Description |
|---|---|---|---|
app.name |
string | "TankStopp" |
Application name |
app.version |
string | "1.0.0" |
Application version |
app.environment |
string | "development" |
Environment: development, production, test |
app.debug |
bool | true |
Enable debug mode |
Security Configuration
| Option | Type | Default | Description |
|---|---|---|---|
security.session.timeout |
duration | "24h" |
Session timeout |
security.session.cookie_name |
string | "tankstopp_session" |
Session cookie name |
security.session.secure_cookies |
bool | false |
Require HTTPS for cookies |
security.session.http_only |
bool | true |
HTTP-only cookies |
security.password.min_length |
int | 8 |
Minimum password length |
security.password.require_uppercase |
bool | true |
Require uppercase letters |
security.password.require_lowercase |
bool | true |
Require lowercase letters |
security.password.require_numbers |
bool | true |
Require numbers |
security.password.require_special_chars |
bool | false |
Require special characters |
Environment-Specific Configurations
Development Configuration
# config.development.yaml
server:
host: "localhost"
port: 8081
database:
path: "fuel_stops_dev.db"
logging:
level: "info"
debug: true
app:
environment: "development"
debug: true
security:
session:
timeout: "8h"
secure_cookies: false
password:
min_length: 6
require_uppercase: false
require_special_chars: false
logging:
level: "debug"
format: "text"
output: "stdout"
Production Configuration
# config.production.yaml
server:
host: "0.0.0.0"
port: 8080
database:
path: "/var/lib/tankstopp/fuel_stops.db"
logging:
level: "error"
debug: false
migration:
auto_migrate: false
app:
environment: "production"
debug: false
security:
session:
timeout: "24h"
secure_cookies: true
password:
min_length: 12
require_special_chars: true
logging:
level: "info"
format: "json"
output: "file"
file_path: "/var/log/tankstopp/application.log"
rotation:
enabled: true
max_size: "500MB"
max_age: "90d"
Migration from Environment Variables
If you're currently using environment variables only, you can migrate to config files:
Step 1: Create Base Configuration
Create a config.yaml file with your current settings:
server:
port: 8081
database:
path: "fuel_stops.db"
app:
environment: "development"
Step 2: Environment-Specific Overrides
Keep sensitive or environment-specific values as environment variables:
# Production overrides
export TANKSTOPP_DATABASE_PATH="/var/lib/tankstopp/fuel_stops.db"
export TANKSTOPP_APP_ENVIRONMENT="production"
export TANKSTOPP_APP_DEBUG="false"
Step 3: Gradual Migration
You can migrate gradually since environment variables take precedence over config files.
Docker Configuration
Using Configuration Files
# Copy config files
COPY config.production.yaml /app/config.yaml
# Set environment for config selection
ENV TANKSTOPP_ENV=production
Using Environment Variables
# Database configuration
ENV TANKSTOPP_DATABASE_PATH=/var/lib/tankstopp/fuel_stops.db
ENV TANKSTOPP_APP_ENVIRONMENT=production
ENV TANKSTOPP_APP_DEBUG=false
# Server configuration
ENV TANKSTOPP_SERVER_HOST=0.0.0.0
ENV TANKSTOPP_SERVER_PORT=8080
Docker Compose Example
version: '3.8'
services:
tankstopp:
build: .
ports:
- "8080:8080"
environment:
- TANKSTOPP_DATABASE_PATH=/data/fuel_stops.db
- TANKSTOPP_APP_ENVIRONMENT=production
- TANKSTOPP_APP_DEBUG=false
volumes:
- ./data:/data
- ./config.production.yaml:/app/config.yaml
Kubernetes Configuration
ConfigMap Example
apiVersion: v1
kind: ConfigMap
metadata:
name: tankstopp-config
data:
config.yaml: |
server:
host: "0.0.0.0"
port: 8080
database:
path: "/data/fuel_stops.db"
app:
environment: "production"
debug: false
Secret Example
apiVersion: v1
kind: Secret
metadata:
name: tankstopp-secrets
type: Opaque
stringData:
DATABASE_PATH: "/secure/fuel_stops.db"
Validation and Debugging
Configuration Validation
The application validates configuration on startup. Common validation errors:
- Invalid port number: Must be between 1-65535
- Empty database path: Database path cannot be empty
- Invalid environment: Must be development, production, or test
- Invalid log level: Must be debug, info, warn, or error
Debugging Configuration
Enable debug logging to see configuration loading:
export TANKSTOPP_APP_DEBUG=true
export TANKSTOPP_LOGGING_LEVEL=debug
The application will log:
- Which config files were found and loaded
- Which environment variables are being used
- Final merged configuration (without sensitive values)
Testing Configuration
You can test configuration without starting the full application:
# Test with specific config file
TANKSTOPP_CONFIG_PATH=config.production.yaml ./tankstopp --validate-config
# Test with environment variables
TANKSTOPP_APP_DEBUG=true ./tankstopp --validate-config
Security Best Practices
1. File Permissions
Protect configuration files containing sensitive data:
chmod 600 config.production.yaml
chown tankstopp:tankstopp config.production.yaml
2. Environment Variables for Secrets
Use environment variables for sensitive values:
# Don't put secrets in config files
export TANKSTOPP_DATABASE_PATH="/secure/path/fuel_stops.db"
export TANKSTOPP_SECURITY_SESSION_COOKIE_NAME="secure_session_name"
3. Production Settings
Ensure production-safe defaults:
app:
environment: "production"
debug: false
security:
session:
secure_cookies: true
http_only: true
logging:
level: "info" # Don't use debug in production
Troubleshooting
Common Issues
1. Configuration file not found
Warning: Failed to load config file 'config.yaml': Config File "config" Not Found
- Check file exists in search paths
- Verify file permissions
- Check
TANKSTOPP_CONFIG_PATHenvironment variable
2. Invalid YAML syntax
Error reading config file: yaml: line 10: mapping values are not allowed in this context
- Validate YAML syntax using an online validator
- Check indentation (use spaces, not tabs)
- Ensure proper quoting of string values
3. Environment variable not working
Configuration not being overridden by environment variable
- Verify variable name format:
TANKSTOPP_prefix + uppercase + underscores - Check variable is exported:
export TANKSTOPP_SERVER_PORT=8080 - Verify no typos in variable name
4. Database connection issues
Failed to connect to database: unable to open database file
- Check database path exists and is writable
- Verify file permissions
- Ensure directory exists
Getting Help
- Enable debug logging: Set
TANKSTOPP_APP_DEBUG=true - Check configuration loading: Look for config-related log messages
- Validate configuration: Use
--validate-configflag - Test minimal config: Start with basic configuration and add options gradually
Advanced Usage
Custom Configuration Paths
# Use custom config file
export TANKSTOPP_CONFIG_PATH=/etc/myapp/custom-config.yaml
# Use config directory
export TANKSTOPP_CONFIG_PATH=/etc/myapp/
Multiple Configuration Files
You can split configuration across multiple files:
# base.yaml
server:
host: "localhost"
database:
path: "fuel_stops.db"
# security.yaml
security:
session:
timeout: "24h"
Configuration Templating
Use environment variable substitution in config files:
database:
path: "${DATABASE_PATH:-fuel_stops.db}"
server:
port: ${PORT:-8081}
This documentation provides comprehensive coverage of the TankStopp configuration system. For additional questions or advanced use cases, refer to the Viper documentation or check the application source code.