
PostgREST 安装部署教程10 分钟把 Postgres 表变成可调用的 REST API【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrestPostgREST 是一个独立运行的 Web 服务它把你现有的 PostgreSQL 数据库直接翻译成一套标准 REST API表变成资源端点视图、函数、角色权限决定谁能做什么。你不需要再手写一层 CRUD 接口代码。适合已经把数据放在 Postgres 里、想快速对外提供接口给前端、给第三方、给移动端的团队。下文带你在 10 分钟内跑通并讲清生产环境要注意什么。5 分钟快速开始最短路径是直接用 Docker一个docker-compose.yml同时拉起 Postgres 和 PostgREST一条命令启动。# docker-compose.yml services: db: image: postgres:16 environment: POSTGRES_USER: app_user POSTGRES_PASSWORD: secret POSTGRES_DB: app_db ports: - 5432:5432 postgrest: image: postgrest/postgrest depends_on: - db environment: PGRST_DB_URI: postgres://app_user:secretdb:5432/app_db PGRST_DB_SCHEMAS: public PGRST_DB_ANON_ROLE: anon ports: - 3000:3000保存后执行docker compose up -d再用一个请求验证服务是否就绪curl -s http://localhost:3000/ | head跑成功后你应该看到什么PostgREST 容器日志里出现API server listening on port 3000curl请求根路径会返回一段 JSONOpenAPI 描述或重定向提示。此时服务已经在对外提供 API 了——但因为数据库里还没有表你暂时没有可调用的资源端点。别急下面几步就是给数据库“装表”。部署方式选型PostgREST 的部署方式不多但各有取舍先按场景选一个再往下走部署方式适用场景优点注意点Docker 镜像生产环境、云原生环境一致、镜像极小、启动快需要 Docker 运行时系统包管理器brew / pacman / apt 等单机开发、内网服务一条命令装好、自动处理依赖仓库里的版本可能滞后官方预编译二进制需要指定版本、不想引入 Docker版本可控、单文件即可运行依赖 libpq需自行安装无论哪种方式PostgREST 本体都是同一个 Haskell 编写的二进制包管理器或二进制装好后用postgrest --help验证能打印帮助页即成功。Docker 镜像基于 scratch 构建只含静态二进制体积和攻击面都很小生产环境优先选它。核心原理速览理解一件事就够PostgREST 本身几乎不存数据它把「鉴权」交给 JWT把「授权」和「数据」全部交给数据库。一个请求的处理链路是这样的关键概念是角色role数据库里的每个角色代表一类用户PostgREST 在每个请求开始时切换到对应角色再去跑 SQL因此「这个角色能查什么、改什么」就天然等于「这个用户能查什么、改什么」。安全规则不用在代码里维护全在数据库里声明这是 PostgREST 最核心的设计。场景演练把一张表变成可调用的接口以一张待办事项表为例走完「建数据 → 配权限 → 调接口」的完整闭环。假设你已有一个可连接的 Postgres。第一步建表并配好角色。连到数据库执行create schema if not exists api; create table api.todos ( id int primary key generated by default as identity, task text not null, done boolean not null default false ); insert into api.todos (task) values (写部署文档), (配 PostgREST 权限); -- 匿名用户角色只读 create role web_anon nologin; grant usage on schema api to web_anon; grant select on api.todos to web_anon; -- 可登录的连接角色并允许它切换到 web_anon create role authenticator nologin login password mysecretpassword; grant web_anon to authenticator;这里有两个角色要分清web_anon是「匿名请求进来后 PostgREST 会临时扮演的身份」只给了读权限authenticator是「用来连数据库的身份」它必须被允许切换到web_anon。第二步写配置文件。新建postgrest.confdb-uri postgres://authenticator:mysecretpasswordlocalhost:5432/app_db db-schemas api db-anon-role web_anon server-port 3000db-schemas决定哪些 schema 下的对象会暴露成端点db-anon-role是未登录请求的身份。然后postgrest postgrest.conf启动Docker 场景则用PGRST_*环境变量含义一一对应。第三步调接口。打开另一个终端用 curl 验证# 读取全部匿名角色只读可用 curl -s http://localhost:3000/todos # 过滤 分页 排序PostgREST 语法列操作符.值 curl -s http://localhost:3000/todos?doneis.falseorderid.desclimit10offset0 # 写入匿名角色没有 INSERT 权限应返回 401 curl -s -X POST http://localhost:3000/todos \ -H Content-Type: application/json -d {task:尝试写入}看到第三条返回401 / permission denied for table todos说明权限体系已经生效——匿名只能读。想让用户能写入就再建一个带更高权限的角色并用 JWT 切过去见下一节。多表关联时PostgREST 还能通过外键把关系数据一次性「嵌入」进来例如GET /films?selectid,title,actors(*)会把每部电影连带的演员一起返回。下面这张 ER 图展示的就是这类表间关系外键是嵌入查询能否成立的依据关键配置与安全只列影响面最大的几个参数其余以官方配置参考为准参数默认值作用生产建议db-uri无数据库连接串用专用低权限角色别用 superuserdb-schemaspublic暴露哪些 schema 成端点只暴露面向 API 的 schema如apidb-anon-role无匿名请求使用的角色单独建一个只读角色最小权限jwt-secret无校验 JWT 签名的密钥至少 32 字符定期轮换db-pool10数据库连接池大小按并发调大配合db-pool-acquisition-timeoutdb-max-rows无限制单次返回行数上限设上限防止一次拉爆生产环境必须做的三件事鉴权用 JWT授权交给数据库。客户端拿一个用jwt-secret签名的 tokenPostgREST 校验签名后读取其中的role声明切换到对应角色执行。token 是签名而非加密payload 可被读出来别往里放敏感信息。下面这张图就是「输入密钥 JSON payload → 生成 token」的对应关系想给用户加写入权限时新建todo_user角色、grant all on api.todos to todo_user;并grant todo_user to authenticator;然后在 token 的 payload 里放{role:todo_user}请求带上Authorization: Bearer token即可读写。用行级安全RLS收紧粒度。表级权限之外开启ALTER TABLE api.todos ENABLE ROW LEVEL SECURITY;并用策略限制「每个用户只能看到自己的行」避免越权。给 token 加exp过期时间并在db-pre-request里挂一个函数做黑名单校验实现即时吊销。排错速查现象原因解决启动报libpq.so加载失败系统缺 PostgreSQL C 库安装libpqapt 装libpq-dev或 macOSbrew install postgresql二进制场景确认已装好端点返回 404表不在db-schemas列出的 schema 里或拼写不对检查db-schemas与表所在 schema改完重载配置写入返回 401 /permission denied当前角色没有对应表的写权限给该角色grant insert/update...并确保连接角色被允许switch到它改了表结构但接口没变化Schema Cache 有缓存发送重载信号SIGUSR2或NOTIFY pgrst,reload config刷新JWT 请求返回 401JWT expired/签名错误jwt-secret不一致或 token 过期确认服务端密钥与签发密钥一致token 带有效exp收尾到这里你已经把一个 Postgres 表跑成了带权限控制的 REST API数据、鉴权、授权全部声明在数据库里接口代码一行没写。下一步建议深入两条线——用db-pre-request和 RLS 做细粒度安全以及用 OpenAPI 端点把这套接口直接生成文档给前端用具体参数与语法以官方文档为准。【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考