Vault

PostgreSQL Store (Grove ORM)

PostgreSQL backend using Grove ORM with pgdriver.

The PostgreSQL store (store/postgres) provides a production-ready backend that uses the Grove ORM with pgdriver for PostgreSQL. It maps Vault entities to Grove model structs and uses programmatic migrations to create all required tables.

Usage

import (
    "github.com/xraph/grove"
    "github.com/xraph/grove/drivers/pgdriver"
    "github.com/xraph/vault/store/postgres"
)

// Open a PostgreSQL connection via Grove's pgdriver.
db := grove.Open(pgdriver.New(
    pgdriver.WithDSN("postgres://user:pass@localhost:5432/vault?sslmode=disable"),
))

s := postgres.New(db)
if err := s.Migrate(ctx); err != nil {
    log.Fatal(err)
}

Options

OptionSignatureDescription
WithLoggerWithLogger(l *slog.Logger) StoreOptionSets the structured logger. Defaults to slog.Default().
s := postgres.New(db, postgres.WithLogger(slog.Default()))

Internals

AspectDetail
DriverGrove ORM with pgdriver (PostgreSQL)
MigrationsProgrammatic DDL statements executed via pgdriver.PgDB
TransactionsDatabase-level ACID transactions

Tables

The store creates 11 tables across secrets, flags, config, overrides, rotation, and audit:

TableEntity
vault_secretssecret.Secret
vault_secret_versionssecret.Version
vault_flagsflag.Definition
vault_flag_rulesflag.Rule
vault_flag_overridesflag.TenantOverride
vault_configconfig.Entry
vault_config_versionsconfig.EntryVersion
vault_overridesoverride.Override
vault_rotation_policiesrotation.Policy
vault_rotation_recordsrotation.Record
vault_auditaudit.Entry

Lifecycle methods

MethodBehaviour
Migrate(ctx)Creates all 11 tables and indexes via programmatic DDL
Ping(ctx)Calls db.Ping(ctx) to verify connectivity
Close()Calls db.Close() to release the database connection

When to use

  • Production deployments -- durable, ACID-compliant storage with connection pooling.
  • Multi-instance deployments -- all application instances share the same database.
  • Teams already using PostgreSQL -- leverage existing infrastructure and expertise.

On this page