Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| Linux kernel | 5.10 | 6.1+ |
| Rust toolchain | 1.75 | latest stable |
| Redis (optional) | 6.0 | 7.x — only needed for cluster-wide rate limiting |
Step 1 — Build
./target/release/arc-gateway. For a development build with debug symbols, omit --release.
Step 2 — Write a minimal config
Arc accepts JSON, TOML, or YAML, detected by file extension. Createarc.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 arate_limit block to any route:
Add TLS
Generate or obtain a certificate, then add a TLS listener:Add ACME (Let’s Encrypt)
Hot reload
Arc monitors config file modification times. After any change:Troubleshooting
Arc starts but `curl http://localhost:8080/` returns a connection refused
Arc starts but `curl http://localhost:8080/` returns a connection refused
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: Operation not permitted
io_uring: Operation not permitted
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./healthz returns 401 Unauthorized
/healthz returns 401 Unauthorized
Config change is not taking effect
Config change is not taking effect
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.TLS: certificate not served for a domain
TLS: certificate not served for a domain
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.ACME: challenge validation fails
ACME: challenge validation fails
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".
