# 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"]