The full Obby self-host stack: IRC server, hosted backend, web client. Run the whole thing or pick parts.
This repository does not build any image. Every service is pulled from Dockerhub. The Dockerfiles live in their per-service repos:
| Image | Source repo |
|---|---|
mattfly/obbyircd |
ObsidianIRC/ObbyIRCd |
mattfly/obby-api |
ObsidianIRC/hosted-backend |
mattfly/obby |
ObsidianIRC/ObsidianIRC |
For Kubernetes / Helm, see obby-helm.
cp .env.example .env
$EDITOR .env # set FQDNs, secrets, public IP
# IRC + backend only
docker compose up -d
# everything including the web client
docker compose --profile frontend up -dThe whole stack defaults to internal-only ports; expose via Traefik or your own reverse proxy. Cloak keys, oper password, and TURN secret are auto-generated on first run if you leave them blank, but they should be set explicitly for any deployment you care about.
| Profile | Services brought up |
|---|---|
| (none, default) | obbyircd, obby-api |
frontend |
obbyircd, obby-api, obby (web) |
Set COMPOSE_PROFILES=frontend in .env to make frontend the default.
Bind-mounted under /data/obby/ by default. Override per-path with
the *_BIND env vars. See .env.example.
Drop files in the matching host dir; they're picked up on next restart
(docker compose restart obbyircd).
| Type | Host path | In-container | Loaded by |
|---|---|---|---|
Native C .c module |
/data/obby/custom-modules/ |
/home/obbyircd/obby/custom-modules |
compiled to third/<name>.so and loadmodule-d automatically |
Server-side JS .js |
/data/obby/scripts/ |
conf/scripts |
obbyscript (scans dir at boot) |
Server-side Python .py |
/data/obby/scripts/python/ |
conf/scripts/python |
obbypy (scans dir at boot) |
docker compose pull && docker compose up -dEach pull resolves the :latest tag of every service to whatever the
respective repo's CI most recently published. For reproducible
deployments, pin per-service tags via OBBYIRCD_IMAGE,
OBBY_API_IMAGE, and OBBY_WEB_IMAGE in .env.