Umbrel: `jmwalletd` and `ob-watcher` Services Fail to Start with Bitcoin Core 27.0
Expected behavior: The jmwalletd and ob-watcher services should start successfully without terminating.
Actual behavior: The jmwalletd and ob-watcher services repeatedly fail with exit code 1.
Steps to reproduce the problem: Install Bitcoin Core 27.0 on Umbrel. Install the Jam app on a Raspberry Pi 4 running umbrelOS 1.2.1. Start the Jam app and observe the service failures.
Specifications: Version: Bitcoin Core 27.0, umbrelOS 1.2.1 Platform: Raspberry Pi 4 Browser: Tor and umbrel.local (all browsers)
I suspect there might be compatibility issues with Bitcoin Core version 27.0 or specific configuration requirements that haven't been documented yet. Any guidance or recommendations on how to resolve this issue would be greatly appreciated.
Jam Troubleshoot logs: I've been trying to find the fix for this issue and nothing I seem to do gets this to work. I've deleted and reinstall tried multiple times using same issues people had when updating to Bitcoin Core 26.0. I am currently running Bitcoin Core 27.0
I'm currently using Umbrel on a Raspberry Pi 4 on umbrelOS 1.2.1
I've tried fixing it here to no luck: https://jamdocs.org/software/installation/
Thejmwalletd and ob-watcher services repeatedly fail with exit code 1.
I suspect there might be compatibility issues with Bitcoin Core version 27.0 or specific configuration requirements that haven't been documented yet.
Any guidance or recommendations on how to resolve this issue would be greatly appreciated.
Jam App Troubleshoot logs: jam_app_proxy_1 | yarn run v1.22.19 jam_app_proxy_1 | $ node ./bin/www jam_app_proxy_1 | [HPM] Proxy created: / -> http://jam_web_1:80 jam_app_proxy_1 | Waiting for jam_web_1:80 to open... jam_web_1 | [WARN tini (6)] Tini is not running as PID 1 and isn't registered as a child subreaper. jam_web_1 | Zombie processes will not be re-parented to Tini, so zombie reaping won't work. jam_web_1 | To fix the problem, use the -s option or set the environment variable TINI_SUBREAPER to register Tini as a child subreaper, or run Tini as PID 1. jam_web_1 | Remove leftover wallet lockfiles before startup... jam_web_1 | ~/.joinmarket/ssl /src/scripts jam_web_1 | Generating a RSA private key jam_web_1 | ......................................++++ jam_web_1 | ............................................................++++ jam_web_1 | writing new private key to 'key.pem' jam_web_1 | ----- jam_web_1 | /src/scripts jam_web_1 | Waiting for bitcoind to accept RPC requests... jam_web_1 | Successfully waited for bitcoind to accept RPC requests. jam_web_1 | Creating wallet jam_default if missing... jam_web_1 | Loading wallet jam_default... jam_web_1 | [ OK ] nginx jam_web_1 | [ OK ] tor jam_web_1 | [ OK ] jmwalletd jam_web_1 | [ OK ] ob-watcher jam_web_1 | [ OK ] boot jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | Jam is now ready... jam_app_proxy_1 | Listening on port: 5002 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 tor_server-1 | Jul 12 18:39:24.458 [notice] Tor 0.4.7.8 running on Linux with Libevent 2.1.12-stable, OpenSSL 1.1.1n, Zlib 1.2.11, Liblzma N/A, Libzstd N/A and Glibc 2.31 as libc. tor_server-1 | Jul 12 18:39:24.459 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://support.torproject.org/faq/staying-anonymous/ tor_server-1 | Jul 12 18:39:24.463 [notice] Read configuration file "/tmp/torrc". tor_server-1 | Jul 12 18:39:24.492 [notice] Opening Socks listener on 127.0.0.1:9050 tor_server-1 | Jul 12 18:39:24.492 [notice] Opened Socks listener connection (ready) on 127.0.0.1:9050 tor_server-1 | Jul 12 18:39:24.000 [notice] Bootstrapped 0% (starting): Starting tor_server-1 | Jul 12 18:39:24.000 [notice] Starting with guard context "default" tor_server-1 | Jul 12 18:39:25.000 [notice] Bootstrapped 5% (conn): Connecting to a relay tor_server-1 | Jul 12 18:39:27.000 [notice] Bootstrapped 10% (conn_done): Connected to a relay tor_server-1 | Jul 12 18:39:27.000 [notice] Bootstrapped 14% (handshake): Handshaking with a relay tor_server-1 | Jul 12 18:41:47.000 [notice] Bootstrapped 15% (handshake_done): Handshake with a relay done tor_server-1 | Jul 12 18:41:47.000 [notice] Bootstrapped 20% (onehop_create): Establishing an encrypted directory connection jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket tor_server-1 | Jul 12 18:41:47.000 [notice] Bootstrapped 25% (requesting_status): Asking for networkstatus consensus jam_app_proxy_1 | [HPM] Upgrading to WebSocket tor_server-1 | Jul 12 18:41:47.000 [notice] Bootstrapped 30% (loading_status): Loading networkstatus consensus jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 tor_server-1 | Jul 12 18:41:48.000 [notice] I learned some more directory information, but not enough to build a circuit: We have no usable consensus. jam_app_proxy_1 | [HPM] Upgrading to WebSocket tor_server-1 | Jul 12 18:41:48.000 [notice] Bootstrapped 40% (loading_keys): Loading authority key certs jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_app_proxy_1 | [HPM] Upgrading to WebSocket tor_server-1 | Jul 12 18:41:48.000 [notice] The current consensus has no exit nodes. Tor can only build internal paths, such as paths to onion services. jam_app_proxy_1 | [HPM] Upgrading to WebSocket tor_server-1 | Jul 12 18:41:48.000 [notice] Bootstrapped 45% (requesting_descriptors): Asking for relay descriptors jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 tor_server-1 | Jul 12 18:41:48.000 [notice] I learned some more directory information, but not enough to build a circuit: We need more microdescriptors: we have 0/7489, and can only build 0% of likely paths. (We have 0% of guards bw, 0% of midpoint bw, and 0% of end bw (no exits in consensus, using mid) = 0% of path bw.) tor_server-1 | Jul 12 18:41:48.000 [notice] I learned some more directory information, but not enough to build a circuit: We need more microdescriptors: we have 0/7489, and can only build 0% of likely paths. (We have 0% of guards bw, 0% of midpoint bw, and 0% of end bw (no exits in consensus, using mid) = 0% of path bw.) tor_server-1 | Jul 12 18:41:49.000 [notice] Bootstrapped 50% (loading_descriptors): Loading relay descriptors tor_server-1 | Jul 12 18:41:50.000 [notice] The current consensus contains exit nodes. Tor can build exit and internal paths. tor_server-1 | Jul 12 18:41:53.000 [notice] Bootstrapped 55% (loading_descriptors): Loading relay descriptors tor_server-1 | Jul 12 18:41:53.000 [notice] Bootstrapped 61% (loading_descriptors): Loading relay descriptors tor_server-1 | Jul 12 18:41:53.000 [notice] Bootstrapped 69% (loading_descriptors): Loading relay descriptors tor_server-1 | Jul 12 18:41:54.000 [notice] Bootstrapped 75% (enough_dirinfo): Loaded enough directory info to build circuits tor_server-1 | Jul 12 18:41:54.000 [notice] Bootstrapped 80% (ap_conn): Connecting to a relay to build circuits tor_server-1 | Jul 12 18:41:54.000 [notice] Bootstrapped 85% (ap_conn_done): Connected to a relay to build circuits tor_server-1 | Jul 12 18:41:54.000 [notice] Bootstrapped 89% (ap_handshake): Finishing handshake with a relay to build circuits tor_server-1 | Jul 12 18:41:54.000 [notice] Bootstrapped 90% (ap_handshake_done): Handshake finished with a relay to build circuits tor_server-1 | Jul 12 18:41:54.000 [notice] Bootstrapped 95% (circuit_create): Establishing a Tor circuit tor_server-1 | Jul 12 18:41:55.000 [notice] Bootstrapped 100% (done): Done jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd process terminated with exit code 1 jam_web_1 | dinit: Service jmwalletd restarting too quickly; stopping. jam_web_1 | [STOPPD] jmwalletd jam_web_1 | dinit: Service ob-watcher process terminated with exit code 1 jam_web_1 | dinit: Service ob-watcher restarting too quickly; stopping. jam_web_1 | [STOPPD] ob-watcher
Hey @jmurphypga!
Thanks for the detailed report!
I suspect there might be compatibility issues with Bitcoin Core version 27.0 or specific configuration requirements that haven't been documented yet. Any guidance or recommendations on how to resolve this issue would be greatly appreciated. Jam Troubleshoot logs: I've been trying to find the fix for this issue and nothing I seem to do gets this to work. I've deleted and reinstall tried multiple times using same issues people had when updating to Bitcoin Core 26.0. I am currently running Bitcoin Core 27.0
Currently testing with Bitcoin Core v27 in regtest and everything seems to work.
Has it worked with v26 before and is now broken after the update?
Would it be possible to verify that you really have deprecatedrpc=create_bdb in your configuration?
Otherwise, if you are sure the config is present, loaded and activated, sharing information from log files in /var/log/jam/ can possibly provide some more information on why jmwalletd is failing :pray:
Thanks again!
Thank you for your response!
Configuration Verification:
Yes, deprecatedrpc=create_bdb is present in my Bitcoin Core configuration file.
includeconf=umbrel-bitcoin.conf deprecatedrpc=create_bdb server=1 rpcuser=**** rpcpassword=**** rpcallowip=127.0.0.1 rpcport=8332
Version Information: The issues started appearing after updating from v26 to v27 of Bitcoin Core.
Below are some excerpts from my log files which might provide more insight into why jmwalletd is failing:
2024-07-15T15:31:13Z Config file arg: deprecatedrpc="create_bdb" 2024-07-15T15:31:13Z Config file arg: rpcallowip="127.0.0.1" 2024-07-15T15:31:13Z Config file arg: rpcpassword=**** 2024-07-15T15:31:13Z Config file arg: rpcport="8332" 2024-07-15T15:31:13Z Config file arg: rpcuser=**** 2024-07-15T15:31:13Z Config file arg: rpcworkqueue="128" 2024-07-15T15:31:13Z Command-line arg: deprecatedrpc="create_bdb" 2024-07-15T15:31:13Z Command-line arg: rpcallowip="10.21.0.0/16" 2024-07-15T15:31:13Z Command-line arg: rpcallowip="127.0.0.1" 2024-07-15T15:31:13Z Command-line arg: rpcauth=**** 2024-07-15T15:31:13Z Command-line arg: rpcbind="10.21.21.8" 2024-07-15T15:31:13Z Command-line arg: rpcbind="127.0.0.1" 2024-07-15T15:31:13Z Command-line arg: rpcport="8332" 2024-07-15T15:31:13Z Binding RPC on address 10.21.21.8 port 8332 2024-07-15T15:31:13Z Binding RPC on address 127.0.0.1 port 8332 2024-07-15T15:31:13Z Config options rpcuser and rpcpassword will soon be deprecated. Locally-run instances may remove rpcuser to use cookie-based auth, or may be replaced with rpcauth. Please see share/rpcauth for rpcauth auth generation. 2024-07-15T15:31:13Z Using rpcauth authentication.
From /var/log/jam/jmwalletd.log:
2024-07-15T15:31:09Z [jam_default] Releasing wallet 2024-07-15T15:31:13Z Setting file arg: wallet = ["","jam_default"] ...
From /var/log/i2pd/daemon.log:
09:47:19@933/error - SAM: Read error: End of file 09:47:19@933/error - SAM: Stream read error: Operation canceled ...
From /var/log/tor/tor.log:
Jul 12 01:04:12.927 [notice] Tor 0.4.7.8 running on Linux with Libevent 2.1.12-stable, OpenSSL 1.1.1n, Zlib 1.2.11, Liblzma N/A, Libzstd N/A and Glibc 2.31 as libc. Jul 12 01:04:12.927 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://support.torproject.org/faq/staying-anonymous/ ...
Please let me know if you need more information or if there's anything else I can do to help debug this issue.
Thanks again
Hmm.. it seems there is no useful information in the logs regarding the problem.
I am not able to reproduce it locally. My last attempt would be: Can you try adding deprecatedrpc=create_bdb to umbrel-bitcoin.conf, restart your node and see if the behaviour stays the same?
Edit: Umbrel should already have deprecatedrpc=create_bdb included..
Hi,
I'm also having the same issue on Bitcoin Core 27.0.
I'm running the container with podman v5.4.1:
podman logs jam
Remove leftover wallet lockfiles before startup...
Waiting for bitcoind to accept RPC requests...
Successfully waited for bitcoind to accept RPC requests.
Creating wallet jm_webui_default if missing...
Loading wallet jm_webui_default...
[ OK ] nginx
[ OK ] tor
[ OK ] jmwalletd
[ OK ] ob-watcher
[ OK ] boot
dinit: Service jmwalletd process terminated with exit code 1
dinit: Service ob-watcher process terminated with exit code 1
dinit: Service jmwalletd process terminated with exit code 1
dinit: Service ob-watcher process terminated with exit code 1
dinit: Service jmwalletd process terminated with exit code 1
dinit: Service ob-watcher process terminated with exit code 1
dinit: Service jmwalletd process terminated with exit code 1
dinit: Service jmwalletd restarting too quickly; stopping.
[STOPPD] jmwalletd
dinit: Service ob-watcher process terminated with exit code 1
dinit: Service ob-watcher restarting too quickly; stopping.
[STOPPD] ob-watcher
In the container these are my logs
/var/log/jam/jmwalletd_stdout.log
User data location: /root/.joinmarket/
2025-04-06 17:05:44,941 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/jmwalletd.py", line 47, in <module>
jmwalletd_main()
File "/src/scripts/jmwalletd.py", line 26, in jmwalletd_main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
User data location: /root/.joinmarket/
2025-04-06 17:05:45,173 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/jmwalletd.py", line 47, in <module>
jmwalletd_main()
File "/src/scripts/jmwalletd.py", line 26, in jmwalletd_main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
User data location: /root/.joinmarket/
2025-04-06 17:05:45,400 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/jmwalletd.py", line 47, in <module>
jmwalletd_main()
File "/src/scripts/jmwalletd.py", line 26, in jmwalletd_main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
User data location: /root/.joinmarket/
2025-04-06 17:05:45,629 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/jmwalletd.py", line 47, in <module>
jmwalletd_main()
File "/src/scripts/jmwalletd.py", line 26, in jmwalletd_main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
/var/log/jam/obwatch_stdout.log
2025-04-06 17:05:44,939 [WARNING] matplotlib not found, charts will not be available. Do `pip install matplotlib` in the joinmarket virtual environment.
User data location: /root/.joinmarket/
2025-04-06 17:05:44,959 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/obwatch/ob-watcher.py", line 841, in <module>
main()
File "/src/scripts/obwatch/ob-watcher.py", line 811, in main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
2025-04-06 17:05:45,197 [WARNING] matplotlib not found, charts will not be available. Do `pip install matplotlib` in the joinmarket virtual environment.
User data location: /root/.joinmarket/
2025-04-06 17:05:45,204 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/obwatch/ob-watcher.py", line 841, in <module>
main()
File "/src/scripts/obwatch/ob-watcher.py", line 811, in main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
2025-04-06 17:05:45,437 [WARNING] matplotlib not found, charts will not be available. Do `pip install matplotlib` in the joinmarket virtual environment.
User data location: /root/.joinmarket/
2025-04-06 17:05:45,444 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/obwatch/ob-watcher.py", line 841, in <module>
main()
File "/src/scripts/obwatch/ob-watcher.py", line 811, in main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
2025-04-06 17:05:45,675 [WARNING] matplotlib not found, charts will not be available. Do `pip install matplotlib` in the joinmarket virtual environment.
User data location: /root/.joinmarket/
2025-04-06 17:05:45,681 [INFO] Loading Bitcoin RPC wallet jm_webui_default...
Traceback (most recent call last):
File "/src/scripts/obwatch/ob-watcher.py", line 841, in <module>
main()
File "/src/scripts/obwatch/ob-watcher.py", line 811, in main
load_program_config(config_path=options.datadir)
File "/src/src/jmclient/configure.py", line 772, in load_program_config
global_singleton.bc_interface = get_blockchain_interface_instance(
File "/src/src/jmclient/configure.py", line 907, in get_blockchain_interface_instance
bc_interface = BitcoinCoreInterface(rpc, network,
File "/src/src/jmclient/blockchaininterface.py", line 357, in __init__
self._rpc("loadwallet", [wallet_name])
File "/src/src/jmclient/blockchaininterface.py", line 435, in _rpc
res = self.jsonRpc.call(method, args)
File "/src/src/jmclient/jsonrpc.py", line 164, in call
raise JsonRpcError(response["error"])
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Path does not exist."}
/var/log/jam/tor_stdout.log
Apr 06 17:05:44.643 [notice] Tor 0.4.8.12 running on Linux with Libevent 2.1.12-stable, OpenSSL 1.1.1w, Zlib 1.2.11, Liblzma 5.2.5, Libzstd 1.4.8 and Glibc 2.31 as libc.
Apr 06 17:05:44.643 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://support.torproject.org/faq/staying-anonymous/
Apr 06 17:05:44.643 [notice] Read configuration file "/etc/tor/torrc".
Apr 06 17:05:44.644 [notice] Opening Socks listener on 127.0.0.1:9050
Apr 06 17:05:44.644 [notice] Opened Socks listener connection (ready) on 127.0.0.1:9050
Apr 06 17:05:44.644 [notice] Opening Control listener on 127.0.0.1:9051
Apr 06 17:05:44.644 [notice] Opened Control listener connection (ready) on 127.0.0.1:9051
My podman quadlet:
jam.container
[Unit]
Description=Web UI for JoinMarket
Requires=bitcoin-core-service.service
After=bitcoin-core-service.service
[Container]
Network=jam_net
ContainerName=jam
Image=ghcr.io/joinmarket-webui/jam-standalone:v0.3.0-clientserver-v0.9.11
AutoUpdate=registry
EnvironmentFile=.env
Environment=JM_RPC_HOST=192.168.1.120
Environment=JM_RPC_PORT=8332
Environment=JM_RPC_USER=${BTC_RPC_USERNAME}
Environment=JM_RPC_PASSWORD=${BTC_RPC_PASSWORD}
Environment=APP_USER=${JM_APP_USER}
Environment=APP_PASSWORD=${JM_APP_PASSWORD}
Environment=ENSURE_WALLET=true
Environment=REMOVE_LOCK_FILES=true
Environment=RESTORE_DEFAULT_CONFIG=true
Volume=jmdatadir.volume:/root/.joinmarket
PublishPort=8050:80
[Service]
Restart=always
[Install]
WantedBy=multi-user.target default.target
bitcoin.conf
txindex=1
server=1
maxuploadtarget=400
rest=1
rpccookiefile=/home/bitcoin/.bitcoin/.cookie
[main]
rpcbind=10.89.5.36 # Internal IP
rpcallowip=10.89.5.0/24
rpcallowip=127.0.0.1 # Local connections (electrumx)
rpcallowip=192.168.1.0/16 # Host machine
rpcallowip=10.89.4.0/24 # Jam
rpcauth=myuser:<longhashpassword>
I am also running Bitcoin Core in a podman container. Based on these logs, it looks like it's a cascade effect starting with jamwalletd which is unable to open /home/bitcoin/.bitcoin/jm_webui_default since it doesn't exist. If I create that directory at that path, the error from jmwalletd changes to this:
jmclient.jsonrpc.JsonRpcError: {'code': -18, 'message': "Wallet file verification failed. Failed to load database path '/home/bitcoin/.bitcoin/jm_webui_default'. Data is not in recognized format."}
/home/bitcoin/.bitcoin/ is mounted to my local drive /mnt/bitcoin for persistent storage.
ls -ld /mnt/bitcoin/
drwx------. 1 100100 100100 326 Apr 6 10:49 /mnt/bitcoin/
Inside the container all files are owned by by rpcuser but outside the container it's owned by 100100. I'm on Fedora 41 and disabled SELinux with sudo setenforce 0 but the error persists. I don't see an error for creating the directory in the logs, and I'm able to connect other wallets to bitcoin core just fine.
I also tried adding deprecatedrpc=create_bdb to my bitcoin.conf and run jam with and without that folder created at that path, and I still get path not found or data is not in recognized format error.
The other thing I tried was set ENSURE_WALLET=false but that does not resolve the original error.
I can confirm that my node is accessible from other containers on other networks (I excluded other rpcallowip configurations from above)
I don't understand exactly what Jam is doing. Any help would be appreciated!
I resolved this with the help of Claude Sonnet 3.7.
Add deprecatedrpc=create_bdb to bitcoin.conf and restart bitcoin core.
In the bitcoin core container I created a legacy wallet jm_webui_default:
podman exec -it bitcoin-core /bin/bash
bitcoin-cli -rpcconnect=ipaddress -rpcuser=username -rpcpassword=password createwallet jm_webui_default false false "passphrase" false false true
Verified the wallet format was in bdb:
bitcoin-cli -rpcconnect=ipaddress -rpcuser=username -rpcpassword=password -rpcwallet=jm_webui_default getwalletinfo
{
"walletname": "jm_webui_default",
"walletversion": 169900,
"format": "bdb",
...
}
Restarted jam
systemctl --user restart jam.service
Why Jam doesn't create the wallet on start up I still do not know. Creating the wallet prior to starting the container was the workaround.
@ElderBlade Glad you got it working. Really nice! Hopefully we get descriptor wallet support soon. https://github.com/JoinMarket-Org/joinmarket-clientserver/issues/157 👀