Skip to main content

Requirements

Kernel 6.1+ is recommended for multishot accept and SQPOLL stability. Check your version:
The installer script downloads the latest GitHub Release, verifies SHA256, and installs arc-gateway to /usr/local/bin/arc-gateway. It currently supports Linux x86_64 and Linux arm64.

Step 2 — Write a minimal config

Arc accepts JSON, TOML, or YAML, detected by file extension. Create arc.yaml:

Step 3 — Start a test backend

Any HTTP server on port 3000 works. Python’s built-in server is enough for testing:

Step 4 — Run Arc

Step 5 — Verify

Add rate limiting

Rate limits use GCRA (Generic Cell Rate Algorithm). Add a rate_limit block to any route:
Save the file. Arc watches for config changes and applies them within ~500 ms without dropping connections.

Add TLS

Generate or obtain a certificate, then add a TLS listener:
Certificate files are read at startup and re-read on hot reload. For automatic certificate issuance, see TLS & Certificates.

Add ACME (Let’s Encrypt)

Hot reload

Arc monitors config file modification times. After any change:
Changes to listener addresses, worker count, io_uring ring sizing, or control plane binding require a process restart. All other changes (routes, upstreams, rate limits, TLS certs, plugins) apply live.

Troubleshooting

Check that the listener bind address and port match what you are curling. If you bound to 127.0.0.1:8080 you cannot reach it from another machine.
io_uring requires Linux 5.10+. On kernels between 5.10 and 5.19, some SQPOLL operations may require elevated privileges. Set RLIMIT_MEMLOCK or run with CAP_SYS_ADMIN. In containers, ensure seccomp does not block io_uring syscalls.
The control plane auth_token is set but the request does not include it. Add the header: curl -H "Authorization: Bearer <token>" http://localhost:22100/healthz.
Confirm the mtime of the file changed (some editors write to a temp file and rename). Send SIGHUP manually: kill -HUP $(pidof arc-gateway). Check arc_config_reload_total in /metrics to confirm a reload fired.
Ensure the sni field in certificates exactly matches the hostname (or uses a wildcard like *.example.com). The first certificate in the array is the default fallback when no SNI matches.
TLS-ALPN-01 requires port 443 to be reachable. HTTP-01 requires port 80. Check firewall rules and that the listener bind address is publicly routable. ACME errors are written to the access log with kind: "system".

Next steps

Configuration

Every config field explained.

Security

XDP, rate limiting, L7 protection.

Deployment

Systemd and Kubernetes guides.

Observability

Metrics, logs, tracing.