{"success":true,"results":[{"id":"issue:nushell/nushell#7108","type":"issue","url":"https://github.com/nushell/nushell/issues/7108","title":"Configure robust retries and connection timeouts for http commands like `fetch`, `post`#7108","passages":[{"text":"# Configure robust retries and connection timeouts for http commands like `fetch`, `post`#7108\n## Description\n### Describe the solution you'd like\n```\n     --retry <num>   Retry request if transient problems occur\n     --retry-connrefused Retry on connection refused (use with --retry)\n     --retry-delay <seconds> Wait time between retries\n     --retry-max-time <seconds> Retry only within this period\n```\n\n```\n     --connect-timeout <fractional seconds> Maximum time allowed for connection\n -m, --max-time <fractional seconds> Maximum time allowed for transfer\n```\n\n```\nsource\n| …\n| exponential-retry\n    --max-retries=10\n    --cap=10min\n    --start=2sec\n    --multiplier=2\n    --jitter=5sec\n  { |it|\n      # whatever commands here will be retried\n  }\n| …\n| sink\n```\n\n```\ndef until [cond: closure] {\n    let piped = $in\n    mut index = 0\n    let input_len = $piped | length\n    mut result = null\n    # ^-- instead there should be something like yield/next\n    # from Python to tell if there's next element to be taken\n\n    while ($result | is-empty) and ($index < $input_len) {\n        let index_const = $index\n        let result_const = do $cond ($piped | get $index_const)\n        # ^-- here we need `$piped`, because `$in` results in \"variable not found\"\n        $result = $result_const\n        $index += 1\n    }\n    if ($result | is-empty) {\n        error make {msg: \"oops\"}\n    } else {\n        $result\n    }\n}\n\ndef retry [\\\n  --retries (-r): int,\\\n  mkDelay: closure,\\\n  op: closure\\\n] {\n    let piped = $in\n    0..<$retries | until {|attempt_index|\n        let res = do $op\n        if not ($res | is-empty) {\n            $res\n        } else {\n            let sleep_time: duration = do $mkDelay $attempt_index\n            print $\"Will sleep ($sleep_time)\"\n            sleep $sleep_time\n        }\n    }\n}\n```","textKind":"highlight"}]},{"id":"pull_request:librefang/librefang#5898","type":"pull_request","url":"https://github.com/librefang/librefang/issues/5898","title":"librefang/librefang#5898","passages":[{"text":"## Out-of-scope follow-ups\n```\n…ble (#10)\n\nThe HTTP-API drivers' retry loop only ever covered server-side throttling\n(429 / 529 / 503).\nTransport-layer failures from `reqwest::send()` — connection refused, TLS\nrecord-layer alerts, read timeouts — returned immediately via `?` and never\nentered the loop, so a single network hiccup on the only configured provider\nfailed the whole turn instead of being retried.\nThe retry cap was also hard-coded to 3 in six hand-copied loops.\n\nTransport errors now go through the same attempt/backoff decision as 429.\nA new `backoff::transport_error_is_retryable` classifies a `reqwest::Error`\nvia its structured predicates (`is_timeout` / `is_connect` / `is_request`)\nwith a substring fallback to the shared transient classifier; retryable\ntransport errors sleep and re-issue, non-retryable ones propagate.\nApplied consistently across anthropic, openai, gemini, bedrock, and vertex_ai\n(both complete and stream paths).\n\nThe retry count is now configurable: `DriverConfig.max_retries`\n(serde default 3, preserving existing behaviour; 0 disables in-driver retries\nand relies on the FallbackChain) plus a per-provider\n`KernelConfig.provider_max_retries` map mirroring `provider_request_timeout_secs`.\nWired through every driver constructor (`with_max_retries` builder, same\npattern as `with_emit_caller_trace_headers`) and every DriverConfig\nconstruction site in the kernel / runtime.\nExposed read + write in the API config surface and classified as\nrestart-required in the config-reload plan (captured by cached drivers).\n\nDeliberately did not extract a unified `call_with_retry` helper: the OpenAI\nloop body carries seven provider-specific recovery branches (tool_use_failed,\ntemperature / max_tokens parameter rewrites, drop-tools, …) and complete vs\nstream have different return/streaming semantics, so a shared HOF would need\nheavy generics/trait objects for little gain.\nCorrectness over de-duplication — the transport-retry decision is the small\nshared piece and it lives in one helper.\nOllama was left unchanged: it has no retry loop at all (single-shot send),\nso neither bug applies; adding one is a separate behavioural change.\n\nTests: backoff unit tests classify real connection-refused / read-timeout\nerrors as retryable; openai integration tests (TcpListener that drops the\nfirst N connections then serves 200) prove the loop re-issues on transport\nerrors, that max_retries(0) does not retry, and that the default survives\nthree consecutive transport failures.\nDriverConfig serde test pins max_retries default 3.\n\nVerified in the sanctioned Docker dev image (Linux): cargo check\n(driver/drivers/types/kernel/runtime/api), clippy -D warnings\n(drivers --all-targets, kernel, runtime), cargo test -p librefang-llm-drivers\n(546), -p librefang-llm-driver (60), -p librefang-api (771); config_reload\ndrift guard green.\n```","textKind":"highlight"}]},{"id":"issue:pola-rs/polars#18966","type":"issue","url":"https://github.com/pola-rs/polars/issues/18966","title":"Make retry strategy for `scan_delta` and `collect` configurable via Python API#18966","passages":[{"text":"# Make retry strategy for `scan_delta` and `collect` configurable via Python API#18966\n## Description\n### Description\n```\ndelta_table = pl.scan_delta(\n        <delta_table_name>,\n        storage_options={\"timeout\": \"0s\"},\n)\n```\n\n```\nGeneric MicrosoftAzure error: Error performing token request: Error after 10 retries in 1.982020166s, max_retries:10, retry_timeout:180s, source:error sending request for url (...)\n```\n\n```\npolars v1.7.1\ndeltalake v0.20.0\n```","textKind":"highlight"}]},{"id":"issue:1jehuang/jcode#559","type":"issue","url":"https://github.com/1jehuang/jcode/issues/559","title":"No retry/backoff for transient API errors (429, 5xx) in OpenAI-compatible provider runtime#559","passages":[{"text":"# No retry/backoff for transient API errors (429, 5xx) in OpenAI-compatible provider runtime#559\n## Root cause\n```\nconst MAX_RETRIES: u32 = 3;\nconst RETRY_BASE_DELAY_MS: u64 = 1000;\n```","textKind":"highlight"}]},{"id":"pull_request:jdx/mise#11066","type":"pull_request","url":"https://github.com/jdx/mise/issues/11066","title":"- treat DNS resolver failures as non-retryable","passages":[{"text":"## Walkthrough\n### Changes\n```\nVerify each finding against current code. Fix only still-valid issues, skip the\nrest with a brief reason, keep changes minimal, and validate.\n\nInline comments:\nIn `@src/http.rs`:\n- Around line 618-623: Update send_once_with_https_fallback_with_retry_headers\nso its HTTP-to-HTTPS fallback condition also recognizes circuit-broken hosts\nfrom UNAVAILABLE_HTTP_HOSTS, in addition to is_connection_error(&err). Preserve\nthe existing fallback behavior for connection errors and ensure subsequent\nrequests to affected http:// URLs still retry via https://.\n```","textKind":"highlight"}]},{"id":"readme:mingweisamuel/riven","type":"readme","url":"https://github.com/mingweisamuel/riven","title":"mingweisamuel/riven","passages":[{"text":"# Usage\n```rust\nuse riven::RiotApi;\nuse riven::consts::PlatformRoute;\n\n// Enter tokio async runtime.\nlet rt = tokio::runtime::Runtime::new().unwrap();\nrt.block_on(async {\n    // Create RiotApi instance from key string.\n    let api_key = std::env!(\"RGAPI_KEY\"); // \"RGAPI-01234567-89ab-cdef-0123-456789abcdef\";\n    let riot_api = RiotApi::new(api_key);\n\n    // The region.\n    let platform = PlatformRoute::NA1;\n\n    // Get account data.\n    let account = riot_api.account_v1()\n        .get_by_riot_id(platform.to_regional(), \"잘 못\", \"NA1\").await\n        .expect(\"Get summoner failed.\")\n        .expect(\"There is no summoner with that name.\");\n\n    // Print account name#tag.\n    println!(\n        \"{}#{} Champion Masteries:\",\n        account.game_name.unwrap_or_default(),\n        account.tag_line.unwrap_or_default(),\n    );\n\n    // Get champion mastery data.\n    let masteries = riot_api.champion_mastery_v4()\n        .get_all_champion_masteries_by_puuid(platform, &account.puuid).await\n        .expect(\"Get champion masteries failed.\");\n\n    // Print champion masteries.\n    for (i, mastery) in masteries.iter().take(10).enumerate() {\n        println!(\"{: >2}) {: <9}    {: >7} ({})\", i + 1,\n            mastery.champion_id.name().unwrap_or(\"UNKNOWN\"),\n            mastery.champion_points, mastery.champion_level);\n    }\n});\n```\n\n## Feature Flags\n### Nightly vs Stable\n```toml\nriven = { version = \"...\", features = [ \"nightly\" ] }\n```","textKind":"highlight","citation_url":"https://raw.githubusercontent.com/mingweisamuel/riven/HEAD/README.md"}]},{"id":"readme:nosduco/nforwardauth","type":"readme","url":"https://github.com/nosduco/nforwardauth","title":"nosduco/nforwardauth","passages":[{"text":"# nforwardauth\n## Getting started\n#### Simple configuration\n```yaml\nversion: '3'\n\nservices:\n  traefik:  # Basic traefik v2 configuration\n    image: traefik:v2.9\n    command: --providers.docker\n    ports:\n      - \"80:80\"\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro # Mount docker socket as read-only\n\n  nforwardauth: # nforwardauth example configuration (for use behind HTTPS by default)\n    image: nosduco/nforwardauth:v1\n    environment:\n      - TOKEN_SECRET=example-secret-123 # Secret to use when signing auth token\n      - AUTH_HOST=nforwardauth.yourdomain.com # Where nforwardauth can be accessed/redirected to for login\n    labels:\n      - \"traefik.http.routers.nforwardauth.rule=Host(`nforwardauth.yourdomain.com`)\"\n      - \"traefik.http.middlewares.nforwardauth.forwardauth.address=http://nforwardauth:3000\"\n      - \"traefik.http.middlewares.nforwardauth.forwardauth.authResponseHeaders=X-Forwarded-User\" #Pass 'X-Forwarded-User' header from response for downstream identification\n      - \"traefik.http.services.nforwardauth.loadbalancer.server.port=3000\"\n    volumes:\n      - \"/path/to/passwd:/passwd:ro\" # Mount local passwd file at /passwd as read only\n\n  whoami: # whoami example container accessible at \"whoami.yourdomain.com\" behind nforwardauth middleware\n    image: traefik/whoami\n    labels:\n      - \"traefik.http.routers.whoami.rule=Host(`whoami.yourdomain.com`)\"\n      - \"traefik.http.routers.whoami.middlewares=nforwardauth\"\n```\n\n#### Advanced configuration\n```yaml\nversion: '3'\n\nservices:\n  traefik: \n    image: traefik:v2.9\n    command: --api.insecure=true --providers.docker\n    ports:\n      - \"80:80\" # HTTP port\n      - \"8080:8080\" # Web UI port (enabled by --api.insecure=true)\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock:ro # Mount docker socket as read-only\n\n  nforwardauth:\n    image: nosduco/nforwardauth:v1\n    environment:\n      - TOKEN_SECRET=example-secret-123 # Secret to use when signing auth token\n      - COOKIE_SECURE=false # Do not set cookies as secure (WARNING: ONLY USE IN DEV OR LAN-ONLY HOSTS)\n      - AUTH_HOST=nforwardauth.localhost.com # (required)\n      - COOKIE_DOMAIN=localhost.com # Set domain for the cookies. This value will allow cookie and auth on *.yourdomain.com (including base domain)\n      - COOKIE_NAME=nforwardauth # Set name for the cookie (helpful if running multiple instances of nforwardauth to prevent collision)\n      - PASS_USER_HEADER=false # Set Whether User is passed in header for downstream identification (default: true, disable to -disallow- username leakage)\n      - PORT=3000 # Set specific port to listen on \n    labels:\n      - \"traefik.http.routers.nforwardauth.rule=Host(`nforwardauth.localhost.com`)\"\n      - \"traefik.http.middlewares.nforwardauth.forwardauth.address=http://nforwardauth:3000\"\n      - \"traefik.http.services.nforwardauth.loadbalancer.server.port=3000\"\n    volumes:\n      - \"/path/to/passwd:/passwd:ro\" # Mount local passwd file at /passwd as ready only\n\n  whoami: # whoami example container accessible at \"whoami.localhost.com\" behind nforwardauth middleware\n    image: traefik/whoami\n    labels:\n      - \"traefik.http.routers.whoami.rule=Host(`whoami.localhost.com`)\"\n      - \"traefik.http.routers.whoami.middlewares=nforwardauth\"\n```","textKind":"highlight","citation_url":"https://raw.githubusercontent.com/nosduco/nforwardauth/HEAD/README.md"}]},{"id":"issue:hmbown/codewhale#5101","type":"issue","url":"https://github.com/hmbown/codewhale/issues/5101","title":"v0.9.4: composer send dies on route preflight with truncated \"Message not sent (Failed to configure provider…)\"#5101","passages":[{"text":"# v0.9.4: composer send dies on route preflight with truncated \"Message not sent (Failed to configure provider…)\"#5101\n## Dogfood evidence\n```\ndone · Message not sent (Failed to configure p... · cache 75%\ndraft · Message not sent (Failed to configure p... · cache 75%\n```","textKind":"highlight"}]},{"id":"issue:pola-rs/polars#18757","type":"issue","url":"https://github.com/pola-rs/polars/issues/18757","title":"`AWS_PROFILE` should be supported in cloud storage I/O config#18757","passages":[{"text":"# `AWS_PROFILE` should be supported in cloud storage I/O config#18757\n## Description\n### Description\n```\nfrom botocore.session import Session\n\nsession = Session(profile=\"default\")\nconfig = session..get_scoped_config()\nconfig.get(\"endpoint_url\")\n```","textKind":"highlight"}]},{"id":"readme:cenotelie/cratery","type":"readme","url":"https://github.com/cenotelie/cratery","title":"cenotelie/cratery","passages":[{"text":"<div align=\"center\">\n  <h1>📦 Cratery</h1>\n    <strong>Lightweight private cargo registry with batteries included, built for organisations</strong>\n  </a>\n  <br>\n  <br>\n\n[![Build Status](https://dev.azure.com/cenotelie/cenotelie/_apis/build/status%2Fcenotelie.cratery?branchName=master)](https://dev.azure.com/cenotelie/cenotelie/_build/latest?definitionId=34&branchName=master)\n  [![Cratery Crates.io version](https://img.shields.io/crates/v/cratery?style=flat)](https://crates.io/crates/cratery)\n  [![Cratery Rust documentation](https://docs.rs/cratery/badge.svg)](https://docs.rs/cratery)\n  [![Cratery dependency status](https://deps.rs/repo/github/cenotelie/cratery/status.svg)](https://deps.rs/repo/github/cenotelie/cratery)\n  [![docker](https://img.shields.io/docker/v/cenotelie/cratery)](https://hub.docker.com/r/cenotelie/cratery)\n\n</div>\n\n\n## Quickstart\n\nTo launch an empty registry using a pre-built docker image, get the latest `docker-compose.yml` file and start it:\n\n```bash\ngit clone https://github.com/cenotelie/cratery\ncd cratery\ndocker compose up -d\n```\n\nThen, connect to [http://localhost/](http://localhost/).\nIn the default configuration, a Google account must be used.\n\nThe first ever user to log in automatically obtains administration rights.\nHe/she is then responsible to setup an admin team.\n\nOnce connected, a token for CLI usage in Cargo can be obtained by going to [http://localhost/webapp/account.html](http://localhost/webapp/account.html) and clicking on the `Create new token` button.\nTokens can be restricted to read access, e.g. for CI purposes.\nFor publishing crates, a token with write accesses must be obtained.\nThe name of the token is just a convenience.\nOn creation, a popup appear with information about how to register this token for Cargo.\n\n\n## Features\n\n### Authentication\n\nAuthentication is handled using OAuth out of the box.\nSimply connect your organisation's provider.\nOn the default configuration, Google is configured as a provider.\nThis is only appropriate for demonstration purposes.\n\n### Administration\n\nAdministrate owners for hosted crates.\n\n![Screenshot of the admin panel for setting a crate's owner](https://raw.githubusercontent.com/cenotelie/cratery/master/docs/capture-owners.png)\n\n### Docs generation\n\nCratery automatically generates and serves the documentation for published crates.\n\n![Screenshot of a piece of documentation](https://raw.githubusercontent.com/cenotelie/cratery/master/docs/capture-docs.png)\n\nCratery now supports worker nodes for the execution of documentation generation jobs, as well as the configuration of crates so that the documentation can be generated:\n* for specific targets (instead of the host by default),\n* possibly requiring a native host for specific targets (for example a native Windows node for the `x86_64-pc-windows-msvc` target),\n* using nodes with identified capabilities, for example specific system libraries.\n\n![Screenshot of the settings page for a crate for documentation generation](https://raw.githubusercontent.com/cenotelie/cratery/master/docs/capture-admin-docs.png)\n\n### Dependency analysis\n\nCratery automatically scans the dependency graph of the latest versions (for each major version) of hosted crates.\nCratery detects outdated direct dependencies and gives the latest version number to use instead.\nCratery also audits the complete dependency graph to find dependencies, direct or indirect, that are affected by vulnerabilities published by the [RustSec group](https://rustsec.org/).\n\nCratery can send notifications by emails to the crates' owners when a issue is discovered.\nAnalysis are also performed on-demand on each crate's page.\n\n![Screenshot of warning about outdated dependencies](https://raw.githubusercontent.com/cenotelie/cratery/master/docs/capture-deps-outdated.png)\n\n![Screenshot of warning about vulnerable dependencies](https://raw.githubusercontent.com/cenotelie/cratery/master/docs/capture-deps-cves.png)\n\n### Statistics\n\nCratery also tracks downloads to give you statistics about the usage of your crates.\n\n![Screenshot of download statistics for a crate](https://raw.githubusercontent.com/cenotelie/cratery/master/docs/capture-crate-stats.png)\n\n## Configuration\n\nConfiguration is passed through environment variables.\nSee [docker-compose.yml](docker-compose.yml) for all values.\n\n### General\n\n* `REGISTRY_WEB_PUBLIC_URI`: The URI at which the registry will be available.\n* `REGISTRY_WEB_COOKIE_SECRET`: The secret key for the private cookie set by `cratery` to track connected users.\n\n### Authentication\n\nAuthentication on `cratery` is archived with OAuth and configured with the `REGISTRY_OAUTH_*` environment variables.\nThe [docker-compose.yml](docker-compose.yml) file contains the basic configuration to use Google as the authentication provider.\nThis is allowed only for `cratery` instances exposed on `localhost` for evaluation and testing purposes.\nThis configuration must be changed to use your own OAuth identity provider.\n\n* `REGISTRY_OAUTH_LOGIN_URI`: URI to redirect to when attempting to log in.\n* `REGISTRY_OAUTH_CALLBACK_URI`: URI on `cratery` the user will be redirected to on successful login on the identity provider.\n* `REGISTRY_OAUTH_TOKEN_URI`: URI `cratery` will connect to for obtaining an authorization token from the identity provider.\n* `REGISTRY_OAUTH_USERINFO_URI`: URI `cratery` will connect to for obtaining the user information from the identity provider when a user logged in.\n* `REGISTRY_OAUTH_USERINFO_PATH_EMAIL`: The path to the email field in the JSON blob returned by the identity provider as the user information.\n* `REGISTRY_OAUTH_USERINFO_PATH_FULLNAME`: The path to the full name field in the JSON blob returned by the identity provider as the user information.\n* `REGISTRY_OAUTH_CLIENT_ID`: The client ID to use when connecting to the identity provider.\n* `REGISTRY_OAUTH_CLIENT_SECRET`: The client secret to use when connecting to the identity provider.\n* `REGISTRY_OAUTH_CLIENT_SCOPE`: The scope to request when redirecting to the identity provider.\n\n### Storage\n\nThe persisted data for `cratery` is:\n* An sqlite database,\n* The index git repository,\n* The actual crates packages and metadata,\n* The generated documentation of stored crates.\n\nBy default, all data is stored in a single directory specified by the `REGISTRY_DATA_DIR` environment variable.\nThe default value is a `/data` folder, expected to be mounted into the docker container.\n\nIn addition, `cratery` uses git and Cargo and expect their respective configuration to appear in a home directory.\nThis directory can be configured using the `REGISTRY_HOME_DIR` environment variable.\nIf this variable is not set, `cratery` looks for the `HOME` environment variable and then fallback to a default value of `home/cratery` expecting to run within a docker container.\n\nThe crates data and their generated documentation can be stored on S3 instead.\nThis is controlled by the following configuration :\n* `REGISTRY_STORAGE`: Either `fs` (default) to store in the `REGISTRY_DATA_DIR` folder or `s3` to store on an S3 bucket.\n* `REGISTRY_STORAGE_TIMEOUT`: Timeout (in milli-seconds) to use when interacting with the storage, defaults to 3000\n* `REGISTRY_S3_URI`: Endpoint base URI for the S3 service.\n* `REGISTRY_S3_REGION`: Sub-domain for the region.\n* `REGISTRY_S3_ACCESS_KEY`: The access key to use, set to empty string to search for existing credentials.\n* `REGISTRY_S3_SECRET_KEY`: The secret key to use, set to empty string to search for existing credentials.\n* `REGISTRY_S3_BUCKET`: The S3 bucket to use for storage. It will be created if it does not exist.\n* `REGISTRY_S3_ROOT`: The prefix to use for storing the data in the bucket (e.g. `/cratery/`), if not set or set to empty string, data will be stored in the root of the bucket.\n* `REGISTRY_STORAGE_RETRY_ENABLED`: Whether to retry temporary errors when accessing the storage, defaults to `false`, enable with `true` or `1`.  Retrying can be used for `S3` and `fs` storage.  If enabled, the following parameters can be used to further configure the retry behaviour:\n    * `REGISTRY_STORAGE_RETRY_MAX_TIMES`: Maximum number of retries to perform, defaults to `3`.\n    * `REGISTRY_STORAGE_RETRY_MIN_DELAY_MS`: Minimum delay (in milliseconds) between retries, defaults to `1000`.\n    * `REGISTRY_STORAGE_RETRY_MAX_DELAY_MS`: Maximum delay (in milliseconds) between retries, defaults to `60000`.\n    * `REGISTRY_STORAGE_RETRY_MAX_FACTOR`: Factor to use to increase the delay between retries, defaults to `2.0`.\n    * `REGISTRY_STORAGE_RETRY_JITTER`: Whether to add a random jitter to the delay between retries, defaults to `false`, enable with `true` or `1`.\n\n### Index\n\nThe index can be served using both the legacy `git` and the new `sparse` protocols, see [Registry Protocols](https://doc.rust-lang.org/cargo/reference/registries.html#registry-protocols).\nThe legacy `git` protocol is disabled by default, and the new `sparse` protocol enabled:\n* `REGISTRY_INDEX_PROTOCOL_GIT`, defaults to `false` to de-activate the legacy `git` \"smart\" protocol. Use `true` to activate.\n* `REGISTRY_INDEX_PROTOCOL_SPARSE`, defaults to `true` to activate the `sparse` protocol. Any other value deactivates it.\n\nFetching the index always requires authentication, regardless of the used protocol.\n\nThe index for the registry is managed as a git repository.\nWhen `cratery` commits to this repository as an author:\n* `REGISTRY_GIT_USER_NAME` is the username to use,\n* `REGISTRY_GIT_USER_EMAIL` is the email to use.\n\nThe git repository for the index can be synchronized with an externally hosted git repository with:\n* `REGISTRY_GIT_REMOTE`: The URI to the remote git repository to use. It will be cloned on startup (or changes pulled from if already present).\n* `REGISTRY_GIT_REMOTE_SSH_KEY_FILENAME`: path and filename of the SSH key to use to authenticate to the remote host.\n* `REGISTRY_GIT_REMOTE_PUSH_CHANGES`: If set to `true`, changes will be automatically pushed to the remote repository to keep the remote in sync.\n\n### Docs generation\n\nWhen generating the documentation for stored crates:\n* `REGISTRY_SELF_LOCAL_NAME` is the name of the registry for Cargo. It should match the name used to upload the crates.\n\n`cratery` will automatically link to `docs.rs` for dependencies on `crates.io`.\nDependencies to crates also hosted on the same `cratery` instance will be recognized using the `REGISTRY_WEB_PUBLIC_URI` value.\n\nExternal private registries so that documentation can be generated and the dependencies' docs linked against.\nThis is specified with the following environment variables.\n`{index}` is a number that starts at `1` for the first external registry.\n* `REGISTRY_EXTERNAL_{index}_NAME`: The name of the registry for Cargo.\n* `REGISTRY_EXTERNAL_{index}_INDEX`: The URL to the registry's index\n* `REGISTRY_EXTERNAL_{index}_DOCS`: The URL prefix to use for links to documentation for crates on this registry.\n* `REGISTRY_EXTERNAL_{index}_LOGIN`: The login that Cargo will use to get crates from the registry.\n* `REGISTRY_EXTERNAL_{index}_TOKEN`: The associated token.\n\n### Dependency analysis\n\nWhen performing dependency analysis, Cratery will access `crates.io` and other external registries.\n\n* `REGISTRY_DEPS_CHECK_PERIOD`: Period in seconds to wait between checking for crates that need to be analyzed.\n* `REGISTRY_DEPS_STALE_REGISTRY`: Number of milliseconds after which the local data about an external registry are deemed stale and must be pulled again. Defaults to 60000 (1 minute).\n* `REGISTRY_DEPS_STALE_ANALYSIS`: Number of minutes after which the saved analysis for a crate becomes stale. Defaults to 1 day. A negative number deactivates background analysis of crates.\n* `REGISTRY_DEPS_NOTIFY_OUTDATED`: Whether to send a notification by email to the owners of a crate when some of its dependencies become outdated, defaults to `false`. To activate, set to `true`.\n* `REGISTRY_DEPS_NOTIFY_CVES`: Whether to send a notification by email to the owners of a crate when CVEs are discovered in its dependencies, defaults to `false`. To activate, set to `true`.\n* `REGISTRY_EMAIL_SMTP_HOST`: The host for sending mails.\n* `REGISTRY_EMAIL_SMTP_PORT`: The port for sending mails.\n* `REGISTRY_EMAIL_SMTP_LOGIN`: The login to connect to the SMTP host.\n* `REGISTRY_EMAIL_SMTP_PASSWORD`: The password to connect to the SMTP host\n* `REGISTRY_EMAIL_SENDER`: The address to use a sender for mails\n* `REGISTRY_EMAIL_CC`: The address to always CC for mails\n\n### Worker nodes\n\nDocumentation jobs do not have to be executed on the server, although this is the default setup.\nThey can be delegated to worker nodes and the main server will act as the master.\nA worker node is just another instance of `cratery`, configured with a specific role.\nThe role of a node is configured as follow:\n\n* `REGISTRY_NODE_ROLE`: By default, a node is in standalone mode, neither a master nor a worker. Documentation jobs are run on the node. For `cratery` instances that want to have worker nodes, the role must be set to `\"master\"`. Worker nodes in turn must have a role set to `\"worker\"`.\n* `REGISTRY_NODE_WORKER_TOKEN`: for both master and worker nodes, this variable must be set to the same value. This is the secret token that workers will use to connect to their master node.\n* `REGISTRY_NODE_WORKER_NAME`: for workers only, the user-friendly name of the worker.\n* `REGISTRY_NODE_MASTER_URI`:  for workers only, the web socket URI to the master, for example `wss://cargo.mycompany.com`.\n* `REGISTRY_NODE_WORKER_CAPABILITIES`: for workers only, a comma-separated list of capabilities provided by the worker. Crates can then be configured to require specific capabilities. For example the presence of `openssl` on the system.\n\n\n## Contributing\n\nContributions are welcome!\n\nOpen a ticket, ask a question or submit a pull request.\n\n\n## License\n\nThis project is licensed under the [MIT license](LICENSE).","textKind":"chunk","citation_url":"https://raw.githubusercontent.com/cenotelie/cratery/HEAD/README.md"}]}],"coverage":{"doc":"unavailable","issue":"ok","pull_request":"ok","readme":"ok"},"reranked":true}