mempool/production
2024-02-06 14:03:44 -05:00
..
freebsd ops: Increase FreeBSD bitcoin node shutdown timeout to 600 2023-08-25 23:29:03 +09:00
linux Fix path for newsyslog configs in prod installer 2022-08-24 17:49:56 +02:00
nginx ops: Add missing HTTP Expires header for fees API 2024-02-06 13:55:44 -05:00
bitcoin.conf ops: Add VA1 nodes to bitcoin.conf peer list 2024-01-20 06:42:46 -05:00
bitcoin.crontab ops: Fix bitcoin crontab 2024-01-20 07:20:18 -05:00
bitcoin.minfee.conf Enable fullrbf 2023-05-20 18:00:22 -04:00
elements.conf ops: Use old elements RPC port 7040 2023-03-18 18:48:37 +09:00
elements.crontab ops: Fix elements crontab 2024-01-20 07:20:40 -05:00
install ops: Add redis to prod installer 2024-01-26 10:51:44 -05:00
mempool-build-all ops: Remove fork repos from upgrade script 2023-03-02 19:30:02 +09:00
mempool-config.bisq.json ops: Add fallback TCP socket for esplora backends 2023-04-06 17:52:17 +09:00
mempool-config.liquid.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.liquidtestnet.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.mainnet-lightning.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.mainnet.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.signet-lightning.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.signet.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.testnet-lightning.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.testnet.json ops: Add new prod servers for fallback/replication 2024-01-29 00:05:16 -05:00
mempool-config.unfurl.json Add Unfurl to the prod installer 2022-07-29 20:13:48 +02:00
mempool-frontend-config.bisq.json Add production frontend configurations 2022-03-12 10:34:17 +00:00
mempool-frontend-config.liquid.json Restore liquid max block weight to defaults 2023-05-24 15:49:35 -04:00
mempool-frontend-config.mainnet.json Add audit / block health config feature flag 2023-02-14 12:32:30 -06:00
mempool-kill-all ops: Kill node before sh in stop script 2023-11-14 17:46:42 +09:00
mempool-logger Fix typo/bug in mempool-logger script 2021-08-21 15:39:15 +09:00
mempool-reset-all ops: fix wildcards in mempool-reset-all script 2023-01-08 13:11:59 +09:00
mempool-start-all ops: Add new nginx hot cacher 2024-01-26 10:40:21 -05:00
mempool-update-assets Add support for liquidtestnet in production backend and nginx 2021-12-28 15:20:11 +09:00
mempool.crontab ops: Tweak boot-time delays for all daemons 2023-04-06 19:19:28 +09:00
minfee.crontab ops: Tweak boot-time delays for all daemons 2023-04-06 19:19:28 +09:00
newsyslog-mempool-backend.conf [ops] Fix syslog permissions for /var/log/mempool 2022-08-02 00:08:02 +02:00
newsyslog-mempool-nginx.conf ops: Use unix sockets to query esplora from nginx 2023-03-13 16:35:27 +09:00
nginx-cache-heater ops: Fix obvious bug in cache heater script 2024-02-06 14:03:44 -05:00
nginx-cache-warmer ops: Add new nginx hot cacher 2024-01-26 10:40:21 -05:00
README.md Add enterprise note to production readme 2023-08-13 13:00:47 +09:00
redis.conf ops: Add production/redis.conf 2024-01-01 08:03:34 +09:00
sitemap-update Update misc files used for mempool.space production website 2020-05-25 18:42:00 +09:00
sysctl.conf Add production FreeBSD tuning parameters to increase network buffers 2021-04-16 00:12:29 +09:00
syslog.conf [ops] Change keybase notifications to ERR or higher priority 2022-08-24 21:59:05 +09:00
test-nginx Change shebang in scripts to be universal for prod install 2022-07-06 12:11:13 +02:00
torrc Fix tor config for FreeBSD on prod installer 2022-07-30 14:01:40 +02:00
unfurler-config.bisq.json Add unfurler configs for 3 sites 2022-08-30 11:28:25 +02:00
unfurler-config.liquid.json Fix unfurler config set network to liquid 2022-09-10 05:39:03 +09:00
unfurler-config.mainnet.json ops: Use TK7 for unfurler 2023-07-31 11:12:54 +09:00

Deploying an Enterprise Production Instance

These instructions are for setting up a serious production Mempool website for Bitcoin (mainnet, testnet, signet), Liquid (mainnet, testnet), and Bisq.

Again, this setup is no joke—home users should use one of the other installation methods. Support is only provided to project sponsors through Mempool Enterprise®.

You can also have the mempool.space team run a highly-performant and highly-available instance of Mempool for you on their own global ISP infrastructure. See Mempool Enterprise® for more details.

Server Hardware

Mempool v2 is powered by blockstream/electrs, which is a beast.

I recommend a beefy server:

  • 20-core CPU (more is better)
  • 64GB RAM (more is better)
  • 4TB SSD (NVMe is better)

HDD vs SSD vs NVMe

