Commit Graph
61 Commits
Author SHA1 Message Date
Jeroen UbbinkandClaude Opus 4.8 eb6a612e5a fix(secrets): make nsec ownership explicit and claim the admin password atomically
Two bootstrap-correctness fixes on the encrypted Secret store:

- Track nsec ownership with an explicit nsec_state (legacy | encrypted |
  cleared) instead of a nsec_managed bool. The bool could not tell "never
  migrated" apart from "intentionally cleared" — both leave encrypted_nsec
  empty — so a cleared identity could be resurrected on a fresh process from a
  stale legacy NSEC (env or old settings blob) and re-derive its npub. Bootstrap
  now branches purely on the state: encrypted decrypts (a missing ciphertext is
  a fail-fast inconsistency, never a silent fall-through to legacy), cleared
  actively empties the live nsec and npub, and legacy imports the plaintext
  once.
- Claim a generated admin password atomically. When no password exists, the
  generated one is written via a conditional UPDATE (WHERE admin_password_hash
  IS NULL) and only the worker that wins the update (rowcount 1) prints it. A
  racing worker on a shared database adopts the winner's hash and stays silent,
  so the operator never sees a second password that was never stored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 10:51:21 +02:00
Jeroen UbbinkandClaude Opus 4.8 0415806c5a fix(config): keep the vault the sole owner of node secrets
Two ways a stale legacy NSEC could override or resurrect an nsec the
vault already owns (issue #553):

- initialize() re-applied env/blob values onto live settings after
  bootstrap had decrypted the authoritative nsec, so a stale NSEC left
  in .env would clobber it on restart (e.g. after rotating the key in
  the admin UI). _apply_to_live_settings now never re-applies secret
  fields; bootstrap_secrets is their only writer.

- An empty encrypted_nsec could not distinguish "never migrated" from
  "intentionally cleared", so clearing the identity via the admin API
  and restarting re-imported the old NSEC from env/blob. Record vault
  ownership in a new secrets.nsec_managed column (set on legacy import
  and on every set_nsec write); bootstrap skips the legacy import once
  the vault owns the nsec, so a cleared identity stays cleared.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 10:51:20 +02:00
Jeroen UbbinkandClaude Opus 4.8 5d5c849180 fix(migrations): repoint secrets migration onto current Alembic head
The add-secrets migration branched off b5e7c9d1f3a2, but the add-slug
migration c6d7e8f9a0b1 has since landed on that same parent, leaving two
Alembic heads. `alembic upgrade head` then refuses to run and the node
fails to boot. Repoint down_revision onto the current head so the chain
is linear again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 10:51:20 +02:00
Jeroen UbbinkandClaude Opus 4.8 6c5c3f0b5f feat(db): add encrypted Secret store and migration
Introduce a singleton Secret model holding the admin password hash and the
Fernet-encrypted nsec, with a hand-written migration for the secrets table.
Add suite-wide pytest config pinning a valid ROUTSTR_SECRET_KEY.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 10:50:51 +02:00
9qeklajc f6d1a41728 fix: checkpoint fee payouts before sending 2026-07-18 14:08:41 +02:00
9qeklajcandGitHub 73f52ef1fd Revert "Retry Cashu transaction storage on transient DB failures" 2026-07-12 14:47:30 +02:00
9qeklajc 07c15de106 better retry logic 2026-07-12 14:12:29 +02:00
9qeklajc aea24d23da fix: retry Cashu transaction storage 2026-07-12 13:29:09 +02:00
9qeklajc f588147b41 use slug base 2026-07-01 17:01:32 +02:00
9qeklajc 9fcf870e3f add provider slug 2026-06-29 23:30:09 +02:00
9qeklajc ed6e0c0189 Merge main into fix-reset-reserve-balance
Resolve pay_for_request conflict: keep main's atomic child-key
balance_limit guard and post-rowcount-check ordering, and stamp
reserved_at on both billing and child reservations.
2026-06-12 21:08:53 +02:00
9qeklajc 919dcf5535 make key reservation reset predictable 2026-06-12 19:45:39 +02:00
Jeroen UbbinkandClaude Sonnet 4.6 feb76bc89d fix: persist and propagate key constraints from Lightning invoices
LightningInvoice had no columns for balance_limit, balance_limit_reset,
or validity_date. SQLModel silently dropped these constructor kwargs, so
create_api_key_from_invoice always produced an unconstrained key.

Add the three columns to LightningInvoice with a migration, and wire them
through to the ApiKey in create_api_key_from_invoice, matching the pattern
already used in the child key creation path.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-03 14:58:40 +02:00
9qeklajc aaa80d47bc add api key creation date 2026-06-01 23:27:26 +02:00
9qeklajc 1f2ff8a99c added admin token 2026-04-25 11:18:58 +02:00
9qeklajc aca8d43a61 fix migration 2026-04-24 23:05:09 +02:00
9qeklajcandGitHub 7fe4c1963b Merge pull request #470 from Routstr/add-dev-cut
update migration rev id
2026-04-24 15:21:32 +02:00
9qeklajc 9a0919f149 update migration rev id 2026-04-24 15:19:53 +02:00
9qeklajcandGitHub d69ab913d4 Merge pull request #419 from Routstr/add-dev-cut
add-dev-cut
2026-04-23 23:22:23 +02:00
9qeklajc c53e72e80a update migration 2026-04-22 23:31:49 +02:00
9qeklajc 05115c3387 add api-key history and fix race condition while topup 2026-04-22 21:50:22 +02:00
9qeklajc d84d249f2c Merge branch 'main' into add-dev-cut
# Conflicts:
#	routstr/auth.py
2026-04-15 23:07:37 +02:00
9qeklajc 85a1ea4b4c add apikey refund tracking 2026-04-10 15:34:19 +02:00
9qeklajc 685368bb0a add support to using custom model ids 2026-04-06 20:09:12 +02:00
9qeklajc a7b815b29f add-dev-cut 2026-03-23 20:07:24 +01:00
9qeklajc 2c2124952f add transaction view 2026-03-11 23:39:22 +01:00
9qeklajc 8a373276ce cache x-cashu tokens 2026-03-11 22:03:05 +01:00
9qeklajc 3ea0a267dd add routstr logic 2026-02-15 16:13:29 +01:00
9qeklajc 2c358276bf add setting jsonb 2026-02-13 23:02:24 +01:00
9qeklajc ba5f9fc181 improvve key logic 2026-02-04 23:10:50 +01:00
9qeklajc 1d043cd98d lint 2026-01-27 09:22:07 +01:00
Shroominic 51c3e5dcd7 fix migrations 2026-01-25 22:58:36 +08:00
Shroominic 788075f656 fix db migration 2026-01-25 22:44:13 +08:00
Shroominic 0bbcacd186 fix: allow multiple provider keys per base url
Use a composite unique constraint and query filters so providers
can share base URLs with distinct API keys.
2026-01-25 22:18:39 +08:00
9qeklajc fc042c768c support child keys mapped to parent balance 2026-01-10 19:53:27 +01:00
Shroominic 71e7c2171b add missing migration 2025-12-25 19:36:26 +01:00
9qeklajc 085ff75d1d create and topup token with lightning 2025-12-10 22:47:37 +01:00
Shroominic 0da08fb945 refactor pricing, provider fees, realtime model map updates 2025-10-20 12:45:02 +08:00
Shroominic 61a0559f8e Add upstream providers management and model integration
- Created migration scripts to establish the `upstream_providers` table and integrate it with the `models` table.
- Enhanced the proxy functionality to support dynamic upstream provider initialization and model resolution.
- Implemented API endpoints for managing upstream providers, including CRUD operations and model fetching.
- Refactored pricing calculations to accommodate upstream provider overrides and ensure accurate cost estimation.
- Updated the admin interface to allow for easy management of upstream providers and their associated models.
2025-10-13 17:17:54 +08:00
Shroominic 73d3613301 move MODELS to DB 2025-09-10 13:28:43 +01:00
Shroominic 14718843de feat(settings): add DB-backed Settings and SettingsService with env merge 2025-09-08 10:52:21 +01:00
Shroominic 9ffd44eac6 undo cursor agent stuff 2025-08-23 17:13:38 -03:00
Shroominic 73e6e259bc Merge remote-tracking branch 'refs/remotes/origin/final-fixes-cleanup' into final-fixes-cleanup 2025-08-23 17:08:01 -03:00
Cursor Agentanddb2002dominic 5061d69f57 Replace print statements with structured logging across multiple files
Co-authored-by: db2002dominic <db2002dominic@gmail.com>
2025-08-23 20:04:19 +00:00
Shroominic 8175188b06 ruff fmt 2025-08-23 17:01:28 -03:00
Shroominic 93f2bf98b8 typing 2025-08-23 16:48:53 -03:00
Shroominic 5831c3e4d4 undo total_balance change 2025-08-22 11:22:59 -03:00
Shroominic 4a338505cc reserved balance wip 2025-08-19 16:54:17 -03:00
Shroominic dda016669f add refund mint+currency to api table 2025-08-13 16:51:00 -03:00
Shroominic 6924f6c18a rm alembic logging 2025-08-12 15:31:17 -03:00