ohmyapi commited on
Commit
a431c63
·
verified ·
1 Parent(s): 07f6b3b

Add Hugging Face Docker Space files for claude2api deploy

Browse files
Files changed (4) hide show
  1. .dockerignore +5 -0
  2. Dockerfile +5 -0
  3. README.md +409 -4
  4. docker-compose.yml +67 -0
.dockerignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ .git
2
+ .env
3
+ .env.*
4
+ !.env.example
5
+ docker-compose.yml
Dockerfile ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ FROM pushzx/claude2api:latest
2
+
3
+ ENV LISTEN_ADDR=:7860
4
+
5
+ EXPOSE 7860
README.md CHANGED
@@ -1,10 +1,415 @@
1
  ---
2
- title: C2api
3
- emoji: 🌖
4
  colorFrom: purple
5
- colorTo: blue
6
  sdk: docker
 
7
  pinned: false
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Claude2API
3
+ emoji: 🔁
4
  colorFrom: purple
5
+ colorTo: indigo
6
  sdk: docker
7
+ app_port: 7860
8
  pinned: false
9
  ---
10
 
11
+ # Claude2API 部署指南
12
+
13
+ Claude.ai Web → Anthropic API 兼容代理。将 Claude.ai 账号会话转换为标准 `/v1/messages` 接口,支持流式输出、工具调用、图片上传、扩展思考等功能。
14
+
15
+ ## Hugging Face Spaces
16
+
17
+ ### 推荐模式
18
+
19
+ Hugging Face Spaces 推荐先使用 **Simple 模式**。Spaces 只运行单容器,当前仓库中的 `postgres`、`redis`、`watchtower` 仅适用于 `docker-compose.yml` 的本地 / VPS 部署,不直接用于 HF。
20
+
21
+ ### 必要 Secrets
22
+
23
+ - `CLAUDE_SESSION_KEYS`
24
+ - `CLAUDE_API_KEY`
25
+ - `ADMIN_PASS`
26
+
27
+ ### 推荐 Variables
28
+
29
+ - `LISTEN_ADDR=:7860`
30
+ - `ADMIN_USER=admin`
31
+
32
+ ### 可选 Secrets
33
+
34
+ - `PROXY_HOST`
35
+ - `PROXY_PORT`
36
+ - `PROXY_USER`
37
+ - `PROXY_PASS`
38
+ - `PROXY_REGION`
39
+ - `DB_HOST`
40
+ - `DB_PORT`
41
+ - `DB_USER`
42
+ - `DB_PASS`
43
+ - `DB_NAME`
44
+ - `REDIS_URL`
45
+
46
+ ### 说明
47
+
48
+ - `config.yaml` 不参与此服务配置,运行时参数全部来自环境变量
49
+ - 若仅提供 `CLAUDE_SESSION_KEYS`,可跳过 PostgreSQL / Redis
50
+ - 若需要管理面板持久化能力,应改用外部 PostgreSQL / Redis,而不是复用 compose sidecar
51
+ - 对外开放时,建议始终设置 `CLAUDE_API_KEY`
52
+
53
+ ### 部署后验证
54
+
55
+ ```bash
56
+ curl https://<space>.hf.space/health
57
+
58
+ curl https://<space>.hf.space/v1/messages \
59
+ -H "Content-Type: application/json" \
60
+ -H "Authorization: Bearer $CLAUDE_API_KEY" \
61
+ -d '{
62
+ "model": "claude-sonnet-4-6",
63
+ "max_tokens": 64,
64
+ "messages": [{"role": "user", "content": "hello"}]
65
+ }'
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 快速部署
71
+
72
+ ### 1. 克隆此仓库
73
+
74
+ ```bash
75
+ git clone https://github.com/realnoob007/claude2api-deploy.git
76
+ cd claude2api-deploy
77
+ ```
78
+
79
+ ### 2. 配置环境变量
80
+
81
+ ```bash
82
+ cp .env.example .env
83
+ nano .env # 填入你的配置
84
+ ```
85
+
86
+ ### 3. 启动服务
87
+
88
+ ```bash
89
+ docker compose up -d
90
+ ```
91
+
92
+ ### 4. 验证
93
+
94
+ ```bash
95
+ curl http://localhost:8080/health
96
+ # {"status":"ok","accounts":1}
97
+ ```
98
+
99
+ ---
100
+
101
+ ## 两种运行模式
102
+
103
+ ### 模式一:Simple 模式(推荐新手,无需数据库)
104
+
105
+ 在 `.env` 中设置:
106
+
107
+ ```env
108
+ CLAUDE_SESSION_KEYS=sk-ant-sid01-xxx,sk-ant-sid01-yyy
109
+ ```
110
+
111
+ 多个 Session Key 用逗号分隔,服务启动后自动轮询使用,无需 PostgreSQL。
112
+
113
+ ### 模式二:PostgreSQL 模式(推荐生产)
114
+
115
+ `docker-compose.yml` 已内置 PostgreSQL 和 Redis,**开箱即用,无需额外安装**。
116
+
117
+ 在 `.env` 中配置(`DB_HOST` 固定填 `postgres`,对应 compose 内的服务名):
118
+
119
+ ```env
120
+ DB_HOST=postgres
121
+ DB_PORT=5432
122
+ DB_USER=claude2api
123
+ DB_PASS=your_strong_password # 必填,自定义强密码
124
+ DB_NAME=claude2api
125
+
126
+ REDIS_PASS=your_redis_password # 必填,需与 REDIS_URL 保持一致
127
+ REDIS_URL=redis://:your_redis_password@redis:6379/0
128
+ ```
129
+
130
+ > 如需连接**外部**数据库,将 `DB_HOST` 改为远程 IP/域名,并在 `docker-compose.yml` 中删除 `postgres` 和 `redis` 服务及对应的 `depends_on`。
131
+
132
+ 通过管理面板动态添加/删除账号,支持每账号独立限额、封禁自动切换等高级功能。
133
+
134
+ ---
135
+
136
+ ## 获取 Session Key
137
+
138
+ 1. 打开 [claude.ai](https://claude.ai) 并登录
139
+ 2. 打开浏览器开发者工具(F12)→ Application → Cookies
140
+ 3. 找到 `sessionKey`,复制其值(格式:`sk-ant-sid01-...`)
141
+
142
+ ---
143
+
144
+ ## 配置说明
145
+
146
+ | 变量 | 默认值 | 说明 |
147
+ |---|---|---|
148
+ | `LISTEN_ADDR` | `:8080` | 服务监听地址,格式为 `:端口号` |
149
+ | `CLAUDE_SESSION_KEYS` | — | Simple 模式:逗号分隔的 Session Keys |
150
+ | `DB_HOST` | `localhost` | PostgreSQL 主机 IP 或域名 |
151
+ | `DB_PORT` | `5432` | PostgreSQL 端口(默认 5432,远程可能不同)|
152
+ | `DB_USER` | `claude2api` | PostgreSQL 用户名 |
153
+ | `DB_PASS` | — | PostgreSQL 密码 |
154
+ | `DB_NAME` | `claude2api` | PostgreSQL 数据库名 |
155
+ | `PROXY_HOST` | — | 住宅代理主机(留空则直连 claude.ai)|
156
+ | `PROXY_PORT` | `3010` | 代理端口 |
157
+ | `PROXY_USER` | — | 代理认证用户名 |
158
+ | `PROXY_PASS` | — | 代理认证密码 |
159
+ | `PROXY_REGION` | `US` | 代理出口区域(如 `US`、`JP`、`GB`)|
160
+ | `ADMIN_USER` | `admin` | 管理面板用户名 |
161
+ | `ADMIN_PASS` | `admin` | 管理面板密码(**务必修改**)|
162
+ | `REDIS_URL` | — | Redis 连接串,用于持久化 metrics(可选)|
163
+ | `CLAUDE_DAILY_LIMIT` | `0` | 每账号每日请求上限(`0` = 不限)|
164
+ | `MAX_RETRIES` | `3` | 账号切换重试次数 |
165
+ | `COOLDOWN_MINUTES` | `5` | 触发 429 后冷却时间(分钟)|
166
+ | `CLAUDE_API_KEY` | — | 保护 `/v1/messages` 的 API Key(可选)|
167
+
168
+ ---
169
+
170
+ ## 数据库连接说明
171
+
172
+ 默认使用 `docker-compose.yml` 内置的 PostgreSQL 容器,`DB_HOST` 固定填服务名 `postgres`,无需额外安装。
173
+
174
+ ```env
175
+ # 默认:使用内置 postgres 容器
176
+ DB_HOST=postgres
177
+ DB_PORT=5432
178
+ DB_USER=claude2api
179
+ DB_PASS=your_strong_password
180
+ DB_NAME=claude2api
181
+ ```
182
+
183
+ 如需连接外部 PostgreSQL(托管云数据库等),将 `DB_HOST` 改为对应 IP 或域名,`DB_PORT` 改为实际端口,并删除 `docker-compose.yml` 中的 `postgres` 服务和 `depends_on` 相关配置。
184
+
185
+ ```env
186
+ # 示例:外部托管数据库
187
+ DB_HOST=db.example.com
188
+ DB_PORT=5433
189
+ DB_USER=claude2api
190
+ DB_PASS=your_strong_password
191
+ DB_NAME=claude2api
192
+ ```
193
+
194
+ ---
195
+
196
+ ## Redis 连接说明
197
+
198
+ 默认使用 `docker-compose.yml` 内置的 Redis 容器。`REDIS_PASS` 和 `REDIS_URL` 中的密码必须保持一致。
199
+
200
+ ```env
201
+ # 默认:使用内置 redis 容器
202
+ REDIS_PASS=your_redis_password
203
+ REDIS_URL=redis://:your_redis_password@redis:6379/0
204
+ ```
205
+
206
+ 如需连接外部 Redis,将 `REDIS_URL` 中的主机名改为实际地址,并删除 `docker-compose.yml` 中的 `redis` 服务和 `depends_on` 相关配置:
207
+
208
+ ```env
209
+ # 示例:外部 Redis(带密码,非标准端口)
210
+ REDIS_URL=redis://:your_redis_password@redis.example.com:6388/0
211
+ ```
212
+
213
+ 连接串通用格式:
214
+ ```
215
+ redis://:密码@主机:端口/库编号
216
+ ```
217
+
218
+ ---
219
+
220
+ ## 代理配置说明
221
+
222
+ `PROXY_HOST`、`PROXY_PORT`、`PROXY_USER`、`PROXY_PASS`、`PROXY_REGION` 共同组成代理连接信息。留空则直连 claude.ai。
223
+
224
+ 代理地址由服务内部按以下规则自动拼接:
225
+
226
+ | 场景 | 实际效果 |
227
+ |---|---|
228
+ | 仅填 `PROXY_HOST` / `PROXY_PORT` | 直连代理,无认证 |
229
+ | 填写 `PROXY_USER` / `PROXY_PASS` | 固定用户名密码认证 |
230
+ | 用户名含 `{sid}` 占位符 | 按账号固定出口 IP(旋转住宅代理)|
231
+ | 用户名含 `region-XX` | 指定出口区域(arxlabs 等服务商格式)|
232
+
233
+ 管理面板中也可为每个账号单独配置代理,支持以下格式:
234
+
235
+ ```
236
+ # 直连(不走代理)
237
+ 留空
238
+
239
+ # 固定代理(无认证)
240
+ http://proxy.example.com:3128
241
+
242
+ # 固定代理(用户名密码认证)
243
+ http://user:pass@proxy.example.com:3010
244
+
245
+ # 旋转住宅代理(按账号固定 IP,{sid} 会被替换为账号唯一标识)
246
+ http://user-session-{sid}:pass@us.arxlabs.io:3010
247
+
248
+ # 旋转住宅代理 + 指定区域(arxlabs / brightdata 等常见格式)
249
+ http://user-region-US-session-{sid}:pass@us.arxlabs.io:3010
250
+ http://user-country-JP-session-{sid}:pass@proxy.provider.io:3010
251
+ ```
252
+
253
+ ---
254
+
255
+ ## API 使用
256
+
257
+ 服务兼容 Anthropic Messages API:
258
+
259
+ ```bash
260
+ curl http://localhost:8080/v1/messages \
261
+ -H "Content-Type: application/json" \
262
+ -H "Authorization: Bearer $CLAUDE_API_KEY" \
263
+ -d '{
264
+ "model": "claude-sonnet-4-6",
265
+ "max_tokens": 1024,
266
+ "messages": [{"role": "user", "content": "你好!"}]
267
+ }'
268
+ ```
269
+
270
+ 未设置 `CLAUDE_API_KEY` 时,`Authorization` 头可省略。
271
+
272
+ ### 支持的模型名
273
+
274
+ | 请求模型名(示例) | 实际路由 |
275
+ |---|---|
276
+ | `claude-sonnet-4-6` | claude-sonnet-4-6 |
277
+ | `claude-sonnet-4-5` | claude-sonnet-4-5-20250929 |
278
+ | `claude-haiku-4-5` | claude-haiku-4-5-20251001 |
279
+ | `claude-opus-4-6` | claude-opus-4-6(需要 Pro)|
280
+ | `*-thinking` 后缀 | 同模型 + 开启扩展思考 |
281
+ | 自定义映射 | 在管理面板配置 |
282
+
283
+ ---
284
+
285
+ ## 管理面板
286
+
287
+ 访问 `http://localhost:8080/admin`,使用 `ADMIN_USER` / `ADMIN_PASS` 登录。
288
+
289
+ 功能:
290
+ - 账号管理(添加 / 批量导入 / 删除 / 状态监控)
291
+ - 代理配置(支持 `{sid}` 占位符实现按账号固定 IP)
292
+ - 模型名映射(自定义入参模型名 → Claude.ai 模型名)
293
+ - 实时 metrics(请求数、延迟、成功率)
294
+ - 全局限速配置
295
+ - API Key 管理
296
+ - 支持中文 / English 切换,深色 / 浅色主题
297
+
298
+ ---
299
+
300
+ ## Docker 镜像说明
301
+
302
+ | 镜像标签 | 架构 | 适用场景 |
303
+ |---|---|---|
304
+ | `pushzx/claude2api:latest` | amd64 (x86_64) | 普通 PC / 云服务器 |
305
+ | `pushzx/claude2api:latest-arm64` | arm64 (aarch64) | 树莓派、Apple Silicon、ARM 云服务器 |
306
+
307
+ ARM 设备部署时,在 `docker-compose.yml` 中将镜像名改为:
308
+
309
+ ```yaml
310
+ image: pushzx/claude2api:latest-arm64
311
+ ```
312
+
313
+ ---
314
+
315
+ ## 更新镜像
316
+
317
+ ```bash
318
+ docker compose pull
319
+ docker compose up -d
320
+ ```
321
+
322
+ ---
323
+
324
+ ## 更新日志
325
+
326
+ ### v0.7.0 — 2026-03-11
327
+ **新增 SOCKS5/SOCKS4 代理支持 + SOCKS 错误自动重试**
328
+
329
+ 后端:
330
+ - `claude/client.go`:`isNetworkError()` 新增 `socks5`、`socks4`、`socks connect`、`proxy` 关键字检测,SOCKS 代理连接失败时自动触发重试
331
+
332
+ 管理面板:
333
+ - Fixed 代理卡片新增 `socks5://user:pass@host:port`、`socks5h://user:pass@host:port` 示例格式
334
+ - Rotating 代理卡片新增 SOCKS5 旋转代理示例(`socks5://user-session-{sid}:pass@host:port`)
335
+ - 中英文 i18n 描述同步更新,注明同时支持 `socks4` / `socks4a` 格式
336
+ - tls-client 基于 `golang.org/x/net/proxy` 原生支持全部 SOCKS 协议,无需额外依赖
337
+
338
+ 代理格式(管理面板中可直接填写):
339
+
340
+ ```
341
+ # SOCKS5(标准,远端 DNS 解析)
342
+ socks5://user:pass@host:port
343
+
344
+ # SOCKS5h(DNS 交由代理服务器解析,适合穿透场景)
345
+ socks5h://user:pass@host:port
346
+
347
+ # SOCKS4 / SOCKS4a
348
+ socks4://host:port
349
+ socks4a://host:port
350
+
351
+ # 旋转 SOCKS5({sid} 替换为账号唯一标识)
352
+ socks5://user-session-{sid}:pass@host:port
353
+ ```
354
+
355
+ ---
356
+
357
+ ### v0.6.0 — 2026-03-10
358
+ **修复 403 封禁判断、账号过滤器、输入样式、上下文错误处理**
359
+
360
+ 后端:
361
+ - `IsBanError`:移除对 `permission_error` 的豁免 — 403 + `account_session_invalid` 现在正确标记账号为封禁(之前被静默忽略)
362
+ - 新增 Claude stream error 事件处理(上下文过长等):流式路径发送 SSE error 事件;非流式返回 HTTP 400 + 标准 JSON 错误体
363
+
364
+ 前端(管理面板):
365
+ - 账号状态过滤 Pills(全部 / 活跃 / 冷却 / 封禁),实时显示各状态数量
366
+ - 邮箱 + Session Key 搜索框(纯客户端过滤,无额外请求)
367
+ - `renderAccounts()` 与 `refreshAccounts()` 解耦,过滤操作即时响应
368
+ - 模型映射新增行:虚线卡片展示 INPUT → TARGET 标签和箭头
369
+ - CSS:`input:not([type])` 选择器修复裸 `<input>` 标签(mmNewKey、mmCustomVal、accountSearch 在深色模式下白色背景问题)
370
+ - `select` 元素与 `input` 样式统一(边框、圆角、焦点环)
371
+ - i18n 新增:filterAll / filterActive / filterLimited / filterBanned / searchPlaceholder
372
+
373
+ ---
374
+
375
+ ### v0.5.0 — 2026-03-10
376
+ **新增精确 Token 计数(tiktoken-go / cl100k_base)+ ARM64 镜像支持**
377
+
378
+ - `claude/tokens.go`:用 `github.com/tiktoken-go/tokenizer` 替换原有字符估算启发式算法,采用 cl100k_base 编码(与 Claude/GPT-4 一致);codec 通过 `sync.Once` 初始化,不可用时自动回退到字符估算
379
+ - `EstimateRequestTokens`:精确统计 system、messages(text / tool_use / tool_result / image)及工具定义的 token 数
380
+ - `StreamTranslator`:在每个 `text_delta` / `thinking_delta` 事件中累计 `outputTokens`
381
+ - 所有 SSE `message_delta` 及非流式响应现在携带真实的 `input_tokens` / `output_tokens`
382
+ - 新增 `pushzx/claude2api:latest-arm64` Docker 镜像,支持树莓派等 ARM 设备部署
383
+
384
+ ---
385
+
386
+ ### v0.4.0 — 2026-03-10
387
+ **Fix 502 EOF:TLS 客户端缓存 + 全链路网络重试**
388
+
389
+ 根本原因:原版每次 API 调用都创建全新的 TLS 客户端,导致每个子请求(GetOrgID、CreateConversation、SendMessage、UploadFile 等)都需要重新建立 TCP+TLS 握手。在住宅代理环境下,频繁触发 EOF / 连接重置错误。
390
+
391
+ 修复内容:
392
+ - `proxy/session.go`:按 `(sessionKey + proxyURL)` 缓存 TLS 客户端,同一账号复用 keep-alive 连接;代理地址变更时自动创建新连接(旧缓存 GC 回收);新增 `InvalidateAccount()` 支持封号/错误时主动驱逐缓存
393
+ - `claude/client.go`:新增 `isNetworkError()` + `doWithRetry()` 辅助函数,所有 HTTP 调用在 EOF、连接重置、broken pipe、超时、TLS 握手错误等瞬态网络异常时自动重试最多 3 次,每次重试前主动废弃缓存连接以确保建立新连接
394
+ - `handler/messages.go`:消息处理改进
395
+
396
+ ---
397
+
398
+ ### v0.3.0 — 2026-03-09
399
+ **修复与优化:流式输出、重试、多轮工具调用历史**
400
+
401
+ - **工具调用多轮历史**:`buildAssistantTurn` 正确合并 text + tool_use;`tool_result` 作为顶层段落输出,不再错误地包裹 `**User**:` 前缀
402
+ - **ReAct 解析**:`extractJSONObject` 改为大括号深度解析器,替换原有正则,正确处理嵌套 `{}` 的 Python 代码块(字典、类定义、f-string)
403
+ - **图片上传**:改为并发 goroutine 上传,N 张图片耗时从 `N×时间` 降为 `max(上传时间)`;每个文件自动重试 3 次
404
+ - **其他**:启动时自动加载 `.env`;Paprika 模式缓存(`sync.Map`)避免每次请求都触发冗余 PATCH
405
+
406
+ ---
407
+
408
+ ### v0.2.0 — 2026-03-08
409
+ **完整 tool_use 实现(ReAct 格式,参考 web2api 方案)**
410
+
411
+ - 复刻 web2api 经过验证的 ReAct 工具调用策略,适配 Anthropic API 格式
412
+ - **Prompt 侧**:携带 `tools` 数组时自动注入 ReAct 格式规范 + 工具定义;多轮历史中 `tool_use` 块转为 Action/Action Input,`tool_result` 块转为 Observation,支持连续工具调用推理
413
+ - **流式解析**:`reActActive` 模式下文本块静默缓存;`message_delta` 时 `ParseReActOutput` 检测工具调用/最终回答,触发正确的 Anthropic SSE 事件序列
414
+ - **非流式**:收集 `content_block_start(tool_use)` + `input_json_delta`,构建完整 `tool_use` 响应块
415
+ - `stop_reason` 在检测到工具调用时正确设置为 `"tool_use"`
docker-compose.yml ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ services:
2
+ claude2api:
3
+ image: pushzx/claude2api:latest
4
+ container_name: claude2api
5
+ restart: unless-stopped
6
+ ports:
7
+ - "${PORT:-8080}:8080"
8
+ env_file:
9
+ - .env
10
+ environment:
11
+ - LISTEN_ADDR=:8080
12
+ depends_on:
13
+ postgres:
14
+ condition: service_healthy
15
+ redis:
16
+ condition: service_healthy
17
+ healthcheck:
18
+ test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"]
19
+ interval: 30s
20
+ timeout: 5s
21
+ retries: 3
22
+ start_period: 15s
23
+
24
+ postgres:
25
+ image: postgres:16-alpine
26
+ container_name: claude2api-postgres
27
+ restart: unless-stopped
28
+ environment:
29
+ POSTGRES_USER: ${DB_USER:-claude2api}
30
+ POSTGRES_PASSWORD: ${DB_PASS}
31
+ POSTGRES_DB: ${DB_NAME:-claude2api}
32
+ volumes:
33
+ - postgres_data:/var/lib/postgresql/data
34
+ healthcheck:
35
+ test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-claude2api} -d ${DB_NAME:-claude2api}"]
36
+ interval: 10s
37
+ timeout: 5s
38
+ retries: 5
39
+
40
+ redis:
41
+ image: redis:7-alpine
42
+ container_name: claude2api-redis
43
+ restart: unless-stopped
44
+ command: redis-server --requirepass ${REDIS_PASS:-redis_secret}
45
+ volumes:
46
+ - redis_data:/data
47
+ healthcheck:
48
+ test: ["CMD", "redis-cli", "-a", "${REDIS_PASS:-redis_secret}", "ping"]
49
+ interval: 10s
50
+ timeout: 5s
51
+ retries: 5
52
+
53
+ watchtower:
54
+ image: containrrr/watchtower
55
+ container_name: claude2api-watchtower
56
+ restart: unless-stopped
57
+ volumes:
58
+ - /var/run/docker.sock:/var/run/docker.sock
59
+ environment:
60
+ - WATCHTOWER_POLL_INTERVAL=600
61
+ - WATCHTOWER_CLEANUP=true
62
+ - WATCHTOWER_INCLUDE_STOPPED=false
63
+ command: claude2api
64
+
65
+ volumes:
66
+ postgres_data:
67
+ redis_data: