1. 项目概述与核心价值最近在折腾AI绘画的自动化流程发现了一个宝藏级的开源项目——trueai-org/midjourney-proxy。简单来说这是一个功能极其强大的Midjourney API代理服务。它允许你通过标准的HTTP API来调用Midjourney的绘图能力而无需再手动登录Discord、在频道里输入指令、等待并手动点击按钮。对于需要批量生成图片、集成到自家应用或者单纯想摆脱Discord繁琐操作的朋友来说这简直是“生产力解放”神器。这个项目最吸引我的地方在于它的“全能性”。它不仅是一个简单的指令转发器更是一个集成了账号池管理、负载均衡、任务队列、图片存储、换脸、视频生成等众多高级功能的企业级解决方案。市面上虽然有不少类似的代理项目但像它这样功能全面、文档清晰、社区活跃且完全开源免费的确实不多见。我花了近一周时间从部署、配置到深度使用踩了不少坑也总结了不少经验这篇文章就来详细拆解一下这个项目分享如何从零开始搭建一个稳定、高效的私有化Midjourney API服务。2. 核心架构与设计思路拆解在深入部署细节之前我们先来理解一下这个项目的核心工作原理。知其然更要知其所以然这样在遇到问题时你才能快速定位。2.1 核心工作原理桥梁与调度中心Midjourney本身并没有提供官方的API它的所有交互都发生在Discord这个聊天平台上。midjourney-proxy项目本质上扮演了两个角色协议翻译器它将我们通过HTTP API发送的标准化请求例如POST /mj/submit/imagine翻译成Midjourney Bot在Discord中能理解的指令例如/imagine prompt: a beautiful sunset并通过模拟用户行为的方式发送到指定的Discord频道。任务调度与状态管理器它需要监听Discord频道的消息捕捉Bot返回的图片、进度信息以及各种按钮Upscale、Vary、Zoom等。然后将这些动态信息映射回我们最初通过API发起的任务并通过回调或轮询接口将结果返回给调用方。为了实现这一点项目底层需要与Discord的网关WebSocket和API进行交互。这解释了为什么配置中需要Bot Token和User Token。Bot Token用于以机器人身份加入频道和发送消息权限相对受限而User Token即用户账户令牌则能获取更完整的消息流和功能例如接收私信、获取更详细的任务状态但使用风险也更高需要妥善保管。2.2 账号池与负载均衡机制个人使用Midjourney有速率限制频繁作图容易触发警告甚至封号。该项目的一个核心设计就是账号池Account Pool。多账号支持你可以在后台配置多个Midjourney订阅账号。每个账号都是一个独立的“绘图工人”。智能调度当有绘图请求进来时服务会根据预设的策略如轮询、随机、选择空闲账号等从池中选取一个账号来执行任务。队列管理每个账号可以设置独立的并发队列数。例如账号A设置MaxQueue3意味着最多同时处理3个任务后续任务会排队等待。这有效防止了对单个账号的请求过载。状态维护服务会持续监控每个账号的任务状态、剩余快速模式时间等并动态调整调度策略。这种设计使得服务具备了高并发处理能力也能通过“错峰使用”来保护账号安全是实现“企业级”稳定的基石。2.3 模块化功能设计项目的功能并非简单堆砌而是围绕核心绘图流程进行了模块化扩展存储模块生成的图片可以保存到本地磁盘也可以无缝对接阿里云OSS、腾讯云COS、Amazon S3等对象存储并支持绑定CDN加速链接解决图片访问速度问题。换脸模块集成基于insightface的换脸功能通过调用外部API如Replicate为图片和视频提供一键换脸能力。请注意此功能务必在法律和道德允许的范围内使用。安全与风控模块包括IP限流、黑白名单、敏感词过滤、单日绘图上限、工作时间段配置等防止API被滥用。管理模块提供完整的Web管理后台用于管理账号、查看任务、调整配置无需直接修改配置文件。高可用支持通过Consul等服务发现组件理论上支持分布式部署实现负载均衡和故障转移。理解了这些我们在部署和配置时就能有的放矢明白每个配置项背后的意义。3. 部署实战从零搭建你的私有API服务理论讲完开始实战。我推荐使用Docker进行部署这是最简洁、环境依赖最少的方式。以下步骤基于Linux服务器如Ubuntu 22.04其他系统可参考项目README调整。3.1 环境准备与前置条件在开始之前你需要准备好以下几样东西一台服务器建议海外服务器如香港、新加坡、日本、美国因为需要稳定访问Discord。配置建议2核4G内存以上硬盘空间视图片存储量而定。Docker与Docker Compose确保服务器上已安装。安装命令如下# Ubuntu/Debian 示例 sudo apt update sudo apt install docker.io docker-compose -y sudo systemctl start docker sudo systemctl enable dockerMidjourney订阅账号至少一个有效的Midjourney付费账号。你需要从中提取出必要的令牌信息。可选对象存储服务如阿里云OSS用于存储生成的图片并获得更快的全球访问速度。3.2 获取Discord凭证这是最关键也最容易出错的一步。你需要从你的Discord账号和Midjourney Bot中获取以下信息Bot Token访问 Discord开发者门户 。创建一个新的Application然后进入“Bot”设置页。点击“Reset Token”获取Token。务必保存好。在“Privileged Gateway Intents”下开启MESSAGE CONTENT INTENT。这是Bot读取频道消息所必需的。在“OAuth2” - “URL Generator”中为Bot生成邀请链接权限至少需要bot,applications.commands,Read Messages/View Channels,Send Messages,Attach Files,Embed Links,Read Message History。用这个链接将Bot邀请到你的Midjourney私人服务器或特定频道。User Token推荐获取功能更完整在浏览器中登录Discord网页版。打开开发者工具F12切换到“网络Network”标签。刷新Discord页面在网络请求中找到一个名为science或users/me的请求。查看该请求的“标头Headers”找到authorization字段其值就是你的User Token。此令牌等同于你的密码绝对不要泄露Server ID Channel ID在Discord设置中开启“开发者模式”。在你邀请Bot的服务器上右键点击服务器名称 - “复制服务器ID”。右键点击你想要接收绘图消息的文本频道 - “复制频道ID”。3.3 使用Docker Compose一键部署项目提供了非常方便的docker-compose.yml模板可以一键拉起包括MySQL数据库、Redis缓存和代理服务本身在内的全套环境。# 1. 创建工作目录并进入 mkdir -p /opt/midjourney-proxy cd /opt/midjourney-proxy # 2. 下载 docker-compose.yml 配置文件 wget -O docker-compose.yml https://raw.githubusercontent.com/trueai-org/midjourney-proxy/main/scripts/docker-compose.yml # 3. 重要编辑配置文件设置关键参数 # 使用vim或nano编辑 docker-compose.yml vim docker-compose.yml你需要重点关注和修改mjopen服务下的环境变量environment部分environment: - ASPNETCORE_ENVIRONMENTProduction # 数据库连接字符串指向下面启动的MySQL容器 - ConnectionStrings__DefaultConnectionData Sourcemjopen-mysql;Port3306;User IDroot;PasswordYourStrongMySQLPassword123!;Initial Catalogmjopen;SslModenone;AllowPublicKeyRetrievaltrue;Min pool size1 # Redis连接字符串 - ConnectionStrings__Redismjopen-redis:6379,passwordYourStrongRedisPassword123!,defaultDatabase1,prefixmjopen: # 管理员令牌首次登录后台用登录后务必修改 - AdminTokenadmin # 是否开启演示模式私有部署务必设为 false - Demofalse # 是否允许访客无Token调用API私有部署建议 false - Guestfalse # 是否允许注册新用户私有部署建议 false - Registerfalse注意YourStrongMySQLPassword123!和YourStrongRedisPassword123!务必替换为你自己生成的强密码。Demo、Guest、Register这三个安全相关的选项在私有化部署时强烈建议全部设置为false否则你的API可能被他人随意调用。# 4. 启动所有服务MySQL, Redis, Midjourney-Proxy docker-compose up -d # 5. 查看启动日志确认服务运行正常 docker-compose logs -f mjopen当看到日志输出类似Now listening on: http://[::]:8080且没有大量错误时说明服务已启动。3.4 初始配置与账号添加服务启动后默认访问http://你的服务器IP:8086即可打开管理后台。首次登录使用默认令牌admin进行登录。登录成功后第一件事就是前往“系统设置”或“个人中心”修改这个默认的Admin Token添加Midjourney账号进入“MJ账号管理”页面。点击“添加账号”填写在3.2步骤中获取的信息BotToken: 你的Discord Bot Token。UserToken: 你的Discord User Token强烈建议填写。GuildId: 你的Discord Server ID。ChannelId: 你的Discord Channel ID。其他参数如Concurrent并发数、MaxQueue最大队列数可以先保持默认。保存后服务会自动尝试连接Discord。如果状态显示为“在线”或“空闲”则表示账号添加成功。3.5 配置优化与调参心得默认配置可以运行但为了稳定和高效有几个关键配置需要根据你的实际情况调整任务执行间隔 (TaskIntervalSeconds)在“系统设置”中建议设置为30-60秒。这是同一个账号连续执行两个/imagine命令的最小间隔时间设置太短极易触发Discord的风控。账号工作时段可以为账号设置“摸鱼时间”例如00:00-08:00。让账号在深夜休息模拟人类操作习惯能有效降低被封风险。图片存储配置如果图片量大或需要公网访问强烈建议配置对象存储。以阿里云OSS为例在后台“存储设置”中填入Endpoint、BucketName、AccessKeyId和AccessKeySecret。在CustomCdn中填入你的CDN加速域名如https://img.yourdomain.com这样API返回的图片链接就是加速后的地址用户体验更好。敏感词过滤在“违禁词管理”中预先添加一些平台明令禁止的敏感词汇可以在任务提交前进行拦截避免账号因生成违规内容被封。4. API使用详解与客户端集成服务部署配置好后我们就可以通过API来调用它了。项目提供了完整的Swagger文档访问http://你的服务器IP:8086/swagger即可查看和调试所有接口。4.1 核心绘图接口调用示例最核心的绘图接口是POST /mj/submit/imagine。以下是一个使用curl和Python的调用示例。请求头Authorization: Bearer your_api_token(你在管理后台创建的用户Token)Content-Type: application/json请求体{ prompt: a cute cat wearing sunglasses, digital art, trending on artstation, base64: , // 可选垫图的Base64字符串 notifyHook: https://your-server.com/notify, // 可选任务完成后的回调地址 state: // 可选自定义任务状态标识 }cURL 调用示例curl -X POST http://your-server-ip:8086/mj/submit/imagine \ -H Authorization: Bearer mj_token_abc123 \ -H Content-Type: application/json \ -d { prompt: a majestic mountain landscape at sunrise, epic fantasy style }Python 调用示例import requests import json api_url http://your-server-ip:8086/mj/submit/imagine api_token mj_token_abc123 headers { Authorization: fBearer {api_token}, Content-Type: application/json } payload { prompt: a steampunk library interior, intricate details, ray tracing, hyperrealistic, notifyHook: https://your-webhook.com/mj/callback # 推荐使用异步获取结果 } response requests.post(api_url, headersheaders, datajson.dumps(payload)) result response.json() print(result) # 成功响应会返回 taskId 和 状态例如{code: 1, description: 成功, result: {taskId: 123456}}4.2 任务状态获取与图片处理提交任务后你有两种方式获取结果回调通知推荐在提交任务时指定notifyHook。当任务状态发生变化如提交成功、绘图完成、失败时服务会向该地址发送一个POST请求包含完整的任务信息。这是最实时、高效的方式。轮询查询使用GET /mj/task/{taskId}/fetch接口通过taskId定期查询任务状态。当任务状态为SUCCESS时响应结果中会包含生成图片的URL数组 (imageUrls)。你可以直接使用这些链接它们已经是配置好的存储地址本地或OSSCDN。对于一张生成的图片你还可以通过接口对其进行扩展Upscale、变体Vary、缩放Zoom等操作。这些操作都对应特定的action例如UPSCALE(对应U1, U2, U3, U4)VARIATION(对应V1, V2, V3, V4)ZOOM等。 调用POST /mj/submit/action接口并传入对应的taskId和action即可。4.3 与第三方客户端集成该项目的一大优势是兼容性极好。许多流行的AI聚合客户端都支持自定义Midjourney API地址这意味着你可以将刚搭建好的私有服务对接到这些漂亮的客户端界面上使用。例如在ChatAny客户端中打开ChatAny设置。找到“模型设置”或“Midjourney配置”。将“接口地址”修改为http://你的服务器IP:8086/mj。在“密钥”处填入你在管理后台创建的用户Token。保存后你就可以在ChatAny的界面中直接使用你的私有Midjourney服务进行绘图了体验和官方Discord几乎无异但更稳定、更可控。5. 高级功能与避坑指南在深度使用过程中我积累了一些关于高级功能配置和常见问题的经验。5.1 换脸功能配置与法律风险提示项目集成了基于Replicate平台的换脸功能。配置步骤如下访问 Replicate Face Swap 页面注册并获取API Token。在管理后台的“换脸设置”中填入Token并启用功能。调用POST /faceswap/submit接口上传源图片和目标人脸图片。重要警告换脸技术具有双重性。请务必严格遵守法律法规和公序良俗仅用于合法的娱乐、创意或艺术创作并获得所有肖像权人的明确授权。任何用于伪造、诽谤、欺诈等非法用途的行为都将带来严重的法律后果。项目作者和提供者对此不承担任何责任。5.2 应对CloudFlare人机验证当使用行为被Discord或Midjourney判定为异常时可能会触发CloudFlare的Turnstile验证。项目提供了两种应对方案自动验证器仅Windows需要部署一个额外的Windows服务并配置2Captcha或YesCaptcha的付费密钥来自动完成验证。这对于账号众多的运营场景是必要的。手动验证当账号被锁定时管理后台的账号列表会显示“验证中”状态。此时你可以点击“验证”按钮手动完成网页上的验证拼图。对于个人或小规模使用手动处理即可。避坑点自动验证器依赖Windows环境和第三方打码平台部署复杂且有额外成本。个人用户如果偶尔触发验证手动处理更经济简单。关键是通过合理设置任务间隔、工作时段和并发数从源头上减少触发验证的概率。5.3 性能优化与稳定性保障数据库选择默认的SQLite适用于轻量级测试。如果任务量巨大超过10万条务必在部署初期就切换到MySQL或PostgreSQL。在docker-compose.yml中启用对应的数据库服务即可。Redis配置Redis用于缓存和任务队列对性能至关重要。确保为Redis容器分配足够的内存可通过Docker资源限制设置并设置一个强密码。资源监控使用docker stats或htop监控服务器资源。绘图过程尤其是处理多张图片或换脸时CPU和内存消耗会显著上升。确保服务器有足够的资源余量。日志排查遇到任务失败、账号掉线等问题首先查看docker-compose logs -f mjopen输出的日志。常见的错误信息如Invalid token令牌失效、Channel not found频道ID错误等日志里都会有明确提示。5.4 账号安全与风控策略这是私有化部署能否长期稳定运行的生命线。令牌安全User Token是最高机密。不要在代码、配置文件或聊天记录中明文存储。建议使用环境变量或密钥管理服务传入。API访问控制关闭Demo、Guest、Register模式。在“IP白名单”中只添加你信任的服务器IP或办公网络IP段。为每个集成客户端创建独立的API Token并定期轮换。绘图行为模拟设置合理的TaskIntervalSeconds如45秒。启用“工作时间段”让账号在每天固定时间“休息”。如果有多账号可以开启“垂直领域”功能让不同账号专注绘制不同风格的图片进一步分散风险。定期备份定期备份数据库/app/data目录和配置文件。一旦账号出现问题或需要迁移可以快速恢复。6. 总结与个人体会搭建并运维这套midjourney-proxy系统让我对AI绘画的工程化应用有了更深的理解。它不仅仅是一个“偷懒”的工具更是一个将不稳定、非标准的C端服务Discord封装成稳定、标准化、可管控的API服务的典范。从个人创作者的角度它解决了效率问题让你能通过脚本批量生成创意素材。从小型工作室的角度它提供了成本可控的绘图能力无需为每个成员购买独立的Midjourney订阅。从开发者的角度它提供了一个绝佳的、功能完整的开源项目进行学习和二次开发。最后几点发自肺腑的建议尊重规则严格遵守Midjourney和Discord的使用条款合理使用账号这是项目能持续存在的前提。关注社区项目的GitHub Issues和QQ群565908696非常活跃很多坑已经有人踩过遇到问题先搜索大部分都能找到答案。量力而行如果是个人学习和小规模使用一个账号、一台基础配置的服务器足矣。切勿盲目追求“企业级”配置先从核心功能用起逐步迭代。安全第一再次强调保护好你的令牌做好网络和访问控制定期检查日志。稳定的服务来自于细致的管理而非侥幸。这个项目就像一把强大的瑞士军刀功能繁多。希望这篇超详细的指南能帮你顺利上手避开我踩过的那些坑真正把这把刀用起来为你的创作或产品赋能。如果在部署中还有具体问题欢迎在评论区交流讨论。