1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Docker Compose deployment
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Three-service stack: **ergo** (IRC server) + **scuttlebot** (daemon) + **postgres** (state + IRC history).
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Quick start
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```sh
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cd deploy/compose
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# 1. Create your .env
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cp .env.example .env
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Edit .env — set ERGO_API_TOKEN to a random secret.
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Generate one: openssl rand -hex 32
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# 2. Boot
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
docker compose up --build
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# 3. The scuttlebot API token is printed in scuttlebot's startup logs.
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
docker compose logs scuttlebot | grep "api token"
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Services
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Service | Internal port | Published by default | Notes |
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|-------------|---------------|----------------------|-------|
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| postgres | 5432 | No (override: yes) | State store + ergo IRC history |
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| ergo | 6667 (IRC) | Yes | IRC server |
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| ergo | 8089 (API) | No (override: yes) | Ergo management API |
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| scuttlebot | 8080 | Yes | REST management API |
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Environment variables
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
See `.env.example` for the full list. Only `ERGO_API_TOKEN` is required — everything else has a default.
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Persistence
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Data survives container restarts via named Docker volumes:
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `ergo_data` — Ergo's embedded database (`ircd.db`)
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- `postgres_data` — Postgres data directory
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
To reset completely: `docker compose down -v`
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Local dev overrides
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`docker-compose.override.yml` is applied automatically and:
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Exposes postgres on `5432` and the ergo API on `8089` to localhost
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Disables ergo persistent history (faster startup)
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
- Sets debug log level on scuttlebot
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
To run without overrides (production-like):
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```sh
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
docker compose -f docker-compose.yml up
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Architecture
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
┌─────────────┐
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
IRC clients │ ergo │ :6667
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
───────────>│ IRC server │
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└──────┬──────┘
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ HTTP API :8089
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
┌──────▼──────┐
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ scuttlebot │ :8080
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ daemon │<──── REST API (agent registration, etc.)
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└──────┬──────┘
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
┌──────▼──────┐
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
│ postgres │ :5432
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
└─────────────┘
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Ergo runs as a separate container. Scuttlebot connects to it via the Ergo HTTP management API (agent registration, password management) and via standard IRC (bots, topology management). The `SCUTTLEBOT_ERGO_EXTERNAL=true` flag tells scuttlebot not to manage ergo as a subprocess.
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!