跳转到内容
文档

翻译发布, 自信地

无论您是独立开发者还是企业团队,这里都提供了安装、配置、部署和维护 i18n Dashboard 所需的一切内容。

从这里开始

Docker 快速入门

官方图片 arnaudprioul/i18n-dashboard在 Docker Hub 上发布这两个项目 linux/amd64linux/arm64. 根据团队规模的不同,有三种运行方式。

本地模式SQLite,无身份验证

单用户、单团队。翻译数据存储在 Docker 卷中。最适合自行托管约 10 万个键。请将此内容保存为 docker-compose.yml并运行 docker compose up -d:

完整的快速入门指南、环境变量及故障排除内容请参见 Docker Hub 概述.

docker-compose.yml

服务器模式Postgres + 集中式身份验证

多团队,通过 JWKS 进行 JWT 验证。该 Web 应用会根据您的认证服务器的信息离线验证令牌 /api/auth/.well-known/jwks.json.

.env

桌面模式Tauri,本地数据

原生 macOS / Windows / Linux 版本,内置 Nitro 服务器和 SQLite。无需 Docker,也无需配置数据库。登录通过您的在线账户进行。

  • macOS
  • Windows
  • Linux

下载桌面应用 →

浏览

按需求查找

八大分类:入门指南、框架指南、部署、管理、质量、参考、账单和支持。

配置

环境变量

每个 runtimeConfig该值可在运行时通过 NUXT_*前缀 — Nitro 的规范约定。诸如 I18N_DB_HOST除非明确列为线协议变量,否则这些变量将被默认忽略。

完整参考文献 (所有变量、默认值、作用域和迁移说明)都位于 Docker Hub 页面上,与镜像紧密关联:

在 Docker Hub 上查看完整的环境变量参考文档 →

最常见的旋钮

  • I18N_APP_MODElocal / server / desktop. 服务器模式需要一个真实的数据库和一个中央认证系统。
  • NUXT_DB_CLIENT + NUXT_DB_HOST + NUXT_DB_NAME + NUXT_DB_USER + NUXT_DB_PASSWORD — Postgres / SQLite / MySQL 连接。
  • NUXT_SESSION_SECRET — 生产环境中必需。使用以下命令生成: openssl rand -hex 32.
  • NUXT_CENTRAL_AUTH_URL + NUXT_PUBLIC_CENTRAL_AUTH_URL — 您的身份验证发行者的服务器端和浏览器端 URL(必须与 JWKS 兼容)。
  • NUXT_AUTH_JWT_ISSUER + NUXT_AUTH_JWT_AUDIENCE — 预期 iss / aud访问令牌上的声明。
  • NUXT_INTERNAL_API_SECRET — Web 应用与中央认证端之间调用所使用的共享 HMAC。双方必须保持一致。
  • NUXT_SMTP_HOST + NUXT_SMTP_PORT + NUXT_SMTP_USER + NUXT_SMTP_PASS + NUXT_SMTP_FROM — 工作流通知。若要禁用电子邮件通知,请将“主机”字段留空。
  • NUXT_DASHBOARD_URL — 此 Web 应用实例的公共 URL,用于事务性电子邮件中的链接。

30秒内完成SMTP设置

选择任意一个 SMTP 中继服务器,并输入以下四个值——系统将在每次工作流事件发生时通过该服务器发送电子邮件。

.env

对于本地开发/烟雾测试,请指向随附的 Mailpit服务: NUXT_SMTP_HOST=mailpit, NUXT_SMTP_PORT=1025.

角色与权限

角色按项目授予,而不是整个实例通用——共有三个层级,每一级都会解锁该项目允许的更多操作。

translatormoderatoradminsuper_admin
编辑翻译
审核翻译
管理项目(设置、扫描、同步)
管理项目成员

在项目的Users页面中分配角色——选择一名成员,再指定 translator、moderator 或 admin。某个项目的 admin 对其他项目或拥有该项目的账户没有任何权限。

super_admin 标志

super_admin 独立于任何项目角色——它是账户级别的标志,会在所有项目上绕过以上全部检查。它会自动授予该实例上创建的第一个账户,无论是通过本地安装向导,还是服务器模式下的首次登录,目前没有办法在仪表板内把 super_admin 授予其他账户。

