自托管LibreChat部署实战:多模型接入与数据隐私保护指南
1. 为什么我最终选择了自托管LibreChat1.1 从一个真实的痛点说起去年下半年我手头同时要处理三个项目的技术文档、两个客户的方案沟通还有团队内部的代码评审记录。每天在不同的大模型对话窗口之间来回切换ChatGPT一个标签页、Claude一个标签页、国产模型又一个标签页光是复制粘贴上下文这件事就让我烦得不行。更别提有些对话涉及客户内部架构信息放在第三方平台上心里总是不踏实。我一开始的想法很简单找个能聚合多个模型接口的开源前端自己部署在内部服务器上。试过几个方案之后最后落在了LibreChat上。原因不复杂——它是目前少数几个把多模型切换、对话管理、插件扩展、多用户体系这几件事都做得比较完整的开源项目而且社区活跃度很高更新频率基本能跟上各家模型API的变化。LibreChat本质上是一个自托管的AI对话平台。你可以把它理解成一个“你自己的ChatGPT界面”后端对接哪家模型由你决定OpenAI、Anthropic、Google、以及任何兼容OpenAI接口规范的服务都能接进来。数据存在你自己的数据库里对话记录不上传到任何第三方。适合谁用我觉得三类人最需要一是对数据隐私有要求的小团队二是需要在一个界面里对比不同模型输出效果的开发者三是想给内部非技术同事提供一个统一AI入口的技术负责人。1.2 它到底解决了什么问题说得再具体一点。没有LibreChat之前我们团队的现状是每个人自己注册各种AI服务账号费用报销一团乱对话内容散落在各个平台想沉淀一套团队级的提示词库根本无从谈起。有了LibreChat之后我可以在后台统一配置模型接入点给每个同事开账号设置不同的权限和额度所有对话记录集中管理。提示词可以做成预设新同事上手就能用团队积累的最佳实践。还有一个容易被忽略的价值模型对比。同一个问题我可以在LibreChat里快速切换不同的模型来回答不需要重新组织语言。做技术选型评估的时候这个功能帮我省了大量时间。比如评估某个代码生成任务到底用哪个模型效果好我直接在界面上切换就行对话上下文保持不变对比结果一目了然。2. 部署前的整体设计与选型考量2.1 部署方式的选择逻辑LibreChat官方提供了几种部署路径Docker Compose、本地Node.js运行、以及一些云平台的模板部署。我的建议很明确——除非你只是想在本地快速体验一下否则一律走Docker Compose。原因有三第一LibreChat依赖MongoDB存储对话数据依赖Meilisearch做对话搜索手动装这些依赖容易出兼容性问题第二Docker Compose把服务间的网络配置、环境变量注入、数据卷挂载都标准化了迁移和备份都方便第三升级版本的时候改一下镜像tag重新拉取就行不用操心Node版本和依赖冲突。我自己的生产环境跑在一台4核8G的轻量服务器上操作系统是Ubuntu 22.04。这个配置支撑十来个人的日常使用完全够用。如果你团队规模更大主要瓶颈会在MongoDB的读写上到时候可以考虑把数据库单独拆出来。2.2 模型接入方案的设计这是整个部署过程中最核心的决策点。LibreChat支持通过配置文件定义多个模型端点endpoint每个端点可以指向不同的服务商。我的做法是分三层来规划第一层是主力模型选一个综合能力最强、响应速度可接受的作为默认选项。第二层是专项模型比如代码任务用一个、长文本分析用另一个。第三层是备用模型当主力服务出现波动时能快速切换。在配置上LibreChat通过librechat.yaml文件来管理这些端点。每个端点需要指定名称、API地址、API密钥、以及支持的模型列表。这里有个细节要注意API密钥不要直接写在yaml文件里用环境变量引用yaml里只写${环境变量名}。这样即使配置文件被误提交到代码仓库密钥也不会泄露。2.3 数据存储与备份策略MongoDB里存着所有用户的对话记录这是最核心的资产。我的备份方案是每天凌晨用mongodump做一次全量导出保留最近30天的备份文件同时每周做一次异地同步。Docker环境下MongoDB的数据卷映射到宿主机的一个固定目录备份脚本直接对这个目录操作就行。另外提一句Meilisearch。它负责对话的全文搜索数据可以从MongoDB重建所以备份优先级没那么高。但如果对话量很大重建索引会比较耗时建议也纳入定期备份的范围。3. 核心配置细节与实操要点3.1 环境变量文件的关键参数LibreChat的Docker Compose部署依赖一个.env文件来注入配置。这个文件里有几个参数必须改有几个容易踩坑。必须修改的CREDS_KEY和CREDS_IV这两个是用于加密存储API密钥的。官方文档给了生成命令用openssl rand -hex 32生成CREDS_KEY用openssl rand -hex 16生成CREDS_IV。千万不要用默认值否则所有用户的API密钥加密形同虚设。JWT_SECRET和JWT_REFRESH_SECRET会话令牌的签名密钥同样用随机字符串。这两个值一旦设定就不要随意更改否则所有用户会被强制登出。MONGO_URI如果用的是Docker Compose自带的MongoDB服务保持默认的mongodb://mongodb:27017/LibreChat即可。如果用的是外部数据库改成对应的连接字符串。容易踩坑的DOMAIN_CLIENT和DOMAIN_SERVER这两个参数决定了前端访问的URL和后端API的地址。如果你通过反向代理暴露服务这里要填对外访问的域名而不是localhost。我第一次部署时没改结果登录后一直跳转到localhost排查了半天。ALLOW_REGISTRATION默认是true意味着任何人都能注册账号。生产环境一定要改成false然后通过管理员后台手动创建用户。或者配合ALLOW_SOCIAL_LOGIN做单点登录集成。3.2 librechat.yaml的端点配置实战这个文件是LibreChat的灵魂。我拿自己的配置举例说明结构version: 1.1.5 cache: true endpoints: custom: - name: 主力模型 apiKey: ${PRIMARY_API_KEY} baseURL: https://api.example.com/v1 models: default: [model-a, model-b] fetch: false titleConvo: true titleModel: model-a modelDisplayLabel: 主力几个关键点解释一下。name是显示在界面上的端点名称可以随便起。baseURL指向兼容OpenAI接口规范的服务地址。models.default列出这个端点下你想暴露给用户的模型。fetch: false表示不从API拉取模型列表直接用你手写的列表这样更可控。titleConvo: true会让LibreChat自动为每个新对话生成一个标题用的是titleModel指定的模型这个功能很实用不然对话列表全是“新对话”。如果你要接入多个端点就在custom下面继续加条目。每个端点的API密钥可以用不同的环境变量互不干扰。3.3 反向代理与HTTPS配置生产环境必须上HTTPS这个不用多解释。我用的是Nginx做反向代理配置里需要注意几个点。首先是WebSocket的支持。LibreChat的流式输出依赖SSEServer-Sent EventsNginx需要关闭对这类请求的缓冲。在location块里加上proxy_buffering off;和proxy_cache off;否则你会看到模型回复一次性蹦出来而不是逐字显示。其次是超时设置。模型生成回复的时间可能比较长Nginx默认的60秒超时不够用。把proxy_read_timeout调到300秒以上避免长回复被截断。最后是上传文件的大小限制。LibreChat支持文件上传作为对话上下文Nginx的client_max_body_size默认是1M建议调到20M以上不然稍微大一点的文档就传不上去。4. 实操过程与核心环节实现4.1 从零开始的完整部署流程我把整个部署过程拆成可复现的步骤你照着做就行。第一步准备服务器环境。确保Docker和Docker Compose已经安装。用docker --version和docker compose version确认版本Docker建议20.10以上Compose建议v2以上。第二步获取LibreChat的代码。直接从官方仓库克隆最新稳定版本。我习惯用git clone然后git checkout到最新的release tag而不是直接拉main分支这样更稳定。第三步创建.env文件。官方仓库里有一个.env.example复制一份改名为.env然后按照我上面说的关键参数逐个修改。生成随机密钥的命令再强调一遍openssl rand -hex 32用于生成32字节的密钥openssl rand -hex 16用于生成16字节的IV。第四步创建librechat.yaml文件。放在项目根目录Docker Compose会自动挂载。如果你不需要自定义端点这一步可以跳过LibreChat会用环境变量里的OpenAI配置作为默认端点。第五步启动服务。在项目目录下执行docker compose up -d。第一次启动会拉取镜像根据网络情况可能需要几分钟。启动完成后用docker compose ps查看各容器状态确保mongodb、meilisearch、api、client四个服务都是running。第六步创建管理员账号。打开浏览器访问你的域名注册第一个账号。第一个注册的账号自动成为管理员。注册完之后立刻去.env里把ALLOW_REGISTRATION改成false然后重启api服务。4.2 模型端点的接入与验证服务跑起来之后登录进去第一件事是配置模型端点。如果你在librechat.yaml里已经写好了界面上应该能直接看到对应的模型选项。如果没有检查两个地方一是yaml文件的格式是否正确缩进有没有问题二是api容器有没有正确挂载到这个文件用docker compose logs api看日志里有没有报错。验证端点是否可用最简单的方法是新建一个对话选对应的模型发一句“你好”。如果能看到流式回复说明接入成功。如果报错常见原因有三个API密钥无效、baseURL写错、或者网络不通。逐个排查就行。我自己的经验是先把一个端点调通确认没问题了再加第二个。同时配多个端点出问题时排查起来会很混乱。4.3 用户管理与权限控制LibreChat的管理后台提供了基本的用户管理功能。管理员可以查看用户列表、重置密码、禁用账号。但更细粒度的权限控制需要通过配置文件来实现。比如你想限制某些用户只能使用特定模型可以在librechat.yaml的端点配置里用groups字段做映射。或者更简单粗暴的方式给不同团队部署不同的LibreChat实例各自配置不同的端点。对话数据的隔离是默认做好的普通用户只能看到自己的对话。管理员可以在后台看到所有对话的元数据但默认看不到具体内容除非开启相应的权限。4.4 预设提示词与团队协作这是我觉得LibreChat最被低估的功能。管理员可以在后台创建“预设”Preset每个预设包含一段系统提示词和一组模型参数。用户新建对话时可以直接选用预设不用每次手动输入提示词。我们团队的做法是把常用的几类任务都做成预设比如“代码评审”、“技术方案撰写”、“会议纪要整理”。每个预设里的系统提示词都是经过多次迭代打磨的新同事直接调用就能得到不错的输出质量。这比让每个人自己摸索提示词效率高太多了。预设还支持绑定特定的模型。比如“代码评审”预设固定用代码能力最强的那个模型用户不需要关心底层用的是哪个模型只管用就行。5. 常见问题与排查技巧实录5.1 部署阶段的典型报错我整理了一个速查表覆盖我遇到过和社区里高频出现的问题。现象可能原因排查方法容器启动后立即退出环境变量缺失或格式错误docker compose logs 服务名查看具体报错界面能打开但无法登录JWT密钥未设置或MongoDB连接失败检查.env中JWT相关变量确认mongodb容器状态模型回复不显示流式效果Nginx缓冲未关闭在反向代理配置中添加proxy_buffering off上传文件失败Nginx body大小限制调大client_max_body_size对话搜索无结果Meilisearch未启动或索引未建立检查meilisearch容器状态等待索引同步修改配置后不生效容器未重启执行docker compose restart api5.2 模型接入的疑难杂症有一类问题特别隐蔽模型端点配置看起来没问题但就是报401或403。这种情况大概率是API密钥的传递方式不对。有些服务商要求密钥放在Authorization: Bearer头里有些要求放在自定义头里。LibreChat默认用Bearer方式如果你的服务商要求不同需要在librechat.yaml里用headers字段自定义。另一个常见问题是模型名称不匹配。你在models.default里写的名称必须和服务商API接受的名称完全一致大小写都不能错。我有一次把gpt-4写成了GPT-4结果一直报模型不存在找了好久才发现。还有一种情况是流式输出中断。如果模型回复到一半突然停了检查Nginx的proxy_read_timeout设置。另外某些服务商对单次请求的token数有限制超长回复可能会被截断这个需要在服务商那边确认。5.3 性能优化的实操心得随着使用人数增加你可能会感觉界面响应变慢。我的优化顺序是这样的先看MongoDB。对话数据量大了之后查询会变慢。给messages集合的conversationId字段建索引效果立竿见影。具体命令是db.messages.createIndex({conversationId: 1})。再看Meilisearch。如果搜索响应慢检查索引是否正常。可以在Meilisearch的dashboard里看索引状态必要时手动触发重建。最后看服务器资源。用docker stats看各容器的CPU和内存占用。如果api容器内存持续高位可能是并发请求太多考虑升级服务器配置或者限制同时在线人数。5.4 数据迁移与版本升级升级LibreChat版本时我的标准流程是先备份MongoDB数据然后拉取新版本代码对比.env.example看有没有新增的环境变量对比librechat.yaml的schema版本看配置格式有没有变化。确认无误后docker compose pull拉取新镜像docker compose up -d重启服务。跨大版本升级时官方有时会提供数据迁移脚本。一定要仔细阅读release notes按照说明执行迁移。我有一次跳过了迁移步骤结果对话列表加载不出来回滚重来才搞定。数据迁移到新服务器时把MongoDB的数据卷目录整体打包复制过去就行。注意保持文件权限一致否则MongoDB可能启动失败。6. 我踩过的坑与独家建议6.1 关于密钥管理的血泪教训刚开始部署的时候我图省事把API密钥直接写在了librechat.yaml里。后来有一次把配置文件发给同事参考差点把密钥泄露出去。从那以后我养成了习惯所有敏感信息一律走环境变量yaml文件里只写引用。.env文件加入.gitignore永远不提交到代码仓库。还有一点定期轮换API密钥。LibreChat支持在管理后台为每个用户单独配置API密钥这样即使某个用户的密钥泄露影响范围也可控。团队共用一把密钥的做法虽然省事但风险太大。6.2 对话数据的管理策略用了一段时间之后MongoDB里积累了大量对话数据。有些是重要的技术讨论有些是随手测试的垃圾对话。我的做法是定期导出有价值的对话存档然后清理掉超过一定时间的低价值对话。LibreChat本身没有提供批量清理功能需要直接操作MongoDB。清理前务必确认备份已完成。另外如果团队对数据保留有合规要求记得在部署时就规划好数据生命周期。比如设置定时任务自动删除超过90天的对话记录。6.3 给新手的三个建议第一个建议先用Docker Compose在本地跑一遍熟悉整个流程之后再上服务器。本地环境出问题好排查不会影响其他人使用。第二个建议不要一上来就配一堆模型端点。先把一个调通用一段时间确认稳定了再加。多端点同时出问题时排查成本是指数级上升的。第三个建议把librechat.yaml和.env纳入版本管理但用不同的仓库或者加密存储。这样配置变更可追溯换服务器时也能快速恢复。6.4 后续可以扩展的方向LibreChat的插件系统支持接入外部工具比如网页搜索、代码执行、API调用等。我目前只用了基础的对话功能但已经在规划接入内部的知识库检索。思路是通过自定义端点的方式把RAG检索增强生成流程封装成一个兼容OpenAI接口的服务然后在LibreChat里作为一个模型端点暴露出来。这样用户在使用时感知不到背后的检索逻辑体验上就是一个“更懂内部知识的模型”。另一个方向是集成团队的SSO系统。LibreChat支持OAuth和OpenID Connect配置好之后用户可以用现有的企业账号登录不用单独维护一套密码。这对中大型团队来说能省不少管理成本。我在实际使用LibreChat的这大半年里最大的体会是自托管AI对话平台的价值不在于技术有多复杂而在于它把数据控制权交还给了使用者。你可以自由选择模型、自由管理数据、自由定制功能这种灵活性是任何闭源SaaS都给不了的。当然代价是要花时间维护但对于有隐私要求或者需要深度定制的场景来说这笔投入完全值得。

相关新闻

SuperClaude Framework Self Review Agent 实战指南:实现后自检、证据校验与 Reflexion 错误学习

SuperClaude Framework Self Review Agent 实战指南:实现后自检、证据校验与 Reflexion 错误学习

SuperClaude Framework Self Review Agent 实战指南:实现后自检、证据校验与 Reflexion 错误学习 【免费下载链接】SuperClaude_Framework A configuration framework that enhances Claude Code with specialized commands, cognitive personas, and development m…

2026/9/20 7:00:06 阅读更多 →
基于NSGA-II的水电光伏多能互补优化调度与MATLAB实现

基于NSGA-II的水电光伏多能互补优化调度与MATLAB实现

1. 项目概述与优化调度问题拆解1.1 水电-光伏多能互补到底在解决什么先说一个我做了无数次实验后最有感触的点:水电和光伏搭配,不是简单把两个电源的出力曲线加在一起就能完事。光伏出力受太阳辐照度、温度、云层遮挡影响,一天之内波动极大&a…

2026/9/20 6:59:06 阅读更多 →
LibreChat+MCP:构建企业级AI Agent调度中枢

LibreChat+MCP:构建企业级AI Agent调度中枢

1. LibreChat 不是另一个 ChatGPT 界面,而是 Agent 生态的「操作系统雏形」LibreChat 这个名字刚出现时,很多人下意识把它当成又一个开源版 ChatGPT Web UI——毕竟它长得确实像:左侧对话列表、中间聊天窗口、右上角模型切换下拉框。但如果你…

