关于通过配置文件为Docker部署的Hasura设置默认角色、用户及权限的问询
嗨,这个问题我刚好碰到过!你之所以重启Docker后角色消失,是因为通过UI添加的角色和权限都存在Hasura的临时元数据里,要是没做持久化,容器重启就会回到初始状态。不过完全可以通过配置文件来预设这些内容,我给你一步步讲怎么弄:
第一步:导出已配置好的元数据
先在Hasura控制台里把你想要的角色、权限都设置好,然后用Hasura CLI导出这些元数据:hasura metadata export执行完会生成一个
metadata文件夹,里面的YAML文件包含了所有角色定义、权限规则、表关联等配置,这就是我们要持久化的核心内容。第二步:挂载元数据到Docker容器
修改你的docker-compose.yml,给Hasura服务添加卷挂载,把本地的metadata文件夹映射到容器内部的指定路径,同时设置环境变量告诉Hasura加载这个目录的元数据:services: hasura: image: hasura/graphql-engine:latest ports: - "8080:8080" volumes: - ./metadata:/hasura-metadata # 本地元数据文件夹挂载到容器内 environment: - HASURA_GRAPHQL_METADATA_DIR=/hasura-metadata # 指定元数据目录 - HASURA_GRAPHQL_ADMIN_SECRET=你的管理员密钥 # 其他必要的环境变量,比如数据库连接串等这样每次启动容器时,Hasura都会自动加载这个文件夹里的元数据,你之前设置的角色和权限就不会丢了。
第三步:预设数据库层面的用户(如果需要)
要是你还需要创建数据库级别的用户(区别于Hasura的角色),可以写个SQL初始化脚本。比如创建init/create-users.sql:-- 创建应用用户 CREATE USER app_user WITH PASSWORD '你的用户密码'; -- 给用户授予public schema下所有表的查询权限 GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_user; -- 按需添加更多权限,比如插入、更新等然后把这个脚本挂载到数据库容器的初始化目录(以PostgreSQL为例),修改
docker-compose.yml的数据库服务部分:services: postgres: image: postgres:14 volumes: - postgres-data:/var/lib/postgresql/data # 持久化数据库数据 - ./init:/docker-entrypoint-initdb.d # 挂载初始化脚本目录 environment: - POSTGRES_PASSWORD=你的数据库密码数据库启动时会自动执行这些脚本,创建好预设的用户和对应的权限。
最后验证配置
重启Docker容器后,打开Hasura控制台检查角色列表,再去数据库里确认用户是否存在,权限是否生效就可以了。
要是你不想用CLI导出元数据,也可以手动编写metadata文件夹里的YAML文件,比如roles.yaml来定义角色,不过导出的方式更省心,不容易出错。
备注:内容来源于stack exchange,提问作者v-ampire




