Rustelo/config/examples/full-featured.toml

585 lines
13 KiB
TOML
Raw Permalink Normal View History

2025-07-07 23:13:01 +01:00
# Full-Featured Configuration Example
# This configuration demonstrates all available features and settings
# Use this as a reference for comprehensive deployments
[server]
protocol = "https"
host = "0.0.0.0"
port = 443
environment = "production"
log_level = "info"
[server.tls]
cert_path = "certs/server.crt"
key_path = "certs/server.key"
[app]
name = "Rustelo-full-featured"
version = "0.1.0"
debug = false
enable_metrics = true
enable_health_check = true
enable_compression = true
max_request_size = 52428800 # 50MB
[database]
url = "postgresql://rustelo:secure_password@localhost:5432/rustelo_full"
max_connections = 25
min_connections = 5
connect_timeout = 30
idle_timeout = 600
max_lifetime = 1800
[database.migrations]
auto_migrate = true
migration_dir = "migrations"
create_db_if_missing = true
[database.health]
enable_ping = true
ping_timeout = 5
max_retries = 3
[database.logging]
log_queries = false
log_slow_queries = true
slow_query_threshold = 500 # milliseconds
[session]
secret = "@encrypted_session_secret"
cookie_name = "rustelo_session"
cookie_secure = true
cookie_http_only = true
cookie_same_site = "strict"
max_age = 7200 # 2 hours
[security]
enable_csrf = true
csrf_token_name = "csrf_token"
rate_limit_requests = 1000
rate_limit_window = 60
bcrypt_cost = 14
[cors]
allowed_origins = ["https://yourdomain.com", "https://api.yourdomain.com", "https://admin.yourdomain.com"]
allowed_methods = ["GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"]
allowed_headers = ["Content-Type", "Authorization", "X-Requested-With", "X-API-Key"]
allow_credentials = true
max_age = 86400
[static]
assets_dir = "public"
site_root = "target/site"
site_pkg_dir = "pkg"
[server_dirs]
public_dir = "public"
uploads_dir = "uploads"
logs_dir = "logs"
temp_dir = "tmp"
cache_dir = "cache"
config_dir = "config"
data_dir = "data"
backup_dir = "backups"
[logging]
format = "json"
level = "info"
file_path = "logs/full_app.log"
max_file_size = 52428800 # 50MB
max_files = 10
enable_console = false
enable_file = true
# Authentication Configuration
[auth]
enabled = true
[auth.jwt]
secret = "@encrypted_jwt_secret"
expiration = 86400 # 24 hours
refresh_token_expiration = 604800 # 7 days
algorithm = "HS256"
issuer = "rustelo-full"
audience = "rustelo-users"
[auth.password]
min_length = 12
require_uppercase = true
require_lowercase = true
require_numbers = true
require_special_chars = true
max_age_days = 90
history_count = 12
[auth.security]
max_login_attempts = 3
lockout_duration = 1800 # 30 minutes
session_timeout = 7200 # 2 hours
require_email_verification = true
password_reset_timeout = 3600 # 1 hour
[auth.two_factor]
enabled = true
backup_codes_count = 10
totp_issuer = "Rustelo Full Featured"
totp_digits = 6
totp_period = 30
[auth.registration]
enabled = true
require_email_verification = true
auto_approve = false
default_role = "user"
allowed_domains = ["yourdomain.com", "trusted-partner.com"]
[auth.sessions]
cleanup_interval = 1800 # 30 minutes
max_concurrent_sessions = 3
remember_me_duration = 2592000 # 30 days
[auth.rate_limiting]
login_attempts_per_minute = 3
registration_attempts_per_hour = 2
password_reset_attempts_per_hour = 2
# OAuth Configuration
[oauth]
enabled = true
[oauth.google]
client_id = "@encrypted_google_client_id"
client_secret = "@encrypted_google_client_secret"
redirect_uri = "https://yourdomain.com/auth/google/callback"
[oauth.github]
client_id = "@encrypted_github_client_id"
client_secret = "@encrypted_github_client_secret"
redirect_uri = "https://yourdomain.com/auth/github/callback"
# Email Configuration
[email]
enabled = true
from_email = "noreply@yourdomain.com"
from_name = "Rustelo Full Featured"
reply_to = "support@yourdomain.com"
default_provider = "smtp"
[email.smtp]
host = "smtp.yourdomain.com"
port = 587
username = "@encrypted_smtp_username"
password = "@encrypted_smtp_password"
use_tls = true
use_starttls = true
timeout = 30
pool_size = 10
[email.templates]
template_dir = "templates/email"
default_language = "en"
supported_languages = ["en", "es", "fr", "de", "ja"]
cache_templates = true
reload_on_change = false
[email.queue]
enabled = true
max_retry_attempts = 5
retry_delay = 120 # seconds
batch_size = 25
processing_interval = 15 # seconds
[email.rate_limiting]
max_emails_per_minute = 100
max_emails_per_hour = 5000
max_emails_per_day = 50000
burst_limit = 50
[email.validation]
check_mx_records = true
check_disposable_domains = true
allowed_domains = []
blocked_domains = ["tempmail.org", "10minutemail.com", "guerrillamail.com"]
[email.bounce_handling]
enabled = true
webhook_url = "/webhooks/email/bounce"
webhook_secret = "@encrypted_email_webhook_secret"
max_bounce_rate = 0.02 # 2%
auto_suppress_bounces = true
[email.security]
enable_dkim = true
dkim_selector = "default"
dkim_private_key_path = "certs/dkim_private.key"
enable_spf = true
enable_dmarc = true
# Content Management Configuration
[content]
enabled = true
content_dir = "content"
cache_enabled = true
cache_ttl = 7200 # 2 hours
max_file_size = 10485760 # 10MB
auto_save_interval = 30 # seconds
enable_versioning = true
max_versions = 25
[content.types.article]
enabled = true
template = "article.hbs"
slug_prefix = "articles"
allow_comments = true
enable_seo = true
max_length = 100000
[content.types.page]
enabled = true
template = "page.hbs"
slug_prefix = "pages"
allow_comments = false
enable_seo = true
max_length = 200000
[content.types.blog_post]
enabled = true
template = "blog_post.hbs"
slug_prefix = "blog"
allow_comments = true
enable_seo = true
max_length = 50000
enable_series = true
[content.markdown]
enable_syntax_highlighting = true
theme = "github"
enable_tables = true
enable_strikethrough = true
enable_autolinks = true
enable_task_lists = true
enable_footnotes = true
enable_math = true
heading_anchors = true
code_block_line_numbers = true
[content.seo]
auto_generate_meta = true
default_meta_description_length = 160
auto_generate_og_tags = true
enable_json_ld = true
sitemap_enabled = true
sitemap_path = "/sitemap.xml"
robots_txt_enabled = true
[content.publishing]
auto_publish = false
require_review = true
enable_drafts = true
enable_scheduling = true
default_status = "draft"
[content.taxonomy]
enable_categories = true
max_categories_per_content = 10
enable_tags = true
max_tags_per_content = 50
enable_hierarchical_categories = true
[content.media]
enabled = true
upload_dir = "uploads/content"
allowed_extensions = ["jpg", "jpeg", "png", "gif", "webp", "svg", "pdf", "doc", "docx", "mp4", "webm"]
max_file_size = 52428800 # 50MB
enable_image_optimization = true
generate_thumbnails = true
thumbnail_sizes = [150, 300, 600, 1200, 1920]
[content.media.images]
auto_optimize = true
quality = 90
progressive_jpeg = true
strip_metadata = true
enable_webp_conversion = true
enable_lazy_loading = true
[content.search]
enabled = true
search_engine = "database"
index_content = true
index_metadata = true
search_fields = ["title", "content", "excerpt", "tags", "categories", "author"]
min_search_length = 2
max_results = 100
[content.search.fulltext]
enable_stemming = true
enable_fuzzy_search = true
fuzzy_distance = 2
boost_title = 3.0
boost_tags = 2.0
boost_categories = 1.5
[content.cache]
enable_redis = true
redis_url = "redis://localhost:6379/1"
redis_prefix = "content:"
cache_rendered_content = true
cache_search_results = true
search_cache_ttl = 600 # 10 minutes
[content.api]
enabled = true
enable_public_api = true
enable_admin_api = true
api_prefix = "/api/content"
rate_limit_per_minute = 200
require_auth_for_write = true
enable_bulk_operations = true
[content.backup]
enabled = true
backup_interval = 43200 # 12 hours
backup_retention_days = 90
backup_dir = "backups/content"
include_media = true
compress_backups = true
[content.workflows]
enabled = true
require_approval = true
approval_roles = ["editor", "admin"]
notification_on_submission = true
notification_on_approval = true
auto_notify_authors = true
[content.comments]
enabled = true
require_approval = true
enable_replies = true
max_nesting_level = 5
enable_voting = true
enable_email_notifications = true
anti_spam_enabled = true
[content.analytics]
track_views = true
track_reading_time = true
track_popular_content = true
analytics_retention_days = 365
enable_heatmaps = true
[content.feeds]
enabled = true
rss_enabled = true
atom_enabled = true
feed_title = "Rustelo Full Featured Content"
feed_description = "Latest content from our full-featured Rustelo application"
max_items = 50
include_full_content = true
[content.security]
enable_content_sanitization = true
allowed_html_tags = ["p", "br", "strong", "em", "ul", "ol", "li", "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "code", "pre", "a", "img", "table", "thead", "tbody", "tr", "th", "td"]
enable_xss_protection = true
enable_csrf_protection = true
max_content_length = 5000000 # 5MB
[content.i18n]
enabled = true
default_language = "en"
supported_languages = ["en", "es", "fr", "de", "ja", "zh"]
fallback_to_default = true
auto_detect_language = true
[content.performance]
enable_lazy_loading = true
enable_pagination = true
default_page_size = 25
max_page_size = 100
enable_content_compression = true
minify_html = true
# Metrics Configuration
[metrics]
enabled = true
endpoint = "/metrics"
health_endpoint = "/metrics/health"
collection_interval = 30 # seconds
enable_process_metrics = true
enable_runtime_metrics = true
[metrics.prometheus]
namespace = "rustelo_full"
subsystem = ""
registry_type = "default"
enable_exemplars = true
histogram_buckets = [0.0005, 0.001, 0.0025, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
[metrics.http]
enabled = true
track_request_count = true
track_request_duration = true
track_requests_in_flight = true
track_response_size = true
track_request_size = true
include_user_agent = false
include_ip_address = false
slow_request_threshold = 0.5 # seconds
[metrics.database]
enabled = true
track_connection_pool = true
track_query_duration = true
track_query_count = true
track_connection_errors = true
track_migration_status = true
slow_query_threshold = 0.05 # seconds
include_query_tags = false
[metrics.auth]
enabled = true
track_login_attempts = true
track_login_failures = true
track_session_duration = true
track_active_sessions = true
track_token_generations = true
track_password_resets = true
track_registration_attempts = true
include_failure_reasons = true
[metrics.content]
enabled = true
track_content_requests = true
track_cache_performance = true
track_content_processing_time = true
track_search_queries = true
track_content_views = true
track_popular_content = true
[metrics.email]
enabled = true
track_emails_sent = true
track_email_failures = true
track_queue_size = true
track_processing_time = true
track_bounce_rate = true
track_delivery_rate = true
include_provider_metrics = true
[metrics.system]
enabled = true
track_memory_usage = true
track_cpu_usage = true
track_disk_usage = true
track_network_io = true
track_file_descriptors = true
track_uptime = true
collection_interval = 15 # seconds
[metrics.business]
enabled = true
track_user_registrations = true
track_user_logins = true
track_content_creation = true
track_api_usage = true
track_feature_usage = true
track_error_rates = true
track_conversion_metrics = true
[metrics.custom]
enabled = true
allow_custom_counters = true
allow_custom_gauges = true
allow_custom_histograms = true
max_custom_metrics = 500
custom_metric_prefix = "custom_"
[metrics.labels]
include_environment = true
include_version = true
include_instance_id = true
include_hostname = true
custom_labels = {datacenter = "us-west-1", team = "platform"}
[metrics.security]
enable_authentication = true
allowed_ips = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]
api_key_header = "X-Metrics-API-Key"
api_key = "@encrypted_metrics_api_key"
# TLS Configuration
[tls]
enabled = true
port = 443
bind_address = "0.0.0.0"
protocols = ["TLSv1.2", "TLSv1.3"]
prefer_server_cipher_order = true
enable_http2 = true
enable_ocsp_stapling = true
[tls.certificates]
cert_path = "certs/production.crt"
key_path = "certs/production.key"
chain_path = "certs/chain.pem"
verify_client_certs = false
[tls.letsencrypt]
enabled = true
email = "admin@yourdomain.com"
domains = ["yourdomain.com", "www.yourdomain.com", "api.yourdomain.com"]
acme_server = "https://acme-v02.api.letsencrypt.org/directory"
challenge_type = "http-01"
cert_path = "certs/letsencrypt"
auto_renew = true
renew_days_before = 30
[tls.monitoring]
check_expiry = true
expiry_warning_days = 30
expiry_critical_days = 7
notify_on_expiry = true
health_check_enabled = true
[tls.ciphers]
allowed_ciphers = [
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256",
"TLS_AES_128_GCM_SHA256",
"ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-RSA-CHACHA20-POLY1305",
"ECDHE-RSA-AES128-GCM-SHA256"
]
allow_legacy_ciphers = false
[tls.hsts]
enabled = true
max_age = 31536000 # 1 year
include_subdomains = true
preload = true
[tls.redirect]
enable_http_redirect = true
redirect_port = 80
permanent_redirect = true
redirect_status_code = 301
# Redis Configuration
[redis]
enabled = true
url = "redis://localhost:6379/0"
pool_size = 20
connection_timeout = 10
command_timeout = 10
# Feature Flags
[features]
auth = true
tls = true
content_db = true
two_factor_auth = true
# Build Configuration
[build]
features = ["auth", "content-db", "crypto", "email", "metrics", "tls"]