<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: fboucquez</title>
    <description>The latest articles on DEV Community by fboucquez (@fboucquez).</description>
    <link>https://dev.to/fboucquez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F630279%2F914acc18-05b2-43d6-b090-8c3a55586367.png</url>
      <title>DEV Community: fboucquez</title>
      <link>https://dev.to/fboucquez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fboucquez"/>
    <language>en</language>
    <item>
      <title>How to create a Symbol Testnet network</title>
      <dc:creator>fboucquez</dc:creator>
      <pubDate>Fri, 04 Feb 2022 17:07:34 +0000</pubDate>
      <link>https://dev.to/fboucquez/how-to-create-a-symbol-testnet-network-4hdd</link>
      <guid>https://dev.to/fboucquez/how-to-create-a-symbol-testnet-network-4hdd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;There are several articles about how to create Symbol nodes connecting to Symbol Testnet or Mainnet networks. But, what if you want to create your own fully decentralized Symbol network for fun/testing?&lt;/p&gt;

&lt;p&gt;If you want to test a Symbol network locally you can just use &lt;a href="https://github.com/fboucquez/symbol-network"&gt;&lt;code&gt;symbol-bootstrap&lt;/code&gt;&lt;/a&gt;. Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap start -p bootstrap -a multinode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a Symbol network bundled in a unique docker-compose. The compose runs 2 peers nodes, 1 API node, and a rest gateway.&lt;/p&gt;

&lt;p&gt;This private network is great when testing new features, like a new transaction or new rest endpoint before the feature is deployed into a shared Testnet. Private local networks are also great for E2E testing, when you want to start a network in a given or "empty" state, run some operations, assert the new states and reset the network. &lt;/p&gt;

&lt;p&gt;A local private network is not production-ready. Running multiple Symbol nodes in one machine is not recommended, it's not decentralized, other people cannot connect to the network easily. &lt;/p&gt;

&lt;p&gt;In this guide, I'm going to explain how you can create your Symbol network, how you can create multiple 'seed' nodes, and how you can share the network configuration so other people can connect to it. The name of this Testnet is &lt;strong&gt;FerNet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This guide uses a a new cli tool called &lt;a href="https://github.com/fboucquez/symbol-network"&gt;&lt;code&gt;symbol-network&lt;/code&gt;&lt;/a&gt;. The &lt;code&gt;symbol-network&lt;/code&gt; cli scales &lt;code&gt;symbol-bootstrap&lt;/code&gt; to create and manage multiple nodes, for new or existing networks. &lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Before starting, let's install the required tooling. The tolling required is the same as the standard &lt;code&gt;symbol-bootstrap&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This guide assumes an Ubuntu distribution, other OSs would be similar.&lt;/p&gt;

&lt;p&gt;1) Node, Docker, and Compose&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
apt-get update
apt-cache policy docker-ce
apt-get install -y unzip gcc g++ make nodejs unzip docker.io
docker --version

curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Install symbol-bootstrap&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g symbol-bootstrap
symbol-bootstrap version
symbol-bootstrap verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Install symbol-network&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g symbol-network
symbol-network version
symbol-network verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Network Layout
&lt;/h2&gt;

&lt;p&gt;Before running symbol-network, it's good to think about the network layout we want initially for our network. My &lt;strong&gt;fernet&lt;/strong&gt; network would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Based on Symbol Tesnet&lt;/li&gt;
&lt;li&gt;Single currency, named, &lt;code&gt;fernet.branca&lt;/code&gt;, same initial supply.&lt;/li&gt;
&lt;li&gt;Network domain &lt;code&gt;fernet.wtf&lt;/code&gt;. No hostname prefix.&lt;/li&gt;
&lt;li&gt;Network Type &lt;code&gt;Testnet&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;HTTP and HTTPS nodes&lt;/li&gt;
&lt;li&gt;2 Voting Peers - 3M balance&lt;/li&gt;
&lt;li&gt;1 Voting Dual - 3M balance&lt;/li&gt;
&lt;li&gt;2 Harvesting Dual Nodes - 1M balance&lt;/li&gt;
&lt;li&gt;Explorer and Faucet (services)&lt;/li&gt;
&lt;li&gt;Some additional genesis block accounts for testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Network Configuration
&lt;/h2&gt;

