Blockscout deployment guide
This guide currently uses the following software versions:
- Ubuntu-18.04 (Bionic) server
- Openethereum (Parity): v3.0.1-stable
- BlockScout:
v3.2.0
General Pre-Requirements
Linux(Ubuntu or CentOS) server with root access, 4+ TB storage for BlockScout database, 2+ TB storage for ETH Mainnet archive node
Create a user with sudo privileges, ssh access, domain name, ensure basic server security
Openethereum setup
Openethereum Pre-Install
Prepare storage
Make sure your user has access to the storage mount/path AE: /mnt/openeth/storage/path
Get binary
Install basic deps: build-essential cmake libudev-dev
Download the latest precompiled version from here
\$ sudo apt-get update && sudo apt-get upgrade -y
\$ sudo apt-get install libudev-dev zip unzip build-essential cmake -y
\$ wget https://github.com/openethereum/openethereum/releases/download/version/openethereum-linux-version.zip
\$ unzip -o openethereum-linux-version.zip -d openethereum
\$ cd openethereum
\$ chmod +x ./openethereum
Configuration
Create an empty log file
\$ touch /mnt/openeth/storage/path/config/example.log
- Write configuration file, AE:
\$ nano /mnt/openeth/storage/path/config.toml
[parity]
mode = "active"
release_track = "stable"
base_path = "/opt/.local/share/io.parity.ethereum"
[network]
warp = false
[misc]
log_file = "/mnt/openeth/storage/path/config/example.log"
Prepare the systemd service file
\$ sudo nano /etc/systemd/system/openethereum.service
[Unit]
Description=OpenEthereum
After=network.target
[Service]
User=youruser
Group=yourusergroup
ExecStart=/usr/bin/openethereum -c /mnt/openeth/storage/path/config.toml --jsonrpc-interface all --jsonrpc-apis web3,eth,net,parity,pubsub,traces --ws-interface all --fat-db=on --pruning=archive --ws-apis all --ws-origins all --ws-hosts all
Restart=on-failure
KillSignal=SIGHUP
[Install]
WantedBy=default.target
Allow the ports used by the openethereum client (ports 30303/tcp, 8545/tcp, 8546/tcp) through your firewall.
Test the systemd service
\$ sudo systemctl daemon-reload
\$ sudo systemctl start openetherum
Enable openethereum as service
\$ sudo systemctl enable openethereum.service
PostgreSQL setup
PostgreSQL Pre-Install
Prepare and mount storage for BlockScout DB
Install PostgreSQL
PostgreSQL downloads page suggests usage of different repositories based on the OS. For example, in Ubuntu:
\$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
\$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
\$ sudo apt-get update
\$ sudo apt-get install postgresql-10
PostgreSQL configuration
Create a new user in the OS and set a password using adduser
\# adduser dbusername
Create a database, user and set userpassword
\# su - postgres
\$ createuser --interactive dbusername
\$ createdb blockscout
\$ psql
\=\# ALTER USER dbusername WITH PASSWORD 'dbuserpassword';
\=\# GRANT ALL PRIVILEGES ON blockscout TO dbusername;
\=\# \q
Set your storage path as psql datadir
\$ nano /etc/postgresql/10/main/postgresql.conf
...
data_directory = '/mnt/psql/storage/path' # use data in another directory
...
Make sure the PSQL user has the right permissions on storage dir.
Start psql
\$ sudo systemctl start postgresql
Validate data directory path
\# su - postgres
\$ psql
\=\# SHOW data_directory;
data_directory
---------------------
/mnt/psql/storage/path
(1 row)
\=\# \q
Make sure your user has blockscout db access
\# su - dbusername
\$ psql -d blockscout
Optionally, you might open the PostgreSQL port on your firewall: 5432/tcp to access it from a remote computer, but we don’t recommend it.
Enable postgresql as service
\$ sudo systemctl enable postgresql
BlockScout dependencies setup
Get base dependencies from apt: (yum/dnf on CentOS)
\$ sudo apt-get update
\$ sudo apt-get install git \
automake \
libtool inotify-tools \
libgmp-dev \
libgmp10 \
build-essential \
cmake -y
Erlang
Get official release here
Example on Ubuntu:
\$ wget https://packages.erlang-solutions.com/erlang/debian/pool/esl-erlang_version~ubuntu~bionic_amd64.deb
\$ sudo apt install ./esl-erlang_version~ubuntu~bionic_amd64.deb
Check version and installation:
\$ erl --version
Elixir
Download pre-compiled release from github
\$ wget https://github.com/elixir-lang/elixir/releases/download/tag/Precompiled.zip
\$ unzip -o Precompiled.zip -d elixir
Add elixir bin to path (for permanent effect, append it to your user bash profile)
\$ export PATH="$PATH:/path/to/elixir/bin"
\$ nano ~/.profile
...
export PATH="$PATH:/path/to/elixir/bin"
Check version and installation:
\$ elixir --version
Node.js
You can get Node.js here or in your distro repos:
\$ curl -sL https://deb.nodesource.com/setup_version | sudo -E bash -
\$ sudo apt-get update
\$ sudo apt-get install -y nodejs
Check Node version:
\$ nodejs --version
BlockScout installation
Get latest master from git:
\$ git clone https://github.com/poanetwork/blockscout
\$ cd blockscout
Generate DB secret and export it to bash:
\$ mix phx.gen.secret # in blockscout base dir
\$ export SECRET_KEY_BASE=<generatedAboveSecret/PasteHere>
Set required env variables, example below is suited for Ethereum Mainnet and Parity(Openethereum)
\$ export ETHEREUM_JSONRPC_HTTP_URL=http://localhost:8545
\$ export COIN=ETH
\$ export SUBNETWORK=Mainnet
\$ export NETWORK=Ethereum
\$ export DATABASE_URL=postgresql://dbusername:dbpassword@localhost:5432/blockscout
Install mix deps, create db, run migrations:
\$ mix do deps.get, local.rebar --force, deps.compile, compile # in blockscout base dir
\$ mix do ecto.create, ecto.migrate
Install Node.js deps, build static assets:
\$ cd apps/block_scout_web/assets; npm install && node_modules/webpack/bin/webpack.js --mode production; cd -
\$ cd apps/explorer && npm install; cd -
\$ mix phx.digest
Enable SSL:
\$ cd apps/block_scout_web; mix phx.gen.cert blockscout blockscout.local; cd -
The above command will generate and enable self-signed ssl certs, you need to replace them with real ones.
You may use certbot (letsencrypt) to do it, don’t forget to set user permissions and configure the file: /path/to/blockscout/config/dev.exs, see example below:
\$ nano /path/to/blockscout/config/dev.exs
...
config :block_scout_web, BlockScoutWeb.Endpoint,
http: [port: 4000],
https: [
port: 4001,
cipher_suite: :strong,
certfile: "priv/cert/cert.pem",
keyfile: "priv/cert/privkey.pem"
]
...
If using certbot, add cert renewal to crontab
Set BlockScout as systemd service
Prepare BlockScout start script. You need to export all required env vars before each run:
\$ nano /path/to/blockscout/start.sh
#!/bin/bash
export PATH="$PATH:/home/scout/elixir/bin"
export ETHEREUM_JSONRPC_HTTP_URL=http://localhost:8545
export COIN=ETH
export SUBNETWORK=Mainnet
export NETWORK=Ethereum
export DATABASE_URL=postgresql://dbusername:dbpassword@localhost:5432/blockscout
/path/to/elixir/bin/mix phx.server
\$ chmod +x /path/to/blockscout/start.sh
Set your start script as service:
\$ sudo nano /etc/systemd/system/blockscout.service
[Unit]
Description=Blockscout
After=network.target
[Service]
User=youruser
Group=yourusergroup
WorkingDirectory=/full/path/to/blockscout
ExecStart=/bin/bash /path/to/blockscout/start.sh
KillSignal=SIGHUP
[Install]
WantedBy=default.target
Open explorer ports on firewall default 4000/tcp 4001/tcp
Test run:
\$ sudo systemctl start blockscout
Enable blockscout as a service:
\$ sudo systemctl enable blockscout.service