2026/9/20 6:59:06 阅读更多 →

最新新闻

3套制作高端网页对比评测:告别改需求拖一周

3套制作高端网页对比评测:告别改需求拖一周

3套制作高端网页对比评测:告别改需求拖一周 改个需求建站公司拖一周,这种憋屈感做过项目的人都懂。明明只是换个按钮颜色,对方却让你等三天,最后发来的链接还是上周的版本。这时候,光靠嘴皮子催进度没用,你得拿出硬碰硬的 对比评测 数据,用专业规范说话。 很多设计师转前端,或者独立开发者在做 制作高端网页…

2026/9/20 7:44:52 阅读更多 →
Android开机动画替换的正确姿势:App如何协同系统完成定制

Android开机动画替换的正确姿势:App如何协同系统完成定制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 7:44:23 阅读更多 →
用 10 分钟跑起 Lucky:端口转发与 DDNS 部署到首次使用

用 10 分钟跑起 Lucky:端口转发与 DDNS 部署到首次使用

用 10 分钟跑起 Lucky:端口转发与 DDNS 部署到首次使用 【免费下载链接】lucky 软硬路由公网神器,ipv6/ipv4 端口转发,反向代理,DDNS,WOL,ipv4 stun内网穿透,cron,acme,rclone,ftp,webdav,filebrowser 项目地址: https://gitcode.com/GitHub_Trending/luc/lucky …

2026/9/20 7:44:23 阅读更多 →
QQ空间历史说说怎么保存?3 步跑通 GetQzonehistory 完整教程

QQ空间历史说说怎么保存?3 步跑通 GetQzonehistory 完整教程

QQ空间历史说说怎么保存?3 步跑通 GetQzonehistory 完整教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 是一个 Python 小工具,通过模拟登录…

2026/9/20 7:44:23 阅读更多 →
GetQzonehistory:如何完整备份QQ空间全部历史说说(5步教程)

GetQzonehistory:如何完整备份QQ空间全部历史说说(5步教程)

GetQzonehistory:如何完整备份QQ空间全部历史说说(5步教程) 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 是一个免费的开源 QQ空间…

2026/9/20 7:44:23 阅读更多 →
Swagger UI 在线验证指南:为什么字段会标红,3 步让错误变绿

Swagger UI 在线验证指南:为什么字段会标红,3 步让错误变绿

Swagger UI 在线验证指南:为什么字段会标红,3 步让错误变绿 【免费下载链接】swagger-ui Swagger UI is a collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API. 项目地…

2026/9/20 7:44:23 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →