136 lines
4.2 KiB
Markdown
136 lines
4.2 KiB
Markdown
<!-- file: deltas/0.3.2/pre.005.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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 :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
ConfigInvalid
|
|
ConnectFailed
|
|
PoolTimeout
|
|
ShutdownTimeout
|
|
TlsFailed
|
|
```
|
|
|
|
La façade mappe vers :
|
|
|
|
```text
|
|
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
|
|
|
|
```text
|
|
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
|
|
|
|
```text
|
|
workspace.package.version = 0.3.2-pre.5
|
|
```
|
|
|
|
## 10. Gate opérateur requis
|
|
|
|
```bash
|
|
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
|
|
```
|