# SteamCache2 SteamCache2 is a blazing fast download cache for Steam, designed to reduce bandwidth usage and speed up game downloads. ## Features - High-speed caching for Steam downloads - Tiered storage for getting the most out of your storage media - Garbage Collected storage for limiting the size of RAM or Disk cache and will not go above what you choose or stop caching unlike others - Reduces bandwidth usage - Easy to set up and configure aside from dns stuff to trick Steam into using it - Supports multiple clients - **NEW:** YAML configuration system with automatic config generation - **NEW:** Simple Makefile for development workflow - Cross-platform builds (Linux, macOS, Windows) ## Quick Start ### First Time Setup 1. **Clone and build:** ```bash git clone cd steamcache2 make # This will run tests and build the application ``` 2. **Run the application** (it will create a default config): ```bash ./steamcache2 # or on Windows: steamcache2.exe ``` The application will automatically create a `config.yaml` file with default settings and exit, allowing you to customize it. 3. **Edit the configuration** (`config.yaml`): ```yaml listen_address: :80 cache: memory: size: 1GB gc_algorithm: lru disk: size: 10GB path: ./disk gc_algorithm: hybrid upstream: "https://steam.cdn.com" # Set your upstream server ``` 4. **Run the application again:** ```bash make run # or ./steamcache2 ``` ### Development Workflow ```bash # Run all tests and start the application (default target) make # Run only tests make test # Run with debug logging make run-debug # Download dependencies make deps # Show available commands make help ``` ### Command Line Flags While most configuration is done via the YAML file, some runtime options are still available as command-line flags: ```bash # Use a custom config file ./steamcache2 --config /path/to/my-config.yaml # Set logging level ./steamcache2 --log-level debug --log-format json # Set number of worker threads ./steamcache2 --threads 8 # Show help ./steamcache2 --help ``` ### Configuration SteamCache2 uses a YAML configuration file (`config.yaml`) for all settings. Here's a complete configuration example: ```yaml # Server configuration listen_address: :80 # P1 hardening (see Security Hardening section) max_object_size: "0" # 0=unlimited; set e.g. "256MB" for response size DoS protection trusted_proxies: [] # empty = safe (ignore XFF for rate limit); set CIDRs for trusted proxies # Cache configuration cache: # Memory cache settings memory: # Size of memory cache (e.g., "512MB", "1GB", "0" to disable) size: 1GB # Garbage collection algorithm gc_algorithm: lru # Disk cache settings disk: # Size of disk cache (e.g., "10GB", "50GB", "0" to disable) size: 10GB # Path to disk cache directory path: ./disk # Garbage collection algorithm gc_algorithm: hybrid # Upstream server configuration # The upstream server to proxy requests to upstream: "https://steam.cdn.com" ``` #### Startup Validation As of P0, `steamcache2` performs strict validation on startup (after loading config + CLI overrides, before creating the cache). Invalid configs cause immediate clean failure (no default written, no panic): - Negative `max_concurrent_requests` / `max_requests_per_client`: "negative concurrency not allowed" - Invalid `gc_algorithm` (memory): "invalid memory gc algorithm: badvalue" - Disk enabled (`size` non-zero/"") but no `path`: "disk cache enabled but no path specified" - Invalid memory/disk `size` strings (via direct New): "invalid memory size: ..." / "invalid disk size: ..." (clean error return, no panic) Example error on stderr + logs: ``` Error: Invalid configuration: invalid memory gc algorithm: foo. Please fix the config file and try again. ``` See `config.Validate()` and `steamcache.New` error paths. This ensures the LAN appliance fails fast on misconfig. #### Security Hardening (P1) - `max_object_size` (default "0" = unlimited): set e.g. "256MB" or "512MB" to reject oversized upstream responses with HTTP 413 before buffering/ReadAll. Prevents OOM DoS from large or malicious responses (P1-01). Large legitimate Steam files still served if under limit. - `trusted_proxies`: CIDR list (default empty). When empty (safe default), X-Forwarded-For and client IP spoofing are ignored for rate limiting — always uses `r.RemoteAddr` only. When set (e.g. your reverse proxy CIDR), uses correct "rightmost untrusted" extraction. Prevents bypass of `max_requests_per_client` (P1-02). Documented for LAN proxy setups only. - These + P0 validation make steamcache2 safe-by-default for LAN exposure. #### Migration / Breaking Changes (P1) - `New()` public signature gained 2 required trailing params (`maxObjectSize`, `trustedProxies`). Direct callers (rare; most use config or NewWithOptions) must update. - Recommended: migrate to `NewWithOptions(Options{...})` (non-breaking) or rely on YAML config + cmd/root.go. - No behavior change for existing configs (defaults preserve prior semantics). #### Garbage Collection Algorithms SteamCache2 supports different garbage collection algorithms for memory and disk caches, allowing you to optimize performance for each storage tier: **Available GC Algorithms:** - **`lru`** (default): Least Recently Used - evicts oldest accessed files - **`lfu`**: Least Frequently Used (P1 real impl) - evicts by lowest AccessCount (tiebreak older ATime); uses existing FileInfo counters - **`fifo`**: First In, First Out - evicts oldest created files (predictable) - **`largest`**: Size-based - evicts largest files first (maximizes file count) - **`smallest`**: Size-based - evicts smallest files first (maximizes cache hit rate) - **`hybrid`**: Recency + frequency hybrid (P1 meaningful) - evicts by lowest time-decayed score (GetTimeDecayedScore combining ATime + AccessCount) **Recommended Algorithms by Cache Type:** **For Memory Cache (Fast, Limited Size):** - **`lru`** - Best overall performance, good balance of speed and hit rate - **`lfu`** - Excellent for gaming cafes where popular games stay cached - **`hybrid`** - Optimal for mixed workloads with varying file sizes **For Disk Cache (Slow, Large Size):** - **`hybrid`** - Recommended for optimal performance, balances speed and storage efficiency - **`largest`** - Good for maximizing number of cached files - **`lru`** - Reliable default with good performance **Use Cases:** - **Gaming Cafes**: Use `lfu` for memory, `hybrid` for disk - **LAN Events**: Use `lfu` for memory, `hybrid` for disk - **Home Use**: Use `lru` for memory, `hybrid` for disk - **Testing**: Use `fifo` for predictable behavior - **Large File Storage**: Use `largest` for disk to maximize file count ### DNS Configuration Configure your DNS to direct Steam traffic to your SteamCache2 server: - If you're on Windows and don't want a whole network implementation, see the [Windows Hosts File Override](#windows-hosts-file-override) section below. ### Windows Hosts File Override 1. Open Notepad as Administrator: - Click on the Start menu, type `Notepad`, right-click on Notepad, and select `Run as administrator`. 2. Open the Hosts File: - In Notepad, go to `File` > `Open`. - Navigate to `C:\Windows\System32\drivers\etc`. - Select `All Files` from the dropdown menu to see the hosts file. - Open the `hosts` file. 3. Add the Override Entry: - At the end of the file, add a new line with the IP address of your SteamCache2 server followed by `lancache.steamcontent.com`. For example: ```plaintext 192.168.1.100 lancache.steamcontent.com ``` Replace `192.168.1.100` with the actual IP address of your SteamCache2 server. 4. Save the Hosts File: - Save the changes by going to `File` > `Save`. 5. Flush DNS Cache (optional but recommended): - Open Command Prompt as Administrator. - Run the following command to flush the DNS cache: ```sh ipconfig /flushdns ``` 6. Restart - Restart Steam or Restart Your PC This will direct any requests to `lancache.steamcontent.com` to your SteamCache2 server. ## Building from Source ### Prerequisites - Go 1.19 or later - Make (optional, but recommended) ### Build Commands ```bash # Clone the repository git clone cd SteamCache2 # Download dependencies make deps # Run tests make test # Build for current platform go build -o steamcache2 . # Build for specific platforms GOOS=linux GOARCH=amd64 go build -o steamcache2-linux-amd64 . GOOS=windows GOARCH=amd64 go build -o steamcache2-windows-amd64.exe . ``` ### Development ```bash # Run in development mode with debug logging make run-debug # Run all tests and start the application make ``` ## Troubleshooting ### Common Issues 1. **"Config file not found" on first run** - This is expected! SteamCache2 will automatically create a default `config.yaml` file - Edit the generated config file with your desired settings - Run the application again 2. **Permission denied when creating config** - Make sure you have write permissions in the current directory - Try running with elevated privileges if necessary 3. **Port already in use** - Change the `listen_address` in `config.yaml` to a different port (e.g., `:8080`) - Or stop the service using the current port 4. **High memory usage** - Reduce the memory cache size in `config.yaml` - Consider using disk-only caching by setting `memory.size: "0"` 5. **Slow disk performance** - Use SSD storage for the disk cache - Consider using a different GC algorithm like `hybrid` - Adjust the disk cache size to match available storage ### Getting Help - Check the logs for detailed error messages - Run with `--log-level debug` for more verbose output - Ensure your upstream server is accessible - Verify DNS configuration is working correctly ## License See the [LICENSE](LICENSE) file for details. But just for clarity this covers all files in this project unless stated in the individual file. ## Acknowledgements - Inspired by [Lancache.net](https://lancache.net/)