Documentation

System & Advanced

Operational commands beyond the day-to-day flow: sync & chain repair, backups, API keys, payback methods, plugins, the dead letter queue, audits, troubleshooting reports, and node lifecycle. From the host, prepend docker exec <container> to every command shown below.

eiou sync

Run all three sync types in order: contacts, then transactions (with backup recovery), then balances. Use this when you want the node fully reconciled in one shot.

eiou sync

eiou sync contacts

Reconcile your contact list with peers (status, addresses, per-currency rows). Useful after a network outage or wallet restore.

eiou sync contacts

eiou sync transactions

Rebuild the transaction chain with each contact and verify chain integrity. If gaps are found, the node tries local backup recovery first, then asks the contact to check theirs. If both sides are missing the same transactions, a tx drop is recommended.

eiou sync transactions

eiou sync balances

Recompute balances from your local transaction history. Useful when balance totals drift from the underlying transaction list (rare).

eiou sync balances

eiou backup create

Create a new encrypted backup of the live database immediately. The output filename uses the backup_YYYYMMDD_HHmmss.eiou.enc pattern.

eiou backup create

eiou backup list

List every backup file currently on disk, including both live and archive prefixes, with size and timestamp.

eiou backup list

eiou backup verify

Verify a specific backup's integrity by decrypting and checksumming it. Run this before relying on a backup for restore.

eiou backup verify backup_20260125_120000.eiou.enc

eiou backup restore

Restore is an internal, root-controlled boot-recovery operation in v0.1.18-alpha. It cannot run from a serving container through the GUI, API, or an ordinary docker exec. Stop the original node, keep its volumes intact for rollback, restore all seven volumes into a new candidate set, and start that candidate with EIOU_BOOT_RECOVERY_BACKUP.

EIOU_BOOT_RECOVERY_BACKUP=backup_20260125_120000.eiou.enc docker compose up

See the Upgrade Guide for the complete fresh-volume candidate and validation procedure. Pre-v0.1.18-alpha backup files must first be restored with the older image that created them, then replaced with a new authenticated v3 snapshot.

eiou backup status

Show whether scheduled auto-backup is on, the configured schedule, the most recent backup time, and current retention counts per prefix.

eiou backup status

eiou backup enable / disable

Toggle scheduled daily backups. The schedule itself (hour and minute, UTC) is configured via the backupCronHour and backupCronMinute settings.

Turn the daily backup cron on — subsequent boots and the running scheduler will start emitting backups at the configured hour.
eiou backup enable
Turn it off — existing files stay on disk, but no new scheduled backups are produced until you re-enable.
eiou backup disable

eiou backup cleanup

Manually trim old backups beyond the configured retention count, per prefix. Normally the daily cron does this for you.

eiou backup cleanup

eiou backup delete

Permanently delete a specific backup file by name. The file is unlinked immediately — there is no undo.

eiou backup delete backup_20260125_120000.eiou.enc

eiou apikey create

Create a new API key with an optional comma-separated permission list. The secret is printed only once at creation — capture it immediately, the node won't show it again. If permissions are omitted, the key is created with default (admin) permissions.

Issue a key with default admin permissions — omit the permission list and the key gets full access.
eiou apikey create "My Mobile App"
Issue a scoped key — pass a comma-separated permission list to restrict what the consumer can do.
eiou apikey create "Read Only" wallet:read,contacts:read

eiou apikey list

List all API keys with their identifiers, names, permissions, and enabled state. Secrets are never re-emitted.

eiou apikey list

eiou apikey disable / enable

Temporarily block a key without destroying it. Disabled keys are rejected at the API edge but the row stays so you can re-enable it later. Useful for rotating access without losing the configuration.

Block requests authenticated with this key id — the row stays so you can re-enable later.
eiou apikey disable eiou_abc123
Reactivate a previously disabled key by id — the original secret keeps working.
eiou apikey enable eiou_abc123

eiou apikey delete

Permanently remove a key. There is no recovery — the API consumer will need a freshly issued key.

eiou apikey delete eiou_abc123

eiou chaindrop propose

Propose dropping a missing transaction with a specific contact. The gap is auto-detected by verifying chain integrity; you don't need to specify the txid. Send auto-proposes too, so most users never run this manually.

