Teable Docker Compose 部署指南

Ubuntu 22.04 上用 Docker Compose 从零部署 Teable 1.10.0 Standalone(应用+PostgreSQL 15.4+Redis 7.2.4,端口 8105):首次启动迁移日志、健康检查、管理员注册、数据持久化与备份、等价 docker run、升级与 FAQ 全流程实测。

TeableTeable2026/10/18

Teable Docker Compose 部署指南

目标:在一台 Ubuntu 服务器上用 Docker Compose 从零部署 Teable 1.10.0(Standalone 形态:应用 + PostgreSQL + Redis),对外端口 8105,含首次启动初始化、数据持久化、等价单命令部署、备份与升级全流程;全部命令与回显均在 Ubuntu 22.04.4 LTS + Docker 29.8.1 环境逐条实测照录。

一、环境信息

  • 操作系统:Ubuntu 22.04.4 LTS(x86_64,12 核 / 32GB 内存 / 500GB+ 可用磁盘)
  • Docker:29.8.1(docker --version 实测)
  • Docker Compose:v5.5.1(docker compose version 实测)
  • Teable:1.10.0(发布件 ghcr.io/teableio/teable:latest,构建标识 release.2026-10-16T07-06-34Z.3445,发布件内核心包 @teable/core 版本实测 1.10.0)
  • PostgreSQL:15.4(官方 Standalone 编排指定版本)
  • Redis:7.2.4(官方 Standalone 编排指定版本)
  • 端口规划:宿主机 8105 → 应用服务内 3000;宿主机 42345 → 数据库 5432(按需保留)
  • 部署目录:/opt/teable
  • 演示账号:admin@teable.local / q1w2e3r4(首个注册用户自动成为实例管理员)
  • 实测日期:2026-10-18

二、镜像选型说明

官方发布件单一入口为 ghcr.io/teableio/teable,Docker Hub 同步发布 teableio/teable。两处 tag 体系一致:

tag含义适用
latest跟随最新滚动发布(当前指向 2026-10-16 构建)评估、尝鲜
release.2026-10-16T07-06-34Z.3445时间戳.构建号精确版本(官方 2026 年中起的版本命名方式)生产固定版本
  • 官方自 2026 年中起不再打 v* 语义化 tag,改用「时间戳.构建号」滚动发布(约每周 6~7 个 Release),版本对应关系见《Teable 1.10 介绍与选型指南》;
  • 生产建议:固定到 release.* 时间戳 tag,升级时再改回新构建号(实测 docker manifest inspect ghcr.io/teableio/teable:release.2026-10-16T07-06-34Z.3445 可正常解析,该 tag 存在);
  • 数据库与缓存版本:官方 Standalone 编排固定 postgres:15.4 与 redis:7.2.4,建议跟随官方组合,不要自行升级主版本。

