Baserow在Linux上必须用docker-compose而非docker run,因其依赖前端、后端、PostgreSQL+Redis三个服务,需depends_on和healthcheck确保启动顺序;BASEROW_PUBLIC_URL须严格匹配根URL格式且不加尾部斜杠;数据目录需chown 1001:1001;邮件需配置SMTP而非console;restart: unless-stopped为生产必需。

Linux 上装 Baserow 不需要编译源码,也不用折腾 PostgreSQL 环境——它官方只提供 Docker 镜像,docker-compose 一条命令就能拉起完整服务。但直接 docker run 容易挂掉、BASEROW_PUBLIC_URL 配错就打不开网页、数据目录权限不对会导致启动失败——这些才是真卡点。
为什么必须用 docker-compose 而不是 docker run
docker run 启动单容器看似简单,但 Baserow 实际依赖三个服务:Web 前端、Django 后端、PostgreSQL 数据库(还带 Redis)。官方镜像 baserow/baserow 是个“all-in-one”打包版,内部已集成 DB 和缓存,但它对宿主机的文件系统权限、网络配置、环境变量顺序极其敏感。
-
docker run没法声明服务依赖顺序,PostgreSQL 可能还没 ready,Django 就去连,结果容器反复重启 - 日志全堆在
docker logs baserow里,DB 启动失败和 Django 连接超时混在一起,排查困难 -
docker-compose的depends_on+healthcheck能强制等待 DB 就绪再启动应用,这是稳定运行的前提
BASEROW_PUBLIC_URL 配错的典型现象和修正方法
浏览器打开 http://192.168.0.197:4180 显示空白页或 502,控制台报 Failed to load resource: the server responded with a status of 404 (Not Found),大概率是 BASEROW_PUBLIC_URL 设错了。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 它不是“你访问的地址”,而是 Baserow 内部生成 API 接口链接、邮件通知链接、Webhook 回调地址时所用的**根 URL**
- 必须以
http://或https://开头,末尾**不能加斜杠**,例如http://192.168.0.197:4180✅,http://192.168.0.197:4180/❌ - 如果你用 Nginx 反代,这里要填反代后的域名,比如
https://baserow.example.com,而不是内网地址 - 改完后必须
docker-compose down && docker-compose up -d,仅docker-compose restart不生效
数据目录权限问题导致容器启动失败
第一次运行 docker-compose up -d 报错:Permission denied: '/baserow/data' 或日志里反复出现 psql: error: connection to server at "localhost" (::1), port 5432 failed,说明容器内进程无法写入挂载卷。
- Baserow 容器默认以 UID/GID 1001 运行,宿主机对应目录所有者必须是 1001,或至少对该 UID 开放读写
- 别用
sudo chown -R $USER:$USER ./data,因为 $USER 通常是 1000,而容器要的是 1001 - 正确做法:
sudo mkdir -p ./data && sudo chown -R 1001:1001 ./data - 如果用群晖等 NAS,需在 Docker 图形界面中手动设置“用户/组 ID”为 1001,否则 Web 界面会提示“Database migration failed”
启动后无法注册或登录的隐藏原因
页面能打开,但点击 “Sign up” 没反应,或注册邮箱收不到验证码,不是网络问题,而是两个关键配置漏了:
-
BASEROW_EMAIL_BACKEND=console是开发默认值,它把邮件打印到日志里,不会真发出去;生产环境必须改成smtp并配好EMAIL_HOST等参数 -
ENABLE_ACCOUNT_DELETION=false默认关闭,但如果你之前试过注册又删库重来,旧邮箱可能被硬编码进数据库,导致新注册报Email already exists—— 此时得进容器执行docker exec -it baserow psql -U baserow -c "DELETE FROM auth_user WHERE email='xxx@xxx.com';"
最常被忽略的是:Baserow 的 docker-compose.yml 里没显式声明 restart: unless-stopped,宿主机重启后服务就停了,得手动拉起。这个字段不是可选的,是生产可用的底线配置。

















