Expose Postgres storage backend - #243
benthecarman wants to merge 1 commit into
Conversation
|
👋 Thanks for assigning @tankyleo as a reviewer! |
c79c1a4 to
a4378ea
Compare
tankyleo
left a comment
There was a problem hiding this comment.
skimmed briefly one question
|
|
||
| When `[storage.postgres]` is configured, LDK Node wallet/channel state is stored in | ||
| PostgreSQL instead of `ldk_node_data.sqlite`. The storage directory remains required for | ||
| the mnemonic, API key, TLS material, logs, and `ldk_server_data.sqlite`. |
There was a problem hiding this comment.
Would big routing nodes want ldk_server_data.sqlite to be in the postgres db too, given that they'll be forwarding a lot of payments ? Or is that for a later PR / out-of-scope here ?
There was a problem hiding this comment.
It will be after lightningdevkit/ldk-node#772, just keeping the docs accurate of the local state of the repo. Will update once we merge and upgrade here
|
|
||
| # Optional LDK Node PostgreSQL storage for wallet and channel state. | ||
| #[storage.postgres] | ||
| #connection_string = "postgresql://postgres:postgres@localhost:5432" # PostgreSQL connection string. Do not include dbname if db_name is set. |
There was a problem hiding this comment.
If it works I find the key value format to be cleaner, less error prone ie host=localhost port=5432 user=postgres sslmode=disable
There was a problem hiding this comment.
tbh i always hate these, but can switch if we really want
| ``` | ||
|
|
||
| Only `connection_string` is required. `db_name`, `kv_table_name`, and `certificate_path` | ||
| are optional. If `db_name` is set, do not also include a database name in the connection |
There was a problem hiding this comment.
Don't remember us explicitly rejecting a database name in the connection string anywhere in this patch ? Would it be good to add test coverage for this?
There was a problem hiding this comment.
that's in ldk-node, added a test for this
|
|
||
| ```toml | ||
| [storage.postgres] | ||
| connection_string = "postgresql://postgres:postgres@localhost:5432" |
There was a problem hiding this comment.
Similar here, the key-value format would be better if we can have it.
| || args.storage_postgres_kv_table_name.is_some() | ||
| || args.storage_postgres_certificate_path.is_some() | ||
| { | ||
| let mut postgres = self.ldk_node_postgres.take().unwrap_or_default(); |
There was a problem hiding this comment.
Here we can do a get_or_insert_default, so we don't need the assignment at the end of the block.
There was a problem hiding this comment.
Similar here can do a get_or_insert_default if you care to :)
| LdkNodeStorageConfig::Postgres { | ||
| connection_string: postgres | ||
| .connection_string | ||
| .ok_or_else(|| missing_field_err("storage_postgres_connection_string"))?, |
There was a problem hiding this comment.
For this field I wonder if this is a sensible default:
host=localhost port=5432 user=postgres sslmode=disable
There was a problem hiding this comment.
Imo probably better to not have a defualt connection string
|
Posting some AI comments that look sensible. Second one is in flight in lightningdevkit/ldk-node#1000, but maybe it should be a prerequisite. 🤖 Requesting changes for two fund-safety blockers.
The previous cross-network concern is fail-closed in the pinned dependency because the persisted BDK network is checked during wallet load. The target is still not network-isolated, however, so the operations claim that multiple networks can share one storage root without conflicts should state that PostgreSQL deployments need distinct database or table targets per network. |
|
|
I’m not sure we should rush PostgreSQL support into ldk-server with an interim locking mechanism, only to replace it with a different approach later. That could also leave us with migration or compatibility concerns between deployed versions? lightningdevkit/ldk-node#1012 does not look entirely trivial either. |
2b96b2b to
81eab49
Compare
|
Now that #258 is merged with lightningdevkit/ldk-node#1012 this should be good to go |
81eab49 to
aa90ea3
Compare
There was a problem hiding this comment.
Here's a review pass from codex. Perhaps the first item is out of scope. Also told codex user starting two instances with the same network_dir is out of scope.
-
[P1] Reject missing or changed PostgreSQL state on restart _ /home/ubuntu/ldk-server/ldk-server/src/main.rs:791-792
When a node has already run on PostgreSQL and the configured database or table is later dropped, changed, or mistyped, postgres_lock_exists is true but this match accepts every PostgreSQL configuration as long as no SQLite file exists. build_with_postgres_store can then create an empty table and start fresh state under the same mnemonic and node ID, potentially endangering existing channels. Record and verify a backend identity or sentinel on subsequent PostgreSQL starts rather than only recording the backend type. -
[P2] Bound the PostgreSQL certificate read _ /home/ubuntu/ldk-server/ldk-server/src/util/config.rs:558-561
When certificate_path points to an oversized file or an unbounded pseudo-file such as /dev/zero, fs::read_to_string reads until EOF before PEM parsing, so startup can exhaust memory or hang. Other externally configured files use read_to_string_with_limit; apply an appropriate certificate-size limit here as well. -
[P2] Keep default builds independent of system OpenSSL _ /home/ubuntu/ldk-server/ldk-server/Cargo.toml:16-16
On Linux, enabling storage-postgres pulls in native-tls and openssl-sys without vendoring, so the default cargo build now fails unless pkg-config and OpenSSL development headers are installed, even when PostgreSQL is unused. This contradicts docs/getting-started.md stating that no other external dependencies are required; use the vendored TLS feature, make the backend opt-in, or document and install the new system prerequisites. -
[P1] Filter PostgreSQL parameter values from debug logs _ /home/ubuntu/ldk-server/ldk-server/src/main.rs:1088-1088
When [storage.postgres] is used with the default Debug log level, tokio_postgres::query logs every bound parameter, including the complete Vec passed to each persistence write. Passing this store to LDK Node therefore copies serialized payment records_including preimages_and channel/wallet state into the console or system journal and the server log file, while large state blobs can also rapidly consume log storage. Filter the tokio_postgres query targets or otherwise prevent driver parameter logging before using this store.
3b7f12b to
0dea4e1
Compare
yeah agreed this is out of scope, seems overkill
fixed
this is an explicit choice, we want to use system tls because we don't want to have to ship an update for every openssl security update, user can update themselves. However, did remove the line in docs saying we don't need external deps.
discussed offline, seems overkill and weird to override user choice. |
0dea4e1 to
9081bf8
Compare
Allow ldk-server to configure LDK Node wallet and channel state storage through PostgreSQL without a feature-gated server build. Refuse switching between SQLite and PostgreSQL after initialization so the same node identity cannot silently start without its persisted channel state. Clarify the backup and per-network isolation boundaries. AI-assisted-by: OpenAI Codex
9081bf8 to
2c9b1a1
Compare
Allow ldk-server to configure LDK Node wallet state, channel state, and payment history through PostgreSQL without a feature-gated server build. Keep local disk storage for server-owned files and forwarded-payment history, and document the backup and per-network isolation boundaries.
Refuse switching between SQLite and PostgreSQL after initialization. The local marker records only the backend type; it does not detect a changed PostgreSQL database or table, or missing state.
Limit PostgreSQL certificate reads to 1 MiB and test oversized and unbounded inputs. Remove the Getting Started claim that no other external dependencies are required.
Validation: formatting, default and all-feature tests, and Clippy passed.
AI-assisted-by: OpenAI Codex