{"id":2218,"date":"2019-08-20T12:23:37","date_gmt":"2019-08-20T09:23:37","guid":{"rendered":"https:\/\/upcloud.com\/global\/us\/resources\/tutorials\/hyperledger-fabric-systemd\/"},"modified":"2019-08-20T12:23:37","modified_gmt":"2019-08-20T09:23:37","slug":"hyperledger-fabric-systemd","status":"publish","type":"tutorial","link":"https:\/\/upcloud.com\/global\/resources\/tutorials\/hyperledger-fabric-systemd\/","title":{"rendered":"How to set up Hyperledger Fabric with Systemd"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Hyperledger Fabric is an enterprise-grade permissioned distributed ledger framework for developing solutions and applications. Its modular and versatile design satisfies a broad range of industry use cases. It offers a unique approach to a consensus that enables performance at scale while preserving privacy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This step-by-step guide goes through what is needed to set up Hyperledger Fabric on UpCloud with systemd. Note that, this setup does not use Docker. This is also a good learner guide on understanding how Hyperledger Fabric works from an administrator&#8217;s perspective.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two hosts, the admin node and at least one peer node, are involved in this setup.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/signup.upcloud.com\/\">Test hosting on UpCloud!<\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Prepare the environment &#8211; Admin node<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Begin by deploying the required nodes.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Choose your configuration, the Simple plan with 1CPU and 1GB of RAM is enough to get started.<\/li>\n\n\n\n<li>Select the Ubuntu 18.04 OS template<\/li>\n\n\n\n<li>Name the server and deploy<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Once deployed, log in using SSH and the root password you received by the delivery method you chose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a local system user with sudo privileges.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">adduser fabric<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">usermod -aG sudo fabric\nsu - fabric<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure the hosts are able to reach each other by name. This can be done by adding the following to the hosts file at <tt>\/etc\/hosts<\/tt> on both admin and peer nodes. Replace the orderer example IP address with your admin and peer0 with the peer node addresses.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/hosts<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><span style=\"color: #ff0000;\">94.237.46.225<\/span> peer0.org1.car.com peer0\n<span style=\"color: #ff0000;\">94.237.46.18<\/span> orderer.car.com orderer<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Install Go language 1.13 on Ubuntu and verify the version. This is needed to compile the fabric-ca-server which isn\u2019t available to download as binary at the time of writing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/golang.org\/\" target=\"_blank\" rel=\"noopener\">Go language<\/a>&nbsp;and&nbsp;<a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener\">Git<\/a>&nbsp;packages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start by downloading Go with the next command.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -O https:\/\/storage.googleapis.com\/golang\/go1.13.4.linux-amd64.tar.gz<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Extract the package to the&nbsp;<tt>\/urs\/local<\/tt>&nbsp;directory.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo tar -C \/usr\/local -xzf go1.13.4.linux-amd64.tar.gz<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next, create a folder for the Go language files, for example, in your home directory with the following command.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir -p ~\/go\/bin<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To use the&nbsp;Go command-line utility, you need to set up a few environmental variables. Add the following to your profile, or adjust the paths depending on where you created the Go directory.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo 'export GOPATH=$HOME\/go' | tee -a ~\/.bashrc\necho 'export GOBIN=$GOPATH\/bin' | tee -a ~\/.bashrc\necho 'export PATH=$PATH:\/usr\/local\/go\/bin:$GOBIN' | tee -a ~\/.bashrc<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">source ~\/.bashrc<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">go version\ngo version go1.13.4 linux\/amd64<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You will also need a compiler so install <tt>gcc<\/tt> with the following command.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt update &amp;&amp; sudo apt install gcc -y<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With these done, you can begin configuring Fabric itself.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Admin node (fabric-ca, orderer, misc)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The admin node hosts Fabric Certificate Authority, Fabric Orderer and is used for other miscellaneous tasks e.g. generating certificates, crypto configs, etc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next, create a new directory to host the relevant configuration files, e.g. fabric.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir ~\/fabric &amp;&amp; cd ~\/fabric<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then download the binaries of a specific Hyperledger Fabric version ( 1.4.3 LTS) to <tt>~\/fabric\/bin<\/tt> directory using the bootstrap script at <a href=\"http:\/\/bit.ly\/2ysbOFE\" target=\"_blank\" rel=\"noopener\">http:\/\/bit.ly\/2ysbOFE<\/a><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -sSL http:\/\/bit.ly\/2ysbOFE | bash -s -- 1.4.3 1.4.3 0.4.15<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Build the fabric-ca server under <tt>~\/fabric\/go<\/tt> (latest version). Again, this is due to the fact that fabric-ca server isn\u2019t available to download in binary at the time of writing.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">go get -u github.com\/hyperledger\/fabric-ca\/cmd\/...<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add it to the <tt>\/usr\/local\/bin<\/tt> directory.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo cp ~\/fabric\/fabric-samples\/bin\/* \/usr\/local\/bin\/\nsudo cp $GOBIN\/fabric-ca-server \/usr\/local\/bin<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Make the necessary destination directories for orderer, peerOrg1, users, fabric, and configtx.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo mkdir -p \/etc\/hyperledger\/msp\/{orderer,peerOrg1,users}\nsudo mkdir -p \/etc\/hyperledger\/configtx\nsudo mkdir -p \/etc\/hyperledger\/fabric\nsudo mkdir -p \/etc\/hyperledger\/config<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Download the orderer-config archive and extract it under <tt>\/etc\/hyperledger\/fabric\/<\/tt>. This contains MSP for orderer to start.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -sSLO https:\/\/raw.githubusercontent.com\/cloudronics\/startFiles\/master\/orderer-config.tar.gz\nsudo tar -zxvf orderer-config.tar.gz -C \/etc\/hyperledger\/fabric\/<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Generate configs, genesis block etc.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Download the crypto-config and configtx yaml.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -sSLO https:\/\/raw.githubusercontent.com\/cloudronics\/startFiles\/master\/crypto-config.yaml\ncurl -sSLO https:\/\/raw.githubusercontent.com\/cloudronics\/startFiles\/master\/configtx.yaml<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Make a new config directory<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir ~\/fabric\/config<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generate the crypto material.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cryptogen generate --config=.\/crypto-config.yaml<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Generate genesis block for the orderer.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo configtxgen -profile OneOrgOrdererGenesis -outputBlock .\/config\/genesis.block<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Generate channel configuration transaction.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo configtxgen -profile OneOrgChannel -outputCreateChannelTx .\/config\/carsales.tx -channelID carsales<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Generate anchor peer transaction.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo configtxgen -asOrg Org1MSP -channelID carsales -profile OneOrgChannel -outputAnchorPeersUpdate .\/config\/Org1MSPanchors.tx<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then copy the generated configuration files to the Hyperledger directory.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo cp config\/* \/etc\/hyperledger\/configtx\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lastly, copy the generated crypto-configs to their respective MSP directories.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo cp -r crypto-config\/ordererOrganizations\/car.com\/orderers\/orderer.car.com\/* \/etc\/hyperledger\/msp\/orderer\/\nsudo cp -r crypto-config\/peerOrganizations\/org1.car.com\/peers\/peer0.org1.car.com\/* \/etc\/hyperledger\/msp\/peerOrg1\/\nsudo cp -r crypto-config\/peerOrganizations\/org1.car.com\/users\/* \/etc\/hyperledger\/msp\/users<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Fabric-CA service &#8211; Admin node<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Next, create a fabric-ca service by making the following service file.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cat &gt; fabric-ca.service &lt;&lt; EOF\n# Service definition for Hyperledger fabric-ca server\n[Unit]\nDescription=hyperledger fabric-ca server - Certificate Authority for hyperledger fabric\nDocumentation=https:\/\/hyperledger-fabric-ca.readthedocs.io\/\nWants=network-online.target\nAfter=network-online.target\n[Service]\nType=simple\nRestart=on-failure\nEnvironment=FABRIC_CA_HOME=\/etc\/hyperledger\/fabric-ca-server\nEnvironment=FABRIC_CA_SERVER_HOME=\/etc\/hyperledger\/fabric-ca-server\nEnvironment=CA_CFG_PATH=\/etc\/hyperledger\/fabric-ca\nExecStart=\/usr\/local\/bin\/fabric-ca-server start -b admin:adminpw\n[Install]\nWantedBy=multi-user.target\nEOF<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then move the service file, enable, start and verify the fabric-ca service is running.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo mv fabric-ca.service \/etc\/systemd\/system\/\nsudo systemctl enable fabric-ca.service\nsudo systemctl start fabric-ca.service\nsystemctl status fabric-ca.service<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output of successfully running fabric services would look something like the example below.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">* fabric-ca.service - hyperledger fabric-ca server - Certificate Authority for hyperledger fabric\n   Loaded: loaded (\/etc\/systemd\/system\/fabric-ca.service; enabled; vendor preset: enabled)\n   Active: active (running) since Wed 2019-07-03 09:49:06 UTC; 5s ago\n     Docs: https:\/\/hyperledger-fabric-ca.readthedocs.io\/\n Main PID: 22133 (fabric-ca-serve)\n    Tasks: 4 (limit: 1109)\n   CGroup: \/system.slice\/fabric-ca.service\n           `-22133 \/usr\/local\/bin\/fabric-ca-server start -b admin:adminpw<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Orderer service &#8211; Admin node<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Repeat the same from the previous step with orderer but using this service file.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cat &gt; fabric-orderer.service &lt;&lt; EOF\n# Service definition for Hyperledger fabric orderer server\n[Unit]\nDescription=hyperledger fabric-orderer server - Orderer for hyperledger fabric\nDocumentation=https:\/\/hyperledger-fabric.readthedocs.io\/\nWants=network-online.target\nAfter=network-online.target\n[Service]\nType=simple\nRestart=on-failure\nEnvironment=CA_CFG_PATH=\/etc\/hyperledger\/fabric-ca\nEnvironment=ORDERER_GENERAL_LISTENADDRESS=0.0.0.0\nEnvironment=ORDERER_GENERAL_GENESISMETHOD=file\nEnvironment=ORDERER_GENERAL_GENESISFILE=\/etc\/hyperledger\/configtx\/genesis.block\nEnvironment=ORDERER_GENERAL_LOCALMSPID=OrdererMSP\nEnvironment=ORDERER_GENERAL_LOCALMSPDIR=\/etc\/hyperledger\/msp\/orderer\/msp\nEnvironment=ORDERER_GENERAL_LISTENADDRESS=0.0.0.0\nExecStart=\/usr\/local\/bin\/orderer start\n[Install]\nWantedBy=multi-user.target\nEOF<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then again move the service file, enable, start and verify that the service is running.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo mv fabric-orderer.service \/etc\/systemd\/system\/\nsudo systemctl enable fabric-orderer.service\nsudo systemctl start fabric-orderer.service\nsystemctl status fabric-orderer.service<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You are now done with the Admin node, continue below with the preparations for the peer node.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prepare the environment &#8211; Peer node<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Firstly, deploy a peer node if you haven\u2019t already.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Choose your configuration, the Simple plan with 1CPU and 1GB of RAM is enough to get started.<\/li>\n\n\n\n<li>Select the Ubuntu 18.04 OS template<\/li>\n\n\n\n<li>Name the server and deploy<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Once deployed, log in using SSH and the root password you received by the delivery method you chose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Begin the configuration by&nbsp;creating a new user for the peer node just like on the admin node.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">adduser fabric<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">usermod -aG sudo fabric\nsu - fabric<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the peer and orderer host information to the peer node\u2019s hosts file. Replace the example IPs with your admin and peer node addresses.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/hosts<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\"><span style=\"color: #ff0000;\">94.237.46.225<\/span> peer0.org1.car.com peer0\n<span style=\"color: #ff0000;\">94.237.46.18<\/span> orderer.car.com orderer<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create a new directory e.g. fabric.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir fabric &amp;&amp; cd fabric<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Set admin host IP address for ease of use. This IP is an imaginary example, replace it with yours.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo 'export ADMIN_HOST=<span style=\"color: #ff0000;\">94.237.46.18<\/span>' | tee -a ~\/.bashrc\necho 'export USER=fabric' | tee -a ~\/.bashrc\nsource ~\/.bashrc<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Make the necessary destination directories on the peer host.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo mkdir -p \/etc\/hyperledger\/\nsudo chown -R $USER \/etc\/hyperledger\/\nsudo mkdir -p \/etc\/hyperledger\/msp\/{peerOrg1,users}\/\nsudo mkdir -p \/etc\/hyperledger\/fabric\/\nsudo mkdir -p \/etc\/hyperledger\/configtx\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then copy the config and crypto-config from the admin node to the peer.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo rsync -r $USER@$ADMIN_HOST:\/home\/fabric\/fabric\/crypto-config\/peerOrganizations\/org1.car.com\/peers\/peer0.org1.car.com\/* \/etc\/hyperledger\/msp\/peerOrg1\/\nsudo rsync -r $USER@$ADMIN_HOST:\/home\/fabric\/fabric\/crypto-config\/peerOrganizations\/org1.car.com\/users\/ \/etc\/hyperledger\/msp\/users\nsudo rsync -r $USER@$ADMIN_HOST:\/etc\/hyperledger\/fabric\/msp \/etc\/hyperledger\/fabric\/msp\nsudo scp $USER@$ADMIN_HOST:\/home\/fabric\/fabric\/fabric-samples\/config\/* \/etc\/hyperledger\/configtx\/\nsudo scp $USER@$ADMIN_HOST:\/home\/fabric\/fabric\/fabric-samples\/bin\/peer \/usr\/local\/bin\nsudo scp $USER@$ADMIN_HOST:\/etc\/hyperledger\/fabric\/core.yaml \/etc\/hyperledger\/fabric\/\nsudo scp $USER@$ADMIN_HOST:\/etc\/hyperledger\/configtx\/carsales.tx \/etc\/hyperledger\/configtx\/carsales.tx<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Download the orderer-config archive and extract it under \/etc\/hyperledger\/fabric\/. This contains MSP for orderer to start.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">curl -sSLO https:\/\/raw.githubusercontent.com\/cloudronics\/startFiles\/master\/orderer-config.tar.gz\nsudo tar -zxvf orderer-config.tar.gz -C \/etc\/hyperledger\/fabric\/<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Install Peer0 service &#8211; Peer node<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Next, create the following service file on the peer node.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cat &gt; fabric-peer0-org1.service &lt;&lt; EOF\n# Service definition for Hyperledger fabric peer server\n[Unit]\nDescription=hyperledger fabric-peer0-org1 server - Peer0\/Org1 for hyperledger fabric\nDocumentation=https:\/\/hyperledger-fabric.readthedocs.io\/\nWants=network-online.target\nAfter=network-online.target\n[Service]\nType=simple\nRestart=on-failure\nEnvironment=FABRIC_CFG_PATH=\/etc\/hyperledger\/fabric\nEnvironment=CORE_PEER_ID=peer0.org1.car.com\nEnvironment=CORE_LOGGING_PEER=info\nEnvironment=CORE_CHAINCODE_LOGGING_LEVEL=info\nEnvironment=CORE_PEER_LOCALMSPID=Org1MSP\nEnvironment=CORE_PEER_MSPCONFIGPATH=\/etc\/hyperledger\/msp\/peerOrg1\/msp\nEnvironment=CORE_PEER_ADDRESS=peer0.org1.car.com:7051\nExecStart=\/usr\/local\/bin\/peer node start\n[Install]\nWantedBy=multi-user.target\nEOF<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then do the following to get the service running.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo mv fabric-peer0-org1.service \/etc\/systemd\/system\/\nsudo systemctl enable fabric-peer0-org1.service\nsudo systemctl start fabric-peer0-org1.service\nsystemctl status fabric-peer0-org1.service<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Create a carssales channel and join peer0 there &#8211; Peer node<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, create and join the channel for communicating using the peer channel commands.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The following must be done as root, switch to the root user with the following.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo su<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Export the necessary variables.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">echo 'export CORE_PEER_MSPCONFIGPATH=\/etc\/hyperledger\/msp\/users\/Admin@org1.car.com\/msp' | tee -a ~\/.bashrc\necho 'export CORE_PEER_LOCALMSPID=Org1MSP' | tee -a ~\/.bashrc\nsource ~\/.bashrc<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next, create the channel with a peer channel.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">peer channel create -o orderer.car.com:7050 -c carsales -f \/etc\/hyperledger\/configtx\/carsales.tx<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then, join the peer0 to that channel with peer channel join command.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">peer channel join -b carsales.block<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lastly, verify that the peer joined the channel successfully.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">peer channel list<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With that, you are all done!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Outcome<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now we have a ready-to-use Hyperledger Fabric network running on systemd without Docker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">References and further reading<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hyperledger fabric read the docs \u2013 https:\/\/hyperledger-fabric.readthedocs.io\/en\/release-1.4\/index.html<\/li>\n\n\n\n<li>Hyperledger fabric certificate authority read the docs \u2013 https:\/\/hyperledger-fabric-ca.readthedocs.io\/en\/release-<br>1.4\/index.html<\/li>\n\n\n\n<li>File references: https:\/\/github.com\/cloudronics\/startFiles<\/li>\n\n\n\n<li>Fabric on single and multinode series: https:\/\/medium.com\/coinmonks\/hyperledger-fabric-cluster-on-multiplehosts-<br>af093f00436<\/li>\n<\/ul>\n","protected":false},"author":26,"featured_media":11811,"comment_status":"open","ping_status":"closed","template":"","community-category":[223],"class_list":["post-2218","tutorial","type-tutorial","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/tutorial\/2218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/tutorial"}],"about":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/types\/tutorial"}],"author":[{"embeddable":true,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/comments?post=2218"}],"version-history":[{"count":0,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/tutorial\/2218\/revisions"}],"wp:attachment":[{"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/media?parent=2218"}],"wp:term":[{"taxonomy":"community-category","embeddable":true,"href":"https:\/\/upcloud.com\/global\/wp-json\/wp\/v2\/community-category?post=2218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}