&lt;p&gt;Now that we know how the network should look, let's run the tool! &lt;/p&gt;

&lt;h3&gt;
  
  
  Init:
&lt;/h3&gt;

&lt;p&gt;The first step is the init wizard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir symbol-fernet
symbol-network init --ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first questions are about the basic network configuration. These questions are the most common, advance tuning can be manually done later by changing the yml files this command creates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dSpdBDcm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jcogydf8y6rzm8t82m8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dSpdBDcm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jcogydf8y6rzm8t82m8j.png" alt="symbol-network init network config" width="880" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command asks for a 'master' password. The master password is used to encrypt the generated network and node keys.&lt;/p&gt;

&lt;p&gt;The command skips this section if you are creating nodes for an existing network. For example, you want to create and maintain dozens of Testnet/Mainnet nodes.&lt;/p&gt;

&lt;p&gt;The second part asks how many nodes you want to create for a new or existing network. We are going to fill in the numbers defined above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BOh1c9cg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/809mfkgnvo34ocx521c1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BOh1c9cg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/809mfkgnvo34ocx521c1.png" alt="symbol-network init node layout" width="880" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the &lt;code&gt;init&lt;/code&gt; command finishes, you can see that 3 files have been created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;network-input.yml&lt;/strong&gt;: the not-expanded network layout. It defines how many of each node we want. If you pre-create this file, &lt;code&gt;symbol-network init&lt;/code&gt; won't ask you any questions and just run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;key-store.yml&lt;/strong&gt;: The file that contains the network keys, nodes keys, and voting files the tool generates. The private values are encrypted using the provided &lt;code&gt;master&lt;/code&gt; password. You can decrypt the file using &lt;code&gt;symbol-bootstrap decrypt --source key-store.yml --destination key-store-plain.yml&lt;/code&gt; command. Remember to remove &lt;code&gt;key-store-plain.yml&lt;/code&gt; after use!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;custom-network-preset.yml&lt;/strong&gt;: The network preset your nodes would use when running. These files are like the &lt;code&gt;-p mainnet&lt;/code&gt; and &lt;code&gt;-p bootstrap&lt;/code&gt; for your network. This is NOT the custom preset of a given node. You can &lt;a href="https://docs.symbolplatform.com/guides/network/configuring-network-properties.html"&gt;tweak it&lt;/a&gt;, for example, change the network supply or inflation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cli tool will recommend the different commands you can run next to continue the network creation process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expand nodes:
&lt;/h3&gt;

&lt;p&gt;The second automatic step 'expands' the nodes so each node can be customized independently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-network expandNodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates the following file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;network.yml&lt;/strong&gt;: It contains each node configuration, including their custom preset. It's possible to tune it by changing the default hostnames, friendly names or adding new custom preset properties like &lt;code&gt;logLevel: Debug&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Generate Nemesis:
&lt;/h3&gt;

&lt;p&gt;The third automatic step is to 'generate' the nemesis block for your new network. The nemesis block includes all the seed nodes accounts, link transactions, faucet, and 'founder' accounts. The founder account is the account that keeps the remaining supply after the node and faucet account distribution. All these accounts can be found encrypted in the &lt;strong&gt;key-store.yml&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-network generateNemesis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nemesis-seed&lt;/strong&gt;: A folder containing the nemesis block of your network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nemesis-target&lt;/strong&gt;: A folder containing a temporary node used to generate the nemesis block. You can validate the generated network configuration in &lt;code&gt;nemesis-target/nodes/node/server-config/resources&lt;/code&gt; and &lt;code&gt;nemesis-target/reports&lt;/code&gt; files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;nemesis-seed&lt;/code&gt; block along the  &lt;code&gt;custom-network-preset.yml&lt;/code&gt; could be shared so other people can connect to the network after launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try the Nemesis Node:
&lt;/h3&gt;

&lt;p&gt;Before creating the nodes to be published in your VPC infrastructure, you can try how everything looks by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap start -t nemesis-target --noPassword --detached --healthCheck --report --pullImages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to the local explorer at &lt;code&gt;http://localhost:90&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Explorer shows the nemesis block, the seed accounts, the nodes' link transaction, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g4wPrW5A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/SkgCcfA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g4wPrW5A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/SkgCcfA.png" alt="Explorer demo block 1" width="880" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HmwHfFPV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/JFHVyh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HmwHfFPV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/JFHVyh2.png" alt="Explorer demo accounts" width="880" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EWRKfHQ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/CvF0gTj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EWRKfHQ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/CvF0gTj.png" alt="Explorer demo transactions" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you are happy, just stop the node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap stop -t nemesis-target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node generation:
&lt;/h3&gt;

