Self-hosting
bytetourist is designed to run on your own infrastructure. Locally, the Go binaries run natively (fast rebuilds) while only the stateful dependencies run in Docker.
Prerequisites
Section titled “Prerequisites”- Go (recent), Docker + Docker Compose, and
bun(for the dashboard UI). make toolsonce, to install the process manager (goreman).
One command
Section titled “One command”make tools # once: installs the process managermake dev # docker compose up etcd + redis, then run core/edge/server/uimake dev brings up the stateful dependencies in Docker, then runs core,
edge, server, and the UI natively with aggregated logs. Ctrl-C stops
everything.
The binaries
Section titled “The binaries”All four services live in cmd/ and share the same config:
| Binary | Command |
|---|---|
| core (proxy) | go run ./cmd/core |
| edge (node) | go run ./cmd/edge |
| scaler | go run ./cmd/scaler |
| server (dashboard API) | go run ./cmd/server |
Configuration
Section titled “Configuration”Config is per-environment YAML selected by APP_ENV (config/local.yaml,
config/prod.yaml), loaded with koanf. Any value can be overridden by an
environment variable prefixed with BT_, using __ for nesting:
# override core.listen_addrBT_CORE__LISTEN_ADDR=":9090" go run ./cmd/core
# override server.default_planBT_SERVER__DEFAULT_PLAN="pro" go run ./cmd/serverSecrets (Postgres DSN, CA key, Auth0/Stripe credentials) come from environment variables or a pluggable secret provider — never from the YAML files.
Minimal vs. full stack
Section titled “Minimal vs. full stack”- Minimal (the URL-fetch path): etcd is required; Redis is optional.
- Full: add Kafka + ClickHouse (analytics/billing) and Postgres (tenancy).
The docker-compose.yml provides the stateful pieces; make infra /
make infra-full bring up the minimal or full set.