can1357/oh-my-pi · error · SystemExit

robomp orchestrator requires ROBOMP_GH_PROXY_URL and ROBOMP_

Error message

robomp orchestrator requires ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY (run gh-proxy in a sibling container).

What it means

_require_proxy_mode() enforces that proxy mode is fully configured: both ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY must be set before the orchestrator can build its GitHub client. Missing either means there is no usable GitHub route, so startup aborts with SystemExit.

Source

Thrown at python/robomp/src/cli.py:43

from robomp.server import create_app


def _settings_or_die() -> Settings:
    try:
        return get_settings()
    except Exception as exc:
        click.echo(f"configuration error: {exc}", err=True)
        sys.exit(2)


def _require_proxy_mode(cfg: Settings) -> tuple[str, bytes]:
    if cfg.github_token is not None:
        raise SystemExit(
            "robomp orchestrator refuses to start with GITHUB_TOKEN set in env. "
            "The PAT must live only in the gh-proxy container."
        )
    if cfg.gh_proxy_url is None or cfg.gh_proxy_hmac_key is None:
        raise SystemExit(
            "robomp orchestrator requires ROBOMP_GH_PROXY_URL and "
            "ROBOMP_GH_PROXY_HMAC_KEY (run gh-proxy in a sibling container)."
        )
    return cfg.gh_proxy_url, cfg.gh_proxy_hmac_key.get_secret_value().encode("utf-8")


def _build_github(cfg: Settings) -> GitHubProxyClient:
    base_url, key = _require_proxy_mode(cfg)
    return GitHubProxyClient(base_url=base_url, hmac_key=key)


def _default_wait_timeout(cfg: Settings) -> float:
    return cfg.task_timeout_seconds + cfg.task_timeout_hard_grace_seconds + 30.0


@click.group()
def main() -> None:
    """roboomp control surface."""

View on GitHub (pinned to 9690622007)

Solutions

  1. Set both ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY in the orchestrator environment.
  2. Deploy the gh-proxy container as a sibling and point ROBOMP_GH_PROXY_URL at it.
  3. Alternatively, if direct-PAT mode is intended, set GITHUB_TOKEN and run in the mode that supports it.
  4. Verify variable names and that your secret injection (k8s secret, docker secret) actually mounts them.

Example fix

// before
# ROBOMP_GH_PROXY_URL unset, ROBOMP_GH_PROXY_HMAC_KEY unset
// after
export ROBOMP_GH_PROXY_URL=http://gh-proxy:8080
export ROBOMP_GH_PROXY_HMAC_KEY=$(cat /run/secrets/gh_proxy_hmac)
Defensive patterns

Strategy: validation

Validate before calling

import os
missing = [v for v in ("ROBOMP_GH_PROXY_URL", "ROBOMP_GH_PROXY_HMAC_KEY") if not os.environ.get(v)]
if missing and not os.environ.get("GITHUB_TOKEN"):
    raise SystemExit(f"missing required env vars: {missing}")

Type guard

def proxy_mode_complete(env: dict) -> bool:
    return bool(env.get("ROBOMP_GH_PROXY_URL")) and bool(env.get("ROBOMP_GH_PROXY_HMAC_KEY"))

Prevention

When it happens

Trigger: Starting the robomp orchestrator with neither GITHUB_TOKEN nor (one or both of) ROBOMP_GH_PROXY_URL/ROBOMP_GH_PROXY_HMAC_KEY set, or setting only one of the proxy pair.

Common situations: Fresh deployment where the .env was never populated; the gh-proxy sidecar was added but orchestrator env vars were forgotten; HMAC key stored in a secret manager but not injected; typo in env var names.

Understand the failure class

Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/e28f2abab8d365a9. Report an issue: GitHub.