eiou chaindrop propose https://bob

eiou chaindrop list

List incoming pending proposals across all contacts, or filter by a specific contact address. The output prints each proposal's id (format cdp-...), missing txid, and direction.

List every pending proposal across all contacts.
eiou chaindrop list
Filter the list to proposals from a single contact — pass the contact address as the only argument.
eiou chaindrop list https://bob

eiou chaindrop accept

Accept a proposal by its id. The drop is executed locally, affected transactions are re-signed, and the re-signed copies are exchanged with the proposer. The chain is repaired and transactions can resume immediately afterwards.

eiou chaindrop accept cdp-2c3c26ba61ab4073

eiou chaindrop reject

Reject a proposal. Warning: the chain gap stays unresolved and transactions with that contact remain blocked until a new proposal is accepted or the missing transactions are recovered through the isolated boot-recovery procedure.

eiou chaindrop reject cdp-2c3c26ba61ab4073

eiou payback list

List your enabled payback methods. --currency <CCY> filters to one currency code; --all also includes disabled rows.

List every enabled method across all currencies.
eiou payback list
Narrow to one currency with --currency and add --all to also include disabled rows.
eiou payback list --currency USD --all

eiou payback add

Create a new method of the given type for the given currency. Type-specific fields (rail, IBAN, account name, etc.) are prompted for interactively, with sensitive inputs read with terminal echo disabled.

Add a bank_wire method — you'll be prompted interactively for rail, IBAN, account name, and similar fields.
eiou payback add bank_wire "My Revolut" EUR
Add a free-text custom method, force a never share policy, and demote it with --priority 10.
eiou payback add custom "Monzo - DM me" GBP --share never --priority 10

eiou payback show

Display a single method with all fields decrypted to plaintext. The GUI and REST API gate plaintext reveal behind an authcode prompt; the CLI is considered authenticated by virtue of having shell access.

eiou payback show pbm_abc123

eiou payback edit

Re-enter the type-specific fields for an existing method (re-encrypts the whole blob atomically). Label, priority, and share policy each have their own subcommands.

eiou payback edit pbm_abc123

eiou payback share-policy

Update only the share policy on an existing method. Use this to change a method from auto-shareable to never-share without re-entering its credentials.

eiou payback share-policy pbm_abc123 never

eiou payback remove

Permanently delete a method. The encrypted row and credentials are removed; contacts that previously fetched the method retain whatever they cached.

eiou payback remove pbm_abc123

eiou plugin

List every installed plugin in a table with version, enabled flag, status, and license. Equivalent to eiou plugin list.

eiou plugin

eiou plugin enable / disable

Persist the enabled flag as true or false in /etc/eiou/config/plugins.json. Neither command restarts the node — you need eiou restart afterwards for the change to take effect, since plugin event subscriptions bind during boot.

Mark a plugin as enabled in plugins.json — takes effect on the next eiou restart.
eiou plugin enable hello-eiou
Mark a plugin as disabled — its event subscriptions stop binding on the next boot, but its tables and files stay intact.
eiou plugin disable hello-eiou

eiou plugin install

Install a plugin from a .zip on the container filesystem. Runs the same validation pipeline the GUI upload uses (zip integrity, path-traversal checks, file-type allow-list, manifest validation, and signature verification per the configured mode), then atomic-renames the staged tree into /etc/eiou/plugins/<name>/. The plugin lands disabled — follow up with eiou plugin enable <name> and eiou restart. Refuses to re-install an already-installed plugin and points at eiou plugin upgrade for that path.

Copy the zip into the container, then install it. The CLI runs inside the wallet container, so the path must be a container-local path (commonly under /tmp/).
docker cp my-plugin.zip alice:/tmp/my-plugin.zip
docker exec alice eiou plugin install /tmp/my-plugin.zip

eiou plugin uninstall

Run the full uninstall sequence: invoke the plugin's onUninstall hook, drop its tables and DB user, delete credentials, and remove plugin files. The plugin must be disabled first — the command will refuse to run otherwise.

eiou plugin uninstall hello-eiou

eiou plugin upgrade

