-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
88 lines (81 loc) · 3.73 KB
/
Copy pathdocker-compose.yml
File metadata and controls
88 lines (81 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 直播小幫手 — 水平擴展(三層拆分)應用程式 compose(計畫 §6,方式 A 固定 shard)
#
# 本 stack 只跑應用程式(coordinator / scraper / notifier-N),共用單一 image(§6),
# 角色由 ROLE 環境變數選擇執行檔(entrypoint)。
# MySQL / Redis 為外部獨立服務,透過 host.docker.internal(或主機 IP)連入,連線資訊放 .env。
# 內部通知匯流排走 Redis Streams(bot:notify),不需額外服務(§4)。
#
# 啟動前置:
# 1. 外部 MySQL / Redis 已啟動且容器可達(bind 0.0.0.0 或主機 IP、防火牆放行)。
# 2. 複製 .env.example -> .env 並填入連線資訊與 Token。
# 3. 準備 bot_config.json(含 WebHookUrl、ApiServerDomain 等設定);provider token 金鑰可改由 .env secret 注入。
#
# 建置 / 啟動:
# docker compose up -d # pull_policy=build,從本 repo 建置單一 image,三角色共用
# 讓容器都能用 host.docker.internal 連回主機(Linux 必要;Docker Desktop 可省)
x-host: &host-gateway
extra_hosts:
- "host.docker.internal:host-gateway"
# 保留 Docker console log 作為 Loki 故障時的本機備援,並限制單一容器最多約 30 MB。
x-logging: &app-logging
driver: json-file
options:
max-size: "10m"
max-file: "3"
# 各角色共用設定錨點:單一 image + 連線設定 + bot_config 掛載
x-app: &app-common
image: discord-stream-notify-bot:latest
# 此 image 只由本 repo 的 Dockerfile 建置,不從 registry 拉取,避免出現 pull access denied。
pull_policy: build
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
logging: *app-logging
env_file: .env
volumes:
# InitBotConfig 需要 bot_config.json 存在;程序不再修改或自動產生 provider token 金鑰。
- ./bot_config.json:/app/bot_config.json:ro
<<: *host-gateway
# 角色由 ROLE 環境變數選擇執行檔(entrypoint);各 exe 的 BotRole 已寫死於 Program.cs
services:
coordinator:
<<: *app-common
environment:
ROLE: coordinator
ports:
# Prometheus metrics endpoint;若 Prometheus 與本 stack 共用 Docker network,可改成只 expose 9464。
- "9464:9464"
scraper:
<<: *app-common
environment:
ROLE: scraper
ports:
# Prometheus metrics endpoint;若 Prometheus 與本 stack 共用 Docker network,可改成只 expose 9465。
- "9465:9465"
depends_on: [coordinator]
# 方式 A:固定 shard,每個 shard 一個服務。ShardId 寫死於 command 第一參數;
# total(第二參數)由 .env 的 TOTAL_SHARDS 插值 → shard 總數單一真實來源(同時餵此處與 coordinator 的 env)。
# 【約束】notifier-N 服務的「數量」必須等於 TOTAL_SHARDS(此處 = 2);要改 shard 數需同步增刪 notifier-N 服務。
# 角色由 ROLE 決定:scraper 偵測並發布至 bot:notify;notifier 消費自己的 consumer group(shard-{id})發送通知。
notifier-0:
<<: *app-common
# Discord token/未處理例外屬人工介入事件,退出後保持停止,避免無限重啟觸發 Discord 風控。
restart: "no"
environment:
ROLE: notifier
command: ["0", "${TOTAL_SHARDS:?請在 .env 設定 TOTAL_SHARDS}"]
ports:
# Notifier 容器內皆使用 9466;固定 shard 以不同宿主機 port 供 Prometheus 抓取。
- "9466:9466"
depends_on: [coordinator]
notifier-1:
<<: *app-common
# 任一 shard 廣播授權失效後兩個 Notifier 都會退出,保持停止直到人工更新 token 後再啟動。
restart: "no"
environment:
ROLE: notifier
command: ["1", "${TOTAL_SHARDS:?請在 .env 設定 TOTAL_SHARDS}"]
ports:
- "9467:9466"
depends_on: [coordinator]