If you don't have a fast SSD or NVMe-backed disk, that's fine—go online and buy some fast new NVMe drives. When they arrive, install them, throw away your old HDDs, and then proceed with the rest of this guide.

FreeBSD 13

The mempool.space site is powered by FreeBSD with ZFS root and ARC cache for maximum performance. Linux probably works fine too, but why settle?

Filesystem

For maximum performance, I use 2x 2TB NVMe SSDs in a RAID 0 using ZFS with lots of RAM for the ARC L2 cache.

% zpool list -v
NAME        SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
nvm        3.62T  1.25T  2.38T        -         -     2%    34%  1.00x    ONLINE  -
  nvd0p3   1.81T   629G  1.20T        -         -     2%  33.9%      -  ONLINE
  nvd1p3   1.81T   646G  1.18T        -         -     2%  34.8%      -  ONLINE

For maximum flexibility of configuration, I recommend separate partitions for each data folder:

Filesystem                             Size    Used   Avail Capacity  Mounted on
nvm/bisq                             766G    1.1G    765G     0%    /bisq
nvm/bitcoin                          766G    648M    765G     0%    /bitcoin
nvm/bitcoin/blocks                   1.1T    375G    765G    33%    /bitcoin/blocks
nvm/bitcoin/chainstate               770G    4.5G    765G     1%    /bitcoin/chainstate
nvm/bitcoin/electrs                  772G    7.3G    765G     1%    /bitcoin/electrs
nvm/bitcoin/indexes                  799G     34G    765G     4%    /bitcoin/indexes
nvm/bitcoin/testnet3                 765G    5.0M    765G     0%    /bitcoin/testnet3
nvm/bitcoin/testnet3/blocks          786G     21G    765G     3%    /bitcoin/testnet3/blocks
nvm/bitcoin/testnet3/chainstate      766G    1.1G    765G     0%    /bitcoin/testnet3/chainstate
nvm/bitcoin/testnet3/indexes         768G    2.9G    765G     0%    /bitcoin/testnet3/indexes
nvm/electrs                          765G    128K    765G     0%    /electrs
nvm/electrs/liquid                   765G    104K    765G     0%    /electrs/liquid
nvm/electrs/liquid/cache             765G    7.8M    765G     0%    /electrs/liquid/newindex/cache
nvm/electrs/liquid/history           766G    886M    765G     0%    /electrs/liquid/newindex/history
nvm/electrs/liquid/txstore           775G     10G    765G     1%    /electrs/liquid/newindex/txstore
nvm/electrs/liquidtestnet            765G    112K    765G     0%    /electrs/liquidtestnet
nvm/electrs/liquidtestnet/cache      765G     96K    765G     0%    /electrs/liquidtestnet/newindex/cache
nvm/electrs/liquidtestnet/history    765G     96K    765G     0%    /electrs/liquidtestnet/newindex/history
nvm/electrs/liquidtestnet/txstore    765G     96K    765G     0%    /electrs/liquidtestnet/newindex/txstore
nvm/electrs/mainnet                  765G    112K    765G     0%    /electrs/mainnet
nvm/electrs/mainnet/cache            765G    4.4M    765G     0%    /electrs/mainnet/newindex/cache
nvm/electrs/mainnet/history          1.0T    300G    765G    28%    /electrs/mainnet/newindex/history
nvm/electrs/mainnet/txstore          1.3T    530G    765G    41%    /electrs/mainnet/newindex/txstore
nvm/electrs/signet                   766G    522M    765G     0%    /electrs/signet
nvm/electrs/testnet                  765G    104K    765G     0%    /electrs/testnet
nvm/electrs/testnet/cache            765G    1.6M    765G     0%    /electrs/testnet/newindex/cache
nvm/electrs/testnet/history          784G     19G    765G     2%    /electrs/testnet/newindex/history
nvm/electrs/testnet/txstore          803G     38G    765G     5%    /electrs/testnet/newindex/txstore
nvm/elements                         766G    927M    765G     0%    /elements
nvm/elements/electrs                 766G    716M    765G     0%    /elements/electrs
nvm/elements/liquidv1                777G     11G    765G     1%    /elements/liquidv1
nvm/mempool                          789G     24G    765G     3%    /mempool
nvm/mysql                            766G    648M    765G     0%    /mysql
tmpfs                                1.0G    1.3M    1.0G     0%    /var/cache/nginx
tmpfs                                3.0G    1.9G    1.1G    63%    /bisq/statsnode-data/btc_mainnet/db/json

Build Dependencies

You'll probably need these:

pkg install -y zsh sudo git screen curl wget neovim rsync nginx openssl openssh-portable py38-pip py38-certbot-nginx boost-libs autoconf automake gmake gcc libevent libtool pkgconf mariadb105-server mariadb105-client

Node.js + npm

Build Node.js v16.16.0 and npm v8 from source using nvm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh
source $HOME/.zshrc
nvm install v16.16.0 --shared-zlib
nvm alias default node

Rust

Build Rust from latest source:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Tor

Install Tor add Bitcoin to the _tor group:

pkg install -y tor
pw user mod bitcoin -G _tor

Then configure /usr/local/etc/tor/torrc as follows:

