Files
keysat-root/RESET_TEST_DATA.md
T
Keysat 843ff0e5d7 Initial backup of root workspace files
Glue files not covered by subproject repos: top-level docs, logo,
keysat-design-system, and crosscheck tests. Subproject folders are
gitignored (each has its own Gitea remote).
2026-06-12 17:51:40 -05:00

2.9 KiB

Reset test data on a master Keysat (StartOS 0.4.0.x)

Pre-launch utility. Wipes every business row (products, policies, codes, licenses, invoices, redemptions, machines) so you can iterate cleanly. Don't run this on a Keysat with real customers — it will delete their licenses too. Only use on test installs before you've sold anything.

What's preserved

  • Issuer keypair (server_keys table)
  • Webhook subscribers (webhook_endpoints)
  • BTCPay connection config and tokens (settings — all btcpay_* keys)
  • Web UI password hash (settings)
  • Operator name (settings)
  • Audit log (audit_log)

The audit log is preserved on purpose — you'll see the wipe transaction recorded in the daemon's logs (not in the audit_log itself, since the wipe doesn't go through the audit path).

How to run

Run these from any machine that has start-cli configured (typically the same workstation you used to install the .s9pk):

# 1) Confirm Keysat is installed and find its package id (should be `keysat`).
start-cli package list

# 2) Stop the daemon so we don't fight in-flight writes.
start-cli package stop keysat

# 3) Drop into a shell inside the LXC subcontainer.
start-cli package attach keysat

You're now inside the Keysat container. sqlite3 is bundled in the runtime image as of v0.1.0:33, so you can run the wipe directly:

# Inside the container:
sqlite3 /data/keysat.db <<'SQL'
BEGIN;
DELETE FROM machines;
DELETE FROM discount_redemptions;
DELETE FROM licenses;
DELETE FROM invoices;
DELETE FROM discount_codes;
DELETE FROM policies;
DELETE FROM products;
COMMIT;
SQL

# Quick sanity check — every row count should be 0.
sqlite3 /data/keysat.db "SELECT
  (SELECT COUNT(*) FROM products)  || ' products, ' ||
  (SELECT COUNT(*) FROM policies)  || ' policies, ' ||
  (SELECT COUNT(*) FROM licenses)  || ' licenses, ' ||
  (SELECT COUNT(*) FROM invoices)  || ' invoices, ' ||
  (SELECT COUNT(*) FROM discount_codes) || ' codes';"

# Leave the container shell.
exit

Back on your host:

# 4) Restart the daemon.
start-cli package start keysat

After the restart: visit /admin/, sign in, and you'll see an empty products list. Recreate everything fresh.

On a pre-:33 daemon

The runtime image before v0.1.0:33 didn't ship with sqlite3. If you're on an older build and need to wipe before upgrading: install sqlite3 inside the container before the wipe step:

# Only needed on pre-:33 daemons.
apt-get update && apt-get install -y sqlite3

Then run the same SQL block.

Even simpler: the in-app Delete buttons

As of v0.1.0:33, Products and Policies have Delete buttons in the admin UI (with refuse-if-referenced safety). For products/policies that have no licenses tied to them, click the buttons one by one — no SQL needed. Once a policy has issued any licenses (active OR revoked), the UI delete is refused; that's when you drop to the SQL above.