- Add complete dark mode system with theme context and toggle - Implement dark mode toggle component in navigation menu - Add client-side routing with SSR-safe signal handling - Fix language selector styling for better dark mode compatibility - Add documentation system with mdBook integration - Improve navigation menu with proper external/internal link handling - Add comprehensive project documentation and configuration - Enhance theme system with localStorage persistence - Fix arena panic issues during server-side rendering - Add proper TypeScript configuration and build optimizations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
9.4 KiB
9.4 KiB
ROOT_PATH Implementation Summary
Overview
This document summarizes the comprehensive ROOT_PATH configuration system that has been implemented to replace hardcoded relative paths (../..) with a flexible, deployment-friendly path resolution system.
✅ What Was Implemented
1. Core Configuration System
- Added
root_pathfield to theConfigstruct with automatic default handling - Implemented
ROOT_PATHenvironment variable support with override capability - Created path resolution methods that convert relative paths to absolute paths
- Added proper validation to ensure the root path exists
2. Path Resolution Engine
resolve_paths(): Converts all relative paths in config to absolute pathsresolve_path(): Helper method for individual path resolutionget_absolute_path(): Public API for runtime path resolution- Supports all path types: relative, absolute, current directory (
./), parent directory (../)
3. Configuration Coverage
All relative paths in the configuration are now resolved against ROOT_PATH:
# Before (relative paths)
[static]
assets_dir = "public"
site_root = "target/site"
[server_dirs]
public_dir = "public"
uploads_dir = "uploads"
logs_dir = "logs"
# After (automatically resolved to absolute paths)
# If ROOT_PATH=/app, these become:
# assets_dir = "/app/public"
# site_root = "/app/target/site"
# public_dir = "/app/public"
# uploads_dir = "/app/uploads"
# logs_dir = "/app/logs"
4. Hardcoded Path Elimination
- config_tool.rs: Removed
../../../config.tomlhardcoded paths - shared/lib.rs: Added dynamic content loading with fallback mechanisms
- All config files: Added ROOT_PATH settings with proper documentation
5. Enhanced Environment Variable Support
Added comprehensive environment variable support:
# Path Configuration
ROOT_PATH=/app
CONFIG_FILE=/custom/config.toml
# Server Configuration
SERVER_PROTOCOL=https
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
ENVIRONMENT=production
# Database & Authentication
DATABASE_URL=postgresql://...
SESSION_SECRET=your-secret-key
JWT_SECRET=your-jwt-secret
# OAuth Integration
GOOGLE_CLIENT_ID=your-google-id
GOOGLE_CLIENT_SECRET=your-google-secret
GITHUB_CLIENT_ID=your-github-id
GITHUB_CLIENT_SECRET=your-github-secret
# TLS Configuration
TLS_CERT_PATH=/app/certs/cert.pem
TLS_KEY_PATH=/app/certs/key.pem
✅ Files Modified/Created
Core Implementation
server/src/config/mod.rs: Main configuration system with ROOT_PATH supportserver/src/bin/config_tool.rs: Updated to use dynamic path resolutionshared/src/lib.rs: Added content loading utilities with path resolution
Configuration Files
config.toml: Added ROOT_PATH configurationconfig.dev.toml: Added ROOT_PATH for developmentconfig.prod.toml: Added ROOT_PATH for production.env.example: Comprehensive environment variable documentation
Documentation & Examples
docs/ROOT_PATH_CONFIG.md: Complete configuration guide (365 lines)server/examples/root_path_example.rs: Working code examplesscripts/demo_root_path.sh: Interactive demonstration scriptROOT_PATH_SUMMARY.md: This summary document
Tests
- Unit tests: Configuration loading and path resolution
- Integration tests: Full configuration validation
- Example tests: Path resolution with custom ROOT_PATH
✅ Key Benefits
1. Deployment Flexibility
# Development
ROOT_PATH=/home/user/myapp cargo run
# Production
ROOT_PATH=/opt/myapp ./target/release/server
# Docker
ENV ROOT_PATH=/app
WORKDIR /app
2. Security & Validation
- No hardcoded paths that could become security vulnerabilities
- Proper path validation ensures directories exist
- Canonical path resolution prevents directory traversal attacks
- All paths are resolved at startup, no runtime path manipulation
3. Maintainability
- Centralized path management through ROOT_PATH
- Easy to change deployment locations without code changes
- Clear separation between configuration and hardcoded paths
- Self-documenting configuration with clear path relationships
4. Production Ready
- Absolute path resolution suitable for production deployments
- Environment variable overrides for different deployment scenarios
- Proper error handling and validation
- Container-friendly configuration
✅ Usage Patterns
Development
# Default behavior (current directory)
cargo run
# Custom development path
ROOT_PATH=/tmp/dev-app cargo run
Production Deployment
# Systemd service
Environment=ROOT_PATH=/opt/myapp
Environment=ENVIRONMENT=production
ExecStart=/opt/myapp/target/release/server
# Docker container
ENV ROOT_PATH=/app
ENV ENVIRONMENT=production
WORKDIR /app
CMD ["./target/release/server"]
Configuration Override
# Override specific paths
ROOT_PATH=/app \
SERVER_PORT=8080 \
DATABASE_URL=postgresql://... \
./target/release/server
✅ API Reference
Configuration Methods
// Load configuration with path resolution
let config = Config::load()?;
// Get resolved absolute path
let uploads_path = config.get_absolute_path("uploads/images")?;
// Access resolved paths
println!("Assets: {}", config.static_files.assets_dir);
println!("Logs: {}", config.server_dirs.logs_dir);
Environment Variables
| Variable | Purpose | Default |
|---|---|---|
ROOT_PATH |
Base directory for path resolution | Current directory |
CONFIG_FILE |
Explicit config file path | Auto-discovered |
ENVIRONMENT |
Runtime environment | development |
SERVER_HOST |
Server bind address | 127.0.0.1 |
SERVER_PORT |
Server port | 3030 |
DATABASE_URL |
Database connection string | From config |
SESSION_SECRET |
Session encryption key | From config |
✅ Migration Guide
Before (Hardcoded Paths)
// ❌ Don't do this
let config_path = "../../../config.toml";
let content = include_str!("../../content/menu.toml");
After (ROOT_PATH Resolution)
// ✅ Do this instead
let config = Config::load()?;
let content_path = config.get_absolute_path("content/menu.toml")?;
let content = std::fs::read_to_string(content_path)?;
✅ Testing
Unit Tests
# Test configuration loading
cargo test test_config_loading
# Test environment variable substitution
cargo test test_env_substitution
# Test path resolution
cargo test config
Integration Tests
# Test full configuration system
cargo test --test config_integration_test
# Test with custom ROOT_PATH
ROOT_PATH=/tmp/test cargo test
Example Execution
# Run the example
cargo run --example root_path_example
# Run the demo script
./scripts/demo_root_path.sh
✅ Validation & Error Handling
Path Validation
- ROOT_PATH must exist and be accessible
- Relative paths are properly resolved
- Absolute paths are preserved unchanged
- Directory creation is handled gracefully
Error Messages
# Invalid ROOT_PATH
❌ Failed to load configuration: Validation error: Root path '/invalid/path' does not exist
# Missing config file
❌ Failed to load configuration: Missing file: config.toml
# Invalid configuration
❌ Failed to load configuration: Parse error: Failed to parse TOML: ...
✅ Performance
- Startup: Path resolution performed once during configuration loading
- Runtime: No path resolution overhead, all paths are pre-resolved
- Memory: Resolved paths cached in configuration structure
- Disk: Minimal filesystem access during path canonicalization
✅ Best Practices
1. Use Relative Paths in Config
# ✅ Good - portable across deployments
[server_dirs]
public_dir = "public"
uploads_dir = "uploads"
# ❌ Avoid - hardcoded absolute paths
# public_dir = "/var/www/html"
2. Set ROOT_PATH in Environment
# ✅ Production deployment
export ROOT_PATH=/opt/myapp
export ENVIRONMENT=production
# ✅ Development
export ROOT_PATH=/home/user/projects/myapp
3. Document Directory Structure
# config.toml
# Expected directory structure:
# ROOT_PATH/
# ├── public/ # Static assets
# ├── uploads/ # User uploads
# ├── logs/ # Application logs
# └── data/ # Application data
✅ Future Enhancements
Potential Improvements
- Path templating: Support for
${ROOT_PATH}/custom/pathsyntax - Multi-root support: Different root paths for different types of resources
- Symlink handling: Enhanced symlink resolution options
- Path watching: File system change detection for development
- Cloud storage: Integration with cloud storage path resolution
Backwards Compatibility
- All existing configurations continue to work
- New ROOT_PATH field has sensible defaults
- Environment variable overrides are additive
- Migration is optional and incremental
✅ Conclusion
The ROOT_PATH implementation provides a robust, secure, and flexible path management system that:
- Eliminates hardcoded paths and security vulnerabilities
- Enables flexible deployments across different environments
- Maintains compatibility with existing configurations
- Provides comprehensive validation and error handling
- Supports modern deployment patterns (Docker, Kubernetes, etc.)
The system is production-ready and provides a solid foundation for path management in any deployment scenario.
For detailed usage instructions, see docs/ROOT_PATH_CONFIG.md.
For interactive demonstration, run ./scripts/demo_root_path.sh.