Teable Docker Compose 部署指南
Ubuntu 22.04 上用 Docker Compose 从零部署 Teable 1.10.0 Standalone(应用+PostgreSQL 15.4+Redis 7.2.4,端口 8105):首次启动迁移日志、健康检查、管理员注册、数据持久化与备份、等价 docker run、升级与 FAQ 全流程实测。
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,建议跟随官方组合,不要自行升级主版本。
三、前置条件
- 已安装 Docker 与 Docker Compose 插件(本机实测版本见环境信息;安装方法见官方文档 https://docs.docker.com/engine/install/);
- 服务器最低资源(官方 docker.md 口径):4GB 内存、2 核 CPU、40GB 磁盘;
- 端口未被占用:部署前先检查 8105 端口(实测回显为空即空闲):
ss -ltn | grep ':8105' || echo "PORT 8105 FREE"
实测回显:
PORT 8105 FREE
- 可访问镜像仓库(ghcr.io);拉取缓慢或超时可为 Docker 守护进程配置 HTTP 代理(
/etc/docker/daemon.json或 systemd 环境变量方式,配置后systemctl restart docker生效); - 若服务器启用了防火墙(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/data | PostgreSQL 全部数据(元数据 + 业务表数据) |
teable_teable-cache | /data | Redis 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 | — | 20d | JWT 有效期 |
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 节)。
十二、参考链接
- 官方 Docker 部署文档:https://help.teable.ai/en/deploy/docker (查询日期 2026-10-18)
- 官方 Standalone 编排源文件:https://github.com/teableio/teable/blob/develop/dockers/examples/standalone/docker-compose.yaml (查询日期 2026-10-18)
- 官方环境变量文档:https://help.teable.ai/en/deploy/env (查询日期 2026-10-18)
- 官方部署选择页:https://help.teable.ai/en/deploy/choose (查询日期 2026-10-18)
- 官方升级指南:https://help.teable.ai/en/deploy/upgrade (查询日期 2026-10-18)
- 全功能自托管(AI/App Builder)部署仓库:https://github.com/teableio/teable-deployment (查询日期 2026-10-18)
- 关联文档:《Teable 1.10 介绍与选型指南》《Teable 1.10 配置参数详解》《Teable 1.10 功能验证手册》