PocketBase 自建后端服务:Docker 部署替代 Firebase
痛点:想快速搭后端,但工具太沉重
每次想做个小项目——个人博客后台、记账应用、TODO 工具——都会面临同样的问题:
- Firebase — 好用但绑定 Google,免费额度有限,数据不在自己手里
- Supabase — 开源但部署复杂,PostgreSQL + GoTrue + Realtime 好几个组件
- Appwrite — 功能全但太重,Docker 部署要拉好几个镜像
- 自己写后端 — Python/Node/Go 选框架、配数据库、写 CRUD、搞认证……项目还没开始已经累了
有没有一个方案:一个二进制文件 = 数据库 + API + 认证 + 文件存储 + 管理面板?
PocketBase 就是答案。
PocketBase 是什么?
PocketBase 是一个用 Go 编写的开源后端即服务——单个可执行文件包含 SQLite 数据库、自动生成 REST API、用户认证、文件存储、管理后台。
核心指标:
| 指标 | 数据 |
|---|---|
| ⭐ GitHub Stars | 59.4k |
| 🐹 语言 | Go(100%) |
| 📦 最新版 | v0.26.0(2026-06 活跃开发中) |
| 📄 许可证 | MIT |
| 🐳 Docker 镜像 | pocketbase/pocketbase |
| 💾 数据库 | 内置 SQLite(无需额外数据库) |
为什么能替代 Firebase?
| 特性 | PocketBase | Firebase | Supabase |
|---|---|---|---|
| 部署 | 单文件 🏆 | SaaS | 多组件(~5 个容器) |
| 数据库 | SQLite(文件级) | Firestore(NoSQL) | PostgreSQL |
| 认证系统 | ✅ 内置(邮箱/OAuth2) | ✅ | ✅ |
| 文件存储 | ✅ 内置(本地/S3) | ✅ | ✅ |
| 管理面板 | ✅ 内置 | ✅ Web 控制台 | ✅ Studio |
| 实时订阅 | ✅ SSE | ✅ WebSocket | ✅ Realtime |
| 自定义逻辑 | Go 插件 / JS 钩子 | Cloud Functions | SQL 函数 |
| 自有数据 | ✅ 完全自控 🏆 | ❌ Google 服务器 | ✅ 可选自建 |
| 免费额度 | 无限制 🏆 | 有限制 | 有限制 |
Docker 部署 PocketBase
快速启动(docker compose)
version: "3.8"
services: pocketbase: image: pocketbase/pocketbase:latest container_name: pocketbase ports: - "8090:8090" # API + Admin UI volumes: - ./pb_data:/pb_data # 数据库 + 文件存储持久化 - ./pb_public:/pb_public # 静态文件托管 - ./pb_hooks:/pb_hooks # Go/JS 钩子(可选) restart: unless-stopped启动:
docker compose up -d访问管理面板:http://你的服务器IP:8090/_/
一行命令启动
docker run -d --name pocketbase \ -p 8090:8090 \ -v $(pwd)/pb_data:/pb_data \ -v $(pwd)/pb_public:/pb_public \ pocketbase/pocketbase:latest初始化管理员
打开管理面板 http://IP:8090/_/,首次访问会引导创建管理员账号。创建完成后即可看到完整的后台:
- Collections — 创建数据表(不需要写 SQL,图形化操作)
- Users — 用户管理
- Settings — 配置 OAuth2 登录、邮件、文件存储等
- Logs — API 请求日志
快速构建一个 API
1. 创建数据表
在管理面板的 Collections 中创建一个 posts 表,添加字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| title | text(required) | 标题 |
| content | editor(rich text) | 正文(富文本) |
| published | bool | 是否发布 |
| cover | file | 封面图 |
| author | relation -> users | 关联到用户 |
2. 设置 API 规则
PocketBase 用简单规则语法控制谁可以做什么:
# 任何人都可以读已发布的文章@request.auth.id != "" && published = true
# 只有作者可以编辑自己的文章@request.auth.id = author.id3. 前端调用
无需写后端代码,REST API 自动生成:
// 获取文章列表const response = await fetch('http://IP:8090/api/collections/posts/records', { headers: { 'Authorization': 'Bearer YOUR_TOKEN' }});const data = await response.json();
// 创建新文章const create = await fetch('http://IP:8090/api/collections/posts/records', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_TOKEN' }, body: JSON.stringify({ title: 'Hello PocketBase', content: 'This is my first post!' })});PocketBase 支持 JS SDK(
pocketbasenpm 包),让前端调用更简单。
用 Nginx 反代 + HTTPS
server { listen 443 ssl; server_name api.yourdomain.com;
# 托管静态前端 root /var/www/pb_public;
location / { proxy_pass http://127.0.0.1:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
# SSE 实时订阅支持 proxy_set_header Connection ''; proxy_http_version 1.1; proxy_buffering off; proxy_cache off; }}进阶玩法
自定义业务逻辑(JS 钩子)
在 pb_hooks 目录中创建 JavaScript 文件,PocketBase 会自动加载:
// 文章创建后发送通知onRecordAfterCreateRequest((e) => { const record = e.record; console.log(`新文章: ${record.get('title')}`);
// 调用外部 Webhook $http.send({ url: 'https://hooks.example.com/new-post', method: 'POST', body: JSON.stringify({ title: record.get('title') }) });}, 'posts');
// 添加自定义 API 端点routerAdd('GET', '/api/hello', (c) => { return c.json(200, { message: 'Hello from PocketBase!' });});Go 插件扩展
PocketBase 允许用 Go 编写插件,直接嵌入服务:
package main
import ( "log" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/core")
func main() { app := pocketbase.New()
app.OnRecordAfterCreateRequest().Add(func(e *core.RecordCreateEvent) error { log.Println("New record created:", e.Record.Id) return nil })
if err := app.Start(); err != nil { log.Fatal(err) }}实时订阅
前端可以用 SSE 订阅数据变化:
const eventSource = new EventSource( 'http://IP:8090/api/realtime?token=YOUR_TOKEN');
eventSource.addEventListener('PB_CONNECT', (e) => { console.log('已连接实时频道');});
eventSource.addEventListener('posts', (e) => { const record = JSON.parse(e.data); console.log('文章更新:', record);});FAQ
Q:PocketBase 适合生产环境吗?
A:适合。已有大量生产案例,SQLite 在单机场景下表现优异,支持 WAL 模式和高并发读。如果需要多机部署,可用 S3 文件存储 + 只读副本。
Q:数据库文件损坏了怎么办?
A:定期备份 pb_data/data.db 文件即可。PocketBase 内置了自动备份功能,可在管理面板设置每日备份。
Q:支持哪些 OAuth2 登录?
A:Google、GitHub、Discord、Facebook、GitLab、Microsoft 等主流 OAuth2 提供方,在管理面板配置即可。
Q:可以托管前端 SPA 吗?
A:可以。将前端构建产物放入 pb_public 目录,PocketBase 会自动作为静态文件服务器。
Q:性能怎么样?
A:单文件启动仅需 10MB 内存,每秒可处理数千次 API 请求。远低于同功能方案的资源占用。
Q:和 Supabase 比怎么样?
A:PocketBase 胜在极简部署(一个二进制)和低资源占用;Supabase 胜在 PostgreSQL 的关系型能力和 Realtime 的 WebSocket 原生支持。个人项目选 PocketBase,企业级选 Supabase。
总结
PocketBase 重新定义了后端开发的入门门槛:
- ✅ 一个二进制 = 全部——数据库 + API + 认证 + 文件存储 + 管理面板,30 秒启动
- ✅ 零代码生成 REST API——创建数据表即可自动拥有完整的 CRUD 接口
- ✅ 内置管理面板——可视化操作,非技术人员也能管理数据
- ✅ 轻量级——10MB 内存,1 核 256MB 服务器就能流畅运行
- ✅ JS/Go 双钩子系统——需要自定义逻辑时随时扩展
如果你正在为下一个想法的后端发愁,或者想找个轻量级后端做前端演示,PocketBase 是当下最好的选择。
本文由小啪撰写,基于 PocketBase v0.26.0。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!