RunAsDaemon 1
SOCKSPort 9050
ControlPort 9051
Log notice syslog

CookieAuthentication 1
CookieAuthFileGroupReadable 1
CookieAuthFile /var/db/tor/control_auth_cookie
DataDirectory /var/db/tor
DataDirectoryGroupReadable 1

HiddenServiceDir /var/db/tor/mempool
HiddenServicePort 80 127.0.0.1:81
HiddenServiceVersion 3

HiddenServiceDir /var/db/tor/bisq
HiddenServicePort 80 127.0.0.1:82
HiddenServiceVersion 3

HiddenServiceDir /var/db/tor/liquid
HiddenServicePort 80 127.0.0.1:83
HiddenServiceVersion 3

Bitcoin

Build Bitcoin Core from source. Alternatively, install the OS packages:

pkg install -y bitcoin-daemon bitcoin-utils

Configure your bitcoin.conf like this:

datadir=/bitcoin
server=1
txindex=1
listen=1
discover=1
par=16
dbcache=4096
maxmempool=1337
mempoolexpiry=999999
maxconnections=42
onion=127.0.0.1:9050
rpcallowip=127.0.0.1
rpcuser=foo
rpcpassword=bar

[main]
bind=127.0.0.1:8333
rpcbind=127.0.0.1:8332
whitelist=bloomfilter@127.0.0.1

[test]
daemon=1
bind=127.0.0.1:18333
rpcbind=127.0.0.1:18332

[signet]
daemon=1
bind=127.0.0.1:38333
rpcbind=127.0.0.1:38332

Elements

Build Elements Core from source:

./autogen.sh
MAKE=gmake CC=cc CXX=c++ CPPFLAGS=-I/usr/local/include \
  ./configure --with-gui=no --disable-wallet
gmake -j19
gmake install

Configure your elements.conf like this:

server=1
daemon=1
listen=1
rpcuser=foo
rpcpassword=bar
mainchainrpchost=127.0.0.1
mainchainrpcuser=foo
mainchainrpcpassword=bar
txindex=1

[liquidv1]
validatepegin=1
mainchainrpcport=8332

[liquidtestnet]
validatepegin=0
anyonecanspendaremine=0
initialfreecoins=2100000000000000
con_dyna_deploy_start=0
con_max_block_sig_size=150
checkblockindex=0
fallbackfee=0.00000100
con_has_parent_chain=0
parentgenesisblockhash=NULL
pubkeyprefix=36
scriptprefix=19
blindedprefix=23
bech32_hrp=tex
blech32_hrp=tlq
pchmessagestart=410edd62
dynamic_epoch_length=1000
signblockscript=51210217e403ddb181872c32a0cd468c710040b2f53d8cac69f18dad07985ee37e9a7151ae
evbparams=dynafed:0:::
addnode=liquid-testnet.blockstream.com:18892
addnode=liquidtestnet.com:18891
addnode=liquid.network:18444

Start elementsd and wait for it to sync the Liquid blockchain.

Electrs

Install Electrs from source:

git clone https://github.com/Blockstream/electrs
cd electrs
git checkout new-index

You'll need one instance per network. Build and run them one at a time:

./electrs-start-mainnet
./electrs-start-testnet
./electrs-start-signet
./electrs-start-liquid
./electrs-start-liquidtestnet

MariaDB

Import the historical mempool fee database snapshot:

mysql -u root
create database mempool;
grant all on mempool.* to 'mempool'@'localhost' identified by 'mempool';
create database mempool_testnet;
grant all on mempool_testnet.* to 'mempool_testnet'@'localhost' identified by 'mempool_testnet';
create database mempool_signet;
grant all on mempool_signet.* to 'mempool_signet'@'localhost' identified by 'mempool_signet';
create database mempool_liquid;
grant all on mempool_liquid.* to 'mempool_liquid'@'localhost' identified by 'mempool_liquid';
create database mempool_liquidtestnet;
grant all on mempool_liquidtestnet.* to 'mempool_liquidtestnet'@'localhost' identified by 'mempool_liquidtestnet';

Bisq

Build bisq-statsnode normally and run using options like this:

./bisq-statsnode --dumpBlockchainData=true --dumpStatistics=true

If Bisq is happy, it should dump JSON files for Bisq Markets and BSQ data into /bisq for the Mempool backend to use.

Mempool

After all 3 electrs instances are fully indexed, install your 3 Mempool nodes:

./mempool-install-all
./mempool-upgrade-all

Finally, start your 3 Mempool backends:

./mempool-start-all

Nginx

Get an SSL certificate using certbot:

certbot --nginx -d mempool.ninja

Make a symlink from /usr/local/etc/nginx/mempool to /mempool/mempool, copy the nginx.conf, and edit as necessary. You probably only need to edit the top-level nginx.conf file.

cd /usr/local/etc/nginx
ln -s /mempool/mempool
cp /mempool/mempool/nginx.conf .
vi nginx.conf

Restart nginx:

service nginx restart

Done

If everything went well, your site should look like the one at https://mempool.space/.