ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Docker 一键部署 PostgREST:权限、配置到第一个 REST API 的完整路线

Docker 一键部署 PostgREST:权限、配置到第一个 REST API 的完整路线 Docker 一键部署 PostgREST权限、配置到第一个 REST API 的完整路线【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrestPostgREST 做的事很直白把一个现成的 PostgreSQL 数据库直接变成一套标准的 REST API。你不用写 controller、不用写路由、不用手写序列化代码——表、视图、函数就是端点角色和授权规则就是安全边界。它适合三种人已经用 Postgres 存数据、想给前端或第三方快速开接口的后端不想维护一套 ORM 手写 API 的小团队以及需要把数据库当成安全真相源所有授权落在库内的架构师。一句话记住它的分工PostgREST 管认证谁来请求PostgreSQL 管授权你能碰什么。整条链路只有一行 SQL 级别的真相。3 条命令用 Docker 跑起 PostgREST先跑通再谈原理。最短路径是 Docker官方镜像用scratch打底只塞一个静态二进制镜像约 14MB启动是毫秒级的。第一步把数据库 PostgREST两个容器一起拉起来。把下面内容存成docker-compose.yml# docker-compose.yml version: 3 services: server: image: postgrest/postgrest ports: [3000:3000] environment: PGRST_SERVER_HOST: 0.0.0.0 # 让就绪检查能工作 PGRST_DB_URI: postgres://app_user:passworddb:5432/app_db PGRST_OPENAPI_SERVER_PROXY_URI: http://127.0.0.1:3000 depends_on: [db] db: image: postgres ports: [5432:5432] environment: POSTGRES_DB: app_db POSTGRES_USER: app_user POSTGRES_PASSWORD: password第二步启动并观察日志docker-compose up✅ 看到API server listening on port 3000就说明服务起来了。第三步验证一下curl http://localhost:3000/返回的是这份 API 的 OpenAPI 描述Swagger 规范。到这里你已经有一个在监听的 PostgREST 实例了。后面所有章节都是把它能做什么拆给你看。挑一条安装路径包管理器、二进制还是 Docker三种官方方式都能装选哪个取决于你的环境。方式命令示例特点适合包管理器brew install postgrest/pacman -S postgrest/pkg install hs-postgrest/nix-env -i postgrest/choco install postgrest自动处理依赖随发行版更新开发机、图省事预编译二进制从 release 页下postgrest-版本-平台tar Jxf解压后直接跑版本可控、可放任意 Linux 发行版生产、要锁定版本Dockerdocker pull postgrest/postgrest环境隔离、镜像 ~14MB、scratch无多余组件容器化、云原生决策建议开发环境用包管理器最顺生产要可复现、可灰度上 Docker二进制留给我就要这个版本、又不想引入容器的场景。两点容易踩二进制依赖libpq。报error while loading shared libraries: libpq.so.5时Ubuntu/Debian 装libpq-devCentOS/RHEL/Fedora 装postgresql-libsmacOS 用brew install postgresql。Windows若弹出找不到pg_config的对话框把C:\Program Files\PostgreSQL\版本\bin加进PATH。装完统一用postgrest --help验证。让每个请求都落在对的数据库角色上PostgREST 的安全模型就一句话请求进来 → 换成一个数据库角色 → 这个角色能碰什么你就只能碰什么。整个过程不靠应用层判断全靠库里的GRANT和行级安全RLS。三种角色各司其职authenticator负责建连的门面必须能LOGIN但它本身尽量不给权限只负责切换。匿名角色db-anon-role没带 JWT 的请求走它通常只给只读。用户角色带 JWT 的请求按role声明切到它不同用户不同权限集。下面这套 SQL 是最小可用配置建角色、给授权、再上一道行级安全-- 门面角色能登录、不继承、能切换 create role authenticator noinherit login password mysecretpassword; -- 匿名角色nologin只给只读 create role web_anon nologin; grant web_anon to authenticator; -- 让门面能切到它 grant usage on schema api to web_anon; grant select on api.todos to web_anon; -- 最小权限只读 -- 行级安全每个用户只看到自己的行 alter table api.todos enable row level security; create policy anon_policy on api.todos for select using (current_setting(request.jwt.claims, true)::json-user_id user_id);JWT 里的role声明决定切到哪个角色密钥用jwt-secret校验至少 32 字符。它长这样改这几个参数其余塞进速查表配置有四种来源优先级从低到高配置文件 环境变量 库内配置。配置文件就是键值对服务器启动时把它当作唯一参数传入# postgrest.conf db-uri postgres://authenticator:mysecretpasswordlocalhost:5432/mydb db-schemas api db-anon-role web_anon jwt-secret reallyreallyreallyreallyverysafe server-port 3000启动postgrest /path/to/postgrest.conf没把握就postgrest -e postgrest.conf生成一份样例再改。环境变量规则是PGRST_前缀 大写 下划线例如db-uri→PGRST_DB_URI容器里最常用。库内配置则建一个函数用set_config写参数配合db-pre-config postgrest.pre_config启用——好处是改配置不用重启。 真正会常改的就这几个先记住它们db-uri连库的字符串。db-anon-role匿名请求用哪个角色不设则禁止匿名。db-schemas暴露哪些模式默认public。jwt-secret校验 JWT 的密钥至少 32 字符。server-port/server-host监听端口默认 3000与绑定地址默认!4任意 IPv4。其余高级项用这张速查表对着查就行参数默认值作用db-pool10连接池最大连接数db-pool-acquisition-timeout10秒等连接槽的最长等待db-pool-max-idletime30秒空闲连接回收db-pool-max-lifetime1800秒单条连接最长存活log-levelerrorcrit/error/warn/info/debugdb-max-rows∞硬限制单次返回行数db-aggregates-enabledfalse是否允许聚合函数db-plan-enabledfalse是否允许取执行计划openapi-modefollow-privilegesfollow-privileges / ignore-privileges / disabledjwt-role-claim-key$.role从 JWT 取角色的键路径server-cors-allowed-origins空任意允许的跨域来源改完多数参数可以热重载不用重启killall -SIGUSR2 postgrest或库里执行NOTIFY pgrst, reload config。注意环境变量改不了进程级Docker 里要么重启要么走库内配置。搭一个商品订单的 API 并跑通 CRUD这次换个例子shop模式products和orders两张表外键相连。先建表create schema shop; create table shop.products ( id int primary key generated by default as identity, name text not null, price numeric not null check (price 0) ); create table shop.orders ( id int primary key generated by default as identity, product_id int not null references shop.products(id), qty int not null default 1 check (qty 0) ); insert into shop.products (name, price) values (机械键盘, 399), (4K 显示器, 2199); insert into shop.orders (product_id, qty) values (1, 2), (2, 1);这种带外键的关系模式是 PostgREST 的核心玩法表变端点外键让资源可以互相嵌入。下面这张官方示例模式图就是多表 外键长什么样授权沿用上一节套路给匿名角色只读门面角色能切到它。create role shop_anon nologin; grant usage on schema shop to shop_anon; grant select on shop.products, shop.orders to shop_anon; -- 匿名只读 create role shop_authenticator noinherit login password mysecretpassword; grant shop_anon to shop_authenticator;写个最小配置并启动# shop.conf db-uri postgres://shop_authenticator:mysecretpasswordlocalhost:5432/postgres db-schemas shop db-anon-role shop_anonpostgrest shop.conf然后逐个跑通开另一个终端# 1) 读全部商品 curl http://localhost:3000/products # 2) 过滤价格大于 100 curl http://localhost:3000/products?pricegt.100 # 3) 过滤 布尔数量恰好为 1演示 is 操作符 curl http://localhost:3000/orders?qtyeq.1 # 4) 排序按订单 id 倒序 curl http://localhost:3000/orders?orderid.desc # 5) 选列 分页 curl http://localhost:3000/products?selectid,namelimit5offset0写操作呢匿名角色只有SELECT所以curl -X POST http://localhost:3000/products \ -H Content-Type: application/json \ -d {name:鼠标,price:199} # 401 / 42501permission denied for table products返回 401 正是我们想要的——权限在库里不在应用里。想让某类用户能写就再建一个角色、给它INSERT/UPDATE然后在 JWT 里带上role声明即可。对着报错表自查别慌高频报错基本集中在连不上和没权限两类按下面逐条对error while loading shared libraries: libpq.so.5—— 缺libpq。Ubuntu/Debian 装libpq-devCentOS/RHEL 装postgresql-libsmacOSbrew install postgresql。500/ connection refused / 连不上—— 核对db-uri的用户、密码、端口、库名再看 Postgres 的pg_hba.conf是否允许该用户登录。401 Unauthorized匿名请求—— 没配db-anon-role或该角色对目标表没有SELECT。补GRANT即可。permission denied for table ...码 42501—— 角色对这张表缺对应操作权限按需要补GRANT SELECT/INSERT/UPDATE/DELETE。Bind for 0.0.0.0:5432 failed: port is already allocated—— 本机 5432 被占把宿主机侧端口改掉例如5433:5432并同步改db-uri里的端口。Windows 弹出pg_config找不到—— 把C:\Program Files\PostgreSQL\版本\bin加入PATH。三条 SQL 帮你自己定位到底缺哪一环-- 1) 看角色继承链哪个角色能被授予给谁 select c.rolname AS role, m.rolname AS granted_to from pg_auth_members am join pg_roles c on c.oid am.roleid join pg_roles m on m.oid am.member; -- 2) 看 shop 模式下各角色对表的权限 select grantee, privilege_type, table_name from information_schema.role_table_grants where table_schema shop; -- 3) 看当前会话身份与 JWT 声明确认切对了角色 select current_user, current_setting(request.jwt.claims, true);第一条验证门面能切到匿名/用户角色第二条验证表权限给够了第三条在调试 RLS 时尤其有用。判断该不该上 PostgREST适合的场景数据已经在 Postgres 里、要快速给前端/第三方开只读或受控读写接口、希望安全真相源落在库里、想要自带 OpenAPI 自文档。它把序列化、授权、行数限制这些活儿都交给数据库省掉一整层手写 API 代码支持 PostgreSQL 14 及以上。不太适合的场景业务逻辑很重、需要复杂的多步事务编排、或者主要数据并不在 Postgres 里。这些情况下 PostgREST 只会变成一层薄壳真正的复杂度还是绕不开。深入阅读从仓库里的文档下手安装与 Docker 细节见 docs/explanations/install.rst完整参数、默认值与可热重载项见 docs/references/configuration.rst。把上面这套先跑通、再拆角色、最后造一个自己的 API的顺序走完你就已经能自己维护一套生产级的 PostgREST 了。【免费下载链接】postgrestREST API for any Postgres database项目地址: https://gitcode.com/GitHub_Trending/po/postgrest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表