Files
host_message/README.md
2026-02-13 12:33:43 +08:00

177 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FastAPI 文件共享和聊天应用
这是一个基于FastAPI的文件共享和实时聊天应用支持Docker部署并解决了Docker环境下IP获取错误的问题。
## ✨ 主要功能
- 📁 文件上传和下载
- 💬 实时聊天WebSocket
- 👥 显示在线用户
- 🔍 真实IP地址获取支持Docker/代理环境)
- ❤️ 健康检查
- 🗑️ 文件删除功能
## 🚀 快速开始
### 方式1Docker Compose推荐
```bash
# 使用nginx反向代理推荐支持真实IP
docker-compose up -d
# 访问应用
open http://localhost
# 查看日志
docker-compose logs -f
```
### 方式2仅FastAPI服务
```bash
# 构建并运行
docker-compose up -d web
# 访问应用
open http://localhost:1000
```
### 方式3本地开发
```bash
# 安装依赖
pip install -r requirements.txt
# 开发模式启动
./start.sh dev
# 或直接启动
python main.py
```
## 🔧 IP获取优化
### 问题说明
在Docker环境中传统的 `request.client.host` 会返回Docker内部网络IP如172.x.x.x而不是真实的客户端IP。
### 解决方案
本项目实现了智能IP获取机制
1. **优先级顺序**
- `X-Forwarded-For` 头部
- `X-Real-IP` 头部
- `client.host`排除Docker内部IP
2. **支持的代理场景**
- Nginx反向代理
- Docker网络
- Cloudflare等CDN
- 各种负载均衡器
### 配置示例
#### Nginx配置
```nginx
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
```
#### Docker启动参数
```bash
uvicorn main:app --proxy-headers --forwarded-allow-ips "*"
```
## 📁 项目结构
```
├── main.py # 主应用文件
├── templates/ # HTML模板
│ ├── index.html # 文件上传页面
│ └── chat.html # 聊天页面
├── uploads/ # 文件存储目录
├── Dockerfile # Docker构建文件
├── docker-compose.yml # Docker编排文件
├── nginx.conf # Nginx配置
├── requirements.txt # Python依赖
├── start.sh # 启动脚本
└── README.md # 说明文档
```
## 🔗 API端点
| 端点 | 方法 | 描述 |
|------|------|------|
| `/` | GET | 主页(文件上传) |
| `/chat` | GET | 聊天页面 |
| `/upload` | POST | 上传文件 |
| `/files` | GET | 获取文件列表 |
| `/files/{filename}` | DELETE | 删除文件 |
| `/get_ip` | GET | 获取客户端IP |
| `/ws` | WebSocket | 聊天WebSocket |
| `/health` | GET | 健康检查 |
| `/online_users` | GET | 获取在线用户 |
## 🐳 Docker部署细节
### 环境变量
```bash
FORWARDED_ALLOW_IPS=* # 允许所有IP转发
PROXY_HEADERS=1 # 启用代理头部
```
### 端口映射
- `1000` - FastAPI应用端口
- `80` - Nginx反向代理端口可选
### 数据持久化
```yaml
volumes:
- ./uploads:/app/uploads # 文件存储持久化
```
## 🛠️ 开发说明
### 本地开发
```bash
# 安装依赖
pip install -r requirements.txt
# 启动开发服务器
./start.sh dev
# 或者
python main.py
```
### 调试IP获取
```python
# 查看请求头
print(request.headers)
# 测试IP获取函数
ip = get_real_client_ip(request=request)
print(f"Client IP: {ip}")
```
## 🚨 常见问题
### Q: Docker中IP显示为172.x.x.x
A: 使用nginx反向代理或确保启动时包含 `--proxy-headers` 参数。
### Q: WebSocket连接失败
A: 检查防火墙设置和代理配置。
### Q: 文件上传失败?
A: 检查uploads目录权限和磁盘空间。
### Q: 健康检查失败?
A: 确保应用正常启动并且端口未被占用。
## 📄 许可证
MIT License
## 🤝 贡献
欢迎提交Issue和Pull Request