&lt;p&gt;Finally, to create the nodes' target folders and zip distributions ready to be deployed in your infrastructure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-network configureNodes --offline --zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will ask for a new password, the 'node' password. The node password is used to encrypt each node individually. It's the password symbol-bootstrap asks when running the different commands. Use a different password than the master password.&lt;/p&gt;

&lt;p&gt;This last command generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nodes&lt;/strong&gt;: the generated configuration for each node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;distribution&lt;/strong&gt;: the zip files of the nodes ready to be pushed to the VPC boxes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration backups:
&lt;/h3&gt;

&lt;p&gt;It's recommended you version the different created files. I use git to commit and backup the files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My .gitignore file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nemesis-target/databases/
nemesis-target/nodes/node/logs/
nemesis-target/nodes/node/data/
nemesis-target/gateways/rest-gateway/logs/
logs.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then commit all the other files for future reference. You may or may not want to backup in a remote github repository. Node and network private keys are encrypted in the &lt;code&gt;key-store.yml&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Deployment
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;symbol-network&lt;/code&gt; doesn't handle the deployment. It is outside the current scope of the tool. The possible infrastructures, cloud providers, and options are limitless.  &lt;/p&gt;

&lt;p&gt;This is up to the developer to script it. You can use bash and scp, you can use Terraform and S3 buckets or Ansible scripts, etc. &lt;/p&gt;

&lt;p&gt;The required process is fairly simple though:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install symbol-bootstrap and its dependencies on each node VPC.&lt;/li&gt;
&lt;li&gt;SCP or Pull the zip to each node VPC, unzip.&lt;/li&gt;
&lt;li&gt;Update firewalls opening ports 80, 7900, 3000, 3001, 443 depending on the node type.&lt;/li&gt;
&lt;li&gt;Update the DNS values linking nodes' hostnames with the VPC IPs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deployment process is similar to this &lt;a href="https://dev.to/fboucquez/the-23-symbol-node-3c41"&gt;guide&lt;/a&gt; although the zips for all the nodes are pre-created, you just need to deploy and &lt;code&gt;symbol-bootstrap run -d&lt;/code&gt; them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network launch:
&lt;/h3&gt;

&lt;p&gt;To run the network, connect to each box and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap run -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;YES! You have just launched a new full Symbol Network!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Node update:
&lt;/h3&gt;

&lt;p&gt;The general process to upgrade a node is installing a new version of the &lt;code&gt;symbol-bootstrap&lt;/code&gt;, and probably a &lt;code&gt;custom-network-preset.yml&lt;/code&gt; (global change) or a &lt;code&gt;custom-preset.yml&lt;/code&gt; (node change) upgrade. Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap stop
symbol-bootstrap start -c custom-preset.yml --upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Allow new nodes to connect:
&lt;/h3&gt;

&lt;p&gt;If you want another person to connect to your network, share with him the &lt;code&gt;custom-network-preset.yml&lt;/code&gt; and &lt;code&gt;nemesis-seed&lt;/code&gt; folder. Then this person can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap start -p custom-network-preset.yml -a dual  -c my-new-node-custom-preset.yml 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that official Symbol networks have the network preset and seed bundled on &lt;code&gt;symbol-bootstrap&lt;/code&gt;. That's why you can just run &lt;code&gt;-p testnet&lt;/code&gt; or &lt;code&gt;-p mainnet&lt;/code&gt;. The process for the custom testnet network is the same, just that the network preset and nemesis seed are externally provided.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contabo deployment
&lt;/h3&gt;

&lt;p&gt;I deployed FerNet to &lt;a href="https://contabo.com/"&gt;contabo's&lt;/a&gt; VPCs. The nodes were located in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dual-001.fernet.wtf:3001/chain/info"&gt;dual-001.fernet.wtf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dual-002.fernet.wtf:3001/chain/info"&gt;dual-002.fernet.wtf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dual-003.fernet.wtf:3001/chain/info"&gt;dual-003.fernet.wtf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;beacon-001.fernet.wtf&lt;/li&gt;
&lt;li&gt;beacon-002.fernet.wtf&lt;/li&gt;
&lt;li&gt;&lt;a href="https://faucet.fernet.wtf"&gt;Faucet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://explorer.fernet.wtf"&gt;Explorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;They have been shut down to save costs!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contabo &lt;a href="https://contabo.com/en/vps"&gt;costs&lt;/a&gt; around 12 USD per node. &lt;br&gt;
The cost is quite lower than &lt;a href="https://www.hetzner.com/cloud"&gt;Hetzner&lt;/a&gt; although Contabo's console is not nearly as nice. &lt;br&gt;
You may need to upgrade storage or processing power depending on how much the network is used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I've created Symbol Network from my experience creating the initial Mainnet and latest Testnets' nodes. It bundles the original private tooling in a user-friendly and open-source cli that uses and scales Symbol Bootstrap.&lt;br&gt;
This new cli tool allows you to create and maintain new Symbol networks quickly as well as nodes for existing networks without losing the configurability.&lt;/p&gt;

&lt;p&gt;Have a look! Feedback is always appreciated! &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>symbol</category>
      <category>nem</category>
      <category>catapult</category>
    </item>
    <item>
      <title>The 23 € Symbol Node</title>
      <dc:creator>fboucquez</dc:creator>
      <pubDate>Tue, 13 Jul 2021 18:38:58 +0000</pubDate>
      <link>https://dev.to/fboucquez/the-23-symbol-node-3c41</link>
      <guid>https://dev.to/fboucquez/the-23-symbol-node-3c41</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Setting up a &lt;a href="https://symbolplatform.com/"&gt;Symbol&lt;/a&gt; node is a great way to enter the NEM community. Your node will join 1000s of other nodes keeping the network healthy while you can earn some well-deserved &lt;a href="https://symbolplatform.com/xym"&gt;XYM&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;This guide will help to create your node in a cost-efficient and secure way. We will use &lt;a href="https://github.com/nemtech/symbol-bootstrap"&gt;symbol-bootstrap&lt;/a&gt; to set up the node and &lt;a href="https://www.hetzner.com"&gt;Hetzner&lt;/a&gt; cloud provider to run the virtual Ubuntu box. You can read more about nodes in the official &lt;a href="https://docs.symbolplatform.com/concepts/node.html"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;In order to follow along with this tutorial, it would be best to have knowledge of Symbol Blockchain, &lt;a href="https://docs.symbolplatform.com/wallets.html#wallets"&gt;Symbol Wallets&lt;/a&gt;, Linux, and Networking. You should try the guide on Symbol's TestNet and eventually create your MainNet node where real tokens are used! &lt;/p&gt;

&lt;p&gt;You will need a private symbol account or &lt;a href="https://docs.symbolplatform.com/wallets.html"&gt;Wallet&lt;/a&gt; with some XYM for the setup. We will call this account the funder account. In Testnet, you can get free XYM using the Testnet's &lt;a href="http://faucet.testnet.symboldev.network/"&gt;faucet&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating the box using Hetzner
&lt;/h1&gt;

&lt;p&gt;For this example, we are using Hetzner as it's user-friendly and fairly low-cost. You can use a similar approach with Digital Ocean or even AWS.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log/Register into the &lt;a href="https://console.hetzner.cloud"&gt;Hetzner console&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a new Project. &lt;/li&gt;
&lt;li&gt;Click on Add a server and select the Location
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i4x7QKy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zxlztds6td54ibzzpnnd.png" alt="image"&gt;
&lt;/li&gt;
&lt;li&gt;For this example, select Ubuntu 20.4.&lt;/li&gt;
&lt;li&gt;To reach the min CPU and Memory node requirements select the CPX41 type. This box currently costs ~22.90 euros per month.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Oqz12I2s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gjsa42c1u0gdn4x9sl5.png" alt="image"&gt;
&lt;/li&gt;
&lt;li&gt;The included 240GB volume is good enough for the current Symbol Testnet (2.6GB) and Mainnet (7.2GB). In the future, the volume would need to be expanded increasing the cost a little bit.&lt;/li&gt;
&lt;li&gt;Create a firewall opening ports 3000 and 7900. Open also port 7881 if you are creating a Supernode. Port 22 is recommended to be opened only if you are connecting to the box's terminal. If you are not, remove 22 from the list.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9UDehOdz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tcvoo5m3dwy3xxiqerpw.png" alt="image"&gt;
&lt;/li&gt;
&lt;li&gt;Add the SSH key of your computer. This will allow you to connect to the box terminal.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6q0b_Bmm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kfhqqppuuj0mhvlp44w.png" alt="image"&gt;
&lt;/li&gt;
&lt;li&gt;Add a name and create the box
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h7pD-WE3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jk5a76apnwiwsgqhwz5y.png" alt="image"&gt;
&lt;/li&gt;
&lt;li&gt;Once the server has booted, copy the public IP address.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aa8AEXM1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgu1t9tggn7i4nuuzp54.png" alt="image"&gt;
&lt;/li&gt;
&lt;li&gt;If you have a domain name, now it's a good time to create a new hostname by linking the box's IP address.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Installing the required software in the Ubuntu box
&lt;/h1&gt;

&lt;p&gt;Now we will install the required software to run a Symbol node using Bootstrap in the Cloud VM. The following setup is for a typical Ubuntu OS, other distributions may be slightly different. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Connect to the box's terminal using ssh:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@REPLACE_WITH_THE_BOX_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the following required software:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-cache policy docker-ce
apt-get install -y docker-ce unzip gcc g++ make nodejs unzip docker-compose
docker --version
docker-compose --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install symbol-bootstrap tool:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g symbol-bootstrap@1.0.6-alpha-202105122247
symbol-bootstrap version
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the bootstrap and docker user:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create the bootstrap user
adduser bootstrap
# Enter a password for the bootstrap user
usermod -aG sudo bootstrap
groupadd -f docker
usermod -aG docker bootstrap
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: Version &lt;a href="mailto:symbol-bootstrap@1.0.6-alpha-202105122247"&gt;symbol-bootstrap@1.0.6-alpha-202105122247&lt;/a&gt; is an alpha version with a new wizard feature we will be using.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuring the Symbol node
&lt;/h1&gt;

&lt;p&gt;Here we have the option to create the Symbol node directly on the Cloud VM box, but for security reasons, we are going to create it a in separate private computer, aka, your own computer. Then, the configured node will be copied over to the VM box. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the required software in your private computer, 

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/package-manager/"&gt;Node 12.0.0+&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/get-docker/"&gt;Docker 18.3.0+&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/compose/install/"&gt;Docker Compose 1.25.0+&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install bootstrap and verify the installation&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g symbol-bootstrap@1.0.8-alpha-202107131135
symbol-bootstrap version
symbol-bootstrap verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the bootstrap wizard and follow the instructions. This is where the magic happens.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap wizard
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the network, let's use Testnet for this guide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your node assembly (Dual).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter a strong password. This password will be used to encrypt and decrypt the node's private keys. Keep this password and the bootstrap files safe!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mP2BnOMq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0fwoj43pm9sez4xs3my.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mP2BnOMq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0fwoj43pm9sez4xs3my.png" alt="image"&gt;&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your &lt;a href="https://docs.symbolplatform.com/concepts/reward-programs.html"&gt;Symbol Reward Program&lt;/a&gt; if it applies to you. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate random &lt;a href="https://docs.symbolplatform.com/concepts/cryptography.html#symbol-keys"&gt;keys&lt;/a&gt;. In this example, we are going to generate new random keys for our node. If you already have keys, you can enter their private part.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the IP/Hostname of your node and a catchy friendly name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the default security mode (PROMPT_MAIN_TRANSPORT) and enable &lt;a href="https://docs.symbolplatform.com/concepts/reward-programs.html#voting-node-program"&gt;voting&lt;/a&gt; if it applies to you.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the wizard finishes, it will create the custom-preset.yml file with your node's customization. This file includes the private keys of your node. The private keys are encrypted using the password provided in the wizard. Keep this file and the password safe! &lt;/p&gt;

&lt;p&gt;The wizard displays the node's generated or entered accounts. The Main account is the account that "owns" the node. It defines the node's importance (or the chance to harvest a block) and links the different secondary accounts.  &lt;/p&gt;

&lt;p&gt;The custom preset will allow you to regenerate (most) of the node's configuration. The only exceptions are voting keys. If you regenerate your voting node, you will need to re-link the voting keys.&lt;/p&gt;

&lt;p&gt;The wizard will also show different useful commands you can use to continue the node setup.&lt;/p&gt;

&lt;p&gt;You now have the option to start the node or to create a zip of the node configuration that can be deployed to a different machine. In our case, we want the latter, create a zip to be deployed in the Hetzner VM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap pack -p testnet -a dual -c custom-preset.yml 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bootstrap's &lt;code&gt;pack&lt;/code&gt;, &lt;code&gt;start&lt;/code&gt;, and &lt;code&gt;config&lt;/code&gt; create the target folder. The target folder is the generated configuration based on the selected preset, assembly, and custom preset. Bootstrap maintains the files inside, they should not be manually changed. The way to tune them is via the custom preset file.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuring the node's accounts
&lt;/h1&gt;

&lt;p&gt;A Symbol node requires several accounts and keys. Bootstrap handles them under the hood but you need to link them. Liking keys is a blockchain transaction that requires XYM to pay the nodes' fees. &lt;/p&gt;

&lt;p&gt;First, you need to fund the node's main account. You can transfer a min amount of 10 XYM from your Symbol funder wallet providing the Main account's address. &lt;/p&gt;

&lt;p&gt;Once your main account has enough XYM, you can link the node's keys using the following wizard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap link --useKnownRestGateways -c custom-preset.yml --maxFee 100000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your node is fully configured to run, now let's copy it to the Cloud VM box.&lt;/p&gt;

&lt;h1&gt;
  
  
  Running the node
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Copy the zip file from your private computer into the Cloud VM and connect to it. Note that we are connecting and copying as the bootstrap Linux user, not as the root user.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp testnet-dual-node.zip  bootstrap@REPLACE_WITH_THE_BOX_IP:~/target.zip
ssh bootstrap@REPLACE_WITH_THE_BOX_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once in the box, unzip the target.zip file.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unzip target.zip -d symbol-node
cd symbol-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify once again symbol-bootstrap installation.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the node!&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;symbol-bootstrap run -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the node is running, you can check it by going to the next URLs from your browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="HTTP://REPLACE_WITH_THE_BOX_IP_HOSTNAME:3000/node/info"&gt;HTTP://REPLACE_WITH_THE_BOX_IP_HOSTNAME:3000/node/info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="HTTP://REPLACE_WITH_THE_BOX_IP_HOSTNAME:3000/chain/info"&gt;HTTP://REPLACE_WITH_THE_BOX_IP_HOSTNAME:3000/chain/info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These links display the node information and the (synching) chain state.&lt;/p&gt;

&lt;h1&gt;
  
  
  Upgrading your node
&lt;/h1&gt;

&lt;p&gt;In general, to upgrade your node you need to connect to the VM box (remember to reopen port 22 in the firewall):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh bootstrap@REPLACE_WITH_THE_BOX_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo npm install -g symbol-bootstrap
cd symbol-node
symbol-bootstrap stop
cp target backup-target -r
symbol-bootstrap start -c config-only-custom-preset.yml --upgrade -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before doing any update, it's recommended to backup the target folder (&lt;code&gt;cp target backup-target -r&lt;/code&gt;). Once the network grows, the node's target folder could be fairly large. Backing up will require doubling the used disk space. A larger volume would need to be considered. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--upgrade&lt;/code&gt; params recreates the node's configuration and docker-compose file upgrading any service. The target folder is upgraded, any manual changes done inside may be overwritten!&lt;/p&gt;

&lt;h1&gt;
  
  
  Node and account security
&lt;/h1&gt;

&lt;p&gt;Why did we use a separate private computer to generate the configuration? Why not just run Bootstrap's wizard directly on the VM Cloud box? Some of the reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private keys are randomly generated or provided in the private machine, not in the Cloud VM box.&lt;/li&gt;
&lt;li&gt;The main private key is never entered or stored in the VM box. The node certificates generation and the link transactions are performed from the private machine. &lt;/li&gt;
&lt;li&gt;The node admin may want to use a fully disconnected offline machine to generate the keys, configurations, and link transactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the Cloud VM box gets compromised, the hacker wouldn't be able to retrieve the main private key.&lt;/p&gt;

&lt;p&gt;Other security recommendations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the node is not a voting node or it's not in the Symbol reward program, you can keep the node's main account with low funds. Your "wealthy" private or founder account could delegate to your node. When the founder harvests a block, it will receive the harvesting reward and the main account will receive the beneficiary account reward.&lt;/li&gt;
&lt;li&gt;Wealthy accounts should be secured with a &lt;a href="https://docs.symbolplatform.com/concepts/multisig-account.html"&gt;multisig&lt;/a&gt; account or with a hardware device like &lt;a href="https://www.ledger.com"&gt;Ledger&lt;/a&gt;. Or both!&lt;/li&gt;
&lt;li&gt;To reach the supernodes or voting requirements, the main account would need to be fully funded (with over 1m tokens). In this case, it's strongly recommended to convert the main account to multisig, ideally, using a hardware wallet as a cosigner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can read more about how to enable &lt;a href="https://docs.symbolplatform.com/guides/harvesting/activating-delegated-harvesting-wallet.html"&gt;delegate harvesting&lt;/a&gt; and this awesome &lt;a href="https://ubc.digital/symbol-from-nem-the-ultimate-guide-to-start-harvesting-blocks/"&gt;ultimate guide to start harvesting blocks&lt;/a&gt; post.&lt;/p&gt;

&lt;h1&gt;
  
  
  Should I run my own node?
&lt;/h1&gt;

&lt;p&gt;In this guide, we explained how to run a node under 23 euros per month. But will the node pay for itself? Let's do some numbers.&lt;/p&gt;

&lt;p&gt;At the very minute of writing, XYM price is 0.12 USD or 0.10 EUR. In XYM coins, the server costs around 230 XYM per month.&lt;/p&gt;

&lt;p&gt;If any of the accounts delegating to your node harvests a block, your node's main account will receive 45 XYM. Meaning that your node needs to harvest around 5.1 blocks per month to pay for itself.&lt;/p&gt;

&lt;p&gt;According to this super useful &lt;a href="https://4xym.de/xym-calculator/"&gt;xym-calculator&lt;/a&gt;, to harvest those blocks your node needs to "collect" 133K XYM. Using Symbol's delegated harvesting, you don't need to have 133K XYM, instead, you need harvesters to delegate to your node this amount. Then, the node (probably) pays itself.&lt;/p&gt;

&lt;p&gt;These numbers literally change every hour so if your margins are tight, you need to revisit them often.&lt;/p&gt;

&lt;p&gt;The node will need to be supported. You need to spend some time keeping up with Symbol news and upgrades. If your node is down, neither the node nor the harvesters will harvest. You need to monitor the node to keep it running. Low to no downtime will keep your harvesters happy.&lt;/p&gt;

&lt;p&gt;If running a node is not for you, you can always delegate your private wallet to another community node. Find &lt;a href="http://explorer.symbolblockchain.io/nodes"&gt;one&lt;/a&gt; that brings you the best uptime and support!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I've created Symbol Bootstrap out of the necessity to create private networks quickly in order to end-to-end tests the Symbol's SDKs. From there, Bootstrap has evolved into a &lt;em&gt;user-friendly&lt;/em&gt; way to create public Symbol nodes. This guide and Bootstrap's wizard reflect the learnings I have acquired along the way from NEM colleagues and the community. &lt;/p&gt;

&lt;p&gt;Bootstrap lets you create all the types of nodes (Dual, API, Peer), include all the known components (Mongo, Server, Broker, Supernode Agent, Rest, Explorer, Wallet, Faucet, etc) for both public or private networks. It allows you to "save" your configuration with just a YML file and update your nodes with --upgrade. Bootstrap hides configuration and implementation details while retaining the tunability with custom presets.&lt;/p&gt;

&lt;p&gt;If you are interested in creating a Symbol node from scratch without using Bootstrap, try this great &lt;a href="https://docs.symbolplatform.com/guides/network/running-a-symbol-node-manually.html"&gt;Running a Symbol node manually&lt;/a&gt; guide. The &lt;a href="https://nemlog.nem.social/blog/58323"&gt;Deploying node for paranoids&lt;/a&gt; post explains how to create the server certificates in detail. &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>symbol</category>
      <category>catapult</category>
      <category>nem</category>
    </item>
  </channel>
</rss>
