PocketBase 自建后端服务:Docker 部署替代 Firebase

1483 字
7 分钟
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 Stars59.4k
🐹 语言Go(100%)
📦 最新版v0.26.0(2026-06 活跃开发中)
📄 许可证MIT
🐳 Docker 镜像pocketbase/pocketbase
💾 数据库内置 SQLite(无需额外数据库)

为什么能替代 Firebase?

特性PocketBaseFirebaseSupabase
部署单文件 🏆SaaS多组件(~5 个容器)
数据库SQLite(文件级)Firestore(NoSQL)PostgreSQL
认证系统✅ 内置(邮箱/OAuth2)
文件存储✅ 内置(本地/S3)
管理面板✅ 内置✅ Web 控制台✅ Studio
实时订阅✅ SSE✅ WebSocket✅ Realtime
自定义逻辑Go 插件 / JS 钩子Cloud FunctionsSQL 函数
自有数据完全自控 🏆❌ Google 服务器✅ 可选自建
免费额度无限制 🏆有限制有限制

Docker 部署 PocketBase#

快速启动(docker compose)#

docker-compose.yml
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

启动:

Terminal window
docker compose up -d

访问管理面板:http://你的服务器IP:8090/_/

一行命令启动#

Terminal window
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 表,添加字段:

字段名类型说明
titletext(required)标题
contenteditor(rich text)正文(富文本)
publishedbool是否发布
coverfile封面图
authorrelation -> users关联到用户

2. 设置 API 规则#

PocketBase 用简单规则语法控制谁可以做什么:

# 任何人都可以读已发布的文章
@request.auth.id != "" && published = true
# 只有作者可以编辑自己的文章
@request.auth.id = author.id

3. 前端调用#

无需写后端代码,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(pocketbase npm 包),让前端调用更简单。

用 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 会自动加载:

pb_hooks/main.pb.js
// 文章创建后发送通知
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 重新定义了后端开发的入门门槛:

  1. 一个二进制 = 全部——数据库 + API + 认证 + 文件存储 + 管理面板,30 秒启动
  2. 零代码生成 REST API——创建数据表即可自动拥有完整的 CRUD 接口
  3. 内置管理面板——可视化操作,非技术人员也能管理数据
  4. 轻量级——10MB 内存,1 核 256MB 服务器就能流畅运行
  5. JS/Go 双钩子系统——需要自定义逻辑时随时扩展

如果你正在为下一个想法的后端发愁,或者想找个轻量级后端做前端演示,PocketBase 是当下最好的选择。


本文由小啪撰写,基于 PocketBase v0.26.0。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
PocketBase 自建后端服务:Docker 部署替代 Firebase
https://www.kshare.top/posts/2026-pocketbase-自建后端服务docker部署替代-firebase/
作者
Kshare
发布于
2026-07-06
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
站点已开启广告(类型:弹窗广告),给您带来的不便敬请谅解。如有更好的广告建议,欢迎发送邮件至 t9uzrz6u@anonaddy.me,感谢您的支持!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
187
分类
9
标签
190
总字数
490,175
运行时长
0
最后活动
0 天前

文章目录