can1357/oh-my-pi · error · SystemExit

robomp orchestrator requires ROBOMP_GH_PROXY_URL and…

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.

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.

Appendix: 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)