Duroxide PostgreSQL Provider
A PostgreSQL-based provider implementation for Duroxide, a durable task orchestration framework for Rust.
Note: See CHANGELOG.md for version history and breaking changes.
Installation
Add to your Cargo.toml:
[]
= "0.1"
Usage
use PostgresProvider;
use Worker;
async
Custom Schema
To isolate data in a specific PostgreSQL schema:
let provider = new_with_schema.await?;
Microsoft Entra ID Authentication (Azure Database for PostgreSQL)
Connect to Azure Database for PostgreSQL Flexible Server using a Microsoft
Entra ID (Azure AD) access token instead of a static password. The provider
acquires the initial token at construction time and a background task
refreshes it before expiry, swapping the new token into the pool via
sqlx::Pool::set_connect_options.
use ;
# async
For multi-tenant deployments use the schema variant:
use ;
# async
Identity sources
By default the provider chains [WorkloadIdentityCredential (only when AKS federated env vars are present), ManagedIdentityCredential, DeveloperToolsCredential] — so the same code works for:
- AKS: Workload Identity federation (preferred when
AZURE_FEDERATED_TOKEN_FILEand friends are set). - Production: User-assigned or system-assigned managed identity, App Service / Container Apps managed identity.
- Local dev:
az login(Azure CLI) orazd auth login.
Required Azure setup
- Configure an Entra admin on the Flexible Server (
az postgres flexible-server ad-admin set). - Create a Postgres role for the principal:
SELECT pgaadauth_create_principal('my-app-managed-identity', false, false); - Grant the role the privileges your application needs (
GRANT ... ON DATABASE ...,GRANT USAGE ON SCHEMA ..., etc.).
Sovereign clouds
The default audience is the public-cloud value
https://ossrdbms-aad.database.windows.net/.default. Override for sovereign
clouds:
use Duration;
use EntraAuthOptions;
let options = new
.audience
.refresh_interval;
Notes
- All Entra connections are pinned to
PgSslMode::VerifyFull. There is no fallback to weaker TLS modes. - Brief auth-failure windows during token rotation surface as retryable
ProviderErrors (SQLSTATE28000/28P01) so the runtime retries transparently. - See the Entra ID technical reference for the design rationale (refresh scheduling, troubleshooting, dependency choices).
Testing
Two test layers cover the Entra integration:
-
Local pipeline tests (
cargo test --lib entra_pipeline) — exercise the full token → connect-options → pool → migrations flow against a local PostgreSQL by injecting a fakeTokenSource(no Azure dependency). They automatically skip ifDATABASE_URLis not set. -
Live Entra smoke test (
tests/entra_live_test.rs,#[ignore]) — opt in by settingDUROXIDE_PG_ENTRA_LIVE_TEST=1plusDUROXIDE_PG_ENTRA_TEST_HOST,DUROXIDE_PG_ENTRA_TEST_DB, andDUROXIDE_PG_ENTRA_TEST_USER. Run withcargo test --test entra_live_test -- --ignored. Credentials are picked up from the ambientazure_identitychain.First-time setup. A pair of helper scripts provisions an ephemeral Azure Database for PostgreSQL Flexible Server (Burstable B1ms tier, ~$13/month if left running — remember to tear it down):
# (script prints the env-var block to copy into your shell)The scripts are idempotent and use the currently
az login'd user as the Entra admin / test principal. Override naming withDUROXIDE_PG_ENTRA_TEST_PREFIX,DUROXIDE_PG_ENTRA_TEST_LOCATION,DUROXIDE_PG_ENTRA_TEST_RG, orDUROXIDE_PG_ENTRA_TEST_SERVERenv vars (see the script headers for details).
Configuration
| Environment Variable | Description | Default |
|---|---|---|
DUROXIDE_PG_POOL_MAX |
Maximum connection pool size | 10 |
Features
- Automatic schema migration on startup
- Connection pooling via sqlx
- Custom schema support for multi-tenant isolation
- Full implementation of the Duroxide
ProviderandProviderAdmintraits - Poison message detection with attempt count tracking
- Lock renewal for long-running orchestrations and activities
- KV store — durable per-instance key-value state for orchestration coordination
- Orchestration stats introspection via
Client::get_orchestration_stats() - Microsoft Entra ID authentication for Azure Database for PostgreSQL (managed identity, Workload Identity, az CLI)
Latest Release (0.1.32)
- Bumped
duroxidecore dependency to0.1.29. The core 0.1.29 release replacesfutures::join_all/join/select_biased!with replay-safe crate-local combinators that eliminate a latent large-fan-in (≥ 1024 children) replay hang. No provider-level code or schema changes required. - See CHANGELOG.md for full version history.
Previous Release (0.1.31)
- Added Microsoft Entra ID authentication for Azure Database for PostgreSQL Flexible Server. New constructors
PostgresProvider::new_with_entraandPostgresProvider::new_with_schema_and_entraaccept anEntraAuthOptionsand authenticate via Entra access tokens; a background task refreshes the token before expiry and swaps it into the connection pool. - Default credential chain is
[WorkloadIdentityCredential (when AKS federated env vars are set), ManagedIdentityCredential, DeveloperToolsCredential], withPgSslMode::VerifyFullpinned for all Entra connections.
License
MIT License - see LICENSE for details.