Skip to content

fix(dispatch): Docker Redis 讓開 6379——本機 redis 會靜默接手,狀態全查錯台 - #72

Merged
thothawei merged 1 commit into
mainfrom
claude/redis-host-port
Aug 1, 2026
Merged

fix(dispatch): Docker Redis 讓開 6379——本機 redis 會靜默接手,狀態全查錯台#72
thothawei merged 1 commit into
mainfrom
claude/redis-host-port

Conversation

@thothawei

Copy link
Copy Markdown
Owner

問題

Mac 上常駐的 redis-server127.0.0.1:6379,compose 綁 *:6379localhost 一律由前者接手(更精確的 bind 優先),所以 server 跑在主機(REDIS_ADDR=127.0.0.1:6379)時吃的是本機那台。

這個衝突不會報錯——服務照跑、限流照運作,只是狀態寫在你沒在看的那台。實際後果:debug 時在容器裡 redis-cli KEYS 什麼都查不到,很容易把「查錯台」誤判成「鍵根本沒寫進去」。line-fleet-app 第二十四輪就在這上面繞了一圈。

修法

${REDIS_HOST_PORT:-6380}:6379,與 postgis 讓開 5432(DB_HOST_PORT=5433同一個做法、同一個理由——這個 repo 已經對 postgres 做過一次,redis 是漏網的。

  • docker-compose.yml:改埠 + 寫明「不會報錯,只會靜默連錯台」
  • .env.example:新增 REDIS_HOST_PORT=6380
  • README.md:補「只起相依服務、server 跑在主機」的正式段落(過去只散落在各 repo 的 TODO 裡),並給出 lsof -nP -iTCP:6379 -sTCP:LISTEN 這個判斷指令

compose 網路內部走的仍是 redis:6379,服務間連線不受影響。

實證(不是改完就算)

對兩台各寫一個 whoami 鍵,用 raw socket 讀:

位址 讀到
127.0.0.1:6379 host_redis
127.0.0.1:6380 docker_redis_6380

改完後用 REDIS_ADDR=127.0.0.1:6380 起 server 跑一輪建單:ratelimit:U_seed_* 出現在容器那台(TTL 27s),主機那台 KEYS 'ratelimit*' 是空的。

下游

line-fleet-app 的 TODO 已同步更正主機跑法為 REDIS_ADDR=127.0.0.1:6380(app PR #97)。

🤖 Generated with Claude Code

Mac 上常駐的 redis-server 綁 127.0.0.1:6379、compose 綁 *:6379,localhost 一律
由前者接手。服務跑在主機(REDIS_ADDR=127.0.0.1:6379)時吃的是本機那台,而在容器裡
`redis-cli KEYS` 什麼都查不到——不會報錯,只會讓人把「查錯台」誤判成「鍵沒寫進去」。

改成 ${REDIS_HOST_PORT:-6380}:6379,與 postgis 讓開 5432 同一個做法;README 補上
「只起相依服務、server 跑在主機」的正式段落,並寫明為什麼一定要用 6380。

實證:對兩台各寫一個 whoami 鍵,raw socket 讀 127.0.0.1:6379 → host_redis、
6380 → docker_redis_6380;用新埠跑一輪建單後 ratelimit:* 出現在容器那台、主機那台是空的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@thothawei
thothawei merged commit ca42434 into main Aug 1, 2026
1 check passed
@thothawei
thothawei deleted the claude/redis-host-port branch August 1, 2026 10:35
thothawei added a commit that referenced this pull request Aug 1, 2026
#72 讓 docker 的 redis 對外發布 6380,但「連到哪一台」這個問題本身還是查不出來,
而且有兩個地方仍把人導回 6379:

1. `scripts/push_e2e.sh` 的起服務註解寫 `REDIS_ADDR=localhost:6379`——照著做就會
   重現 #72 修掉的那個坑(靜默連到 Mac 本機的 redis-server)。改成 6380 並寫明理由。
2. `config.Load()` 的缺省值是 `localhost:6379`。這個缺省值只有「服務跑在主機、
   又忘了設 REDIS_ADDR」時才會用到——那正是會連錯台的情境。改成 6380。
   docker compose 內一律明設 `REDIS_ADDR=redis:6379`,不受這行影響。
   順帶更正 `Load()` 的註解:缺省值對應的是「服務在主機、相依服務在 docker」的
   本地跑法,不是 compose 內部(compose 會把 DB_HOST/REDIS_ADDR 明設成服務名)。

但真正的根因不是埠號寫錯,是**連錯不會失敗**:兩台都是健康的 redis,ping 都會過,
於是限流/派單狀態寫進了另一台,而你在容器裡怎麼查都查不到。所以最重要的一行是
ping 成功之後把位址印出來(比照 DB 印 statement_timeout 的理由:ops 可見)——
讓「連到哪一台」變成一行 log,而不是一小時的猜測。

驗收:gofmt 乾淨、go build ./... 通過、go vet ./... 無輸出、
go test ./internal/config/ ok。新增 2 個 config 測試(缺省 6380/明設就照用),
反向驗證:把缺省值改回 6379,缺省那案 FAIL。
啟動 log 那一行只驗到編譯,**沒有實跑觀察**——起 server 會跑 migration,依約定要先問過。

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant