Please feel free to edit this question for any fix or enhancement.
Your contribution is valuable especially that EOS and its resources
are frequently updated and this answer will need to be updated
The front-end can be configured as a set of non-producing nodes to serve as a cluster. Those nodes should be the ones exposed to handle user requests. They also could be set behind a load-balancer that redirects the p2p requests to a specific node(s), while redirecting the http(s) end-user requests to a different node(s). An HTTP DDOS protection could be applied on the http(s) port. While a low-level, and possibly a customized, DDOS protection could be applied on the p2p port.
However, the back-end could be another nodes cluster that is connected to the non-producing nodes and configured to do block-producing. Whereas, those back-end nodes should not be exposed.
Additionally, database files are better to be isolated on some file server.
Taking all those into consideration, the following diagram is provided as a suggestion:
Note that the diagram is just a suggestion and you may came with a different one. However, in both ways, it should give you an insight.
To achieve the suggested topology for the front-end nodes, follow the steps on this Wiki page https://github.com/EOSIO/eos/wiki/Testnet-Single-Host-Multinode that contains detailed instructions regarding bringing up a multi-node network. But to have non-producing nodes, don’t add them to the
setprods JSON data, or create producer accounts for them.
However, the Peer-to-Peer relay node also needs a
peer-private-key to authenticate itself with the producing node, but should retain
allowed-connection = any.
Note: The p2p relay node will sign handshakes sent to nodes outside of the cluster as well, but if those nodes don't have its
peer-key, they will simply ignore the signature.
Actaully, there can be as many http-servicing nodes as you wish (or need dictates), and the protocol supposes to work as expected when they’re set up behind a typical http load-balancer. (reference)
The mentioned production cluster may be tightly coupled with authenticated connections using the
peer-key =, and
peer-private-key = options provided for the purpose and could be used as follow on both the block producing (and http-servicing) nodes (reference):
allowed-connection = specified to each of them.
- Add a
peer-private-key to each of them.
- And provide each of them with the public
peer-key of the other.
To have the data on a separate storage location(s), you may consider the following:
nodeos Runtime Data
nodeos stores runtime data (e.g., shared memory and log content) in a custom data folder. The location of this folder is determined by your system.
- Mac OS: ~/Library/Application Support/eosio/nodeos/data
- Linux: ~/.local/share/eosio/nodeos/data
A data folder can be specified using the --data-dir command line argument to nodeos. (EOS Wiki)
Location of the Produced Blocks
The location of the blocks directory (absolute path or relative to application data dir) is set in the
config.ini as follow:
blocks-dir = "blocks"
MongoDB database directory bath can be set to the desired location as mentioned at: https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/#specify-a-data-directory
mongod —dbpath /srv/mongodb/
However, bear in mind that the mongo DB plugin may not survive long term.
Consider that this article was written at the early time of Dawn 4.0, where there were very few resources on EOS, and the official documentations was changing very frequently. So, I advice to double check the official wiki to be sure that you are up to date.
The same content of this question/answer is published at: