一个可配置的多端口反向代理套件,基于 mitmproxy/mitmweb,支持:
- 通过
proxies.json一次性定义多个反向代理目标 - 自动生成并启动对应容器,端口与日志独立
- 健康检查、日志滚动、快速重启与查看
- 可选 Web UI 密码(支持明文或 Argon2 哈希)
- 启用 Docker BuildKit 的 pip 缓存快速构建
make up # 生成 docker-compose.generated.yml 并启动
make ps # 查看容器状态
make logs # 跟随日志
make restart # 变更后重建并启动
make down # 停止并删除容器- 如需隔离不同工作区,可覆盖项目名:
PROJECT_NAME=multi-mitmproxy-dev make upexport IMAGE_REPO=luckybill/multi-mitmproxy-service
make up- 或直接运行:
docker run -p 8080:48080 -p 8081:48081 \
-e MITM_REVERSE_TARGET=http://host.docker.internal:11434 \
-e MITM_WEB_PASSWORD=5555.5555 \
luckybill/multi-mitmproxy-service:latest- Docker Hub:
https://hub.docker.com/r/luckybill/multi-mitmproxy-service - GitHub Repo:
https://github.com/BillLucky/multi-mitmproxy-service
访问:
- 代理端口:见
proxies.json的host_proxy_port - Web UI:见
proxies.json的host_web_port - 若配置了
web_password,可用http://localhost:<web_port>/?token=<web_password>首次登录
编辑 proxies.json:
{
"proxies": [
{
"name": "11434",
"target": "http://host.docker.internal:11434",
"host_proxy_port": 48084,
"host_web_port": 48085,
"web_password": "$argon2id$v=19$m=4096,t=3,p=1$UJkTjY9A73NJo7QdAeSJhQ$iqqkhTvomJhA/IO33n4P/a9BLS548QaxTj4mTbBEshE",
"volumes": ["./mitmproxy-conf:/root/.mitmproxy:rw"],
"env": { "SSLKEYLOGFILE": "/app/logs/sslkeylog.txt" }
},
{
"name": "11435",
"target": "http://host.docker.internal:11435",
"host_proxy_port": 48082,
"host_web_port": 48083
}
]
}name:用于服务名区分与容器命名target:反向代理目标(宿主端口可用host.docker.internal:<port>)host_proxy_port:宿主机暴露的 HTTP(S) 代理端口(容器内固定使用48080)host_web_port:宿主机暴露的 Web UI 端口(容器内固定使用48081)web_password:可选,支持明文或 Argon2 哈希。首次登录可直接访问/?token=<password>volumes:可选,挂载额外目录或文件。示例将宿主机./mitmproxy-conf挂载为容器内~/.mitmproxy,以加载自定义证书与配置。env:可选,额外环境变量。例如SSLKEYLOGFILE输出 TLS 密钥日志,便于 Wireshark 解密。
修改完成后执行:
make up{
"proxies": [
{
"name": "ollama",
"target": "http://host.docker.internal:11434",
"host_proxy_port": 48084,
"host_web_port": 48085,
"flow_log": "/app/logs/flows/ollama.flow",
"web_log": "/app/logs/web/ollama.log",
"env": { "STREAM_TO_STDOUT": "1" },
"volumes": [
"./captures:/app/logs:rw",
"./mitmproxy-conf:/root/.mitmproxy:rw"
]
},
{
"name": "apiA",
"target": "http://host.docker.internal:9000",
"host_proxy_port": 49080,
"host_web_port": 49081,
"flow_log": "/app/logs/flows/apiA.flow",
"web_log": "/app/logs/web/apiA.log",
"env": { "SSLKEYLOGFILE": "/app/logs/sslkeylog.txt", "STREAM_TO_STDOUT": "1" },
"volumes": [
"./captures:/app/logs:rw",
"./mitmproxy-conf:/root/.mitmproxy:rw"
]
}
]
}make up
open http://localhost:48085/?token=<password>
open http://localhost:49081/?token=<password>说明
flow_log/web_log:按服务自定义日志文件路径(默认分别为/app/logs/log_<proxy>.flow与/app/logs/mitmweb_<proxy>.log)STREAM_TO_STDOUT=1:同时将web_log与flow_log流式输出到容器标准输出,配合docker compose logs -f观察./captures:/app/logs:rw:统一挂载日志根目录到宿主机,保存所有服务的捕获内容
- 生成器:
tools/gen_compose.py读取proxies.json,生成docker-compose.generated.yml - Compose:基础文件
docker-compose.yml仅包含通用锚点与空services,具体服务全部来自生成文件 - 容器端口:所有容器内部统一使用
48080/48081,宿主映射端口由proxies.json决定 - 健康检查:每个容器对
127.0.0.1:<web_port>进行 HTTP 检查,保证 UI 可达 - 日志:
driver=local,max-size=100m,max-file=3,各服务单独目录
- 实际启动的服务与端口以
docker-compose.generated.yml为准 docker-compose.yml的services: {}不启动任何服务,仅提供通用配置.env文件不再参与服务端口配置(可用于你自定义环境,不影响生成器输出)- 容器名称由 Compose 自动生成,格式通常为
<project>-<service>-<index> - Web UI 端口:
<host_web_port>;代理端口:<host_proxy_port>
- 问题:当你在本机调试 Ollama 的
11434端口,或调用任意后端 API,常常需要同时“看见”请求与响应,以便迭代提示词、参数与返回内容。传统做法要么在代码埋日志,要么开抓包工具,既费力又不易分享上下文。 - 方案:用本项目为目标端口启动一个反向代理容器。代理端口对外提供稳定入口、Web UI 可视化流量,日志与 CA/配置可挂载到宿主机持久化。
- 收益:
- 一键为多个端口生成“观测点”,代理复用容器内固定端口(48080/48081),宿主机端口自定义;
mitmweb提供请求/响应体、Header、时间线等信息,帮助你快速洞察哪一步造成延迟或错误;- 挂载
SSLKEYLOGFILE可配合 Wireshark 解密 TLS,定位更隐蔽的问题; - 文档与 Makefile 统一操作,团队共享镜像即可复用,无需每人手动构建。
- 示例:为 Ollama
11434启服务,宿主代理端口设为48084,Web 端口48085:proxies.json设置target=http://host.docker.internal:11434,host_proxy_port=48084,host_web_port=48085make up后访问http://localhost:48084/与http://localhost:48085/?token=<密码>,即可观察请求与响应
- What: A configurable multi-port reverse proxy suite built on mitmproxy/mitmweb.
- Why: Give API/AI/backend developers a “port observatory” to visualize requests/responses while iterating prompts and parameters.
- How:
- Define multiple targets in
proxies.json, auto-generate services with isolated proxy/UI/log directories. - Web UI visualizes headers, bodies, and timelines. Mount logs/certs to persist context. Optional
SSLKEYLOGFILEfor TLS decryption (Wireshark).
- Define multiple targets in
- Quick Start:
docker run -p 8080:48080 -p 8081:48081 \
-e MITM_REVERSE_TARGET=http://host.docker.internal:11434 \
-e MITM_WEB_PASSWORD=yourpass \
luckybill/multi-mitmproxy-service:latest- Multiple Services:
export IMAGE_REPO=luckybill/multi-mitmproxy-service
make up- Links:
- 明文:
"web_password": "yourpass" - Argon2 哈希:
"web_password": "$argon2id$...."- 生成方式:
make hash PASSWORD=yourpass(返回哈希,直接粘贴进proxies.json) - 说明:生成器自动转义
$,避免 Compose 变量展开破坏哈希
- 生成方式:
- 登录方式:
- 浏览器直接访问:
http://localhost:<web_port>/?token=<web_password> - 或添加请求头:
Authorization: Bearer <web_password>
- 浏览器直接访问:
- Docker 使用层缓存复用依赖安装层,重复构建会显著减少耗时
- 若本机未开启 BuildKit,可手动启用:
export DOCKER_BUILDKIT=1 - 可通过
docker builder prune清理缓存并强制全量重建
make generate # 仅生成 compose 文件
make check # 配置与语法校验
make up # 生成 + 启动
make restart # 生成 + 重建 + 启动
make ps # 查看
make logs # 跟随日志
make down # 停止
make clean # 清理生成的 compose 文件
make hash PASSWORD=yourpass # 生成 Argon2 哈希
# 推送到 Docker Hub
make dockerhub-login
make dockerhub-build DOCKER_REPO=luckybill/multi-mitmproxy-service VERSION=1.0.0
make dockerhub-push DOCKER_REPO=luckybill/multi-mitmproxy-service VERSION=1.0.0- 端口不可重复:生成器会检查所有宿主端口冲突(含跨服务、跨 proxy/web)
- 如你本机已有进程占用某端口,请调整
proxies.json中对应端口避免冲突 - 首次登录建议用
/?token=方式自动建立会话,后续靠 Cookie 维持 make up内置一次自愈重试:首次启动若遇到 Docker 残留状态,会先清理孤儿资源再自动重启- 建议在提交前执行
make check,快速发现配置和 Compose 结构问题
- 自定义证书与配置:在宿主机创建
./mitmproxy-conf,生成器示例将其挂载到容器内~/.mitmproxy,mitmproxy 会自动读取。 - 日志目录:每个服务自动挂载
./mitmproxy-logs/<proxy_port>:/app/logs,滚动策略为100m * 3。 - 挂载单个文件:可在
volumes中写入"./path/to/file:/container/path:ro";适合注入脚本或额外资源。 - 环境变量扩展:通过
env字段注入,例如启用SSLKEYLOGFILE或调整PIP_INDEX_URL、HTTP_PROXY等。 - 标准输出日志:设置
STREAM_TO_STDOUT=1后,容器会把web_log与flow_log同步到 stdout;查看make logs或docker compose logs -f - 日志滚动:默认每次启动为日志文件添加时间戳后缀,避免覆盖历史(可通过
ROLL_ON_START=0禁用,使用固定文件名) - 内存优化:设置
STREAM_LARGE_BODIES=1m(默认)让超过阈值的响应体直接流式传递不保留;可选BODY_SIZE_LIMIT=10m限制最大体积 - 纯录制模式:设置
MITM_UI_ENABLED=0使用后端mitmdump无 UI 录制,降低内存占用;健康检查自动切换为代理端口连通性
- 已提供工作流:
.github/workflows/docker.yml - 需要在仓库设置 Secrets:
DOCKERHUB_USERNAME:你的 Docker Hub 用户名DOCKERHUB_TOKEN:你的 Docker Hub Access TokenDOCKER_REPO:luckybill/multi-mitmproxy-service
- 触发策略:
- 对
main/master推送:构建并推送latest - 打标签
vX.Y.Z:构建并推送X.Y.Z版本标签
- 对
- 多架构:
linux/amd64, linux/arm64 - 缓存:使用远端 registry 缓存加速重复构建
- 症状:
No such container: <id>且make up失败,多见于 Docker/Compose 残留状态 - 现状:
make up已内置自动重试和清理,通常可直接恢复 - 仍失败时执行:
make down
docker compose -p multi-mitmproxy -f docker-compose.yml -f docker-compose.generated.yml down --remove-orphans
make up
make ps- 多项目并行建议显式设置
PROJECT_NAME,避免不同目录误复用同一 Compose 资源