blob: 7795d14b055891a71c8a2f4b3bc364945033d1ab [file] [log] [blame] [view] [raw]
# Docker 部署指南
## 📋 概述
本项目支持通过Docker容器化部署4个独立的Telegram Bot实例:
- **Tomato** (西红柿)
- **Cyrene**
- **Gold Ship** (黄金船)
- **LunaTalk Private**
每个bot都是独立的Docker容器,拥有自己的配置、日志和持久化数据。
## 🏗️ 架构设计
```
aichatbot/
├── Dockerfile # 共享的镜像定义
├── docker-bot.sh # 统一管理脚本
├── run/
│ ├── tomato/
│ │ ├── docker-compose.yml # Tomato bot配置
│ │ ├── .env.example # 环境变量模板
│ │ ├── .env # 实际配置(需创建)
│ │ ├── CLAUDE.md # 个性提示词
│ │ ├── bot.log # Bot日志
│ │ └── debug.log # 调试日志
│ ├── cyrene/ # 同上结构
│ ├── gold-ship/ # 同上结构
│ └── lunatalk_private/ # 同上结构
```
## 🚀 快速开始
### 1. 配置环境变量
每个bot目录都需要创建 `.env` 文件:
```bash
# 以Tomato为例
cd run/tomato
cp .env.example .env
nano .env # 编辑配置
```
必需的配置项:
- `ANTHROPIC_API_KEY` - Claude API密钥
- `TELEGRAM_BOT_TOKEN` - Telegram Bot Token
- `TELEGRAM_ALLOWED_USERS` - 允许的用户ID列表(JSON格式)
- `TELEGRAM_ALLOWED_GROUPS` - 允许的群组ID列表(JSON格式)
可选配置:
- `ANTHROPIC_BASE_URL` - 自定义API端点(留空使用官方API
- `WEBHOOK_PORT` - Webhook回调端口
### 2. 使用管理脚本
项目提供了便捷的管理脚本 `docker-bot.sh`
```bash
# 查看帮助
./docker-bot.sh help
# 启动单个bot
./docker-bot.sh start tomato
# 启动所有bot
./docker-bot.sh start all
# 停止bot
./docker-bot.sh stop tomato
# 重启bot
./docker-bot.sh restart cyrene
# 查看日志
./docker-bot.sh logs tomato
# 查看所有bot状态
./docker-bot.sh status
# 重新构建镜像
./docker-bot.sh build
# 清理Docker资源
./docker-bot.sh clean
```
### 3. 手动操作(不使用脚本)
如果你更喜欢手动操作:
```bash
# 启动单个bot
cd run/tomato
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止bot
docker-compose down
# 重启bot
docker-compose restart
# 查看容器状态
docker-compose ps
```
## 🔧 配置说明
### 环境变量详解
#### ANTHROPIC_API_KEY
Claude API密钥,从 [Anthropic Console](https://console.anthropic.com/) 获取。
**必需**
#### ANTHROPIC_BASE_URL
自定义API端点,用于:
- 使用代理服务器
- 第三方API提供商
- 自建Claude API端点
**可选**,留空使用官方API
#### TELEGRAM_BOT_TOKEN
Telegram Bot Token,从 [@BotFather](https://t.me/BotFather) 创建bot时获取。
**必需**
#### TELEGRAM_ALLOWED_USERS
允许使用bot的用户ID列表,JSON数组格式。
获取用户ID:发送消息给 [@userinfobot](https://t.me/userinfobot)
**示例**:
```bash
TELEGRAM_ALLOWED_USERS=[156318176, 123456789]
```
**必需**
#### TELEGRAM_ALLOWED_GROUPS
允许bot加入的群组ID列表,JSON数组格式。
获取群组ID:添加 [@raw_data_bot](https://t.me/raw_data_bot) 到群组
**注意**: 群组ID通常是负数
**示例**:
```bash
TELEGRAM_ALLOWED_GROUPS=[-1001074286857, -1002454076747]
```
**必需**
#### WEBHOOK_PORT
Webhook回调端口,默认值:
- Tomato: 30541
- Cyrene: 30542
- Gold Ship: 30543
- LunaTalk: 30544
**可选**
## 📊 数据持久化
每个bot使用Docker Volume持久化数据:
- **{bot}_data** - 对话历史和Agent状态
- **{bot}_sessions** - Claude SDK SessionsV2.2必需)
- **{bot}_temp** - 临时文件
查看Volumes
```bash
docker volume ls | grep claude-bot
```
清理特定bot的数据(⚠️ 会删除所有历史记录):
```bash
docker volume rm claude-bot-tomato_data
docker volume rm claude-bot-tomato_sessions
```
## 🔍 故障排除
### 1. Bot无法启动
**检查 .env 文件**:
```bash
cd run/tomato
cat .env
```
确保:
- 所有必需字段已填写
- JSON格式正确(no trailing commas
- 没有多余的空格
**查看日志**:
```bash
./docker-bot.sh logs tomato
```
### 2. API错误
**错误**: `401 Unauthorized`
- 检查 `ANTHROPIC_API_KEY` 是否正确
- 确认API密钥没有过期
**错误**: `403 Forbidden`
- 检查API额度是否充足
- 确认API密钥有正确的权限
### 3. Telegram连接失败
**检查Token**:
```bash
curl https://api.telegram.org/bot<YOUR_TOKEN>/getMe
```
**检查网络**:
```bash
docker exec -it claude-bot-tomato ping -c 3 api.telegram.org
```
### 4. 端口冲突
**错误**: `address already in use`
修改 `.env` 文件中的 `WEBHOOK_PORT`
```bash
WEBHOOK_PORT=40541 # 使用不同的端口
```
### 5. 日志文件权限错误
如果日志文件无法写入:
```bash
cd run/tomato
touch bot.log debug.log
chmod 666 bot.log debug.log
```
## 🔄 更新部署
### 更新代码
```bash
# 1. 拉取最新代码
git pull
# 2. 停止所有bot
./docker-bot.sh stop all
# 3. 重新构建镜像
./docker-bot.sh build
# 4. 启动所有bot
./docker-bot.sh start all
```
### 更新配置
修改 `.env` 文件后重启bot
```bash
./docker-bot.sh restart tomato
```
### 更新CLAUDE.md
修改 `run/{bot}/CLAUDE.md` 后重启bot
```bash
./docker-bot.sh restart tomato
```
## 📝 日志管理
### 查看实时日志
```bash
# 使用管理脚本
./docker-bot.sh logs tomato
# 或直接使用docker-compose
cd run/tomato
docker-compose logs -f
```
### 日志文件位置
每个bot的日志文件:
- `run/{bot}/bot.log` - Bot运行日志
- `run/{bot}/debug.log` - 详细调试日志
### 清理日志
```bash
# 清空日志文件
cd run/tomato
> bot.log
> debug.log
```
## 🔒 安全建议
1. **保护 .env 文件**
```bash
chmod 600 run/*/. env
```
2. **不要提交敏感信息到Git**
- `.env` 文件已在 `.gitignore`
- 只提交 `.env.example`
3. **定期更新依赖**
```bash
# 更新基础镜像
docker pull python:3.12-slim
# 重新构建
./docker-bot.sh build
```
4. **使用最小权限**
- 只授权必要的用户ID
- 只授权必要的群组ID
5. **监控API使用**
- 定期检查 [Anthropic Console](https://console.anthropic.com/)
- 设置使用限额
## 🌐 网络配置
每个bot使用独立的Docker网络:
- `claude-bot-tomato`
- `claude-bot-cyrene`
- `claude-bot-goldship`
- `claude-bot-lunatalk`
这确保了bot之间的隔离。
## 💡 最佳实践
1. **分阶段部署**
```bash
# 先测试单个bot
./docker-bot.sh start tomato
# 确认正常后再启动其他
./docker-bot.sh start all
```
2. **监控资源使用**
```bash
docker stats claude-bot-tomato
```
3. **定期备份数据**
```bash
# 备份Volume
docker run --rm -v claude-bot-tomato_data:/data \
-v $(pwd):/backup alpine \
tar czf /backup/tomato-backup.tar.gz -C /data .
```
4. **使用健康检查**
- 每个bot都配置了健康检查
- 不健康时Docker会自动重启
5. **日志轮转**
```bash
# 配置logrotate
sudo nano /etc/logrotate.d/claude-bot
```
## 🔗 相关文档
- [项目主文档](../../README.md)
- [V2.2 技术设计](../../docs/technical-design/)
- [Telegram Bot配置](../../docs/telegram-bot-setup.md)
## ❓ 常见问题
**Q: 可以在同一台机器上运行多个bot吗?**
A: 可以,每个bot是独立容器,使用不同的端口和网络。
**Q: 数据存储在哪里?**
A: 使用Docker Volume持久化存储,位置由Docker管理。
**Q: 如何迁移bot到另一台服务器?**
A: 导出Volume数据,传输到新服务器,导入Volume即可。
**Q: Bot重启后会丢失对话历史吗?**
A: 不会,对话历史持久化在Docker Volume中。
**Q: 可以使用自己的API代理吗?**
A: 可以,设置 `ANTHROPIC_BASE_URL` 环境变量。
---
**维护者**: Rivoreo AutoPilot
**最后更新**: 2025-12-11