Webhook

在 Admin → Integrations(仅限 super_admin)中按项目配置。该项目上每次发生订阅的事件时,webhook 都会向你的端点发送请求。

事件

一个 webhook 可以订阅以下任意事件:

  • key.deleted — 一个或多个翻译键被删除
  • translation.saved — 保存了一个翻译值
  • scan.completed — 针对新增或变更键的源代码扫描已完成
  • sync.completed — 与已配置翻译服务商的同步已完成

验证一次投递

发往通用 HTTP 端点的每次投递都带有X-Webhook-Signature(使用创建 webhook 时仅显示一次的密钥,对 JSON 正文做 HMAC-SHA256)和X-Webhook-Event。Slack 和 Discord 的端点 URL 会被自动识别,并改为使用各自平台专属的消息格式发送;这两种集成通过 URL 本身完成鉴权,因此从不携带签名头。

出站 URL 要求

  • 必须解析为公网地址——loopback、私有地址(RFC1918/唯一本地地址)和链路本地地址会被拒绝,无论是在你保存 URL 时,还是在每次尝试投递时(包括每一跳重定向),这堵住了主机名在两个时间点解析结果不同的漏洞。
  • 在生产环境中,端点必须使用https:——仅在生产环境之外才允许使用普通 HTTP。
  • URL 中嵌入的凭据(https://user:pass@host)会被拒绝。
  • 投递会在 10 秒后超时,最多跟随 5 次重定向。

点击某个 webhook 旁边的 ▶ 按钮,即可按需发送一个已签名的 ping 事件,无需等待真实事件发生。

备份与恢复

仅限 super_admin,可在 Admin → Backup 或通过 CLI 执行。备份是一个单独的 JSON 导出文件,涵盖所有项目、翻译、用户和设置。

始终排除:refresh_tokens, password_reset_tokens, otp_tokens, webhook_deliveries,以及每个账户的密码哈希。

在仪表板中

点击“Download backup”会保存一个带日期的 JSON 文件,例如 i18n-dashboard-backup-2026-07-31.json。

恢复操作会重新上传该文件,并要求选择一种模式:

  • merge(默认)保留已有的行,只插入缺失的数据
  • replace 会先删除每张表中已有的数据,再导入——不可撤销

结果会报告已恢复的行数、跳过的重复项,以及任何失败的行,而不是在部分恢复的情况下悄悄报告成功。

在 CLI 中

bash

两个命令都需要一个更高权限的管理员令牌——NUXT_CLI_ADMIN_TOKEN(回退到NUXT_CLI_TOKEN)——通过--token传入,或从你的 CLI 配置中解析。

故障排查

自托管用户最常遇到的问题,直接摘自 Docker 镜像自身的故障排查指南。

  • Refusing to start: NUXT_DB_HOST is still the build-time default 'localhost' — 你的环境仍在使用加 NUXT_* 前缀之前的变量名。请给数据库相关的环境变量加上 NUXT_ 前缀(NUXT_DB_HOST、NUXT_DB_USER 等)。
  • Webapp returns 401 on every API call — 无法访问 JWKS 端点。请确认 NUXT_CENTRAL_AUTH_URL 能从容器内部解析(如果两个服务在同一个 compose 中运行,请使用 Docker 网络主机名)。
  • JWT verification fails right after a key rotation — JWKS 缓存保留 1 小时,并在密钥 ID 未命中后 30 秒刷新。请预留一小段宽限期,或在轮换密钥后立即重启 Web 应用。
  • Health check shows "0 keys" despite a non-empty database — 你很可能连接到了错误的数据库。请确认 NUXT_DB_HOST 确实已设置,而不是回退到遗留的 SQLite 文件。
  • Container starts on port 3000 instead of 6001 — Nitro 直接读取 PORT。镜像设置了 I18N_PORT=6001,但覆盖 PORT 会改变绑定端口——请让它与你的 ports: 映射保持一致。
  • Can't reach the dashboard from another machine — 使用默认 Compose 配置时属于预期行为——该端口被有意绑定到 127.0.0.1。如需刻意对外暴露,请绑定一个可路由的地址,或在前面放置一个反向代理。