4.2 KiB
Delta 0.3.2-pre.005 — PostgreSQL connection + pool + TLS
1. Base
Base exacte : 0.3.2-pre.004-fix.001, incluant l'ajustement opérateur de .env.example version 13.
Le gate opérateur du 29 août 2026 est entièrement vert : audits Rust/Markdown, workspace check/Clippy, 126 tests Config, ownership, Store avec et sans feature PostgreSQL, compilation --no-default-features et Config Desk passent.
2. Objet
Matérialiser la première ouverture PostgreSQL physique sans ouvrir encore les migrations ou le SQL métier :
tokio-postgres 0.7.18+
deadpool-postgres 0.14.x
tokio-postgres-rustls 0.14.x
rustls 0.23.x / AWS-LC
roots système
pool borné
Store::open physique
Store::close borné
3. Frontière façade/backend
ksp-store-lib reste l'unique surface consumer et ne dépend directement d'aucun driver/pool/TLS. Il convertit ses settings vers un bridge ksp-store-postgres-lib, puis mappe les erreurs backend vers des ErrorCode Store stables.
ksp-store-postgres-lib possède seul :
parse/normalisation tokio_postgres::Config
Deadpool Manager/Pool
connector Rustls
roots système
première acquisition physique
fermeture/drain physique
Les types physiques Pool, Client, Row et Statement ne sont jamais réexportés par la façade.
4. Normalisation de l'URI
Le backend consomme uniquement l'URI déjà résolue par Config. Après parsing, KSP impose :
application_name = ksp-store
connect_timeout = settings typés
sslnegotiation = postgres
Disabled -> sslmode=disable
VerifyFull -> sslmode=require
options= est rejeté dans cette fondation. VerifyFull exige un host TCP afin de disposer d'une identité serveur à vérifier : hostaddr seul et les sockets Unix sont rejetés. Les erreurs de parsing ne conservent jamais le texte de l'URI.
5. Pool et lifecycle
Le pool applique les limites validées en pre.003 : taille maximale et deadlines wait/create/recycle. Le manager utilise RecyclingMethod::Verified; la requête de vérification éventuelle reste interne à Deadpool et aucun SQL KSP n'est ajouté.
La création du pool est lazy, donc Store::open exécute explicitement une première pool.get().await. Le succès signifie ainsi qu'une connexion physique/auth/TLS a réellement été établie.
Store::close(self) appelle Pool::close() puis attend un drain size == 0 sous shutdown_timeout. Drop ne fait qu'un close best-effort.
6. TLS
Modes exacts :
Disabled
VerifyFull
VerifyFull charge les roots système dans rustls::RootCertStore, utilise explicitement le provider AWS-LC et conserve la vérification standard de certificat + identité serveur. Aucun mode Prefer, aucun verifier permissif et aucun fallback plaintext ne sont introduits.
7. Erreurs sûres
Le backend retourne uniquement une classification et une phase statique :
ConfigInvalid
ConnectFailed
PoolTimeout
ShutdownTimeout
TlsFailed
La façade mappe vers :
store.postgres_config_invalid
store.postgres_connect_failed
store.postgres_pool_timeout
store.postgres_tls_failed
store.shutdown_timeout
Aucune erreur tokio-postgres, Deadpool, Rustls ou native-certs n'est attachée comme source publique.
8. Hors scope
migrations/bootstrap SQL
ksp_store_schema_migrations
health snapshot public
RAW transaction/account persistence
routing multi-target/multi-réseau dans Store
live PostgreSQL integration test
Ces éléments restent respectivement aux tranches pre.006, pre.007, 0.3.3/0.3.4 et pre.008.
9. Version
workspace.package.version = 0.3.2-pre.5
10. Gate opérateur requis
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.2
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-store-postgres-lib
cargo test -p ksp-store-lib
cargo test -p ksp-store-lib --no-default-features
cargo check -p ksp-store-lib --no-default-features
cargo tree -p ksp-store-postgres-lib --edges normal
cargo tree -p ksp-store-lib --edges normal
cargo tree --duplicates