使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
此页面的内容已使用 AI 翻译。
查看英文原文的最新版本如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
自托管 Intlayer
Intlayer 可以在您自己的基础设施上运行。无需 Intlayer Cloud 账户。单个一体化 Docker 镜像捆绑了仪表板、API 和它所需的本地数据存储(Redis 和 MinIO),由 s6-overlay 监管。
Intlayer 可以完全在您自己的基础设施上运行——无需 Intlayer Cloud 账户。只需一条命令即可启动一个生产就绪的堆栈:
复制代码到剪贴板
安装程序会下载 docker-compose.yml 和 .env 文件,自动生成所需的密钥,并使用 docker compose up -d 启动所有容器。
唯一的外部依赖是 MongoDB:后端连接到你提供的 MongoDB Atlas 集群。其他一切都在容器内运行。
目录
架构
复制代码到剪贴板
Chromium(用于 Puppeteer 屏幕截图生成)捆绑在后端镜像中——无需单独的容器。
先决条件
- Docker ≥ 24 和 Docker Compose ≥ v2。如果其中任何一个缺失,安装程序将打印安装链接并退出。
- 主机上端口
3000、3100、8025、9000和9001可用。 - Linux 或 macOS 主机(或 Windows 上的 WSL2)。
其他所有内容 — Bun、Redis、MinIO、Chromium — 都包含在镜像中。
快速开始
1. 运行安装程序
复制代码到剪贴板
它验证 Docker 是否已安装且正在运行,将 ./intlayer.env 写入已生成的 BETTER_AUTH_SECRET 和 S3_SECRET_ACCESS_KEY,并拉取镜像。它不启动容器 — 后端无法在没有数据库凭证的情况下启动。
重新运行安装程序是安全的:现有的 intlayer.env 永远不会被覆盖,因此它也可以作为升级路径。
2. 填入你的凭证
打开 intlayer.env 并完成标记为 TODO 的值:
复制代码到剪贴板
该文件还包含了可选功能的注释块 — SMTP mailer、OPENAI_API_KEY 和 OAuth 提供商。取消注释你需要的内容。
该文件由docker run --env-file读取,它不会去除引号,并将=之后的所有内容视为值。写入裸值,并将注释放在单独的行上。
3. 启动容器
这是安装程序完成时打印的命令:
复制代码到剪贴板
然后打开 http://localhost:3000。首次启动会初始化数据存储,请等待一分钟。
仪表板在 localhost 上提供。请参阅限制 — 已发布的镜像不支持自定义域名。
安装程序设置
安装程序读取几个环境变量。由于它被管道传输到 sh,请将它们传递给 shell 而不是 curl:
复制代码到剪贴板
在弹窗中打开表格以清晰地查看所有数据
| 变量 | 默认值 | 描述 |
|---|---|---|
INTLAYER_IMAGE | ghcr.io/aymericzip/intlayer-selfhost:latest | 要拉取的镜像 |
INTLAYER_ENV_FILE | ./intlayer.env | 环境文件的写入位置 |
INTLAYER_CONTAINER_NAME | intlayer | 容器名称 |
INTLAYER_DATA_VOLUME | intlayer-data | 挂载在 /data 的命名卷 |
INTLAYER_APP_PORT | 3000 | 仪表板的主机端口 |
INTLAYER_API_PORT | 3100 | API 的主机端口 |
INTLAYER_S3_PORT | 9000 | MinIO S3 API 的主机端口 |
INTLAYER_CONSOLE_PORT | 9001 | MinIO 控制台的主机端口 |
四个端口变量仅改变docker run命令中打印的映射的主机端,已发布的镜像在构建时将http://localhost:3000、http://localhost:3100和http://localhost:9000编译到仪表板包中,因此重新映射它们会导致浏览器指向旧端口。除非您正在构建自己的镜像,否则请保持默认值 — 参见限制。
快速开始
安装程序执行以下操作:
- 检查
docker和docker compose是否存在。 - 将
docker-compose.yml和.env.example下载到./intlayer/目录中。 - 如果不存在
.env文件,则复制示例文件并使用openssl rand为BETTER_AUTH_SECRET、S3_ACCESS_KEY_ID和S3_SECRET_ACCESS_KEY生成随机密钥。 - 运行
docker compose pull+docker compose up -d。 - 打印 URL:仪表盘
:3000、API:3100、电子邮件 UI:8025、MinIO 控制台:9001。
堆栈启动后,打开 http://localhost:3000 并创建您的第一个账户。
服务
在弹窗中打开表格以清晰地查看所有数据
| 服务 | 镜像 | 主机端口 | 用途 |
|---|---|---|---|
| app | 从 apps/app/Dockerfile 构建 | 3000 | TanStack Start 仪表盘 (CMS UI) |
| backend | 从 apps/backend/Dockerfile 构建 | 3100 | Fastify REST API (/health 端点) |
| mongo | mongo:7 | 内部 | 单节点副本集 (rs0) |
| redis | redis:7-alpine | 内部 | 任务队列 (BullMQ) 和缓存 (ioredis) |
| minio | minio/minio | 9000 (S3), 9001 (控制台) | 用于头像和截图的 S3 兼容对象存储 |
| mailpit | axllent/mailpit | 1025 (SMTP), 8025 (Web UI) | 本地事务性电子邮件接收器 |
MinIO 端口9000必须可从浏览器访问,因为上传的资产(头像、截图)直接从S3_PUBLIC_URL=http://localhost:9000/intlayer加载。
环境变量
必需
在弹窗中打开表格以清晰地查看所有数据
| Variable | Example | Description |
|---|---|---|
DB_ID | intlayer | MongoDB Atlas 用户 |
DB_MDP | (your password) | MongoDB Atlas 密码 |
DB_CLUSTER | cluster0.xxxxx.mongodb.net | MongoDB Atlas 集群主机(在 mongodb+srv:// URI 中使用) |
BETTER_AUTH_SECRET | (generated) | 用于会话签名的 32 字节密钥 |
S3_SECRET_ACCESS_KEY | (generated) | 捆绑 MinIO 的密钥 |
RESEND_API_KEY | (your key) | 通过 Resend 发送事务性邮件。除非你配置全局 SMTP 邮件器(见全局邮件器),否则首次运行设置时为必需项 |
必需(自动生成或提示)
在弹窗中打开表格以清晰地查看所有数据
| 变量 | 示例 | 描述 |
|---|---|---|
NODE_ENV | production | 运行时环境 |
PORT | 3100 | 后端监听端口 |
BACKEND_URL | http://localhost:3100 | 后端 API 的公共 URL |
APP_URL | http://localhost:3000 | 仪表盘的公共 URL |
DOMAIN | localhost | Cookie 域 |
MONGODB_URI | mongodb://mongo:27017/intlayer?replicaSet=rs0 | 完整的 MongoDB 连接 URI |
REDIS_URL | redis://redis:6379 | Redis 连接 URL |
BETTER_AUTH_SECRET | (已生成) | 用于会话签名的 32 字节密钥 |
MAIL_PROVIDER | smtp | 邮件传输方式:smtp 或 resend |
MAIL_SMTP_HOST | mailpit | SMTP 主机名 (Mailpit 容器名称) |
MAIL_SMTP_PORT | 1025 | SMTP 端口 |
MAIL_FROM | Intlayer <no-reply@localhost> | 发件人地址 |
S3_ENDPOINT | http://minio:9000 | S3 兼容端点 |
S3_PUBLIC_URL | http://localhost:9000/intlayer | 用于浏览器资产加载的公共 URL |
S3_BUCKET_NAME | intlayer | 存储桶名称 |
S3_ACCESS_KEY_ID | (已生成) | MinIO 访问密钥 |
S3_SECRET_ACCESS_KEY | (已生成) | MinIO 秘密密钥 |
VITE_BACKEND_URL | http://localhost:3100 | 构建时嵌入到仪表盘中的后端 URL |
VITE_DOMAIN | localhost | 构建时嵌入到仪表盘中的域 |
可选(缺少时功能会优雅降级)
在弹窗中打开表格以清晰地查看所有数据
| 变量 | 功能 |
|---|---|
OPENAI_API_KEY | AI 辅助翻译和内容审计 |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_* | 账单和订阅管理 |
RESEND_API_KEY | 通过 Resend 发送事务性电子邮件(设置后会覆盖 Mailpit) |
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET | GitHub OAuth 登录 |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | Google OAuth 登录 |
GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET | GitLab OAuth 登录 |
MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET | Microsoft OAuth 登录 |
LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET | LinkedIn OAuth 登录 |
ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRET | Atlassian OAuth 登录 |
全局邮件服务
默认情况下,所有事务性电子邮件都通过使用 RESEND_API_KEY 的 Resend 发送。自托管部署可以改为通过配置了环境变量的全局邮件服务路由所有电子邮件 — 包括非组织电子邮件,例如密码重置和魔法链接。
设置 MAIL_PROVIDER 以激活它。如果未设置,将使用默认的 Resend 邮件服务。
在弹窗中打开表格以清晰地查看所有数据
| 变量 | 示例 | 描述 |
|---|---|---|
MAIL_PROVIDER | smtp | 全局传输:smtp 或 resend。留空使用默认值 |
MAIL_FROM | Intlayer <no-reply@acme.com> | 发件人标题。接受裸地址或 Name <email> 格式 |
MAIL_SMTP_HOST | smtp.acme.com | SMTP 主机(当 MAIL_PROVIDER=smtp 时必需) |
MAIL_SMTP_PORT | 587 | SMTP 端口(默认为 587) |
MAIL_SMTP_SECURE | false | 隐式 TLS。对于端口 465 设置为 true |
MAIL_SMTP_USER | (你的用户名) | SMTP 用户名(可选;无身份验证中继可省略) |
MAIL_SMTP_PASSWORD | (你的密码) | SMTP 密码 |
优先级:组织自己的邮件服务(从组织仪表板配置)优先于全局邮件服务,全局邮件服务优先于默认的 Resend 密钥。
连接您的 Intlayer 项目
堆栈运行后,将您的项目指向自托管的后端和仪表盘,而不是 intlayer.org。
项目配置
复制代码到剪贴板
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
/**
* 自托管 CMS 仪表盘的 URL。
* 默认值: https://app.intlayer.org
*/
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
/**
* 自托管后端 API 的 URL。
* 默认值: https://back.intlayer.org
*/
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
},
};
export default config;
在您项目的 .env 中设置环境变量:
复制代码到剪贴板
在您的自托管仪表盘中,通过 http://localhost:3000/projects 下的 项目 → 访问密钥 创建访问凭据。
@intlayer/api SDK
以编程方式使用 @intlayer/api SDK 时,明确传递 backendURL:
复制代码到剪贴板
升级
这会拉取最新镜像并使用 docker compose pull && docker compose up -d 重启容器。现有卷(mongo-data、redis-data、minio-data)会保留——不会丢失数据。
复制代码到剪贴板
备份与恢复
所有持久化数据都存储在三个命名 Docker 卷中。
备份
复制代码到剪贴板
恢复
复制代码到剪贴板
限制条件
- MongoDB 必须是外部的 (Atlas)。 后端仅通过
mongodb+srv://连接(由DB_ID/DB_MDP/DB_CLUSTER构建),因此不能使用普通的mongodb://host:27017— 包括容器自己的捆绑mongod。请提供一个 MongoDB Atlas 集群。 - 不支持自定义域名。 所有面向浏览器的
VITE_*URL 都在构建时内联到应用中,发布的镜像带有localhost值。必须在http://localhost:3000上访问仪表板;在公共域上提供服务需要使用目标 URL 重新构建镜像,这在开箱即用时不受支持。 - Email 需要工作的邮件程序。 首次运行设置强制执行电子邮件验证,因此必须配置
RESEND_API_KEY或 全局 SMTP 邮件程序(MAIL_PROVIDER=smtp+MAIL_SMTP_*)。第一个管理员登录后,每个组织也可以从仪表板配置自己的 SMTP 或 Resend 邮件程序。
故障排除
后端首次启动时崩溃循环
MongoDB 和 Redis 必须在后端启动前保持健康。compose 文件使用带有 condition: service_healthy 的 depends_on。如果您看到后端重复重启,请检查 mongo 和 redis 的健康检查是否通过:
复制代码到剪贴板
在日志的顶部附近查找 MongoDB connection error。
电子邮件未发送
默认情况下,所有出站电子邮件都会被 Mailpit 捕获。打开 http://localhost:8025 查看已发送的消息。要发送真实电子邮件,请在 .env 中设置 MAIL_PROVIDER=resend 和 RESEND_API_KEY=<your-key>,然后重启后端:
MinIO 存储桶缺失
如果 minio-init 一次性服务未运行(或在 MinIO 准备好之前运行),请手动创建存储桶:
复制代码到剪贴板
