From 098ab260caa5a5eee7c6b54b37ae9dcc44cb37f1 Mon Sep 17 00:00:00 2001 From: awei Date: Fri, 31 Jul 2026 08:19:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(dispatch):=20Docker=20Redis=20=E8=AE=93?= =?UTF-8?q?=E9=96=8B=206379=E2=80=94=E2=80=94=E6=9C=AC=E6=A9=9F=20redis=20?= =?UTF-8?q?=E6=9C=83=E9=9D=9C=E9=BB=98=E6=8E=A5=E6=89=8B=EF=BC=8C=E7=8B=80?= =?UTF-8?q?=E6=85=8B=E5=85=A8=E6=9F=A5=E9=8C=AF=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .env.example | 4 ++++ README.md | 16 ++++++++++++++++ docker-compose.yml | 6 +++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index a79a405..0bf3c85 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,10 @@ DB_STATEMENT_TIMEOUT_MS=10000 # Redis REDIS_ADDR=redis:6379 +# 服務跑在主機時連 Docker Redis 用此 port;避開 Mac 本機 redis-server 的 6379。 +# 這個衝突不會報錯,只會靜默連錯台(本機 redis 綁 127.0.0.1,比 docker 的 * 更精確,優先接手), +# 所以主機跑法一律用 REDIS_ADDR=127.0.0.1:6380,不要用 6379。 +REDIS_HOST_PORT=6380 # LINE LINE_CHANNEL_SECRET= diff --git a/README.md b/README.md index 35c530b..7195c3c 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,22 @@ docker compose --profile simulator up -d simulator > 重跑 `smoke_test.sh` 前建議先 `docker compose down -v` 清掉舊資料,避免殘留訂單干擾。 +### 只起相依服務、server 跑在主機(debug 常用) + +```bash +docker compose up -d postgis redis +DB_HOST=127.0.0.1 DB_PORT=5433 REDIS_ADDR=127.0.0.1:6380 go run ./cmd/server +``` + +> **三個變數都要覆寫**:`.env` 裡的 `postgis`/`redis` 是 compose 網路內的主機名, +> 在主機上解析不到。 +> +> **Redis 一定要用 6380,不要用 6379**:Mac 上常駐的 `redis-server` 綁 `127.0.0.1:6379`, +> Docker 綁 `*:6379`,**localhost 一律由本機那台接手**——連錯不會報錯,服務照跑, +> 但你在容器裡 `redis-cli KEYS` 什麼都查不到(狀態其實寫在本機那台)。 +> 這也是 postgis 讓開 5432 的同一個理由。用 +> `lsof -nP -iTCP:6379 -sTCP:LISTEN` 可以看誰在聽。 + --- ## API 端點 diff --git a/docker-compose.yml b/docker-compose.yml index 78d2628..fbc57fd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,7 +40,11 @@ services: redis: image: redis:7-alpine ports: - - "6379:6379" + # 6380 避免與本機 Redis 的 6379 衝突(與上面 postgis 讓開 5432 同一個理由)。 + # **這個衝突不會報錯,只會靜默連錯台**:本機 redis-server 綁 127.0.0.1、 + # docker 綁 *,localhost 一律由前者接手——服務跑在主機時吃的是本機那台, + # 而你在容器裡 `redis-cli KEYS` 什麼都查不到,很容易誤判成「鍵根本沒寫進去」。 + - "${REDIS_HOST_PORT:-6380}:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s