Caching HTTP proxy server for the `crates.io` registry ====================================================== Introduction ------------ `crates-io-proxy` implements transparent caching for both the sparse registry index at and the static crate file download server. Two independent HTTP proxy endpoints are implemented: 1. Listens to HTTP GET requests at `/index/.../{crate}`, forwards them to and caches the downloaded registry index entries as JSON text files on the local filesystem. 2. Listens to HTTP GET requests at `/api/v1/crates/{crate}/{version}/download`, forwards them to and caches the downloaded crates as `.crate` files on the local filesystem. Subsequent sparse registry index and crate download API hits are serviced using the locally cached index entry and crate files. As a convenience feature, the download requests for the `config.json` file found at the sparse index root are served with a replacement file, which changes the crate download URL to point to this same proxy server. Usage ----- Cargo can be told to use the crate registry mirror by using the source replacement feature. Add the following lines to your `.cargo/config`: ``` [source.crates-io] replace-with = "crates-io-mirror" [registries.crates-io-mirror] index = "sparse+http://crates-io-proxy.example.com:3080/index/" ``` Using static git index mirror ----------------------------- `crates-io-proxy` can also be used as the crate file download proxy server with a separate git-based registry index. To use this configuration, clone and rehost the [crates.io index] repository from GitHub and change `"dl"` parameter in `config.json` file in the repository root to point to the `crates-io-proxy` server instead: ``` { "dl": "https://crates-io-proxy.example.com:3080/api/v1/crates", "api": "https://crates.io" } ``` In this configuration, the git registry index link should be used instead: ``` [registries.crates-io-mirror] index = "https://crates-io-index.example.com/crates-io-index.git" ``` Configuration ------------- The proxy server can be configured by either command line options or environment variables. Run `crates-io-proxy --help` to get the following help page: ``` Usage: crates-io-proxy [options] Options: -v, --verbose print more debug info -h, --help print help and exit -V, --version print version and exit -L, --listen ADDRESS:PORT address and port to listen at (0.0.0.0:3080) --listen-unix PATH Unix domain socket path to listen at -U, --upstream-url URL upstream download URL (https://crates.io/) -I, --index-url URL upstream index URL (https://index.crates.io/) -S, --proxy-url URL this proxy server URL (http://localhost:3080/) -C, --cache-dir DIR proxy cache directory (/var/cache/crates-io-proxy) -T, --cache-ttl SECONDS index cache entry Time-to-Live in seconds (3600) Environment: INDEX_CRATES_IO_URL same as --index-url option CRATES_IO_URL same as --upstream-url option CRATES_IO_PROXY_URL same as --proxy-url option CRATES_IO_PROXY_CACHE_DIR same as --cache-dir option CRATES_IO_PROXY_CACHE_TTL same as --cache-ttl option ``` Advanced configuration ---------------------- By default, `crates-io-proxy` uses embedded TLS trusted root certificates. It is possible to configure it to use the system certificate store at the build time by setting the `native-certs` feature flag. Configuring this behavior at the run time is not supported yet. [crates.io index]: https://github.com/rust-lang/crates.io-index