三、前置条件

  1. 已安装 Docker 与 Docker Compose 插件(本机实测版本见环境信息;安装方法见官方文档 https://docs.docker.com/engine/install/);
  2. 服务器最低资源(官方 docker.md 口径):4GB 内存、2 核 CPU、40GB 磁盘;
  3. 端口未被占用:部署前先检查 8105 端口(实测回显为空即空闲):
ss -ltn | grep ':8105' || echo "PORT 8105 FREE"

实测回显:

PORT 8105 FREE
  1. 可访问镜像仓库(ghcr.io);拉取缓慢或超时可为 Docker 守护进程配置 HTTP 代理(/etc/docker/daemon.json 或 systemd 环境变量方式,配置后 systemctl restart docker 生效);
  2. 若服务器启用了防火墙(ufw/firewalld),放行 8105 端口。

四、部署步骤

4.1 创建部署目录

mkdir -p /opt/teable && cd /opt/teable

说明:目录名即 Compose 项目名,后续数据卷命名会带上该前缀(本例为 teable_*)。

4.2 编写 docker-compose.yaml

在 /opt/teable/docker-compose.yaml 写入以下内容(结构与官方仓库 dockers/examples/standalone/docker-compose.yaml 一致,仅调整了对外端口、网络子网与固定服务名):

services:
  teable:
    image: ghcr.io/teableio/teable:latest
    container_name: teable-1-10-0-app
    restart: always
    ports:
      - '8105:3000'
    volumes:
      - teable-data:/app/.assets:rw
    env_file:
      - .env
    environment:
      - TZ=${TIMEZONE}
    networks:
      - teable-standalone
    depends_on:
      teable-db:
        condition: service_healthy
      teable-cache:
        condition: service_healthy

  teable-db:
    image: postgres:15.4
    container_name: teable-1-10-0-db
    restart: always
    ports:
      - '42345:5432'
    volumes:
      - teable-db:/var/lib/postgresql/data:rw
    environment:
      - TZ=${TIMEZONE}
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    networks:
      - teable-standalone
    healthcheck:
      test: ['CMD-SHELL', "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
      interval: 10s
      timeout: 3s
      retries: 3
  teable-cache:
    image: redis:7.2.4
    container_name: teable-1-10-0-cache
    restart: always
    expose:
      - '6379'
    volumes:
      - teable-cache:/data:rw
    networks:
      - teable-standalone
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 3s
      retries: 3


networks:
  teable-standalone:
    name: teable-standalone-network
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.33.0/24

volumes:
  teable-data: {}
  teable-db: {}
  teable-cache: {}

配置要点逐项说明:

  • teable 服务:官方应用发布件,应用内固定监听 3000;8105:3000 把宿主机 8105 映射到应用端口;teable-data 卷挂载到 /app/.assets 存放本地附件与内置资源;
  • teable-db 服务:PostgreSQL 15.4,官方健康检查 pg_isready 通过后应用才会启动(depends_on.condition: service_healthy);42345:5432 把数据库暴露到宿主机,仅用于运维排查,不需要时可删除该映射;
  • teable-cache 服务:Redis 7.2.4,仅在内网暴露(expose,不映射宿主机端口),--requirepass 强制密码,--appendonly yes 开启 AOF 持久化;
  • networks:自定义网桥并显式固定子网 10.89.33.0/24——显式声明可避免随机网段与服务器既有内网冲突(内网网段冲突会抢占路由导致整机断网),网段可按部署环境替换为其他空闲私网段;
  • restart: always:三个服务全部开机自启、异常自动拉起。

4.3 编写 .env

在 /opt/teable/.env 写入(与官方 dockers/examples/standalone/.env 结构一致,演示口令按测试规范落为 q1w2e3r4,生产环境请替换为强口令):

TIMEZONE=Asia/Shanghai

# Postgres
POSTGRES_HOST=teable-db
POSTGRES_PORT=5432
POSTGRES_DB=teable
POSTGRES_USER=teable
POSTGRES_PASSWORD=q1w2e3r4

# Redis
REDIS_HOST=teable-cache
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=q1w2e3r4

# App
PUBLIC_ORIGIN=http://127.0.0.1:8105
PRISMA_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}

BACKEND_CACHE_PROVIDER=redis
BACKEND_CACHE_REDIS_URI=redis://default:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}

关键项说明:

  • PUBLIC_ORIGIN:对外访问地址,必须与实际访问入口一致(含端口)。它决定邀请链接、头像 URL 等对外地址的生成(实测设为 http://127.0.0.1:8105 时,注册接口返回的头像字段为 http://127.0.0.1:8105/api/attachments/read/public/avatar/<用户ID>)。通过域名或 IP 访问时改成对应值,如 http://192.168.146.128:8105;
  • PRISMA_DATABASE_URL:主数据库连接串,Compose 会展开 ${POSTGRES_USER} 等变量;
  • BACKEND_CACHE_PROVIDER=redis + BACKEND_CACHE_REDIS_URI:缓存与任务队列走 Redis(REDIS_DB=0 即 URI 末尾的 /0);
  • 密钥类变量(SECRET_KEY、BACKEND_STORAGE_ENCRYPTION_KEY/IV、BACKEND_ACCESS_TOKEN_ENCRYPTION_KEY/IV 等)首次部署建议一并配置,未配置时服务会用内置公开默认值启动并打印告警,详见《Teable 1.10 配置参数详解》。

4.4 启动服务

docker compose up -d

实测回显(首次启动,需先拉取发布件,约 3.4GB,已拉取时直接进入启动流程):

[+] Running 8/8
 ✔ Network teable-standalone-network  Created
 ✔ Volume "teable_teable-cache"       Created
 ✔ Volume "teable_teable-db"          Created
 ✔ Volume "teable_teable-data"        Created
 ✔ Container teable-1-10-0-db         Healthy
 ✔ Container teable-1-10-0-cache      Healthy
 ✔ Container teable-1-10-0-app        Started

4.5 观察首次启动初始化

首次启动时应用自动完成数据库迁移(建元数据库全部表结构),过程约 40~60 秒:

docker compose logs -f teable

实测回显(节选,实测保留首尾):

teable-1-10-0-app  | Running database migration...
teable-1-10-0-app  | DB Migrate Starting
teable-1-10-0-app  | meta database target: teable-db:5432 (postgresql)
teable-1-10-0-app  | data database target: teable-db:5432 (postgresql)
teable-1-10-0-app  | Running meta database migration...
teable-1-10-0-app  | meta database migration completed: ProcessOutput {
teable-1-10-0-app  |   stdout: 'Prisma schema loaded from prisma/postgres/schema.prisma\n' +
teable-1-10-0-app  |   'Datasource "db": PostgreSQL database "teable" at "teable-db:5432"\n' +
teable-1-10-0-app  |   '\n' +
teable-1-10-0-app  |   '255 migrations found in prisma/migrations\n' +
teable-1-10-0-app  |   '\n' +
teable-1-10-0-app  |   'Applying migration `20240308114704_initial_database`\n' +
teable-1-10-0-app  |   'Applying migration `20240313062534_add_credit`\n' +
teable-1-10-0-app  |   'Applying migration `20240409081450_field_order`\n' +
...(中间 240 余条迁移逐条执行,略)...
teable-1-10-0-app  |   '14 migrations found in prisma/migrations\n' +
teable-1-10-0-app  |   'Applying migration `20260421000000_init_data_db_baseline`\n' +
teable-1-10-0-app  |   'Applying migration `20260623000000_add_data_db_attachment_support`\n' +
teable-1-10-0-app  |   'Applying migration `20260823080000_add_computed_outbox_lineage_and_run_history`\n' +
teable-1-10-0-app  | ▲ Next.js 16.3.8
teable-1-10-0-app  | - Local:         http://localhost:3002
teable-1-10-0-app  | - Network:       http://0.0.0.0:3002
teable-1-10-0-app  | ✓ Ready in 0ms
...(后台任务初始化日志,略)...
teable-1-10-0-app  | {"level":30,...,"msg":"Nest application successfully started"}
teable-1-10-0-app  | {"level":30,...,"msg":"> NODE_ENV is production"}
teable-1-10-0-app  | {"level":30,...,"msg":"> Ready on http://localhost:3000"}
teable-1-10-0-app  | {"level":30,...,"msg":"> System Time Zone: Asia/Shanghai"}
teable-1-10-0-app  | {"level":30,...,"msg":"> Current System Time: Sun Oct 18 2026 20:10:34 GMT+0800 (China Standard Time)"}
teable-1-10-0-app  | {"level":30,...,"context":"BuiltinAssetsInitService","msg":"Builtin assets initialization completed"}
teable-1-10-0-app  | {"level":30,...,"context":"EeAssetsInitService","msg":"[EE] Assets initialization completed"}

看到 Nest application successfully started 与 > Ready on http://localhost:3000 即初始化完成。

4.6 验证服务状态与健康检查

服务状态(三服务全部 Up,db/cache 显示 healthy):

docker compose ps

实测回显:

NAME                  IMAGE                            COMMAND                   SERVICE        STATUS                    PORTS
teable-1-10-0-app     ghcr.io/teableio/teable:latest   "scripts/start.sh"        teable         Up 52 seconds             0.0.0.0:8105->3000/tcp, [::]:8105->3000/tcp
teable-1-10-0-cache   redis:7.2.4                      "docker-entrypoint.s…"   teable-cache   Up About a minute (healthy)   6379/tcp
teable-1-10-0-db      postgres:15.4                    "docker-entrypoint.s…"   teable-db      Up About a minute (healthy)   0.0.0.0:42345->5432/tcp, [::]:42345->5432/tcp

健康检查端点(应用内置,返回元数据库连通状态):

curl -s http://127.0.0.1:8105/health

实测回显:

{"status":"ok","info":{"metaDatabase":{"responseTime":3,"status":"up"}},"error":{},"details":{"metaDatabase":{"responseTime":3,"status":"up"}}}

宿主机端口监听确认:

ss -ltn | grep -E ':(8105|42345)\b'

实测回显:

LISTEN 0      4096         0.0.0.0:8105       0.0.0.0:*
LISTEN 0      4096         0.0.0.0:42345      0.0.0.0:*
LISTEN 0      4096            [::]:8105          [::]:*
LISTEN 0      4096            [::]:42345         [::]:*

网段固定确认(子网应为我们声明的 10.89.33.0/24,且宿主机默认路由不受影响):

docker network inspect teable-standalone-network --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'
ip route get 192.168.1.62 | head -1

实测回显:

10.89.33.0/24
192.168.1.62 via 192.168.146.2 dev ens33 src 192.168.146.128 uid 0

4.7 注册管理员并登录

浏览器访问 http://<服务器IP>:8105,进入初始化注册页创建首个账号(首个注册用户自动成为实例管理员)。也可用 API 完成注册与登录(注册接口 POST /api/auth/signup,登录接口 POST /api/auth/signin):

curl -s -X POST "http://127.0.0.1:8105/api/auth/signup" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@teable.local","password":"q1w2e3r4"}'

实测回显:

{"id":"usrmBbQTvZwObJ4ugW8","name":"admin","phone":null,"email":"admin@teable.local","isAdmin":true,"lang":"en","notifyMeta":{"email":true},"avatar":"http://127.0.0.1:8105/api/attachments/read/public/avatar/usrmBbQTvZwObJ4ugW8","hasPassword":true}

⚠️ 注意:返回中的 isAdmin: true 仅在首个注册用户出现;第二个及以后注册的用户 isAdmin 为 false。name 字段取邮箱前缀自动填充,可在网页端个人设置中修改。

登录验证(成功后返回用户信息并通过 Set-Cookie 下发会话):

curl -s -X POST "http://127.0.0.1:8105/api/auth/signin" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@teable.local","password":"q1w2e3r4"}' -D - -o /dev/null | grep -i set-cookie | cut -c1-80

实测回显(会话 Cookie 片段):

Set-Cookie: auth_session=s%3AfPNBo8DvYDPbnAEeeMOlMB_CYD215DZN.kULZwnWun4CiX5y

浏览器登录后即可进入工作台建空间、建项目、建表。

五、数据持久化说明

5.1 数据卷布局

docker volume ls | grep teable

实测回显(卷名 = 项目名 teable + 卷名):

local     teable_teable-cache
local     teable_teable-db
local     teable_teable-data
卷挂载点(服务内)存放内容
teable_teable-data/app/.assets本地附件、头像等上传资源(默认存储后端)
teable_teable-db/var/lib/postgresql/dataPostgreSQL 全部数据(元数据 + 业务表数据)
teable_teable-cache/dataRedis AOF 持久化数据(缓存与队列,可丢失重建)

💡 说明:业务数据(表格、记录、用户)在 teable-db 卷;附件在 teable-data 卷;两者都要备份。若希望附件直接落在宿主机目录,可把 teable-data 卷换成 bind mount(如 ./data/assets:/app/.assets:rw),官方编排注释中给出了这一写法。

5.2 重启后数据验证

重启应用服务后数据完整保留(会话与用户不丢):

docker compose restart teable

实测回显:

[+] Restarting 1/1
 ✔ Container teable-1-10-0-app  Started

等待约 30 秒应用就绪后验证:

curl -s http://127.0.0.1:8105/health
curl -s -X POST "http://127.0.0.1:8105/api/auth/signin" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@teable.local","password":"q1w2e3r4"}' | head -c 120

实测回显:

{"status":"ok","info":{"metaDatabase":{"responseTime":2,"status":"up"}},"error":{},"details":{"metaDatabase":{"responseTime":2,"status":"up"}}}
{"id":"usrmBbQTvZwObJ4ugW8","name":"admin","phone":null,"email":"admin@teable.local","isAdmin":true,"lang":"en","notifyMeta":{"email":true},"avatar":"

用户 ID 与重启前一致(usrmBbQTvZwObJ4ugW8),数据持久化生效。

5.3 数据库内部结构核对

业务与元数据全部落在 PostgreSQL(可直连核对):

docker compose exec -T teable-db psql -U teable -d teable -t -c \
  "SELECT count(*) FROM pg_tables WHERE schemaname='public';"

实测回显:

   145

💡 说明:145 张表为元数据库表(base、table_meta、user、access_token 等);用户在各项目中创建的业务表同样以真实 PostgreSQL 表存在,可用 SQL 直连分析——这是 Teable「记录即数据库表」架构的直接证据。

5.4 备份与恢复

备份(在宿主机生成 SQL 转储):

cd /opt/teable
docker compose exec -T teable-db pg_dump -U teable -d teable > teable-backup-$(date +%F).sql
ls -lh teable-backup-*.sql

实测回显(转储文件约 300KB,随数据量增长):

-rw-r--r-- 1 root root 307232 Oct 18 20:17 teable-backup-2026-10-18.sql

恢复(空库导入转储):

cat teable-backup-2026-10-18.sql | docker compose exec -T teable-db psql -U teable -d teable

⚠️ 注意:完整备份还应包含附件卷 teable-data(tar 打包宿主机对应 volume 目录或 bind mount 目录)。生产环境建议 cron 定时执行 5.4 的备份命令并异地存放转储文件。

六、环境变量表

官方全部环境变量说明见文档站 https://help.teable.ai/en/deploy/env (2026-10-18 抓取)。Standalone 部署涉及的核心变量如下(默认值与实测行为详见《Teable 1.10 配置参数详解》):

变量必填默认值说明
PUBLIC_ORIGIN✅—对外访问地址,生成链接/头像 URL 的基准
PRISMA_DATABASE_URL✅—主数据库连接串(或 DATABASE_URL)
BACKEND_CACHE_PROVIDER—sqlite缓存后端:memory / sqlite / redis
BACKEND_CACHE_REDIS_URI✅—Redis 连接 URI(校验层强制必填,同时用于计算任务队列)
TZ / TIMEZONE—UTC时区(日志与日期显示)
PORT—3000应用内监听端口
LOG_LEVEL—info日志级别:fatal/error/warn/info/debug/trace
SECRET_KEY建议内置公开值JWT/会话/分享的根密钥(openssl rand -base64 32 生成)
BACKEND_STORAGE_ENCRYPTION_KEY / _IV建议内置公开值附件访问令牌加密(16 字符随机串)
BACKEND_ACCESS_TOKEN_ENCRYPTION_KEY / _IV建议内置公开值API 令牌加密(16 字符随机串)
BACKEND_STORAGE_PROVIDER—local附件存储:local/minio/s3/aliyun
BACKEND_SESSION_EXPIRES_IN—7d登录会话有效期
BACKEND_JWT_EXPIRES_IN—20dJWT 有效期
PASSWORD_LOGIN_DISABLED—false置 true 关闭密码登录(仅 OAuth/OIDC)

密钥生成命令实测:

openssl rand -base64 32
openssl rand -hex 8
openssl rand -hex 8

实测回显(每次执行结果不同,此处为实测样例):

arNqKGLeb0cJyMqPgWzVJK9Yno+V2j9dwntLdmZDJIY=
1f3dfd8b72471373
593baf48b1c66380

七、配置参数说明

  • 参数注入方式:Teable 全部参数为环境变量驱动,无主配置文件;Compose 部署改 .env 或编排文件 environment: 段后,必须 docker compose up -d 重建服务才会重新读取(docker compose restart 不会重读 .env,见 FAQ Q2);
  • 健康自检:/health 返回元数据库状态,升级或改参后首先核对它;
  • 启动日志核对:docker compose logs teable | grep -E 'Ready|Time Zone' 可确认端口、时区等启动期参数;
  • 附件存储切换:默认 local(/app/.assets/uploads),切 MinIO/S3 需增配 BACKEND_STORAGE_PROVIDER 与对应端点/密钥变量组,全量变量见第六章官方链接。

八、配置文件挂载

官方 Standalone 编排未挂载任何配置文件——Teable 没有主配置文件,配置全部经环境变量注入,因此仅需挂载数据卷:

挂载类型作用
teable-data:/app/.assets:rw命名卷附件与内置资源(可改 bind mount 落宿主机目录)
teable-db:/var/lib/postgresql/data:rw命名卷PostgreSQL 数据
teable-cache:/data:rw命名卷Redis AOF 数据

如需 bind mount(数据直落宿主机目录,便于备份迁移),把 teable-data 的卷引用替换为:

    volumes:
      - ./data/assets:/app/.assets:rw
      - ./data/db:/var/lib/postgresql/data:rw

⚠️ 注意:从命名卷切换为 bind mount 时,旧卷中的存量数据需先拷贝到新目录(docker run --rm -v teable_teable-db:/from -v $(pwd)/data/db:/to alpine cp -a /from/. /to/),否则会出现"数据消失"的假象——其实是新挂载点为空。

九、等价 docker run 命令

不使用 Compose 时,以下三条 docker run 与第四章编排完全等价(实测通过,应用健康检查与注册均正常;容器名与端口为避免与 Compose 栈冲突,后缀 -manual、宿主端口改用 8106/42346):

# 1. 创建自定义网络(生产按需固定空闲私网段,禁止落在服务器内网段)
docker network create -d bridge --subnet 10.89.35.0/24 teable-run-net

# 2. 启动 PostgreSQL(数据落命名卷,健康检查与编排一致)
docker run -d --name teable-1-10-0-manual-db --network teable-run-net \
  -e TZ=Asia/Shanghai -e POSTGRES_DB=teable -e POSTGRES_USER=teable -e POSTGRES_PASSWORD=q1w2e3r4 \
  -v teable-manual-db-data:/var/lib/postgresql/data:rw \
  --health-cmd "sh -c 'pg_isready -U teable -d teable'" --health-interval 10s --health-timeout 3s --health-retries 3 \
  postgres:15.4

# 3. 启动 Redis(AOF 持久化 + 密码)
docker run -d --name teable-1-10-0-manual-cache --network teable-run-net \
  -v teable-manual-cache-data:/data:rw \
  redis:7.2.4 redis-server --appendonly yes --requirepass q1w2e3r4

# 4. 等数据库健康后启动应用(映射 8106 -> 3000)
docker run -d --name teable-1-10-0-manual-app --network teable-run-net \
  -p 8106:3000 -e TZ=Asia/Shanghai \
  -e PUBLIC_ORIGIN=http://127.0.0.1:8106 \
  -e PRISMA_DATABASE_URL='postgresql://teable:q1w2e3r4@teable-1-10-0-manual-db:5432/teable' \
  -e BACKEND_CACHE_PROVIDER=redis \
  -e 'BACKEND_CACHE_REDIS_URI=redis://default:q1w2e3r4@teable-1-10-0-manual-cache:6379/0' \
  -v teable-manual-app-data:/app/.assets:rw \
  ghcr.io/teableio/teable:latest

逐步验证(实测回显):

docker ps --filter name=manual --format '{{.Names}} {{.Status}}'
teable-1-10-0-manual-app Up About a minute
teable-1-10-0-manual-cache Up About a minute
teable-1-10-0-manual-db Up 2 minutes (healthy)
curl -s http://127.0.0.1:8106/health
{"status":"ok","info":{"metaDatabase":{"responseTime":2,"status":"up"}},"error":{},"details":{"metaDatabase":{"responseTime":2,"status":"up"}}}
curl -s -X POST "http://127.0.0.1:8106/api/auth/signup" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@teable.local","password":"q1w2e3r4"}' | head -c 120
{"id":"usrYQTznWIbgGmmmIGs","name":"admin","phone":null,"email":"admin@teable.local","isAdmin":true,"lang":"en","notifyMeta":{"email":true},"avatar":"http://127.0.0.1:8106/api/attachments/read/public/

💡 说明:若与 Compose 栈并存,同一台服务器上的两套 Teable 是两个独立实例(各自独立数据库卷),不要让两个应用指向同一个数据库卷。

十、常用运维命令

以下命令均在 /opt/teable 目录执行:

# 查看三服务状态(含健康检查)
docker compose ps

# 查看应用日志(实时跟踪)
docker compose logs -f teable

# 查看应用日志(最近 200 行)
docker compose logs --tail 200 teable

# 重启单个服务(不重读 .env)
docker compose restart teable

# 重建并启动(.env/编排变更后使用)
docker compose up -d

# 停止全部服务(保留数据卷)
docker compose stop

# 启动已停止的服务
docker compose start

# 进入数据库命令行
docker compose exec teable-db psql -U teable -d teable

# 查看数据卷占用
docker system df -v | grep teable

升级到新版本(固定 tag 部署时改编排文件中的 tag 后重建):

docker compose pull          # 拉取 latest 或新 tag
docker compose up -d         # 重建,应用自动执行增量迁移

实测说明:升级过程中应用启动时会自动执行新增的数据库迁移(首次启动 255 个迁移全量执行,后续升级只执行增量),迁移日志模式与 4.5 节一致;升级前务必先完成 5.4 节备份。回滚 = 把 tag 改回旧构建号再 up -d(数据库结构由 Prisma 迁移管理,跨大版本回滚需按官方 Version Upgrade 指南评估)。

十一、常见问题(FAQ)

Q1:拉取发布件超时/失败(failed to copy: httpReadSeeker: failed open ... timeout awaiting response headers 或 EOF)?

实测现象:首次 docker pull ghcr.io/teableio/teable:latest 与 docker pull postgres:15.4 均出现过网络超时中断。定位:服务器直连国外仓库(ghcr.io、cloudfront 分发层)不稳定。解决:为 Docker 守护进程配置 HTTP 代理(/etc/systemd/system/docker.service.d/http-proxy.conf 设置 HTTPS_PROXY,或 daemon 环境注入),systemctl daemon-reload && systemctl restart docker 后重新 docker pull;实测重试后三个发布件均完整拉取成功。

Q2:修改了 .env 但 docker compose restart 后参数没生效?

定位:环境变量在服务创建时注入,restart 只是重启进程,不会重新读取 .env。解决:改 .env 后执行 docker compose up -d,Compose 检测到配置变化会重建服务(实测重建后新参数生效)。改编排文件同理。

Q3:启动后访问 8105 返回 502 或连接被拒?

定位:应用启动要执行数据库迁移(首次约 40~60 秒,255 个迁移),期间 HTTP 未就绪。解决:docker compose logs -f teable 看到 > Ready on http://localhost:3000 后再访问;确认 depends_on 健康检查未被跳过(db/cache 必须 healthy)。

Q4:注册接口报 Cannot POST /api/user/signup?

定位:注册端点为 POST /api/auth/signup(auth 前缀),不是 /api/user/signup。实测 404 回显:{"message":"Cannot POST /api/user/signup","status":404,"code":"not_found"}。解决:改用正确路径,或直接在网页端注册。

Q5:头像/邀请链接的地址不对(显示 127.0.0.1 或旧端口)?

定位:PUBLIC_ORIGIN 与实际访问入口不一致,该变量决定对外链接生成。解决:改 .env 中 PUBLIC_ORIGIN 为真实访问地址后 docker compose up -d 重建。

Q6:忘记管理员密码无法登录?

解决:数据库直连重置。进入 docker compose exec teable-db psql -U teable -d teable,在 user 表按 email 定位记录后按官方文档重置流程处理(Teable 密码为哈希存储,不能直接改明文;推荐用管理员账号在「用户管理」中重置目标用户密码,或配置邮件服务走自助找回——邮件服务配置见官方 deploy/email 页)。

Q7:服务时区不对(日志时间与本地不一致)?

定位:.env 中 TIMEZONE 默认 UTC。解决:改为 Asia/Shanghai 后重建,启动日志会打印 > System Time Zone: Asia/Shanghai(实测回显见 4.5 节)。

十二、参考链接

  1. 官方 Docker 部署文档:https://help.teable.ai/en/deploy/docker (查询日期 2026-10-18)
  2. 官方 Standalone 编排源文件:https://github.com/teableio/teable/blob/develop/dockers/examples/standalone/docker-compose.yaml (查询日期 2026-10-18)
  3. 官方环境变量文档:https://help.teable.ai/en/deploy/env (查询日期 2026-10-18)
  4. 官方部署选择页:https://help.teable.ai/en/deploy/choose (查询日期 2026-10-18)
  5. 官方升级指南:https://help.teable.ai/en/deploy/upgrade (查询日期 2026-10-18)
  6. 全功能自托管(AI/App Builder)部署仓库:https://github.com/teableio/teable-deployment (查询日期 2026-10-18)
  7. 关联文档:《Teable 1.10 介绍与选型指南》《Teable 1.10 配置参数详解》《Teable 1.10 功能验证手册》