Replace an installed plugin's code with a newer version. Two argument shapes feed into the same engine: pass a plugin name (kebab-case) to upgrade to the image-baked version under /app/plugins/<name>/, or pass a zip path (anything containing slashes or dots) to upgrade to an operator-supplied build. The plugin's state (MySQL tables, plugin user, credentials, gateway token) is preserved across the upgrade. A snapshot of the previous version is kept under <name>.backup-<oldver>-<ts>/ next to the live plugin and pruned automatically after 30 days. Refuses same-version, downgrades, and min_upgradable_from violations.

Upgrade to the image-baked version of a bundled plugin.
eiou plugin upgrade hello-eiou
Upgrade from an operator-supplied .zip on the container filesystem.
docker cp hello-eiou-1.6.zip alice:/tmp/hello-eiou-1.6.zip
docker exec alice eiou plugin upgrade /tmp/hello-eiou-1.6.zip

eiou dlq

Show active items (pending + retrying) in one quick table — the most common usage. Equivalent to eiou dlq list with no filter.

eiou dlq

eiou dlq list

List items, optionally filtered by status. Accepted values: pending, retrying, resolved, abandoned, or all (everything regardless of status).

Show every row regardless of status — including resolved and abandoned items still inside the retention window.
eiou dlq list --status=all
Filter to a single status — here, just messages waiting for their first manual action.
eiou dlq list --status=pending

eiou dlq retry

Manually re-attempt delivery of a failed message by id. Transaction payloads have their previousTxid and time refreshed from current DB state and the envelope is re-signed before send, so retries don't ship a stale chain link.

eiou dlq retry 42

eiou dlq abandon

Mark an item as abandoned so it stops appearing in the active list. Use this for stale p2p / rp2p rows that can no longer be delivered meaningfully. Cannot be undone.

eiou dlq abandon 42
Example
eiou verify-chain

Exit codes: 0 = every pair clean; 1 = at least one pair has a finding (chain gap or hash mismatch).

eiou report debug

Save a JSON report under /tmp/ with system info, debug-table entries, and the last 50 lines of each log file. An optional description string is recorded in the report header. The output path is printed to stdout when the command completes.

Capture a report with no description — just the system info, debug-table entries, and the last 50 lines of each log.
eiou report debug
Same capture, but tag it with a free-text description that's recorded in the report header for later context.
eiou report debug "login page crash"

eiou report debug --full

Same as the default, but includes up to 5 MB per log file instead of just the last 50 lines. Use this when investigating issues that span more history than the default capture covers.

Capture the longer 5 MB-per-log report with no description.
eiou report debug --full
Same long capture, with a description recorded in the report header to flag what you were investigating.
eiou report debug "sync failure after restore" --full

eiou report debug --send

Scrub the report of sensitive data (addresses, keys, IPs) and submit it to the support endpoint over Tor instead of saving locally. The command returns a reference key you can quote to support. Combine with --full to send the longer log capture.

Scrub and submit the default report to support over Tor — prints a reference key instead of a local path.
eiou report debug --send
Submit the longer --full capture with a description — combine when 50 lines of logs aren't enough context for support.
eiou report debug "login crash" --full --send

eiou updatecheck

Query Docker Hub and GitHub Releases for newer image versions, bypassing the 24-hour cache. If an update is available the output prints the new version and a docker pull command; otherwise it confirms the current version.

eiou updatecheck

eiou shutdown

Gracefully stop all background processors (P2P, transaction, cleanup, contact-status) and set a shutdown flag. The watchdog respects the flag and won't auto-restart them. PHP-FPM and the HTTP front-end keep running — only the queue processors are paused.

eiou shutdown

eiou start

Resume processors after a previous shutdown. Removes the shutdown flag; the watchdog detects the change and restarts the processors within ~30 seconds. Restart counters are reset so prior shutdown limits don't block them.

eiou start

eiou restart

Full in-place restart: SIGTERM the processors (watchdog respawns them within ~30 s) and SIGUSR2 the PHP-FPM master so workers gracefully recycle (in-flight HTTP requests finish first). Required after toggling plugins, since their event subscriptions bind during boot. Must run as root inside the container.

eiou restart