Merge pull request 'development_manual_update_june' (#98) from development_manual_update_june into development

Reviewed-on: #98
This commit is contained in:
mik-tf 2024-06-13 23:02:16 +00:00
commit 30342d0360
142 changed files with 2710 additions and 797 deletions

View File

@ -1,6 +1,6 @@
- [Introduction](manual/intro.md) - [Introduction](manual/intro.md)
- [Documentation](manual/documentation.md) - [Documentation](manual/documentation.md)
- [Dashboard](dashboard/dashboard.md) - [ThreeFold Dashboard](dashboard/dashboard.md)
- [Wallet Connector](dashboard/wallet_connector.md) - [Wallet Connector](dashboard/wallet_connector.md)
- [TFGrid](dashboard/tfgrid/tfgrid.md) - [TFGrid](dashboard/tfgrid/tfgrid.md)
- [Grid Status](dashboard/tfgrid/grid_status.md) - [Grid Status](dashboard/tfgrid/grid_status.md)
@ -28,7 +28,6 @@
- [Mattermost](dashboard/solutions/mattermost.md) - [Mattermost](dashboard/solutions/mattermost.md)
- [Nextcloud](dashboard/solutions/nextcloud.md) - [Nextcloud](dashboard/solutions/nextcloud.md)
- [Node Pilot](dashboard/solutions/nodepilot.md) - [Node Pilot](dashboard/solutions/nodepilot.md)
- [ownCloud](dashboard/solutions/owncloud.md)
- [Peertube](dashboard/solutions/peertube.md) - [Peertube](dashboard/solutions/peertube.md)
- [Presearch](dashboard/solutions/presearch.md) - [Presearch](dashboard/solutions/presearch.md)
- [Static Website](dashboard/solutions/static_website.md) - [Static Website](dashboard/solutions/static_website.md)
@ -47,9 +46,15 @@
- [TFChain](dashboard/tfchain/tfchain.md) - [TFChain](dashboard/tfchain/tfchain.md)
- [Your Profile](dashboard/tfchain/your_profile.md) - [Your Profile](dashboard/tfchain/your_profile.md)
- [TF DAO](dashboard/tfchain/tf_dao.md) - [TF DAO](dashboard/tfchain/tf_dao.md)
- [Voting Weight Example](dashboard/tfchain/tf_dao_voting_weight.md)
- [TF Token Bridge](dashboard/tfchain/tf_token_bridge.md) - [TF Token Bridge](dashboard/tfchain/tf_token_bridge.md)
- [TF Token Transfer](dashboard/tfchain/tf_token_transfer.md) - [TF Token Transfer](dashboard/tfchain/tf_token_transfer.md)
- [TF Minting Reports](dashboard/tfchain/tf_minting_reports.md) - [TF Minting Reports](dashboard/tfchain/tf_minting_reports.md)
- [ThreeFold Connect](tfconnect/tfconnect_toc.md)
- [TFConnect Overview](tfconnect/tfconnect_overview.md)
- [TFConnect Authenticator](tfconnect/tfconnect_authenticator.md)
- [TFConnect Advanced](tfconnect/tfconnect_advanced.md)
- [TFConnect Troubleshooting](tfconnect/tfconnect_troubleshooting.md)
- [Developers](developers/developers.md) - [Developers](developers/developers.md)
- [Javascript Client](developers/javascript/grid3_javascript_readme.md) - [Javascript Client](developers/javascript/grid3_javascript_readme.md)
- [Installation](developers/javascript/grid3_javascript_installation.md) - [Installation](developers/javascript/grid3_javascript_installation.md)
@ -117,13 +122,14 @@
- [Internals](developers/internals/internals.md) - [Internals](developers/internals/internals.md)
- [Reliable Message Bus - RMB](developers/internals/rmb/rmb_toc.md) - [Reliable Message Bus - RMB](developers/internals/rmb/rmb_toc.md)
- [Introduction to RMB](developers/internals/rmb/rmb_intro.md) - [Introduction to RMB](developers/internals/rmb/rmb_intro.md)
- [Coding Guides](developers/internals/rmb/rmb_coding_guides.md)
- [RMB Specs](developers/internals/rmb/rmb_specs.md) - [RMB Specs](developers/internals/rmb/rmb_specs.md)
- [RMB Peer](developers/internals/rmb/uml/peer.md) - [RMB Peer](developers/internals/rmb/uml/peer.md)
- [RMB Relay](developers/internals/rmb/uml/relay.md) - [RMB Relay](developers/internals/rmb/uml/relay.md)
- [Zero-OS](developers/internals/zos/zos_readme.md) - [Zero-OS](developers/internals/zos/zos_readme.md)
- [Manual](developers/internals/zos/manual/manual.md) - [Manual](developers/internals/zos/manual/manual.md)
- [Workload Types](developers/internals/zos/manual/workload_types.md) - [Workload Types](developers/internals/zos/manual/workload_types.md)
- [Internal Modules](developers/internals/zos/internals/internals.md) - [Internal Modules](developers/internals/zos/internals/zos_internals.md)
- [Identity](developers/internals/zos/internals/identity/identity_readme.md) - [Identity](developers/internals/zos/internals/identity/identity_readme.md)
- [Node ID Generation](developers/internals/zos/internals/identity/identity.md) - [Node ID Generation](developers/internals/zos/internals/identity/identity.md)
- [Node Upgrade](developers/internals/zos/internals/identity/upgrade.md) - [Node Upgrade](developers/internals/zos/internals/identity/upgrade.md)
@ -150,6 +156,7 @@
- [Full VM Grid Deployment](developers/grid_deployment/grid_deployment_full_vm.md) - [Full VM Grid Deployment](developers/grid_deployment/grid_deployment_full_vm.md)
- [Grid Snapshots](developers/grid_deployment/snapshots.md) - [Grid Snapshots](developers/grid_deployment/snapshots.md)
- [Deploy the Dashboard](developers/grid_deployment/deploy_dashboard.md) - [Deploy the Dashboard](developers/grid_deployment/deploy_dashboard.md)
- [Application Case Study: Nextcloud](developers/grid_deployment/app_case_study_nextcloud.md)
- [Farmers](farmers/farmers.md) - [Farmers](farmers/farmers.md)
- [Build a 3Node](farmers/3node_building/3node_building.md) - [Build a 3Node](farmers/3node_building/3node_building.md)
- [1. Create a Farm](farmers/3node_building/1_create_farm.md) - [1. Create a Farm](farmers/3node_building/1_create_farm.md)
@ -175,6 +182,8 @@
- [Quick Guide](farmers/farmerbot/farmerbot_quick.md) - [Quick Guide](farmers/farmerbot/farmerbot_quick.md)
- [Additional Information](farmers/farmerbot/farmerbot_information.md) - [Additional Information](farmers/farmerbot/farmerbot_information.md)
- [Minting and the Farmerbot](farmers/farmerbot/farmerbot_minting.md) - [Minting and the Farmerbot](farmers/farmerbot/farmerbot_minting.md)
- [Node Status Bot](farmers/node_status_bot/node_status_bot.md)
- [Farming Troubleshooting](farmers/farming_troubleshooting.md)
- [System Administrators](system_administrators/system_administrators.md) - [System Administrators](system_administrators/system_administrators.md)
- [Getting Started](system_administrators/getstarted/tfgrid3_getstarted.md) - [Getting Started](system_administrators/getstarted/tfgrid3_getstarted.md)
- [SSH Remote Connection](system_administrators/getstarted/ssh_guide/ssh_guide.md) - [SSH Remote Connection](system_administrators/getstarted/ssh_guide/ssh_guide.md)
@ -255,8 +264,13 @@
- [IPFS on a Full VM](system_administrators/advanced/ipfs/ipfs_fullvm.md) - [IPFS on a Full VM](system_administrators/advanced/ipfs/ipfs_fullvm.md)
- [IPFS on a Micro VM](system_administrators/advanced/ipfs/ipfs_microvm.md) - [IPFS on a Micro VM](system_administrators/advanced/ipfs/ipfs_microvm.md)
- [MinIO Operator with Helm3](system_administrators/advanced/minio_helm3.md) - [MinIO Operator with Helm3](system_administrators/advanced/minio_helm3.md)
- [AI & ML Workloads](system_administrators/advanced/ai_ml_workloads.md)
- [Hummingbot](system_administrators/advanced/hummingbot.md) - [Hummingbot](system_administrators/advanced/hummingbot.md)
- [AI & ML Workloads](system_administrators/advanced/ai_ml_workloads.md)
- [Ecommerce](system_administrators/advanced/ecommerce/ecommerce.md)
- [WooCommerce](system_administrators/advanced/ecommerce/woocommerce.md)
- [nopCommerce](system_administrators/advanced/ecommerce/nopcommerce.md)
- [HTTPS with Caddy](system_administrators/advanced/https_caddy.md)
- [Node Status Bot](system_administrators/advanced/node_status_bot.md)
- [ThreeFold Token](threefold_token/threefold_token.md) - [ThreeFold Token](threefold_token/threefold_token.md)
- [TFT Bridges](threefold_token/tft_bridges/tft_bridges.md) - [TFT Bridges](threefold_token/tft_bridges/tft_bridges.md)
- [TFChain-Stellar Bridge](threefold_token/tft_bridges/tfchain_stellar_bridge.md) - [TFChain-Stellar Bridge](threefold_token/tft_bridges/tfchain_stellar_bridge.md)

View File

@ -15,7 +15,6 @@ Easily deploy your favourite applications on the ThreeFold grid with a click of
- [Mattermost](mattermost.md) - [Mattermost](mattermost.md)
- [Nextcloud](nextcloud.md) - [Nextcloud](nextcloud.md)
- [Node Pilot](nodepilot.md) - [Node Pilot](nodepilot.md)
- [ownCloud](owncloud.md)
- [Peertube](peertube.md) - [Peertube](peertube.md)
- [Presearch](presearch.md) - [Presearch](presearch.md)
- [Static Website](static_website.md) - [Static Website](static_website.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -4,10 +4,9 @@
- [Introduction](#introduction) - [Introduction](#introduction)
- [Prerequisites](#prerequisites) - [Prerequisites](#prerequisites)
- [Algorand Structure](#algorand-structure) - [Algorand Structure](#algorand-structure)
- [Run Default Node](#run-default-node) - [Run Default Node](#run-default-node)
- [Run Relay Node](#run-relay-node) - [Run Relay Node](#run-relay-node)
- [Run Participant Node](#run-participant-node)
- [Run Indexer Node](#run-indexer-node) - [Run Indexer Node](#run-indexer-node)
- [Select Capacity](#select-capacity) - [Select Capacity](#select-capacity)
@ -23,75 +22,56 @@
- From the sidebar click on **Applications** - From the sidebar click on **Applications**
- Click on **Algorand** - Click on **Algorand**
### Algorand Structure ## Algorand Structure
- Algorand has two main [types](https://developer.algorand.org/docs/run-a-node/setup/types/#:~:text=The%20Algorand%20network%20is%20comprised,%2C%20and%20non%2Drelay%20nodes.) of nodes (Relay or Participant) you can run also a 4 networks you can run your node against. Combining the types you can get: An Algorand node can be either a `Default`, `Relay` or `Indexer` node.
- Defualt:
This is a Non-relay and Non-participant - Default:
It can run on (Devnet, Testnet, Betanet, Mainnet) - This is a non-relay node.
- Relay: - It can run on Devnet, Testnet, Betanet and Mainnet.
Relay node Can't be participant. - Relay:
It can run only on (Testnet, Mainnet) - It can run only on Testnet and Mainnet.
- Participant: - Indexer:
Can run on any of the four nets. - It is a default node but with Archival Mode enabled which will make you able to query the data of the blockchain.
- Indexer:
It is a default node but with Archival Mode enbled which will make you able to query the data of the blockchain.
## Run Default Node ## Run Default Node
The basic type. you select any network you want. and for the node type select Default. You can select any network you want and for the node type select Default.
If you have more than one SSH keys set, you can click on `Manage SSH keys` to select which one to use for this deployment.
![defaultdep](./img/solutions_algorand.png) ![defaultdep](./img/solutions_algorand.png)
after the deployment is done. `ssh` to the node and run `goal node status` After the deployment is done, SSH into the node and run `goal node status`.
Here you see your node runs on mainnet.
![defaulttest](./img/algorand_defaulttest.png) ![defaulttest](./img/algorand_defaulttest.png)
here you see your node run against mainnet.
## Run Relay Node ## Run Relay Node
Relay nodes are where other nodes connect. Therefore, a relay node must be able to support a large number of connections and handle the processing load associated with all the data flowing to and from these connections. Thus, relay nodes require significantly more power than non-relay nodes. Relay nodes are always configured in archival mode. Relay nodes are where other nodes connect. Therefore, a relay node must be able to support a large number of connections and handle the processing load associated with all the data flowing to and from these connections. Thus, relay nodes require significantly more power than non-relay nodes. Relay nodes are always configured in archival mode.
The relay node must be publicaly accessable. so it must have public ip. The relay node must be publicaly accessable, so it must have a public ip.
![relaydep](./img/algorand_relaydep.png) ![relaydep](./img/algorand_relaydep.png)
after the deployment is done. `ssh` to the node and run `goal node status` to see the status of the node. and also you can check if the right port is listening (:4161 for testnet, and :4160 for mainnet) Once the deployment is done, SSH into the node and run `goal node status` to see the status of the node. You can also check if the right port is listening (:4161 for testnet, and :4160 for mainnet).
![relaytest](./img/algorand_relaytest.png) ![relaytest](./img/algorand_relaytest.png)
The next step accourding to the [docs](https://developer.algorand.org/docs/run-a-node/setup/types/#relay-node) is to register your `ip:port` on Algorand Public SRV. The next step accourding to the [docs](https://developer.algorand.org/docs/run-a-node/setup/types/#relay-node) is to register your `ip:port` on Algorand Public SRV.
## Run Participant Node
Participation means participation in the Algorand consensus protocol. An account that participates in the Algorand consensus protocol is eligible and available to be selected to propose and vote on new slice in the Algorand blockchain.
Participation node is responsible for hosting participation keys for one or more online accounts.
What you need?
- Account mnemonics on the network you deploy on (offline) you can check the status for you account on the AlgoExplorer. search by your account id.
The account needs to have some microAlgo to sign the participation transaction.
- [Main net explorer](https://algoexplorer.io/)
- [Test net explorer](https://testnet.algoexplorer.io/)
- First Round: is the first block you need your participaiton node to validate from. you can choose the last block form the explorer.
![partexp](./img/algorand_partexp.png)
- Last Round: is the final block your node can validate. let's make it 30M
![partdep](./img/algorand_partdep.png)
after the deployment is done. `ssh` to the node and run `goal node status` to see the status of the node. you see it do catchup. and the fast catchup is to make the node sync with the latest block faster by only fetch the last 1k slice. after it done it will start create the participation keys.
![partstatus](./img/algorand_partstatus.png)
now if you check the explorer you can see the status of the account turned to Online
![partonl](./img/algorand_partonl.png)
## Run Indexer Node ## Run Indexer Node
The primary purpose of this Indexer is to provide a REST API interface of API calls to support searching the Algorand Blockchain. The Indexer REST APIs retrieve the blockchain data from a PostgreSQL compatible database that must be populated. This database is populated using the same indexer instance or a separate instance of the indexer which must connect to the algod process of a running Algorand node to read block data. This node must also be an Archival node to make searching the entire blockchain possible. The primary purpose of this Indexer is to provide a REST API interface of API calls to support searching the Algorand Blockchain. The Indexer REST APIs retrieve the blockchain data from a PostgreSQL compatible database that must be populated. This database is populated using the same indexer instance or a separate instance of the indexer which must connect to the algod process of a running Algorand node to read block data. This node must also be an Archival node to make searching the entire blockchain possible.
![indexernode](./img/algorand_indexernode.png) ![indexernode](./img/algorand_indexernode.png)
After it finish you can access the indexer API at port `8980` and here are the [endpoint](https://developer.algorand.org/docs/rest-apis/indexer/) you can access. Once it's done, you can access the indexer API at port `8980` and here are the [endpoint](https://developer.algorand.org/docs/rest-apis/indexer/) you can access.
## Select Capacity ## Select Capacity
The default scinario the capacity is computed based on the node (network/type) accourding to this [reference](https://howbigisalgorand.com/). The default scenario capacity is computed based on the node (network/type) accourding to this [reference](https://howbigisalgorand.com/).
But you still can change this only to higher values by selecting the option `Set Custom Capacity` But you can still change this to higher values by selecting the option `Set Custom Capacity`.

View File

@ -49,6 +49,8 @@ It has following benefits :
- Enter domain for you Caprover instance, Be very careful about the domain name: it needs to be a wildcard domain name you can configure in your chosen domain name system. - Enter domain for you Caprover instance, Be very careful about the domain name: it needs to be a wildcard domain name you can configure in your chosen domain name system.
- Enter password for you Caprover instance. - Enter password for you Caprover instance.
If you have more than one SSH keys set, you can click on `Manage SSH keys` to select which one to use for this deployment.
## Admin and Workers Tabs ## Admin and Workers Tabs
![ ](./img/solutions_caprover_leader.png) ![ ](./img/solutions_caprover_leader.png)

View File

@ -42,6 +42,8 @@ __Process__ :
- `Custom Domain` flag lets the user to use a custom domain - `Custom Domain` flag lets the user to use a custom domain
- Choose a gateway node to deploy your Casperlab instance on. - Choose a gateway node to deploy your Casperlab instance on.
If you have more than one SSH keys set, you can click on `Manage SSH keys` to select which one to use for this deployment.
After that is done you can see a list of all of your deployed instances After that is done you can see a list of all of your deployed instances
![ ](./img/casper4.png) ![ ](./img/casper4.png)

View File

@ -52,16 +52,20 @@ Deploy a new full virtual machine on the Threefold Grid
- Choose the node to deploy the Full Virtual Machine on - Choose the node to deploy the Full Virtual Machine on
![](./img/node_selection.png) ![](./img/node_selection.png)
- If you have more than one SSH keys set, you can click on `Manage SSH keys` to select which one to use for this deployment.
You can attach one or more disks to the Virtual Machine by clicking on the Disks tab and the plus `+` sign and specify the following parameters You can attach one or more disks to the Virtual Machine by clicking on the Disks tab and the plus `+` sign and specify the following parameters
![ ](./img/new_vm3.png) ![ ](./img/new_vm3.png)
- Disk name - Disk name
- Disk size - Disk size
in the bottom of the page you can see a list of all of the virtual machines you deployed. you can click on `Show details` for more details At the bottom of the page, you can see a list of all of the virtual machines you deployed. You can click on `Show details` for more details:
![ ](./img/new_vm5.png) ![ ](./img/new_vm5.png)
You can also go to JSON tab for full details
You can also go to JSON tab for full details:
![ ](./img/new_vm6.png) ![ ](./img/new_vm6.png)
## Difference Between Full VM and Micro VM ## Difference Between Full VM and Micro VM

View File

@ -5,6 +5,7 @@
- [Introduction](#introduction) - [Introduction](#introduction)
- [Prerequisites](#prerequisites) - [Prerequisites](#prerequisites)
- [Deployment](#deployment) - [Deployment](#deployment)
- [Troubleshooting](#troubleshooting)
*** ***
@ -56,4 +57,8 @@ After that is done you can see a list of all of your deployed instances
Click on ***Visit*** to go to the homepage of your Funkwhale instance! Click on ***Visit*** to go to the homepage of your Funkwhale instance!
![ ](./img/funkwhale3.png) ![ ](./img/funkwhale3.png)
## Troubleshooting
If you get a `Bad Gateway` while connecting to the website, you might simply need to wait for the deployment to complete.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 142 KiB

View File

@ -58,5 +58,7 @@ __Process__ :
in the bottom of the page you can see a list of all of the virual machines you deployed. you can click on `Show details` for more details in the bottom of the page you can see a list of all of the virual machines you deployed. you can click on `Show details` for more details
![](./img/vm_list.png) ![](./img/vm_list.png)
You can also go to JSON tab for full details You can also go to JSON tab for full details
![ ](./img/vm_json.png) ![ ](./img/vm_json.png)

View File

@ -16,7 +16,6 @@ This section provides a non-code easy way to deploy a whole solution on the TFGr
- [Funkwhale](funkwhale.md) - [Funkwhale](funkwhale.md)
- [Peertube](peertube.md) - [Peertube](peertube.md)
- [Taiga](taiga.md) - [Taiga](taiga.md)
- [Owncloud](owncloud.md)
- [Nextcloud](nextcloud.md) - [Nextcloud](nextcloud.md)
- [Discourse](discourse.md) - [Discourse](discourse.md)
- [Mattermost](mattermost.md) - [Mattermost](mattermost.md)

View File

@ -5,6 +5,7 @@
- [Introduction](#introduction) - [Introduction](#introduction)
- [Prerequisites](#prerequisites) - [Prerequisites](#prerequisites)
- [Deployment](#deployment) - [Deployment](#deployment)
- [Troubleshooting](#troubleshooting)
*** ***
@ -55,3 +56,7 @@ After that is done you can see a list of all of your deployed instances
Click on ***Visit*** to go to the homepage of your Taiga instance! Click on ***Visit*** to go to the homepage of your Taiga instance!
![ ](./img/taiga6.png) ![ ](./img/taiga6.png)
## Troubleshooting
If you get a `Bad Gateway` while connecting to the website, you might simply need to wait for the deployment to complete.

View File

@ -47,9 +47,11 @@ You can see a list of all of your deployed instances
![ ](./img/umbrel2.png) ![ ](./img/umbrel2.png)
- you can click on `Show details` for more details about the Umbrel deployment. - You can click on `Show details` for more details about the Umbrel deployment
![ ](./img/umbrel3.png) ![ ](./img/umbrel3.png)
and for more detailed information switch to `JSON` tap.
- For more detailed information, you can switch to `JSON` tab
![ ](./img/umbrel4.png) ![ ](./img/umbrel4.png)
- Click on ***Admin Panel*** to go to the dashboard of your Umbrel instance! - Click on ***Admin Panel*** to go to the dashboard of your Umbrel instance!
- Enter the ***Password*** that you provided in `config` section to login into Umbrel dashboard. - Enter the ***Password*** that you provided in `config` section to login into Umbrel dashboard.

View File

@ -14,7 +14,7 @@
- [WordPress Instance Website](#wordpress-instance-website) - [WordPress Instance Website](#wordpress-instance-website)
- [WordPress Instance Admin Page](#wordpress-instance-admin-page) - [WordPress Instance Admin Page](#wordpress-instance-admin-page)
- [WordPress Instance Credentials](#wordpress-instance-credentials) - [WordPress Instance Credentials](#wordpress-instance-credentials)
- [Questions and Feedback](#questions-and-feedback) - [Troubleshooting](#troubleshooting)
*** ***
@ -142,6 +142,6 @@ At any time, you can find the credentials of your WordPress instance by clicking
![ ](img/wp8.png) ![ ](img/wp8.png)
# Questions and Feedback # Troubleshooting
If you have any questions, you can ask the ThreeFold community for help on the [ThreeFold Forum](http://forum.threefold.io/) or on the [ThreeFold Grid Tester Community](https://t.me/threefoldtesting) on Telegram. If you get a `Bad Gateway` while connecting to the website, you might simply need to wait for the deployment to complete.

View File

@ -53,4 +53,6 @@ The DAO votes are weighted as follows:
2 * (sum of CU of all nodes) + (sum of SU of all nodes) 2 * (sum of CU of all nodes) + (sum of SU of all nodes)
``` ```
Voting weights are tracked per farm to keep it easy and traceable. Thus, if an account has multiple farms, the vote will be registered per farm. Voting weights are tracked per farm to keep it easy and traceable. Thus, if an account has multiple farms, the vote will be registered per farm.
For more information on voting weight, [check this example](./tf_dao_voting_weight.md).

View File

@ -0,0 +1,90 @@
<h1> Voting Weight Example</h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Example](#example)
---
## Introduction
As we've seen in the previous section, voting weights for the TF DAO are tracked per farm to keep it easy and traceable.
Let's see an example of how the weight of a farm is calculated.
## Example
For this example, we will take a node from QANet:
```
node_id = 3
farm_id = 1
```
The node information is the following:
![Alt text](../img/tf_dao_voting_weight_example.png)
The Rust code that calculates node weight extracted from TFChain can be found [here](https://github.com/threefoldtech/tfchain/blob/eb36aa90df2d60cb1a534997903821fc68a096f1/substrate-node/support/src/resources.rs#L57-L91).
When we apply this code to the current node, we get the following:
```
const GIGABYTE: u128 = 1024 * 1024 * 1024;
const ONE_THOUSAND: u128 = 1000;
const CRU: u64 = 24;
const MRU: u64 = 202803462144;
const SRU: u64 = 512110190592;
const HRU: u64 = 9001778946048;
fn calc_cu() -> u64 {
let cru_min = CRU as u128 * 2 * GIGABYTE * ONE_THOUSAND;
let mru_min =
((MRU as u128).checked_sub(1).unwrap_or(0) * GIGABYTE) * ONE_THOUSAND / 4;
let sru_min = SRU as u128 * ONE_THOUSAND / 50;
if cru_min < mru_min && cru_min < sru_min {
cru_min as u64
} else if mru_min < cru_min && mru_min < sru_min {
mru_min as u64
} else if sru_min < cru_min && sru_min < mru_min {
sru_min as u64
} else {
0
}
}
fn get_cu() -> u64 {
let cu = calc_cu();
let calculated_cu = 2 * (cu as u128 / GIGABYTE / ONE_THOUSAND);
calculated_cu as u64
}
fn get_su() -> u64 {
let su = HRU as u128 * ONE_THOUSAND / 1200 + SRU as u128 * ONE_THOUSAND / 250;
let calculated_su = su / GIGABYTE;
let result = calculated_su as u128 / ONE_THOUSAND;
result as u64
}
fn main() {
println!("CU: {}", get_cu());
println!("SU: {}", get_su());
}
```
We can then simply paste this code in the [Rust playground](https://play.rust-lang.org/) to obtain the `CU` and `SU` values of this node:
```
CU: 18
SU: 8
```
We can then simply put these numbers in the [equation shown in the last section](./tf_dao.md#voting-weight) to obtain the farm weight. Note that in this case, the farm has 2 different nodes with the same `CU` and `SU` values.
```
Weight = 2 * (sum of CU of all nodes) + (sum of SU of all nodes)
Weight = 2 * (18+18) + (8+8)
Weight = 2 * 36 + 16
Weight = 88
```
We can see that the farm has the weight `88`.

View File

@ -76,7 +76,7 @@ For complementary information on the technology developed by ThreeFold, refer to
- [ZOS](index.md) - [ZOS](index.md)
- [Manual](manual.md) - [Manual](manual.md)
- [Workload Types](workload_types.md) - [Workload Types](workload_types.md)
- [Internal Modules](internals.md) - [Internal Modules](zos_internals.md)
- [Capacity](capacity.md) - [Capacity](capacity.md)
- [Performance Monitor Package](performance.md) - [Performance Monitor Package](performance.md)
- [Public IPs Validation Task](publicips.md) - [Public IPs Validation Task](publicips.md)
@ -88,4 +88,5 @@ For complementary information on the technology developed by ThreeFold, refer to
- [TFGrid Stacks](tfgrid_stacks.md) - [TFGrid Stacks](tfgrid_stacks.md)
- [Full VM Grid Deployment](grid_deployment_full_vm.md) - [Full VM Grid Deployment](grid_deployment_full_vm.md)
- [Grid Snapshots](snapshots.md) - [Grid Snapshots](snapshots.md)
- [Deploy the Dashboard](deploy_dashboard.md) - [Deploy the Dashboard](deploy_dashboard.md)
- [Application Case Study: Nextcloud](app_case_study_nextcloud.md)

View File

@ -819,8 +819,8 @@ output "wg_config" {
output "vm1_ip" { output "vm1_ip" {
value = grid_deployment.d1.vms[0].ip value = grid_deployment.d1.vms[0].ip
} }
output "vm1_ygg_ip" { output "vm1_planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "fqdn" { output "fqdn" {

View File

@ -0,0 +1,281 @@
<h1>Application Case Study: Nextcloud</h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Process Overview and Preparation Steps](#process-overview-and-preparation-steps)
- [Building an Application](#building-an-application)
- [Add an Icon](#add-an-icon)
- [Add a Description](#add-a-description)
- [Update deployment\_list.ts](#update-deployment_listts)
- [Update /types/index.ts](#update-typesindexts)
- [Update /router/index.ts](#update-routerindexts)
- [Update vm\_deployment\_table.vue](#update-vm_deployment_tablevue)
- [Update delete\_deployment.ts](#update-delete_deploymentts)
- [Update tf\_deployment\_list.vue](#update-tf_deployment_listvue)
- [Create nextcloud\_view.vue](#create-nextcloud_viewvue)
- [Create tf\_nextcloud.vue](#create-tf_nextcloudvue)
- [Template Section](#template-section)
- [First Script Section (Setup)](#first-script-section-setup)
- [Second Script Section](#second-script-section)
- [Testing a application](#testing-a-application)
- [Contributing to the Dashboard](#contributing-to-the-dashboard)
- [Conclusion](#conclusion)
***
# Introduction
In this ThreeFold guide, we explore how to create an application on the Dashboard. To do so, we will use the Nextcloud application as a case study. This application is ideal to study since it uses many of the ThreeFold Grid functionalities, such as gateways and gateway domains.
By reading this guide, you should have a proper understanding of the general process of building a new application on the ThreeFold Grid. This might give you inspiration to build your own application and contribute to the ThreeFold Dashboard.
# Process Overview and Preparation Steps
The bulk of the files needed for the Nextcloud application can be found in the [ThreeFold tfgrid-sdk-ts repository](https://github.com/threefoldtech/tfgrid-sdk-ts) on GitHub. More specifically, we are interested in the subdirectory called [playground](https://github.com/threefoldtech/tfgrid-sdk-ts/tree/development/packages/playground).
While there are many ways to proceed in the development of a ThreeFold application for the Dashboard, we present here a general method that works efficiently and is well organized.
The information provided here are specific to the Nextcloud workload, but it can be applied to other types of workload.
Before building the Nextcloud application, we first deployed a [Nextcloud instance](system_administrators@@terraform_nextcloud_aio) on the ThreeFold Grid with a full virtual machine. Once this deployment was working well, we built an [Nextcloud flist](flist_nextcloud_case_study.md). You can consult the Nextcloud flist code in the ThreeFold Tech [tf-images repository](https://github.com/threefoldtech/tf-images/tree/development/tfgrid3/nextcloud). We note that the flist uses a micro VM. There are some differences between a full VM and a micro VM. We propose users to first start deploying with a full VM and then adjust their work when they want to publish an flist with a micro VM, since full VM are easier to work with. You can of course start directly with a micro VM if you want.
In sum, once we were confortable launching Nextcloud on a full VM and also using an flist, we were ready to tackle the building of a application. These steps should be taken into account when building your own application. We proceed this way to ensure that the workload is properly configured. Once we know the flist is working properly, we can focus on the application aspect of the deployment, knowing the deployment itself is working properly.
# Building an Application
In the subsections that follow, we cover all the different files that either need to be updated or created when building a application on the Dashboard.
For the most part, the work consist of updating existing files to add the Nextcloud information. As you will see, the bulk of the work is happening with the file named **tf_nextcloud.vue**, where we set the main application page seen on the Dashboard.
## Add an Icon
We added a Nextcloud icon to be featured on the Dashboard by adding a **png** file at the following directory **packages/playground/public/images/icons/nextcloud.png**.
## Add a Description
We added a description to the Nextcloud application by adding a markdown file at the following directory **packages/playground/public/info/nextcloud.md**. This file contains a short description of Nextcloud for users to quickly understand what the application does.
## Update deployment_list.ts
In the file **deployment_list.ts**, we set parameters to be shared to the Nextcloud application during deployment. The file is available at the following directory **packages/playground/src/constants/deployment_list.ts**.
In our case, the Nextcloud content is the following:
```
nextcloud: {
SSH_KEY: _ssh,
NEXTCLOUD_AIO_LINK: "Nextcloud Setup",
NEXTCLOUD_DOMAIN: "Nextcloud Domain",
},
```
We can see here that the application will receive the SSH public key, the Nextcloud setup and domain links. The SSH public key will allow users to connect to the VM via SSH. The Nextcloud setup link is linked to the The Nextcloud domain is used to set the domain name to the Nextcloud instance. The Nextcloud setup and domain links will be linked to the **Actions** buttons once the workload is deployed.
## Update \/types\/index.ts
In the file **index.ts**, located at the directory **packages/playground/src/types/**, we set the **ProjectName**, **SolutionCode** and **solutionType** for the Nextcloud application.
We added the line **Nextcloud = "Nextcloud",** in the array **export enum ProjectName**. This will provide a name for the Nextcloud application, which will be used in the Deployment table shown on the Dashboard.
We added the line **nextcloud = "nc"** in the array **export enum SolutionCode**. This will be used notably as a prefix for the randomly generated deployment name. For example, when the user deploys a Nextcloud application, the name of the VM could be **ncxwbt2**.
We also added the line **nextcloud: "Nextcloud",** in the array **export const solutionType: { [key: string]: string } =**. This will be used when setting a contract with the TFGrid.
## Update \/router\/index.ts
In the file **index.ts**, located at the directory **packages/playground/src/router/**, we add the following lines in the function **createApplicationsRoutes()**:
```
{
path: DashboardRoutes.Applications.Nextcloud,
component: () => import("../views/nextcloud_view.vue"),
meta: {
title: "Nextcloud",
info: { page: "info/nextcloud.md" },
navbarConfig: {
back: true,
path: [
{ title: "Deploy" },
{
title: "Applications",
disabled: false,
to: DashboardRoutes.Deploy.Applications,
},
{
title: "Nextcloud",
},
],
},
},
},
```
We can see that this section makes use of the Nextcloud description seen in the section [Add a Description](#add-a-description). It also sets the path to the **nextcloud_view.vue** file.
## Update vm_deployment_table.vue
In the file **vm_deployment_table.vue**, located at the directory **packages/playground/src/components/**, we added the line **ProjectName.Nextcloud** in the constant section named **IPV4Solutions**.
The Nextcloud IPv4 address will thus be shown in the deployment table after the user has deployed the Nextcloud application.
If, for example, we wanted to display the WireGuard address in the deployment table, we would add **ProjectName.Nextcloud** in the array named **WireguardSolutions**.
## Update delete_deployment.ts
In the file **delete_deployment.ts**, located at the directory **packages/playground/src/utils**, we added the line **ProjectName.Nextcloud,** in the function **solutionHasGateway(projectName: ProjectName)**.
## Update tf_deployment_list.vue
In the file **tf_deployment_list.vue**, located at the directory **packages/playground/src/weblets**, we added the following code to set Actions buttons that are clickable once the workload is deployed:
```
<template #Nextcloud-actions="{ item }">
<IconActionBtn
tooltip="Show Details"
icon="mdi-eye-outline"
@click="openDialog(tabs[activeTab].value, item)"
/>
<IconActionBtn
tooltip="Open Nextcloud"
color="anchor"
icon="mdi-web"
:href="'https://' + item.value[0].env.NEXTCLOUD_DOMAIN"
/>
<IconActionBtn
tooltip="Nextcloud Setup"
color="anchor"
icon="mdi-view-dashboard"
:href="'https://' + item.value[0].env.NEXTCLOUD_AIO_LINK"
/>
</template>
```
We note that this section makes use of the **NEXTCLOUD_DOMAIN** and **NEXTCLOUD_AIO_LINK** environment variables shown in the section [Update deployment_list.ts](#update-deployment_listts).
At the end of the file, at the section **const tabs: Tab[]**, we also added the line **{ title: "Nextcloud", value: "Nextcloud", imgPath: "images/icons/nextcloud.png" },**. We note that this line makes use of the Nextcloud icon we set in the **icons** directory.
## Create nextcloud_view.vue
We created a file named **nextcloud_view.vue**. Instead of starting from scratch, we took a file template from an already existing file, in our case it was **owncloud_view.vue**. We only needed to change a few lines to make it work with the Nextcloud application.
```
<template>
<view-layout>
<TfNextcloud />
<template #list>
<TfDeploymentList title="Nextcloud Instances" :project-name="name" />
</template>
</view-layout>
</template>
<script lang="ts">
import { ProjectName } from "../types";
import TfDeploymentList from "../applications/tf_deployment_list.vue";
import TfNextcloud from "../applications/tf_nextcloud.vue";
export default {
name: "NextcloudView",
components: {
TfNextcloud,
TfDeploymentList,
},
setup() {
return { name: ProjectName.Nextcloud };
},
};
</script>
```
The line containing **TfDeploymentList title** sets the strings used to present the different Nextcloud instances in the deployment table, populated once we deploy a Nextcloud workload on the Dashboard.
We also note that this file imports the variables **TfDeploymentList** and **TfNextcloud** from the files **tf_deployment_list.vue** and **tf_nextcloud.vue** respectively. These variables are then exported in the section **export default**. We recall that in **tf_deployment_list.vue**, we set the Actions button, as well as set the application name and icon. The file **tf_nextcloud.vue** is covered in the next section.
## Create tf_nextcloud.vue
Still in the directory **packages/playground/src/weblets**, we created a file named **tf_nextcloud.vue**. Instead of starting from scratch, it can be recommended to start from a template of a application that is close to the current application you are building. In our case, we started with the file **owncloud.vue**. That being said, since the Nextcloud application uses the gateway as well as gateway domains, some major updates were necessary. This file constitutes the bulk of the work when building a application for the Dashboard. For this reason, we dedicate more attention to this file and explore it section by section.
This file is mainly composed of three sections. The first section, **template** will be used to configure and set the proper deployment configurations. The second section, the first **script** section will import the necessary modules and variables, set the constants and set the asynchronous function that will query the TFGrid to deploy the application instance. The third section, the second **script** section, imports modules and variables and export them.
### Template Section
We first start to explore the **template** main section.
The section **weblet-layout** defines the basic layout of the application. This section sets the variable names for the different deployment configurations, such as the CPU, the memory and the disk. These variables will then be set to specific quantities when the users set the application on the Dashboard.
The section **template #title** sets the main title displayed on the Dashboard application page.
The section **form-validator** contains many subsections that will serve to configure the application deployment.
The first subsection of **form-validator** is **input-validator**. This subsection is used to give a name to the application instance. This subsection provides strict requirements for the **Name** of the application instance. While the name is automatically generated randomly by the Dashboard, users can also set their own name, to the extent that they follow the name requirements.
The following subsection is called **SelectSolutionFlavor**. In this subsection, we provide templates for the users to choose the deployment parameters. The parameters are CPU, memory and disk. As stated before, the names of those parameters have been set in the section **application-layout**.
The subsection **Networks** is where we set the TFGrid parameter options. In our case, the user can decide to enable **ipv4** and **mycelium**.
The subsections called **input-tooltip** are used to generated information for the users. The developer can decide to either simply display a message as string, and also to set a clickable hyperlink.
The first **input-tooltip** of the Nextcloud instance provides a hyperlink leading to the TF Manual dedicated nodes documentation. This tooltip also contains a **v-switch**. This gives a toggle button that can be enabled or disabled. In this case, the user can either enable the option **Dedicated** or not. The name given to this option is **dedicated**. We can see further in the document, at line 122, that this option is set as a constant and is false by default (**ref(false)**).
The second **input-tooltip** is about certified node. As with the previous tool-tip, it is accompanied by a **v-switch** named **certified**. Also further in the document, we can see at line 123 that this option is set as a constant and set to false by default (**set(false)**).
The subsection **template #footer-actions** configures the **Deploy** button. As we can see here, we set **validateBeforeDeploy** to ensure that the user selects a proper node and deloyment configurations before being able to query the TFGrid to deploy the application instance.
By the end of this subsection, we arrive at the end of the **weblet-layout** subsection and of the **template** section.
### First Script Section (Setup)
The first part of this section consists of importing modules from the **src** directory as well as **GridClient** from **@threefold/grid_client** and **computed**, **type Ref** and **ref** from **vue**. Then we set constants based on the **template** section.
One constant to notice is **flist**. This constant is given the URL to the Nextcloud flist that we created for the application deployment. For more information on how to create this flist, read the [Nextcloud flist case study](../flist/flist_case_studies/flist_nextcloud_case_study.md) available on the ThreeFold Manual.
In the function **finalize**, we set the output displayed when the deployment has been successful. It's important to add relevant information for the user here. In the case of Nextcloud, we add the following text to provide guidance to the user:
> Successfully deployed a Nextcloud instance. Under Actions, click on the button Nextcloud Setup to set up Nextcloud. After installation, you can access the Nextcloud instance by clicking on the Open Nextcloud button or navigating to your Nextcloud domain.
A big part of the first script section is the asynchronous function **deploy**. As the constant **projectName**, we set the following:
> ProjectName.Nextcloud.toLowerCase() + "/" + name.value
For our Nextcloud instance, the user can decide to use a gateway or not as well as a custom or gateway domain. The constant **domain** sets this. 148 consists of setting the proper **domain** whether the user chose a custom or a gateway domain:
> const domain = selectionDetails.value!.domain!.enabledCustomDomain
? selectionDetails.value!.domain!.customDomain
: subdomain + "." + selectionDetails.value!.domain!.selectedDomain?.publicConfig.domain;
The constant **has_gateway** is set to true only if both **customDomain** and **ipv4.value** are set to false:
> const has_gateway = !(selectionDetails.value!.domain!.enabledCustomDomain && ipv4.value);
The constant **aio_link** is composed of the **domain** variable set earlier followed by `/aio`. This will ensure that the Action button to open the Nextcloud AIO page is properly set.
> const aio_link = domain + "/aio";
Once the susmentioned constants are set, the asynchronous function **deploy** will deploy the application instance on the TFGrid. This can be seen in the section **try**.
This section references to all the necessary parameters to deploy the application instance as defined by the user on the TFGrid. For example, the subsection **envs** contains all the necessary environment variables for the deployment, such as the SSH public key (**SSH_KEY**), as well as the domain and Nextcloudt setup URLs (**NEXTCLOUD_DOMAIN**, **NEXTCLOUD_AIO_LINK**). We also pass a boolean telling the deployer if there is a gateway within the deeployment (**GATEWAY**) as well as the IPv4 address (**IPV4**).
If this **try** function fails, we catch the error and display **Failed to deploy a Nextcloud instance.** as shown in the section **catch (e)**.
The next section is an **if** statement that will be triggered if the deployment consist of a custom domain and an IPv4 connection. In this case, we call the function **finalize** to deploy the application instance by passing the **vm** as a parameter.
If this is not the case, we trigger the second **try** function where we set the gateway. Once this is done, we finally trigger the function **finalize** to deploy the application instance with the gateway set.
### Second Script Section
The second script section imports different modules necessary to run the application and then exports many of them as a package for the application, in our case **TFNextcloud**.
The import section of this script section should be common for all applications using a gateway.
The export section (**export default**) is set with **TFNextcloud** as its **name**.
# Testing a application
You can test this application or the application you are creating by deploying the Dashboard locally. For more information on this, feel free to read the documentation [Deploy the Dashboard](./deploy_dashboard.md) of the ThreeFold Manual.
This is very useful, if not necessary, when testing and building your own application.
# Contributing to the Dashboard
If you've created a new application and you wish to share it to the ThreeFold community, feel free to fork the ThreeFold [tfgrid-sdk-ts repository](https://github.com/threefoldtech/tfgrid-sdk-ts) to your own GitHub account, add the new application to the Dashboard and then create a pull request. The ThreeFold development team will be happy to review your code and propose changes if needed.
# Conclusion
We now went through the Nextcloud application code and explored how to create a new application for the ThreeFold Dashboard. This case study should have given you the necessary tools and knowledge to understand the general steps when it comes to creating a new application. Of course, each application will be different and you will most certainly need to adjust the files presented here when you build your own application.
Should you have any questions or feedback, you can ask the ThreeFold community for help on the [ThreeFold Forum](http://forum.threefold.io/) or on the [ThreeFold Grid Tester Community](https://t.me/threefoldtesting) chat on Telegram.

View File

@ -7,4 +7,5 @@ The TFGrid whole source code is open-source and instances of the grid can be dep
- [TFGrid Stacks](tfgrid_stacks.md) - [TFGrid Stacks](tfgrid_stacks.md)
- [Full VM Grid Deployment](grid_deployment_full_vm.md) - [Full VM Grid Deployment](grid_deployment_full_vm.md)
- [Grid Snapshots](snapshots.md) - [Grid Snapshots](snapshots.md)
- [Deploy the Dashboard](deploy_dashboard.md) - [Deploy the Dashboard](deploy_dashboard.md)
- [Application Case Study: Nextcloud](app_case_study_nextcloud.md)

View File

@ -6,6 +6,7 @@ We present in this section of the developers book a partial list of system compo
- [Reliable Message Bus - RMB](rmb_toc.md) - [Reliable Message Bus - RMB](rmb_toc.md)
- [Introduction to RMB](rmb_intro.md) - [Introduction to RMB](rmb_intro.md)
- [Coding Guides](rmb_coding_guides.md)
- [RMB Specs](rmb_specs.md) - [RMB Specs](rmb_specs.md)
- [RMB Peer](peer.md) - [RMB Peer](peer.md)
- [RMB Relay](relay.md) - [RMB Relay](relay.md)
@ -13,7 +14,7 @@ We present in this section of the developers book a partial list of system compo
- [ZOS](zos_readme.md) - [ZOS](zos_readme.md)
- [Manual](manual.md) - [Manual](manual.md)
- [Workload Types](workload_types.md) - [Workload Types](workload_types.md)
- [Internal Modules](internals.md) - [Internal Modules](zos_internals.md)
- [Capacity](capacity.md) - [Capacity](capacity.md)
- [Performance Monitor Package](performance.md) - [Performance Monitor Package](performance.md)
- [API](api.md) - [API](api.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -0,0 +1,174 @@
<h1> Coding Guides </h1>
<h2> Table of Contents </h2>
- [Introduction](#introduction)
- [Module Structure](#module-structure)
- [Example](#example)
- [Naming Conventions](#naming-conventions)
- [`error` Handling](#error-handling)
- [`logs`](#logs)
- [Function Signatures](#function-signatures)
- [Examples](#examples)
---
## Introduction
We present coding guides for the reliable message bus (RMB).
> This document will always be `work in progress`. [Read the official docs for updates](https://github.com/threefoldtech/rmb-rs/blob/main/docs/code-guide.md).
## Module Structure
In Rust there are multiple ways to create a (sub)module in your crate
- `<module>.rs` A single file module. can be imported in `main.rs` or `lib.rs` with the keyword `mod`
- `<module>/mod.rs` A directory module. Uses mod.rs as the module `entrypoint` always. Other sub-modules can be created next to mod.rs and can be made available by using the `mod` keyword again in the `mod.rs` file.
We will agree to use the 2nd way (directory) but with the following restrictions:
- `mod.rs` will have all `traits` and `concrete types` used by the traits.
- `<implementation>.rs` file next to `mod.rs` that can include implementation for the module trait.
z
### Example
Following is an example of `animal` module.
```
animal/
mod.rs
dog.rs
cat.rs
```
> File names are always in `snake_case` but avoid the `_` as much as possible because they basically look ugly in file tree. For example we prefer the name `dog.rs` over `dog_animal.rs` because we already can tell from the module name that it's a `dog` __animal__. Hence in the identity module for example the name `ed25519.rs` is preferred over `ed25519_identity.rs` because that's already inferred from the module name.
The `mod.rs` file then can contain
```rust
pub mod dog;
pub mod cat;
pub use dog::Dog;
pub trait Food {
fn calories(&self) -> u32;
}
pub trait Animal<F>
where
F: Food,
{
fn feed(&mut self, food: F);
}
```
The `dog.rs` file then can contain
```rust
use super::{Animal, Food};
pub struct DogFood {}
impl Food for DogFood {
fn calories(&self) -> u32 {
1000
}
}
pub struct Dog {}
impl Animal<DogFood> for Dog {
fn feed(&mut self, food: DogFood) {
println!("yum yum yum {} calories", food.calories());
}
}
```
A user of the module now can do
```
use animal::dog::{Dog, DogFood};
```
For common implementation that are usually used in your modules, a `pub use` can be added in `mod.rs` to make it easier to import your type. For example
```rust
// dog is brought directly from animal crate
use animal::Dog;
// cat i need to get from the sub-module
use animal::cat::Cat;
```
## Naming Conventions
Following the rust guide lines for name
- `file names` are short snake case. avoid `_` if otherwise name will not be descriptive. Check note about file names above.
- `trait`, `struct`, `enum` names are all `CamelCase`
- `fn`, `variables` names are snake case
Note, names of functions and variables need to be `descriptive` but __short__ at the same time. Also avoid the `_` until absolutely necessary. A variable with a single `word` name is better if it doesn't cause confusion with other variables in the same context.
The name of the variable should never include the `type`.
## `error` Handling
We agreed to use `anyhow` crate in this project. Please read the docs for [`anyhow`](https://docs.rs/anyhow/1.0.57/anyhow/)
To unify the practice by default we import both `Result` and `Context` from `anyhow`
> Others can be imported as well if needed.
```rust
use anyhow::{Result, Context};
fn might_fail() -> Result<()> {
// context adds a `context` to the error. so if another_call fails. I can tell exactly failed when i was doing what
another_call().context("failed to do something")?; // <- we use ? to propagate the error unless you need to handle the error differently
Ok(()) // we use Ok from std no need to import anyhow::Ok although it's probably the same.
}
fn might_fail2() -> Result<()> {
if fail {
// use the bail macro fom anyhow to exit with an error.
bail!("failed because fail with set to true");
}
}
> NOTE: all error messages starts with lowercase. for example it's `failed to ...` not `Failed to ...`
```
## `logs`
logging is important to trace the errors that cannot be propagated and also for debug messages that can help spotting a problem. We always gonna use `log` crate. as
```rust
log::debug!(); // for debug messages
log::info!(); // info messages
```
Note only `errors` that can __NOT__ be propagated are logged.
> NOTE: All log messages start with lowercase.
## Function Signatures
For function inputs (arguments) `generic` types are preferred if available over concrete types. This most obvious with `string` types. depending on the function behavior
### Examples
This is bad:
```rust
fn call1(key: String);
fn call2(key: &str);
```
It is preferred to use:
```rust
// in case function will need to take ownership of the string.
fn call1<k: Into<String>>(k: K);
// inc ase function will just need to use a reference to the string.
fn call2<K: AsRef<str>>(k: K);
// this will allow both functions to be callable with `&str`, `String`.
```

View File

@ -2,106 +2,294 @@
<h2> Table of Contents </h2> <h2> Table of Contents </h2>
- [What is RMB](#what-is-rmb) - [Introduction](#introduction)
- [Why](#why) - [Overview of the Operation of RMB Relay](#overview-of-the-operation-of-rmb-relay)
- [Specifications](#specifications) - [Connections](#connections)
- [How to Use RMB](#how-to-use-rmb) - [Federations](#federations)
- [Libraries](#libraries) - [Peer](#peer)
- [Known Libraries](#known-libraries) - [Peer Implementation](#peer-implementation)
- [No Known Libraries](#no-known-libraries) - [`rmb-peer` message types](#rmb-peer-message-types)
- [What is rmb-peer](#what-is-rmb-peer) - [Output Requests](#output-requests)
- [Download](#download) - [Incoming Response](#incoming-response)
- [Building](#building) - [Incoming Request](#incoming-request)
- [Running tests](#running-tests) - [Outgoing Response](#outgoing-response)
- [End2End Encryption](#end2end-encryption)
- [Rate Limiting](#rate-limiting)
- [Substrate Connections](#substrate-connections)
- [Redundancy and Failover](#redundancy-and-failover)
--- ***
## What is RMB ## Introduction
Reliable message bus is a secure communication panel that allows `bots` to communicate together in a `chat` like way. It makes it very easy to host a service or a set of functions to be used by anyone, even if your service is running behind NAT. RMB is (reliable message bus) is a set of protocols and a `relay` server that aims to abstract inter-process communication between multiple processes running over multiple nodes.
Out of the box RMB provides the following: The point behind using RMB is to allow the clients to not know much about the other process, or where it lives (client doesn't know network addresses, or identity). Unlike HTTP(S) where the caller must know exact address (or dns-name) and endpoints of the calls. Instead RMB requires you to only know about
- Guarantee authenticity of the messages. You are always sure that the received message is from whoever is pretending to be - Twin ID (numeric ID) of where the service can be found
- End to End encryption - Command (string) is simply the function to call
- Support for 3rd party hosted relays. Anyone can host a relay and people can use it safely since there is no way messages can be inspected while using e2e. That's similar to `home` servers by `matrix` - The request "body" which is binary blob that is passed to the command as is
- implementation of the command need then to interpret this data as intended (out of scope of rmb)
![layout](img/layout.png) Twins are stored on tfchain. hence identity of twins is granted not to be spoofed, or phished. When a twin is created he needs to define 2 things:
## Why - RMB RELAYS
- His Elliptic Curve public key (we use secp256k1 (K-256) elliptic curve)
RMB is developed by ThreefoldTech to create a global network of nodes that are available to host capacity. Each node will act like a single bot where you can ask to host your capacity. This enforced a unique set of requirements: Once all twins has their data set correctly on the chain. Any 2 twins can communicate with full end-to-end encryption as follows:
- Communication needed to be reliable - A twin establish a WS connection to his relays
- Minimize and completely eliminate message loss - A twin create an `envelope` as defined by the protobuf schema
- Reduce downtime - Twin fill end all envelope information (more about this later)
- Node need to authenticate and authorize calls - Twin pushes the envelope to one of his relays
- Guarantee identity of the other peer so only owners of data can see it When received by the relay, it will determine whether to deliver the message to one of its directly connected clients or to a remote relay. the message processed as follows:
- Fast request response time - If the destination twin is also using the same relay, local route will have priority over others and message is directly forwarded to this twin.
- If federation is needed (twin using different relay), message is forwarded to one of the twin's relays.
Starting from this we came up with a more detailed requirements: Any new messages that is designated to this twin, is pushed over the websocket to this twin. The twin can NOT maintain multiple connections to same relay hence a small tool (rmb-peer) is provided that runs as a dispatcher for a single twin identity.
- User (or rather bots) need their identity maintained by `tfchain` (a blockchain) hence each bot needs an account on tfchain to be able to use `rmb` This rmb-peer tool makes it possible to run multiple services behind this twin and push replies back to their initiators
- Then each message then can be signed by the `bot` keys, hence make it easy to verify the identity of the sender of a message. This is done both ways.
- To support federation (using 3rd party relays) we needed to add e2e encryption to make sure messages that are surfing the public internet can't be sniffed
- e2e encryption is done by deriving an encryption key from the same identity seed, and share the public key on `tfchain` hence it's available to everyone to use
## Specifications ## Overview of the Operation of RMB Relay
For details about protocol itself please check the [specs](rmb_specs.md). ![](./img/rmb_overview.png)
## How to Use RMB ### Connections
There are many ways to use `rmb` because it was built for `bots` and software to communicate. Hence, there is no mobile app for it for example, but instead a set of libraries where you can use to connect to the network, make chitchats with other bots then exit. The relay can maintain **MULTIPLE** connections per peer given that each connection has a unique **SID** (session id). But for each (twin-id, session-id) combo there can be only one connection. if a new connection with the same (twin-id, session-id) is created, the older connection is dropped.
Or you can keep the connection forever to answer other bots requests if you are providing a service. The `rmb-peer` process reserved the `None` sid. It connection with No session id, hence you can only run one `rmb-peer` per `twin` (identity). But the same twin (identity) can make other connection with other rmb clients (for example rmb-sdk-go direct client) to establish more connections with unique session ids.
## Libraries ### Federations
If there is a library in your preferred language, then you are in luck! Simply follow the library documentations to implement a service bot, or to make requests to other bots. Starting from version 1.1.0, the federation field has been deprecated, and the logic of federation has moved to happen in the relays. Relay is now responsible for determining whether to deliver the message to one of its directly connected clients or to a remote relay.
### Known Libraries Relay now has an in-memory ranking system to rank its known relays according to their known mean failure rate over a recent configured period of time (time window).
- Golang [rmb-sdk-go](https://github.com/threefoldtech/rmb-sdk-go) The ranking system used to give a hint to the router (when a twin has multiple configured relays on-chain) to try the relays that have a higher chance of working first, minimizing routing messages to services that failed recently (minimizing the latency).
- Typescript [rmb-sdk-ts](https://github.com/threefoldtech/rmb-sdk-ts)
### No Known Libraries The rank of a relay will heal over time because the system will only consider failures in the recent time frame, allowing the router to revisit the relay and distribute the load between all working services. For relays with the same failure rate, the order will be randomized.
If there are no library in your preferred language, here's what you can do: The ranker time window can be configured when starting the relay by specifying the period in seconds after the `--ranker_period` option. If the option is omitted, the default value of one hour will be used.
- Implement a library in your preferred language Example:
- If it's too much to do all the signing, verification, e2e in your language then use `rmb-peer`
## What is rmb-peer ```
rmb-relay --substrate wss://tfchain.dev.grid.tf:443 --domain r1.3x0.me --ranker-period 1800
think of `rmb-peer` as a gateway that stands between you and the `relay`. `rmb-peer` uses your mnemonics (your identity secret key) to assume your identity and it connects to the relay on your behalf, it maintains the connection forever and takes care of
- reconnecting if connection was lost
- verifying received messages
- decrypting received messages
- sending requests on your behalf, taking care of all crypto heavy lifting.
Then it provide a simple (plain-text) api over `redis`. means to send messages (or handle requests) you just need to be able to push and pop messages from some redis queues. Messages are simple plain text json.
> More details can be found [here](rmb_specs.md)
## Download
Please check the latest [releases](https://github.com/threefoldtech/rmb-rs/releases) normally you only need the `rmb-peer` binary, unless you want to host your own relay.
## Building
```bash
git clone git@github.com:threefoldtech/rmb-rs.git
cd rmb-rs
cargo build --release --target=x86_64-unknown-linux-musl
``` ```
## Running tests ### Peer
While inside the repository Any language or code that can open `WebSocket` connection to the relay can work as a peer. A peer need to do the following:
- Authenticate with the relay. This is by providing a `JWT` that is signed by the twin key (more on that later)
- Handle received binary mesasge
- Send binary messages
Each message is an object of type `Envelope` serialized as with protobuf. Type definition can be found under `proto/types.proto`
### Peer Implementation
This project already have a peer implementation that works as local peer gateway. By running this peer instance it allows you to
run multiple services (and clients) behind that gateway and they appear to the world as a single twin.
- The peer gateway (rmb-peer) starts and connects to his relays
- If requests are received, they are verified, decrypted and pushed to a redis queue that as command specific (from the envelope)
- A service can then be waiting on this redis queue for new messages
- The service can process the command, and push a response back to a specific redis queue for responses.
- The gateway can then pull ready responses from the responses queue, create a valid envelope, encrypt, and sign and send to destination
![](./img/rmb_peer.png)
#### `rmb-peer` message types
To make it easy for apps to work behind an `rmb-peer`, we use JSON message for communication between the local process and the rmb-peer. the rmb-peer still
maintains a fully binary communication with the relay.
A request message is defined as follows
##### Output Requests
This is created by a client who wants to request make a request to a remote service
> this message is pushed to `msgbus.system.local` to be picked up by the peer
```rust
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct JsonOutgoingRequest {
#[serde(rename = "ver")]
pub version: usize,
#[serde(rename = "ref")]
pub reference: Option<String>,
#[serde(rename = "cmd")]
pub command: String,
#[serde(rename = "exp")]
pub expiration: u64,
#[serde(rename = "dat")]
pub data: String,
#[serde(rename = "tag")]
pub tags: Option<String>,
#[serde(rename = "dst")]
pub destinations: Vec<u32>,
#[serde(rename = "ret")]
pub reply_to: String,
#[serde(rename = "shm")]
pub schema: String,
#[serde(rename = "now")]
pub timestamp: u64,
}
```
##### Incoming Response
A response message is defined as follows this is what is received as a response by a client in response to his outgoing request.
> this response is what is pushed to `$ret` queue defined by the outgoing request, hence the client need to wait on this queue until the response is received or it times out
```rust
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct JsonError {
pub code: u32,
pub message: String,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct JsonIncomingResponse {
#[serde(rename = "ver")]
pub version: usize,
#[serde(rename = "ref")]
pub reference: Option<String>,
#[serde(rename = "dat")]
pub data: String,
#[serde(rename = "src")]
pub source: String,
#[serde(rename = "shm")]
pub schema: Option<String>,
#[serde(rename = "now")]
pub timestamp: u64,
#[serde(rename = "err")]
pub error: Option<JsonError>,
}
```
##### Incoming Request
An incoming request is a modified version of the request that is received by a service running behind RMB peer
> this request is received on `msgbus.${request.cmd}` (always prefixed with `msgbus`)
```rust
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct JsonIncomingRequest {
#[serde(rename = "ver")]
pub version: usize,
#[serde(rename = "ref")]
pub reference: Option<String>,
#[serde(rename = "src")]
pub source: String,
#[serde(rename = "cmd")]
pub command: String,
#[serde(rename = "exp")]
pub expiration: u64,
#[serde(rename = "dat")]
pub data: String,
#[serde(rename = "tag")]
pub tags: Option<String>,
#[serde(rename = "ret")]
pub reply_to: String,
#[serde(rename = "shm")]
pub schema: String,
#[serde(rename = "now")]
pub timestamp: u64,
}
```
Services that receive this needs to make sure their responses `destination` to have the same value as the incoming request `source`
##### Outgoing Response
A response message is defined as follows this is what is sent as a response by a service in response to an incoming request.
Your bot (server) need to make sure to set `destination` to the same value as the incoming request `source`
> This response is what is pushed to `msgbus.system.reply`
```rust
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct JsonOutgoingResponse {
#[serde(rename = "ver")]
pub version: usize,
#[serde(rename = "ref")]
pub reference: Option<String>,
#[serde(rename = "dat")]
pub data: String,
#[serde(rename = "dst")]
pub destination: String,
#[serde(rename = "shm")]
pub schema: Option<String>,
#[serde(rename = "now")]
pub timestamp: u64,
#[serde(rename = "err")]
pub error: Option<JsonError>,
}
```
## End2End Encryption
Relay is totally opaque to the messages. Our implementation of the relay does not poke into messages except for the routing attributes (source, and destinations addresses, and federation information). But since the relay is designed to be hosted by other 3rd parties (hence federation) you should
not fully trust the relay or whoever is hosting it. Hence e2e was needed
As you already understand e2e is completely up to the peers to implement, and even other implementations of the peers can agree on a completely different encryption algorithm and key sharing algorithm (again, relay does not care). But in our implementation of the e2e (rmb-peer) things goes like this
- Each twin has a `pk` field on tfchain. when rmb-peer start, it generates an `secp256k1` key from the same seed as the user tfchain mnemonics. Note that this will not make the encryption key and the signing key any related, they just are driven from the same seed.
- On start, if the key is not already set on the twin object, the key is updated.
- If a peer A is trying to send a message to peer B. but peer B does not has his `pk` set, peer A will send the message in plain-text format (please check the protobuf envelope type for details)
- If peer B has public key set, peer A will prefer e2e encryption and will does the following:
- Drive a shared secret point with `ecdh` algorithm, the key is the `sha256` of that point
- `shared = ecdh(A.sk, B.pk)`
- create a 12 bytes random nonce
- encrypt data as `encrypted = aes-gcm.encrypt(shared-key, nonce, plain-data)`
- create cipher as `cipher nonce + encrypted`
- fill `envelope.cipher = cipher`
- on receiving a message peer B does the same in the opposite direction
- split data and nonce (nonce is always first 12 bytes)
- derive the same shared key
- `shared = ecdh(B.sk, A.pk)`
- `plain-data = aes-gcm.decrypt(shared-key, nonce, encrypted)`
### Rate Limiting
To avoid abuse of the server, and prevent DoS attacks on the relay, a rate limiter is used to limit the number of clients' requests.\
It was decided that the rate limiter should only watch websocket connections of users, since all other requests/connections with users consume little resources, and since the relay handles the max number of users inherently.\
The limiter's configurations are passed as a command line argument `--limit <count>, <size>`. `<count>` represents the number of messages a twin is allowed to send in each time window, `<size>` represents the total size of messages in bytes a twin is allowed to send in each time window.\
Currently there are two implementations of the rate limiter:
- `NoLimit` which imposes no limits on users.
- `FixedWindowLimiter` which breaks the timeline into fixed time windows, and allows a twin to send a fixed number of messages, with a fixed total size, in each time window. If a twin exceeded their limits in some time window, their message is dropped, an error message is sent back to the user, the relay dumps a log about this twin, and the user gets to keep their connection with the relay.
### Substrate Connections
To make the relay and peer more reliable, the substrate client accepts multiple substrate urls.
> To provide multiple urls use the `--substrate <url>` command line argument multiple times.
Example:
```bash ```bash
cargo test rmb-peer --substrate wss://tfchain.grid.tf:443 --substrate wss://02.tfchain.grid.tf:443 --substrate wss://03.tfchain.grid.tf:443
``` ```
It's important to note the only one substrate client is held at a time, and the other urls are only used in the case of a network failure.\
This way, if a substrate connection failed, other urls are used to try to connect to substrate.\
The client uses iterates between urls in a Round Robin fashion, and tries to reconnect. If a specified number of trials is done (currently 2x the number of urls) and none of them was successful, the client fails and returns and error.
### Redundancy and Failover
Starting from version 1.1.0, RMB has integrated redundancy and failover into the system to achieve high availability.
This is done by allowing RMB-peer to set more than one relay domain for a twin on-chain and establish connections with several redundant relays at the same time.
Enabling failover ensures that communication between twins can continue even if one of the relays fails, as the client will eventually route the message to its destination through another operational relay.
Example:
```bash
rmb-peer -m "{MNEMONIC}" --substrate wss://tfchain.dev.grid.tf:443 --relay wss://r1.dev.grid.tf --relay wss://r2.dev.grid.tf
```

View File

@ -13,6 +13,7 @@ Out of the box RMB provides the following:
<h2> Table of Contents </h2> <h2> Table of Contents </h2>
- [Introduction to RMB](rmb_intro.md) - [Introduction to RMB](rmb_intro.md)
- [Coding Guides](rmb_coding_guides.md)
- [RMB Specs](rmb_specs.md) - [RMB Specs](rmb_specs.md)
- [RMB Peer](peer.md) - [RMB Peer](peer.md)
- [RMB Relay](relay.md) - [RMB Relay](relay.md)

View File

@ -1,4 +1,4 @@
<h1> RMB Peer </h1> <h1> RMB Relay </h1>
<h2> Table of Contents </h2> <h2> Table of Contents </h2>

View File

@ -33,9 +33,6 @@
- [TF Connect App, TF Dashboard, GraphQL, Grix Proxy and Polkadot Substrate](#tf-connect-app-tf-dashboard-graphql-grix-proxy-and-polkadot-substrate) - [TF Connect App, TF Dashboard, GraphQL, Grix Proxy and Polkadot Substrate](#tf-connect-app-tf-dashboard-graphql-grix-proxy-and-polkadot-substrate)
- [Is there a way to create or import another wallet in TF Connect App?](#is-there-a-way-to-create-or-import-another-wallet-in-tf-connect-app) - [Is there a way to create or import another wallet in TF Connect App?](#is-there-a-way-to-create-or-import-another-wallet-in-tf-connect-app)
- [I created a farm on the TF Chain. On the TF Connect App Farmer Migration section, my farm is under Other v3 farms, is this normal?](#i-created-a-farm-on-the-tf-chain-on-the-tf-connect-app-farmer-migration-section-my-farm-is-under-other-v3-farms-is-this-normal) - [I created a farm on the TF Chain. On the TF Connect App Farmer Migration section, my farm is under Other v3 farms, is this normal?](#i-created-a-farm-on-the-tf-chain-on-the-tf-connect-app-farmer-migration-section-my-farm-is-under-other-v3-farms-is-this-normal)
- [I am trying to access my wallet in the ThreeFold Connect App. It worked fine before, but now I just get a white screen. What does it mean and what can I do?](#i-am-trying-to-access-my-wallet-in-the-threefold-connect-app-it-worked-fine-before-but-now-i-just-get-a-white-screen-what-does-it-mean-and-what-can-i-do)
- [When I open the ThreeFold Connect App, I get the error: Error in initialization in Flagsmith. How can I fix this issue?](#when-i-open-the-threefold-connect-app-i-get-the-error-error-in-initialization-in-flagsmith-how-can-i-fix-this-issue)
- [Apart form the ThreeFold Connect App Wallet, how can I check my TFT balance?](#apart-form-the-threefold-connect-app-wallet-how-can-i-check-my-tft-balance)
- [Is it possible to export the transaction history of a wallet to a CSV file?](#is-it-possible-to-export-the-transaction-history-of-a-wallet-to-a-csv-file) - [Is it possible to export the transaction history of a wallet to a CSV file?](#is-it-possible-to-export-the-transaction-history-of-a-wallet-to-a-csv-file)
- [How can I use GraphQl to find information on the ThreeFold Grid?](#how-can-i-use-graphql-to-find-information-on-the-threefold-grid) - [How can I use GraphQl to find information on the ThreeFold Grid?](#how-can-i-use-graphql-to-find-information-on-the-threefold-grid)
- [What are the different links to ThreeFold's Graph QL depending on the network?](#what-are-the-different-links-to-threefolds-graph-ql-depending-on-the-network) - [What are the different links to ThreeFold's Graph QL depending on the network?](#what-are-the-different-links-to-threefolds-graph-ql-depending-on-the-network)
@ -44,7 +41,6 @@
- [How can I use Grid Proxy to find information on the ThreeFold Grid and 3Nodes?](#how-can-i-use-grid-proxy-to-find-information-on-the-threefold-grid-and-3nodes) - [How can I use Grid Proxy to find information on the ThreeFold Grid and 3Nodes?](#how-can-i-use-grid-proxy-to-find-information-on-the-threefold-grid-and-3nodes)
- [Who is hosting GraphQL and Grid Proxy on the ThreeFold Grid?](#who-is-hosting-graphql-and-grid-proxy-on-the-threefold-grid) - [Who is hosting GraphQL and Grid Proxy on the ThreeFold Grid?](#who-is-hosting-graphql-and-grid-proxy-on-the-threefold-grid)
- [What is the difference between uptime, status and power state?](#what-is-the-difference-between-uptime-status-and-power-state) - [What is the difference between uptime, status and power state?](#what-is-the-difference-between-uptime-status-and-power-state)
- [I do not remember the name - ThreeFold 3bot ID - associated with my seed phrase on the ThreeFold Connect app. Can I recover my TF Connect app account with only the seed phrase and not the name, 3bot ID, associated with it?](#i-do-not-remember-the-name---threefold-3bot-id---associated-with-my-seed-phrase-on-the-threefold-connect-app-can-i-recover-my-tf-connect-app-account-with-only-the-seed-phrase-and-not-the-name-3bot-id-associated-with-it)
- [USERS FAQ](#users-faq) - [USERS FAQ](#users-faq)
- [TF Grid Functionalities](#tf-grid-functionalities) - [TF Grid Functionalities](#tf-grid-functionalities)
- [What are the type of storage available on TF Grid?](#what-are-the-type-of-storage-available-on-tf-grid) - [What are the type of storage available on TF Grid?](#what-are-the-type-of-storage-available-on-tf-grid)
@ -81,9 +77,6 @@
- [Users Troubleshooting and Error Messages](#users-troubleshooting-and-error-messages) - [Users Troubleshooting and Error Messages](#users-troubleshooting-and-error-messages)
- [When deploying a virtual machine (VM) on the ThreeFold Grid, I get the following message after trying a full system update and upgrade: GRUB failed to install to the following devices... Is there a fix to this issue?](#when-deploying-a-virtual-machine-vm-on-the-threefold-grid-i-get-the-following-message-after-trying-a-full-system-update-and-upgrade-grub-failed-to-install-to-the-following-devices-is-there-a-fix-to-this-issue) - [When deploying a virtual machine (VM) on the ThreeFold Grid, I get the following message after trying a full system update and upgrade: GRUB failed to install to the following devices... Is there a fix to this issue?](#when-deploying-a-virtual-machine-vm-on-the-threefold-grid-i-get-the-following-message-after-trying-a-full-system-update-and-upgrade-grub-failed-to-install-to-the-following-devices-is-there-a-fix-to-this-issue)
- [While deploying on the TF Dashboard, I get the following error :"global workload with the same name exists: conflict". What can I do to fix this issue?](#while-deploying-on-the-tf-dashboard-i-get-the-following-error-global-workload-with-the-same-name-exists-conflict-what-can-i-do-to-fix-this-issue) - [While deploying on the TF Dashboard, I get the following error :"global workload with the same name exists: conflict". What can I do to fix this issue?](#while-deploying-on-the-tf-dashboard-i-get-the-following-error-global-workload-with-the-same-name-exists-conflict-what-can-i-do-to-fix-this-issue)
- [ThreeFold Connect App](#threefold-connect-app)
- [TF Connect App is now asking for a 4-digit password (PIN). I don't remember it as I usually use touch or face ID to unlock the app. What can I do?](#tf-connect-app-is-now-asking-for-a-4-digit-password-pin-i-dont-remember-it-as-i-usually-use-touch-or-face-id-to-unlock-the-app-what-can-i-do)
- [Is there a way to have more than one wallet in TF Connect App?](#is-there-a-way-to-have-more-than-one-wallet-in-tf-connect-app)
- [What is the difference between 10.x.y.z and 192.168.x.y addresses?](#what-is-the-difference-between-10xyz-and-192168xy-addresses) - [What is the difference between 10.x.y.z and 192.168.x.y addresses?](#what-is-the-difference-between-10xyz-and-192168xy-addresses)
- [DEVELOPERS FAQ](#developers-faq) - [DEVELOPERS FAQ](#developers-faq)
- [General Information for Developer](#general-information-for-developer) - [General Information for Developer](#general-information-for-developer)
@ -117,7 +110,6 @@
- [When it comes to the Zero-OS bootstrap image, can I simply duplicate the first image I burnt when I build another 3Node?](#when-it-comes-to-the-zero-os-bootstrap-image-can-i-simply-duplicate-the-first-image-i-burnt-when-i-build-another-3node) - [When it comes to the Zero-OS bootstrap image, can I simply duplicate the first image I burnt when I build another 3Node?](#when-it-comes-to-the-zero-os-bootstrap-image-can-i-simply-duplicate-the-first-image-i-burnt-when-i-build-another-3node)
- [If a node is unused for certain time, e.g. many months offline, will it be erased by the Grid?](#if-a-node-is-unused-for-certain-time-eg-many-months-offline-will-it-be-erased-by-the-grid) - [If a node is unused for certain time, e.g. many months offline, will it be erased by the Grid?](#if-a-node-is-unused-for-certain-time-eg-many-months-offline-will-it-be-erased-by-the-grid)
- [Can a farm be erased from TF Grid?](#can-a-farm-be-erased-from-tf-grid) - [Can a farm be erased from TF Grid?](#can-a-farm-be-erased-from-tf-grid)
- [On the ThreeFold Connect App, it says I need to migrate my Titan farm from V2 to V3. What do I have to do? How long does this take?](#on-the-threefold-connect-app-it-says-i-need-to-migrate-my-titan-farm-from-v2-to-v3-what-do-i-have-to-do-how-long-does-this-take)
- [How can I migrate my DIY farm from V2 to V3?](#how-can-i-migrate-my-diy-farm-from-v2-to-v3) - [How can I migrate my DIY farm from V2 to V3?](#how-can-i-migrate-my-diy-farm-from-v2-to-v3)
- [What does the pricing policy ID of a farm represent?](#what-does-the-pricing-policy-id-of-a-farm-represent) - [What does the pricing policy ID of a farm represent?](#what-does-the-pricing-policy-id-of-a-farm-represent)
- [What is the difference between TiB and TB? Why doesn't the TF Explorer shows the same storage space as my disk?](#what-is-the-difference-between-tib-and-tb-why-doesnt-the-tf-explorer-shows-the-same-storage-space-as-my-disk) - [What is the difference between TiB and TB? Why doesn't the TF Explorer shows the same storage space as my disk?](#what-is-the-difference-between-tib-and-tb-why-doesnt-the-tf-explorer-shows-the-same-storage-space-as-my-disk)
@ -204,55 +196,12 @@
- [My 3Node lost power momentarily and I had to power it back on manually. Is there a better way to proceed?](#my-3node-lost-power-momentarily-and-i-had-to-power-it-back-on-manually-is-there-a-better-way-to-proceed) - [My 3Node lost power momentarily and I had to power it back on manually. Is there a better way to proceed?](#my-3node-lost-power-momentarily-and-i-had-to-power-it-back-on-manually-is-there-a-better-way-to-proceed)
- [Do I need to change the battery BIOS?](#do-i-need-to-change-the-battery-bios) - [Do I need to change the battery BIOS?](#do-i-need-to-change-the-battery-bios)
- [Do I need to enable UEFI Network Stack?](#do-i-need-to-enable-uefi-network-stack) - [Do I need to enable UEFI Network Stack?](#do-i-need-to-enable-uefi-network-stack)
- [I want redundancy of power for my 3 nodes. I have two PSU on my Dell server. What can I do?](#i-want-redundancy-of-power-for-my-3-nodes-i-have-two-psu-on-my-dell-server-what-can-i-do)
- [Why isn't there support for RAID? Does Zero-OS work with RAID?](#why-isnt-there-support-for-raid-does-zero-os-work-with-raid) - [Why isn't there support for RAID? Does Zero-OS work with RAID?](#why-isnt-there-support-for-raid-does-zero-os-work-with-raid)
- [Is there a way to bypass RAID in order for Zero-OS to have bare metals on the system - No RAID controller in between storage and the Grid ?](#is-there-a-way-to-bypass-raid-in-order-for-zero-os-to-have-bare-metals-on-the-system---no-raid-controller-in-between-storage-and-the-grid-)
- [I have a 3Node rack server. Is it possible to use a M.2 to SATA adapter in order to put the M.2 SATA disk in the HDD bay onboard storage?](#i-have-a-3node-rack-server-is-it-possible-to-use-a-m2-to-sata-adapter-in-order-to-put-the-m2-sata-disk-in-the-hdd-bay-onboard-storage) - [I have a 3Node rack server. Is it possible to use a M.2 to SATA adapter in order to put the M.2 SATA disk in the HDD bay onboard storage?](#i-have-a-3node-rack-server-is-it-possible-to-use-a-m2-to-sata-adapter-in-order-to-put-the-m2-sata-disk-in-the-hdd-bay-onboard-storage)
- [My 3Node uses only PCIe adapters and SSD NVME disks. Do I need the RAID controller on?](#my-3node-uses-only-pcie-adapters-and-ssd-nvme-disks-do-i-need-the-raid-controller-on)
- [Can I change the name of my farm on polkadot.js?](#can-i-change-the-name-of-my-farm-on-polkadotjs) - [Can I change the name of my farm on polkadot.js?](#can-i-change-the-name-of-my-farm-on-polkadotjs)
- [How can I delete a farm on polkadot.js?](#how-can-i-delete-a-farm-on-polkadotjs) - [How can I delete a farm on polkadot.js?](#how-can-i-delete-a-farm-on-polkadotjs)
- [I try to delete a node on the TF Dashboard, but it doesnt work. Is there any other way to proceed that could work?](#i-try-to-delete-a-node-on-the-tf-dashboard-but-it-doesnt-work-is-there-any-other-way-to-proceed-that-could-work) - [I try to delete a node on the TF Dashboard, but it doesnt work. Is there any other way to proceed that could work?](#i-try-to-delete-a-node-on-the-tf-dashboard-but-it-doesnt-work-is-there-any-other-way-to-proceed-that-could-work)
- [My 3Node has 2 ethernet ports in the back, with one written AMT above, what does it mean? Can I use this port to connect my 3Node to the ThreeFold Grid?](#my-3node-has-2-ethernet-ports-in-the-back-with-one-written-amt-above-what-does-it-mean-can-i-use-this-port-to-connect-my-3node-to-the-threefold-grid)
- [My 3Node is based on a the hardware Z600, Z620 or Z820, can I run it headless or without a GPU?](#my-3node-is-based-on-a-the-hardware-z600-z620-or-z820-can-i-run-it-headless-or-without-a-gpu)
- [Is it possible to add high-level GPU on rack servers to farm more TFT?](#is-it-possible-to-add-high-level-gpu-on-rack-servers-to-farm-more-tft)
- [If I change farm, will my node IDs change on my 3Node servers?](#if-i-change-farm-will-my-node-ids-change-on-my-3node-servers) - [If I change farm, will my node IDs change on my 3Node servers?](#if-i-change-farm-will-my-node-ids-change-on-my-3node-servers)
- [Troubleshooting and Error Messages](#troubleshooting-and-error-messages)
- [Is it possible to access the Error Screen or Log Screen?](#is-it-possible-to-access-the-error-screen-or-log-screen)
- [What does it mean when I see, during the 3Node boot, the message: error = context deadline exceeded?](#what-does-it-mean-when-i-see-during-the-3node-boot-the-message-error--context-deadline-exceeded)
- [How can I fix the error messages: "context deadline exceeded" accompanied with "node is behind acceptable delay with timestamp"?](#how-can-i-fix-the-error-messages-context-deadline-exceeded-accompanied-with-node-is-behind-acceptable-delay-with-timestamp)
- [I try to boot a 3Node, but I get the error: "No Route to Host on Linux". What does it mean?](#i-try-to-boot-a-3node-but-i-get-the-error-no-route-to-host-on-linux-what-does-it-mean)
- [How can I fix the error: "Network configuration succeed but Zero-OS kernel could not be downloaded" when booting a 3Node?](#how-can-i-fix-the-error-network-configuration-succeed-but-zero-os-kernel-could-not-be-downloaded-when-booting-a-3node)
- [Using SAS disks, I get the error; "No ssd found, failed to register". What can I do to fix this?](#using-sas-disks-i-get-the-error-no-ssd-found-failed-to-register-what-can-i-do-to-fix-this)
- [When booting a 3Node, how to fix the error: "no disks: registration failed"?](#when-booting-a-3node-how-to-fix-the-error-no-disks-registration-failed)
- [My SSD is sometimes detected as HDD by Zero-OS when there is a reboot. Is there a fix or a way to test the SSD disk?](#my-ssd-is-sometimes-detected-as-hdd-by-zero-os-when-there-is-a-reboot-is-there-a-fix-or-a-way-to-test-the-ssd-disk)
- [When booting a 3Node, I get the message: failed to register node: failed to create node: failed to submit extrinsic: Invalid Transaction: registration failed. What could fix this?](#when-booting-a-3node-i-get-the-message-failed-to-register-node-failed-to-create-node-failed-to-submit-extrinsic-invalid-transaction-registration-failed-what-could-fix-this)
- [I try to boot a 3Node, but I get the message no route with default gateway found. What does it mean?](#i-try-to-boot-a-3node-but-i-get-the-message-no-route-with-default-gateway-found-what-does-it-mean)
- [I have trouble connecting the 3Node to the Grid with a 10GB NIC card. What can I do?](#i-have-trouble-connecting-the-3node-to-the-grid-with-a-10gb-nic-card-what-can-i-do)
- [I switch the ethernet cable to a different port when my 3Node was running. Internet connection is lost. What can I do?](#i-switch-the-ethernet-cable-to-a-different-port-when-my-3node-was-running-internet-connection-is-lost-what-can-i-do)
- [I get the error Certificate is not yet valid when booting my 3Node server, what can I do?](#i--get-the-error-certificate-is-not-yet-valid-when-booting-my-3node-server-what-can-i-do)
- [When running wipefs to wipe my disks on Linux, I get either of the following errors: "syntax error near unexpected token" or "Probing Initialized Failed". Is there a fix?](#when-running-wipefs-to-wipe-my-disks-on-linux-i-get-either-of-the-following-errors-syntax-error-near-unexpected-token-or-probing-initialized-failed-is-there-a-fix)
- [I did a format on my SSD disk, but Zero-OS still does not recognize them. What's wrong?](#i-did-a-format-on-my-ssd-disk-but-zero-os-still-does-not-recognize-them-whats-wrong)
- [I have a Dell Rx10 server - R610, 710, 910. When I boot Zero-OS I get the message Probing EDD and the 3Node doesn't boot from there. What can I do?](#i-have-a-dell-rx10-server---r610-710-910-when-i-boot-zero-os-i-get-the-message-probing-edd-and-the-3node-doesnt-boot-from-there-what-can-i-do)
- [My 3Node doesn't boot properly without a monitor plugged in. What can I do?](#my-3node-doesnt-boot-properly-without-a-monitor-plugged-in-what-can-i-do)
- [My 3Node is running on the Grid, but when I plugged in the monitor, it states: Disabling IR #16. Is there a problem?](#my-3node-is-running-on-the-grid-but-when-i-plugged-in-the-monitor-it-states-disabling-ir-16-is-there-a-problem)
- [My 3Node won't boot without disabling the Secure Boot option, is it safe?](#my-3node-wont-boot-without-disabling-the-secure-boot-option-is-it-safe)
- [When I tried to boot my 3Node, at some point the screen went black, with or without a blinking hyphen or dash. What could cause this and what could I do to resolve the issue?](#when-i-tried-to-boot-my-3node-at-some-point-the-screen-went-black-with-or-without-a-blinking-hyphen-or-dash-what-could-cause-this-and-what-could-i-do-to-resolve-the-issue)
- [My 3Nodes go offline after a modem reboot. Is there a way to prevent this?](#my-3nodes-go-offline-after-a-modem-reboot-is-there-a-way-to-prevent-this)
- [When I boot my 3Node, it reaches the Welcome to Zero-OS window, but it doesn't boot properly and there's an error message: failed to load object : type substrate..., what can I do?](#when-i-boot-my-3node-it-reaches-the-welcome-to-zero-os-window-but-it-doesnt-boot-properly-and-theres-an-error-message-failed-to-load-object--type-substrate-what-can-i-do)
- [When I try to access iDRAC on a web browswer, even with protected mode off, I get the error The webpage cannot be found, what can I do?](#when-i-try-to-access-idrac-on-a-web-browswer-even-with-protected-mode-off-i-get-the-error-the-webpage-cannot-be-found-what-can-i-do)
- [When booting the 3Node, I get the error Network interface detected but autoconfiguration failed. What can I do?](#when-booting-the-3node-i-get-the-error-network-interface-detected-but-autoconfiguration-failed-what-can-i-do)
- [When I boot my Dell server, I get the message: All of the disks from your previous configuration are gone... Press any key to continue or 'C' to load the configuration utility. What can I do?](#when-i-boot-my-dell-server-i-get-the-message-all-of-the-disks-from-your-previous-configuration-are-gone-press-any-key-to-continue-or-c-to-load-the-configuration-utility-what-can-i-do)
- [I have a Dell R620. In Zero-OS, I get the failure message No network card found and then the 3Node reebots after few seconds. The same happens for every LAN input. What can I do?](#i-have-a-dell-r620-in-zero-os-i-get-the-failure-message-no-network-card-found-and-then-the-3node-reebots-after-few-seconds-the-same-happens-for-every-lan-input-what-can-i-do)
- [I am using freeDos to crossflash my raid controller on a Dell server, but I can't see the RAID controller with the Command Info. What can I do?](#i-am-using-freedos-to-crossflash-my-raid-controller-on-a-dell-server-but-i-cant-see-the-raid-controller-with-the-command-info-what-can-i-do)
- [Can I use a VGA to HDMI adaptor to connect a TV screen or monitor to the 3Node? I tried to boot a 3Node with a VGA to HDMI adaptor but the boot fails, what can I do?](#can-i-use-a-vga-to-hdmi-adaptor-to-connect-a-tv-screen-or-monitor-to-the-3node-i-tried-to-boot-a-3node-with-a-vga-to-hdmi-adaptor-but-the-boot-fails-what-can-i-do)
- [When I try to boot my 3Node, the fans start spinning fast with a loud noise and the screen is black. What can I do to resolve this?](#when-i-try-to-boot-my-3node-the-fans-start-spinning-fast-with-a-loud-noise-and-the-screen-is-black-what-can-i-do-to-resolve-this)
- [When booting Zero-OS with IPV6 configurations, I get the errors (1) dial tcp: address IPV6-address too many columns in address and (2) no pools matches key: not routable. What can I do to fix this issue?](#when-booting-zero-os-with-ipv6-configurations-i-get-the-errors-1-dial-tcp-address-ipv6-address-too-many-columns-in-address-and-2-no-pools-matches-key-not-routable-what-can-i-do-to-fix-this-issue)
- [When booting a 3Node, Zero-OS downloads fine, but then I get the message: error no route with default gateway found, and the message: info check if interface has a cable plugged in. What could fix this?](#when-booting-a-3node-zero-os-downloads-fine-but-then-i-get-the-message-error-no-route-with-default-gateway-found-and-the-message-info-check-if-interface-has-a-cable-plugged-in-what-could-fix-this)
- [How can I update Dell and HP servers to Intel E5-2600v2, E5-2400v2 and E5-4600v2, when applicable?](#how-can-i-update-dell-and-hp-servers-to-intel-e5-2600v2-e5-2400v2-and-e5-4600v2-when-applicable)
- [How can I update the firmware and driver of a Dell PowerEdge server?](#how-can-i-update-the-firmware-and-driver-of-a-dell-poweredge-server)
- [When I boot a 3Node in UEFI mode, it gets stuck at: Initializing Network Device, is there a way to fix this?](#when-i-boot-a-3node-in-uefi-mode-it-gets-stuck-at-initializing-network-device-is-there-a-way-to-fix-this)
- [When I boot my 3Node, it gets stuck during the Zero-OS download. It never reaches 100%. What can I do to fix this issue?](#when-i-boot-my-3node-it-gets-stuck-during-the-zero-os-download-it-never-reaches-100-what-can-i-do-to-fix-this-issue)
- [When booting a 3Node, I get the error=“context deadline exceeded” module=network error=failed to initialize rmb api failed to initialized admin mw: failed to get farm: farm not found: object not found. What can I do to fix this issue?](#when-booting-a-3node-i-get-the-errorcontext-deadline-exceeded-modulenetwork-errorfailed-to-initialize-rmb-api-failed-to-initialized-admin-mw-failed-to-get-farm-farm-not-found-object-not-found-what-can-i-do-to-fix-this-issue)
- [ThreeFold Grid and Data](#threefold-grid-and-data) - [ThreeFold Grid and Data](#threefold-grid-and-data)
- [How is the farming minting reward calculated? Is the Grid always monitoring my 3Node?](#how-is-the-farming-minting-reward-calculated-is-the-grid-always-monitoring-my-3node) - [How is the farming minting reward calculated? Is the Grid always monitoring my 3Node?](#how-is-the-farming-minting-reward-calculated-is-the-grid-always-monitoring-my-3node)
- [How does communication happen on the ThreeFold Grid at the 3Node's level?](#how-does-communication-happen-on-the-threefold-grid-at-the-3nodes-level) - [How does communication happen on the ThreeFold Grid at the 3Node's level?](#how-does-communication-happen-on-the-threefold-grid-at-the-3nodes-level)
@ -261,15 +210,6 @@
- [How does the Telegram Status Bot get information from my 3Node? My 3Node is online on the ThreeFold Node Finder, but offline on the Telegram Status Bot, is this normal?](#how-does-the-telegram-status-bot-get-information-from-my-3node-my-3node-is-online-on-the-threefold-node-finder-but-offline-on-the-telegram-status-bot-is-this-normal) - [How does the Telegram Status Bot get information from my 3Node? My 3Node is online on the ThreeFold Node Finder, but offline on the Telegram Status Bot, is this normal?](#how-does-the-telegram-status-bot-get-information-from-my-3node-my-3node-is-online-on-the-threefold-node-finder-but-offline-on-the-telegram-status-bot-is-this-normal)
- [I noticed that when I reboot my 3Node, the uptime counter on the ThreeFold Node Finder goes back to zero. Does it mean I lose uptime and the uptime start over again when I reboot the 3Node?](#i-noticed-that-when-i-reboot-my-3node-the-uptime-counter-on-the-threefold-node-finder-goes-back-to-zero-does-it-mean-i-lose-uptime-and-the-uptime-start-over-again-when-i-reboot-the-3node) - [I noticed that when I reboot my 3Node, the uptime counter on the ThreeFold Node Finder goes back to zero. Does it mean I lose uptime and the uptime start over again when I reboot the 3Node?](#i-noticed-that-when-i-reboot-my-3node-the-uptime-counter-on-the-threefold-node-finder-goes-back-to-zero-does-it-mean-i-lose-uptime-and-the-uptime-start-over-again-when-i-reboot-the-3node)
- [One of my nodes is showing the wrong location. Any problem with that?](#one-of-my-nodes-is-showing-the-wrong-location-any-problem-with-that) - [One of my nodes is showing the wrong location. Any problem with that?](#one-of-my-nodes-is-showing-the-wrong-location-any-problem-with-that)
- [Memory](#memory)
- [Can I use different type of RAM for the same 3Node?](#can-i-use-different-type-of-ram-for-the-same-3node)
- [How can I know if the memory I am buying is correct for my specific hardware?](#how-can-i-know-if-the-memory-i-am-buying-is-correct-for-my-specific-hardware)
- [What do the terms RDIMM, LDIMM, UDIMM, LRDIMM, FBDIMM mean when it comes to RAM memory sticks?](#what-do-the-terms-rdimm-ldimm-udimm-lrdimm-fbdimm-mean-when-it-comes-to-ram-memory-sticks)
- [What is the difference between ECC and non-ECC memory?](#what-is-the-difference-between-ecc-and-non-ecc-memory)
- [How can I change the RAM memory sticks on my 3Nodes? How can I achieve dual channel configuration with sticks of RAM?](#how-can-i-change-the-ram-memory-sticks-on-my-3nodes-how-can-i-achieve-dual-channel-configuration-with-sticks-of-ram)
- [What does RAM mean?](#what-does-ram-mean)
- [What does DIMM mean when it comes to RAM sticks?](#what-does-dimm-mean-when-it-comes-to-ram-sticks)
- [I have 24 DIMMS ram slots on my server. Can I use them all?](#i-have-24-dimms-ram-slots-on-my-server-can-i-use-them-all)
- [Ask a Question to the ThreeFold Community](#ask-a-question-to-the-threefold-community) - [Ask a Question to the ThreeFold Community](#ask-a-question-to-the-threefold-community)
*** ***
@ -468,28 +408,6 @@ The TF Connect App supports Stellar and TF Chain wallets. The app by default can
Yes this is normal. Farms created on TF Chain instead of the TF Connect App will appear in *Other v3 farms*. Yes this is normal. Farms created on TF Chain instead of the TF Connect App will appear in *Other v3 farms*.
### I am trying to access my wallet in the ThreeFold Connect App. It worked fine before, but now I just get a white screen. What does it mean and what can I do?
On the TF Connect App, when you get a white screen, it means that there is a connection issue. It can help to try other networks; maybe try switching between ethernet cable or wifi. Or you can also try it later when the connection might be more stable.
### When I open the ThreeFold Connect App, I get the error: Error in initialization in Flagsmith. How can I fix this issue?
To fix this Flagsmith error message on the ThreeFold Connect app, you can try the following methods:
* Check your internet connection
* Update your phone current operating system (OS) version
* Update the date and time on your phone
### Apart form the ThreeFold Connect App Wallet, how can I check my TFT balance?
You can go on [Stellar.Expert](https://stellar.expert). With your wallet address, you will be able to see your transactions and wallet details.
### Is it possible to export the transaction history of a wallet to a CSV file? ### Is it possible to export the transaction history of a wallet to a CSV file?
Yes, every blockchain has an explorer function and these explorer functions allow you to see transactions and export them. TFT is on 2 chains at the moment: Stellar and Polkadot. Yes, every blockchain has an explorer function and these explorer functions allow you to see transactions and export them. TFT is on 2 chains at the moment: Stellar and Polkadot.
@ -620,15 +538,6 @@ There are three distinctly named endpoints or fields that exist in the back end
* Power state * Power state
* this is a field that only exists on GraphQL, and it's the self reported power state of the node. This only goes to "down" if the node shut itself down at request of the Farmerbot. * this is a field that only exists on GraphQL, and it's the self reported power state of the node. This only goes to "down" if the node shut itself down at request of the Farmerbot.
### I do not remember the name - ThreeFold 3bot ID - associated with my seed phrase on the ThreeFold Connect app. Can I recover my TF Connect app account with only the seed phrase and not the name, 3bot ID, associated with it?
If you forgot the name associated with your seed phrase on the TF Connect app, you can always create a new identity (ThreeFold 3bot ID) and import your wallet using the old seed phrase.
Since the Connect App is also used for identity and authentication, you need both the name (3bot ID) and seed phrase to fully recover your account. The wallet is only linked to the seed phrase and not the name (3bot ID).
# USERS FAQ # USERS FAQ
## TF Grid Functionalities ## TF Grid Functionalities
@ -1072,24 +981,6 @@ This should fix the issue.
This error happens if you deployed a workload on the TF Dashboard with the same deployment name of a previous deployment. In general, you can simply refresh the TF Dashboard browser page and/or change the deployment name for a new one. This should fix the issue. This error happens if you deployed a workload on the TF Dashboard with the same deployment name of a previous deployment. In general, you can simply refresh the TF Dashboard browser page and/or change the deployment name for a new one. This should fix the issue.
## ThreeFold Connect App
### TF Connect App is now asking for a 4-digit password (PIN). I don't remember it as I usually use touch or face ID to unlock the app. What can I do?
When you set up your the app, you are asked a 4-digit password (PIN). After some time, the app will be asking for this PIN when users may have been exclusively using touch/face ID. You can reset it by recovering the account with your seedphrase.
### Is there a way to have more than one wallet in TF Connect App?
Yes, this is perfectly possible. You can have multiple wallets in the TF Connect app. You can have multiple wallets for the Stellar network and multiple wallets for Polkadot Substrate.
For example, you can create a wallet on the Stellar Blockchain and import it on TF Connect App with the function *Import Wallet*. Just copy the seedphrase and it will be imported in TF Connect App.
Note: There will not be an automatic function in the app to create a new wallet. You must do it manually.
### What is the difference between 10.x.y.z and 192.168.x.y addresses? ### What is the difference between 10.x.y.z and 192.168.x.y addresses?
The addresses 10.x.y.z and 192.168.x.y are on the private network. The addresses 10.x.y.z and 192.168.x.y are on the private network.
@ -1309,14 +1200,6 @@ No, nodes only get deleted if the farm owner chooses to do so. Old "nodes" are r
No, this is not possible. In the future, we will implement some features in order to allow the cleaning of unused farms. As of now, this is not possible. Also, an old farm does not take resources on the TF Grid, or very little. No, this is not possible. In the future, we will implement some features in order to allow the cleaning of unused farms. As of now, this is not possible. Also, an old farm does not take resources on the TF Grid, or very little.
### On the ThreeFold Connect App, it says I need to migrate my Titan farm from V2 to V3. What do I have to do? How long does this take?
To migrate, read [this documentation](https://forum.threefold.io/t/what-to-do-if-your-farm-is-still-on-grid-v2-closed/3761).
### How can I migrate my DIY farm from V2 to V3? ### How can I migrate my DIY farm from V2 to V3?
Create a new [bootstrap image](https://bootstrap.grid.tf/) using your new V3 Farm ID. To create a new V3 Farm ID, you can use the ThreeFold Connect App or the ThreeFold Dashboard. Create a new [bootstrap image](https://bootstrap.grid.tf/) using your new V3 Farm ID. To create a new V3 Farm ID, you can use the ThreeFold Connect App or the ThreeFold Dashboard.
@ -1943,12 +1826,6 @@ It can be a good thing to change it when you buy an old desktop or server to mak
You don't need to if you use a removable media (e.g. USB key) as a booting image. It is needed only if you boot from a PXE server on your network. You should keep this feature disabled. Enable it only if you know 100% what you are doing. Otherwise it might bring vulnerabilities in terms of network security. You don't need to if you use a removable media (e.g. USB key) as a booting image. It is needed only if you boot from a PXE server on your network. You should keep this feature disabled. Enable it only if you know 100% what you are doing. Otherwise it might bring vulnerabilities in terms of network security.
### I want redundancy of power for my 3 nodes. I have two PSU on my Dell server. What can I do?
Make sure you enable the Hot Spare feature. This feature is accessible in iDRAC Settings - Power Configuration. Other servers might have this function, with a different name and configuration. Check the server's manual for more details.
### Why isn't there support for RAID? Does Zero-OS work with RAID? ### Why isn't there support for RAID? Does Zero-OS work with RAID?
RAID is a technology that has brought resilience and security to the IT industry. But it has some limitations that we at ThreeFold did not want to get stuck in. We developed a different (and more efficient way to store data reliably. Please have a look [here](https://library.threefold.me/info/threefold#/cloud/threefold__cloud_products?id=storage-quantum-safe-filesystem). RAID is a technology that has brought resilience and security to the IT industry. But it has some limitations that we at ThreeFold did not want to get stuck in. We developed a different (and more efficient way to store data reliably. Please have a look [here](https://library.threefold.me/info/threefold#/cloud/threefold__cloud_products?id=storage-quantum-safe-filesystem).
@ -1956,24 +1833,11 @@ RAID is a technology that has brought resilience and security to the IT industry
This Quantum Safe Storage overcomes some of the shortfalls of RAID and is able to work over multiple nodes geographically spread on the TF Grid. This Quantum Safe Storage overcomes some of the shortfalls of RAID and is able to work over multiple nodes geographically spread on the TF Grid.
### Is there a way to bypass RAID in order for Zero-OS to have bare metals on the system - No RAID controller in between storage and the Grid ?
Yes it is possible. "You can use the on board storage on a server without RAID. You can [re-flash](https://fohdeesha.com/docs/perc.html) the RAID card, turn on HBA/non-RAID mode, or install a different card. No need for RAID." @FLnelson It's usually easy to set servers such as a HP Proliant with the HBA mode. For Dell servers, you can either cross-flash the RAID controller with an “IT-mode-Firmware” (see this [video](https://www.youtube.com/watch?v=h5nb09VksYw)) or get a DELL H310-controller (which has the non-RAID option). Otherwise, you can install a NVME SSD with a PCIe adaptor, and turn off the RAID controller.
### I have a 3Node rack server. Is it possible to use a M.2 to SATA adapter in order to put the M.2 SATA disk in the HDD bay onboard storage? ### I have a 3Node rack server. Is it possible to use a M.2 to SATA adapter in order to put the M.2 SATA disk in the HDD bay onboard storage?
Yes, it is possible. You will most probably need to bypass the RAID controller for Zero-OS to access properly the onboard storage. See previous question. Yes, it is possible. You will most probably need to bypass the RAID controller for Zero-OS to access properly the onboard storage. See previous question.
### My 3Node uses only PCIe adapters and SSD NVME disks. Do I need the RAID controller on?
The onboard RAID controller is not linked to your PCIe SSDs. In this case, you can switch the RAID controller off.
### Can I change the name of my farm on polkadot.js? ### Can I change the name of my farm on polkadot.js?
Its possible to rename farms through the Polkadot UI. For mainnet, use [this link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Ftfchain.grid.tf#/extrinsics). Its possible to rename farms through the Polkadot UI. For mainnet, use [this link](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Ftfchain.grid.tf#/extrinsics).
@ -2003,359 +1867,11 @@ Its possible to delete nodes through the Polkadot UI. For mainnet, use [this
5. Finally, click on the bottom *Submit Transaction* at the bottom right of the screen 5. Finally, click on the bottom *Submit Transaction* at the bottom right of the screen
### My 3Node has 2 ethernet ports in the back, with one written AMT above, what does it mean? Can I use this port to connect my 3Node to the ThreeFold Grid?
First, let's define the term AMT. It means: Active Management Technology. Without going into too much details, it is to remotely access servers via the network at the BIOS level. Thus, you should plug the ethernet cable in the port next to AMT, and not into the AMT port. You can explore AMT properties if you want remote access to your server.
### My 3Node is based on a the hardware Z600, Z620 or Z820, can I run it headless or without a GPU?
For the Z600, there is a great [video on youtube](https://www.youtube.com/watch?app=desktop&v=JgBYbaT-N-w).
For the Z620 and the Z820, you need to do some variation on the video above. In the BIOS, go in File, then Replicated Setup, and select Save to Removable Storage Device. This will save a text file on your USB key. Then, in the text file, go to Headless Mode and remove the * in front of Disable and put it in front of Enable. Save the file and then go back into BIOS. Now go in File, then Replicated Setup, and select Restore from Removable Storage Device.
Running your 3Node without the GPU can save some power consumption as well as giving you one more extra slot for other hardware.
### Is it possible to add high-level GPU on rack servers to farm more TFT?
Some farmers had success installing GPUs such as the RTX3080 in servers as small as 2U (such as R730). Connections such as 250W 8-pin plug are needed on each riser. Generally, tower servers have more space to add high-level GPU.
Note: GPU farming will be implemented in the future.
### If I change farm, will my node IDs change on my 3Node servers? ### If I change farm, will my node IDs change on my 3Node servers?
You can move 3Nodes between farms without losing the node IDs. You simply need to change the boot media with the new farm ID and then reboot the 3Node. The 3Node will have the same node ID but it will now be associated with the new farm ID. You can move 3Nodes between farms without losing the node IDs. You simply need to change the boot media with the new farm ID and then reboot the 3Node. The 3Node will have the same node ID but it will now be associated with the new farm ID.
## Troubleshooting and Error Messages
### Is it possible to access the Error Screen or Log Screen?
Yes! On the Zero-OS console, hit alt-F2 to open up the Error/Log Screen, and hit alt-F3 to go back to the main screen.
### What does it mean when I see, during the 3Node boot, the message: error = context deadline exceeded?
In general, this message means that the ThreeFold Grid asked something to your 3Node, and your 3Node could not respond fast enough. It is usually necessary to read the following error message to understand the situation more specifically.
### How can I fix the error messages: "context deadline exceeded" accompanied with "node is behind acceptable delay with timestamp"?
This often indicates that the real-time clock of the system is not synced with current time. There have been different fixes reported to this issue.
You can boot the node using a Ubuntu live image to sync the hardware time. After that, you can reboot the node and it should boot normally.
You can fix this manually in the BIOS. Go to the BIOS settings and adjust the **Time** and **Date** settings.
You can also try to adjust the clock by NTP over the network, if it applies to your case.
### I try to boot a 3Node, but I get the error: "No Route to Host on Linux". What does it mean?
There are many potential answers to this. Perhaps the Host is offline, the service isn't running. This is usually the reason with TF Grid. It means the Grid is not responsive. In this case, try to boot the 3Node later. If it persists ask TF Support.
There can also be other reasons. You might have connected to the wrong port. Perhaps you have configured iptables to block connections on that port. Your DNS might be improperly configured. You might have an Incorrect Network or Host Configuration. Many troubleshoots are possible. Here's a [good place to start](https://www.maketecheasier.com/fix-no-route-to-host-error-linux/).
### How can I fix the error: "Network configuration succeed but Zero-OS kernel could not be downloaded" when booting a 3Node?
To fix the error "Network configuration succeed but Zero-OS kernel could not be downloaded", you can try to restart the router and reboot the 3Node. This usually fixes the issue. If this doesn't work, check if the router is still functional. The cause of this issue might be that your router is broken.
### Using SAS disks, I get the error; "No ssd found, failed to register". What can I do to fix this?
First make sure to wipe the disks and then boot your 3Node. If you've wiped the disks and it doesn't work, it's been reported that using the command "diskpart clean command" on Windows can fix this issue.
### When booting a 3Node, how to fix the error: "no disks: registration failed"?
There can be many different fixes for this error. Here are some troubleshooting tips to test separately:
* In BIOS, enable AHCI
* Make sure to [wipe the disks](farmers@@4_wipe_all_disks) of the 3Nodes
* If the 3Node has a RAID Controller:
* Disabled the RAID controller, OR;
* [Flash the RAID controller](https://fohdeesha.com/docs/perc.html) (i.e. crossflashing), OR;
* Change the controller to a Dell H310 controller (for Dell servers)
* Try the command **badblocks** (replace **sda** with your specific disk). Note that this command will delete all the data on the disk
```
sudo badblocks -svw -b 512 -t 0x00 /dev/sda
```
### My SSD is sometimes detected as HDD by Zero-OS when there is a reboot. Is there a fix or a way to test the SSD disk?
If your SSD disk shows as HDD, usually you can reboot the 3Node and Z-OS adjusts correctly.
Anyone experiencing frequently this issue where Z-OS sometimes detects an SSD as HDD can try the following:
* Boot up a live Ubuntu Desktop image
* Run the benchmark utility within the Disks app
* Check if the seektime of the disk is sufficient for Z-OS
* If the seektime is above 0.5ms, Z-OS will consider your SSD as HDD
**Detailed Steps:**
* Boot a Ubuntu Linux live USB
* Install **gnome-disks** if it isn't already installed:
```
sudo apt install gnome-disks
```
* Open the application launcher and search for **Disks**
* Select your disk
* Click on the tree dots menu
* Select **Benchmark Disk...**
* Use the default parameters
* **Transfer rate**: This is not relevant for our current test
* You can set to it to minimum (e.g. 2)
* **Sample size**: 10 MB is sufficient
* Check the average access time on the [ThreeFold repository](https://www.github.com/threefoldtech/seektime)
* Check seek time for HDD and SSD
* A SSD needs to be <=0.5ms
* If the result is above 0.5ms, this is why Z-OS doesn't recognize the disk properly
* You can then run diagnostics (e.g. smartmontools)
* If this is not fixable, you should change disk (e.g. take a more performing disk)
Note: The green dots on the output represent seektime and that's what Z-OS is looking at. Specifically, it checks that the average seektime is below 0.5ms. If the seektime is above this, Z-OS will consider your SSD as HDD.
### When booting a 3Node, I get the message: failed to register node: failed to create node: failed to submit extrinsic: Invalid Transaction: registration failed. What could fix this?
The most probable fix to this error is simply to properly wipe your disk(s):
* [Wipe your disks on Linux](#what-can-you-do-to-zero-out-your-disks-how-can-i-wipe-the-disks-of-my-3node-server-with-linux)
* [Wipe your disks on Windows](#how-can-i-wipe-a-disk-with-windows)
### I try to boot a 3Node, but I get the message no route with default gateway found. What does it mean?
First, let's see the main terms. Default gateway act as an access point to other networks, in this case the TF Grid, when there is a back and forth exchange of data packets.
While the last question implied a communication problem from the Grid, this error message usually means that the 3Node has communication problem. In short, it has difficulty reaching the TF Grid. There are many ways to troubleshoot this error. First, let's give the most direct solution. Make sure you have a direct connection with your Internet Service Provider (ISP): your 3Node should be connected to a router or a switch via an ethernet cable. Wifi doesn't work. Make sure your DHCP is set correctly.
If the problem persists, check the default gateway of your 3Node and then make sure your router can reach it.
*See next Q+A for more a possible solution.
### I have trouble connecting the 3Node to the Grid with a 10GB NIC card. What can I do?
As of now, Zero-OS sometimes has trouble with 10GB NIC card. The easiest solution to this is to connect your 3Node with the 1GB NIC card. This should solve the issue. More fine tuning might be needed to get your 3Node to work with a 10GB NIC card. Future Zero-OS version might solve this issue.
### I switch the ethernet cable to a different port when my 3Node was running. Internet connection is lost. What can I do?
When your 3Node boots, Zero-OS marks the NIC port. This means you cannot change NIC port when your 3Node is running. You can either put back the ethernet cable in the initial NIC port, or reboot the 3Node. At boot, Zero-OS will marks the new NIC port as the main entry.
### I get the error Certificate is not yet valid when booting my 3Node server, what can I do?
Make sure your firmware is up to date. If necessary, reinstall it. You might have to install then re-install the firmware if your system is very old.
### When running wipefs to wipe my disks on Linux, I get either of the following errors: "syntax error near unexpected token" or "Probing Initialized Failed". Is there a fix?
Many different reasons can cause this issue. When you get that error, sometimes it is because your are trying to wipe your boot USB by accident. If this is not the case, and you really are trying to wipe the correct disk, here are some fixes to try out, with the disk `sda` as an example:
* Fix 1:
* Force the wiping of the disk:
```
sudo wipefs -af /dev/sda
```
* Fix 2:
* Unmount the disk then wipe it:
```
sudo umount /dev/sda
sudo wipefs -a /dev/sda
```
### I did a format on my SSD disk, but Zero-OS still does not recognize them. What's wrong?
Formatting is one thing, but to boot properly, Zero-OS needs to work on a completely wipe disk. Thus, make sure you [wipe your disks](#what-can-you-do-to-zero-out-your-disks-how-can-i-wipe-the-disks-with-linux). Formatting is not enough.
### I have a Dell Rx10 server - R610, 710, 910. When I boot Zero-OS I get the message Probing EDD and the 3Node doesn't boot from there. What can I do?
For the R610 and 710, you can simply re-flash the card. See [this link](https://fohdeesha.com/docs/perc.html) for more information. For the 910, you cant re-flash the card. In this case, get a LSI Dell card and it should work. (They are cheap when you buy them used online.)
### My 3Node doesn't boot properly without a monitor plugged in. What can I do?
First, try to disable the "Halt On" mode in BIOS. If you do not have this option, try simply enabling the Legacy Support (Dell BIOS for example). If this doesn't work, try to plug in a Dummy Plug/Headless Ghost/Display Emulator in your 3Node. This will simulate a plugged monitor. This should fix the problem.
### My 3Node is running on the Grid, but when I plugged in the monitor, it states: Disabling IR #16. Is there a problem?
In general, you can simply ignore this error statement. This error is linked to the Nvidia binary driver. It simply means that your 3Node lost connection with the graphic card (by unplugging and replugging the monitor for example).
### My 3Node won't boot without disabling the Secure Boot option, is it safe?
In the case where you want to boot Zero-OS, disabling Secure Boot option is safe. With Secure Boot disabled, it can be easier or even necessary when it comes to booting Zero-OS. Secure Boot is used when you want to lock the BIOS/UEFI settings.
### When I tried to boot my 3Node, at some point the screen went black, with or without a blinking hyphen or dash. What could cause this and what could I do to resolve the issue?
There is a possibility that this happens because you are booting your 3Node on a HDD. A 3Node needs a minimum of 500GB of SSD to work properly.
Also, make sure that you are using the correct boot option (Legacy BIOS or UEFI) in the Settings and that it corresponds to the correct booting image on the ThreeFold Bootstrap page.
This problem often arises when you plugged your disks in the wrong controller. For example, try unpluging the disks from the SAS controller, and plug them in the SATA controller. Also, disable the SAS controller if needed.
In a Legacy BIOS boot, make sure Legacy is enabled and disable *Data Execution Prevention* if possible.
Also, it might have to do with your RAID controller configuration. Make sure this is properly set. For example, configuring all the HDD disks into one logical disk can fix this problem, or re-flashing the RAID card can also help.
### My 3Nodes go offline after a modem reboot. Is there a way to prevent this?
Yes, there are many ways to prevent this. An easy solution is to set the DHCP server to reserve local IPs for the 3Nodes MAC addresses.
This problem is also preventable if your router stays online during the modem reboot.
Indeed, rebooting the 3Nodes is necessary when there are local IP changes, as 3Nodes are addressed a local IP addresses when they are booted.
The DHCP will addresses any local IP address that is available when you are booting a 3Node. Reserving local IP addresses is a good TF farming practice.
### When I boot my 3Node, it reaches the Welcome to Zero-OS window, but it doesn't boot properly and there's an error message: failed to load object : type substrate..., what can I do?
Usually simply rebooting the 3Node fixes this problem.
### When I try to access iDRAC on a web browswer, even with protected mode off, I get the error The webpage cannot be found, what can I do?
Open iDRAC in the Internet Explorer emulator extension (IE Tab) in Chrome, then update iDRAC. It should work elsewhere then. Sometimes, it will be needed to add "ST1=code" at the end of the IE Tab url.
### When booting the 3Node, I get the error Network interface detected but autoconfiguration failed. What can I do?
First make sure your network cable is plugged in and that your DHCP is working and responding. If you change the NIC port of the ethernet cable, make sure to reboot the 3Node so Zero-OS can change the NIC port attribution.
Some farmers reported that this got fixed by simply powering off the 3Node(s), the router and modem for 2 minutes then powering it all back on. Resetting the modem and router (switch on the hardware) in the process can also help.
If this doesn't work, try to upgrade the firmware of the NIC and the motherboard. If this still doesn't work, the NIC card might be broken. Try with another NIC card.
### When I boot my Dell server, I get the message: All of the disks from your previous configuration are gone... Press any key to continue or 'C' to load the configuration utility. What can I do?
Many changes to your server can lead to this message.
Usually, the easiest solution is to reset the disk configuration in iDRAC's configuration utility.
What can causes this message:
1. During a new installation, the cables connecting to your external storage are not wired to the correct ports.
2. Your RAID adapter has failed.
3. Your SAS cables are not plugged properly or are malfunctioning.
Note: Resetting the configuration will destroy all data on all virtual disks. Make sure you know what you are doing! In doubt, ask the TF community.
### I have a Dell R620. In Zero-OS, I get the failure message No network card found and then the 3Node reebots after few seconds. The same happens for every LAN input. What can I do?
The first thing to try here is to boot the server in BIOS mode instead of UEFI mode. If this doesn't fix the problem, try the following.
Sometimes, this happens when the firmwares of BIOS, iDRAC, Lifecycle Controller and NIC are incompatible to each other. The solution is then to update them all correctly. Some problems can arise in the process.
First, you should try to do the updates using iDRAC as you can update both iDRAC and BIOS there. If this does not work, try to update separate, with a live-linux distro, the BIOS, iDRAC and Lifecycle Controller. Once this is done, the server should be able to do a liveupdate, https to dell support website, via lifecycle-controller. This would update the other components. For more details on this method, watch [this video](https://www.youtube.com/watch?v=ISA7j2BKgjI).
Note: Some farmers have reported that the Broadcom NIC card does not work well for Zero-OS and that a standard Intel PCI NIC card replacement resolved the issue. This could be a more straightforward method if updating the firmwares doesn't resolve the issue.
### I am using freeDos to crossflash my raid controller on a Dell server, but I can't see the RAID controller with the Command Info. What can I do?
Turn on the raid controller in the BIOS, otherwise freeDos does not show you the raid controller with the command Info.
### Can I use a VGA to HDMI adaptor to connect a TV screen or monitor to the 3Node? I tried to boot a 3Node with a VGA to HDMI adaptor but the boot fails, what can I do?
This might work, but it has been reported by farmers that Zero-OS might have difficulties booting when this is done with a VGA/HDMI adaptor on a TV screen. This is most likely due to the TV screen not supporting the output once the system loaded into Zero-OS. The easy fix to this issue is to use a standard computer monitor with a VGA plug.
### When I try to boot my 3Node, the fans start spinning fast with a loud noise and the screen is black. What can I do to resolve this?
There may be several causes to this issue. You can try to remove all the RAM sticks, to clean the dust and then to reseat the RAM sticks. If it still doesn't resolve the issue, you can check the RAM sticks one by one to see if one is malfunctioning. This often resolves the issue. Also, some cables might not be properly connected.
### When booting Zero-OS with IPV6 configurations, I get the errors (1) dial tcp: address IPV6-address too many columns in address and (2) no pools matches key: not routable. What can I do to fix this issue?
This usually means that the IPV6 attributed is not valid. It is also often caused when the DNS configuration does not resolve IPV6 correctly.
To fix this issue, it is often necessary to adjust the IPV6 settings related to the router and the modem. Confirming with your Internet service provider (ISP) that the IPV6 settings are properly configured could also be necessary to fix the issue.
### When booting a 3Node, Zero-OS downloads fine, but then I get the message: error no route with default gateway found, and the message: info check if interface has a cable plugged in. What could fix this?
Make sure you have network stack enabled in BIOS. If so, check you ethernet port and make sure that it's clean. Also make sure the ethernet rj45 connectors are clean on both ends. If that does not work, verify the state of your SATA cables. If all this doesn't work, download and re-install Zero-OS.
### How can I update Dell and HP servers to Intel E5-2600v2, E5-2400v2 and E5-4600v2, when applicable?
There are many ressources online with steps on how to do this. You can check this [youtube video](https://www.youtube.com/watch?v=duzrULLtonM) on Dell and HP servers, as welll as this [documentation](https://ixnfo.com/en/hp-proliant-gen8-update-to-support-cpu-e5-2600v2-e5-2400v2-e5-4600v2.html) for HP Proliant Gen8.
### How can I update the firmware and driver of a Dell PowerEdge server?
Dell has excellen documentation for this. Read [this](https://www.dell.com/support/kbdoc/en-us/000128194/updating-firmware-and-drivers-on-dell-emc-poweredge-servers) for the detailed steps.
### When I boot a 3Node in UEFI mode, it gets stuck at: Initializing Network Device, is there a way to fix this?
In short, booting the 3Node in BIOS mode instead of UEFI mode usually fixes this issue.
You can make bootable USB with the USB option of the [Zero-OS bootstrap image page](https://bootstrap.grid.tf/). Make sure to boot your server using BIOS and not UEFI. In the boot sequence, make the USB as your first choice to boot.
### When I boot my 3Node, it gets stuck during the Zero-OS download. It never reaches 100%. What can I do to fix this issue?
Here are some ways to troubleshoot your 3Node when it cannot download Zero-OS completely (to 100%):
* Sometimes, just rebooting the 3Node and/or trying a little bit later can work.
* It can help to reboot the modem and the router.
* Make sure your BIOS/UEFI is up to date. Updating the BIOS/UEFI can help.
* It can also help to set the correct date and time.
### When booting a 3Node, I get the error=“context deadline exceeded” module=network error=failed to initialize rmb api failed to initialized admin mw: failed to get farm: farm not found: object not found. What can I do to fix this issue?
Usually, the simple fix to this issue is to make sure that your bootstrap image is on the same network as your farm. For example, if you created your farm on the Main net, you should use a Main net Zero-OS bootstrap image.
## ThreeFold Grid and Data ## ThreeFold Grid and Data
@ -2409,71 +1925,6 @@ No. The only uptime you lose is the time your 3Node was offline from the ThreeFo
### One of my nodes is showing the wrong location. Any problem with that? ### One of my nodes is showing the wrong location. Any problem with that?
The ThreeFold Node Finder is showing your ISP location. This is perfectly normal. The ThreeFold Node Finder is showing your ISP location. This is perfectly normal.
## Memory
### Can I use different type of RAM for the same 3Node?
No. Always use the same type of RAM per 3Node. If you use RDIMM, go all RDIMM, etc. Check your hardware specifications to make sure you have the right type of memory.
### How can I know if the memory I am buying is correct for my specific hardware?
To be sure, look into the owner's manual of your specific computer.
In general, you can go to [Memory.net](https://memory.net/) and look for your specific computer model. As general steps, select your computer's system in *By system*, then select the series and then select the specific model of the series. You will then see available memories to buy from memory.net. You can also simply read the documentation at the bottom. The memory type supported by your computer will be explained. Then you can buy the memory needed from any other computer store.
For servers, you can check with Cloudninja's documentation [here](https://cloudninjas.com/pages/server-memory). Search for your specific hardware and look for the compatible memory. This reference is good for rack and tower servers.
### What do the terms RDIMM, LDIMM, UDIMM, LRDIMM, FBDIMM mean when it comes to RAM memory sticks?
Well first, the DIMM means dual inline memory module.
* U stands for or unregistered (or unbuffered).
* R stands for registered memory.
* LR stands for load-reduced.
* FB stands for fully-buffered.
### What is the difference between ECC and non-ECC memory?
ECC means error correction code memory. This type of memory can detect and correct data corruption. Non-ECC mostly cannot detect nor correct, but some can detect, but never correct data corruption. Check your hardware specifications to make sure you have the right type of memory (ECC or non-ECC).
### How can I change the RAM memory sticks on my 3Nodes? How can I achieve dual channel configuration with sticks of RAM?
First, always use RAM sticks of the same size and type. It should be noted on your motherboard which slots to populate first. As a general guide, there is usually 2 slots A and B, with each 2 memory stick entries. You must then install the ram sticks on A1 and B1 in order to achieve dual channel, then A2 and B2 if you have more (visual order: A1 A2 B1 B2).
> Example: You want to start with your largest sticks, evenly distributed between both processors and work your way down to your smallest. Let's take an example with 2 processors as well as 4x 16GB sticks and 4x 8GB sticks. The arrangement would be A1-16GB, B1-16GB, A2-16GB, B2-16GB, A3-8GB, B3-8GB, A4-8GB, B4-8GB. Avoid odd numbers as well. You optimally want pairs. So if you only have 5x 8GB sticks, only install 4 until you have an even 6.
### What does RAM mean?
RAM means random access memory. Those type of memory can be read and changed in any order.
### What does DIMM mean when it comes to RAM sticks?
It means *dual in-line memory module*. This type of computer memory is natively 64 bits, enabling fast data transfer.
### I have 24 DIMMS ram slots on my server. Can I use them all?
Be careful when installing memory on a server. Always check your server's documentation to make sure your RAM sticks combination are correct.
For example, on the Dell R720, you can have 24x16gb RAM ECC sticks, but it can only handle 16 Quad ranked DIMMs. In this case, you can fill up all slots with registered DIMMs if you have a maximum of 4 quad DIMMS ranked on each CPU.
# Ask a Question to the ThreeFold Community # Ask a Question to the ThreeFold Community
If you have any question, you can ask the ThreeFold community via the ThreeFold forum or the ThreeFold Telegram channels: If you have any question, you can ask the ThreeFold community via the ThreeFold forum or the ThreeFold Telegram channels:

View File

@ -7,7 +7,8 @@
- [1. Create a Linux Bootstrap Image](#1-create-a-linux-bootstrap-image) - [1. Create a Linux Bootstrap Image](#1-create-a-linux-bootstrap-image)
- [2. Boot Linux in *Try Mode*](#2-boot-linux-in-try-mode) - [2. Boot Linux in *Try Mode*](#2-boot-linux-in-try-mode)
- [3. Use wipefs to Wipe All the Disks](#3-use-wipefs-to-wipe-all-the-disks) - [3. Use wipefs to Wipe All the Disks](#3-use-wipefs-to-wipe-all-the-disks)
- [Troubleshooting](#troubleshooting) - [SATA Disks](#sata-disks)
- [NVMe Disks](#nvme-disks)
*** ***
@ -27,12 +28,11 @@ It only takes a few steps to wipe all the disks of a 3Node.
ThreeFold runs its own OS, which is Zero-OS. You thus need to start with completely wiped disks. Note that ALL disks must be wiped. Otherwise, Zero-OS won't boot. ThreeFold runs its own OS, which is Zero-OS. You thus need to start with completely wiped disks. Note that ALL disks must be wiped. Otherwise, Zero-OS won't boot.
An easy method is to simply download a Linux distribution and wipe the disk with the proper command line in the Terminal. An easy method is to simply download a Linux distribution and wipe the disks by running simple commands on the command-line interface.
We will show how to do this with Ubuntu 20.04. LTS. This distribution is easy to use and it is thus a good introduction for Linux, in case you haven't yet explored this great operating system. We will show how to do this with Ubuntu 20.04. LTS. This distribution is easy to use and it is thus a good introduction for Linux, in case you haven't yet explored this great operating system.
## 1. Create a Linux Bootstrap Image ## 1. Create a Linux Bootstrap Image
Download the Ubuntu 20.04 ISO file [here](https://releases.ubuntu.com/20.04/) and burn the ISO image on a USB key. Make sure you have enough space on your USB key. You can also use other Linux Distro such as [GRML](https://grml.org/download/), if you want a lighter ISO image. Download the Ubuntu 20.04 ISO file [here](https://releases.ubuntu.com/20.04/) and burn the ISO image on a USB key. Make sure you have enough space on your USB key. You can also use other Linux Distro such as [GRML](https://grml.org/download/), if you want a lighter ISO image.
@ -40,7 +40,6 @@ Download the Ubuntu 20.04 ISO file [here](https://releases.ubuntu.com/20.04/) an
The process here is the same as in section [Burning the Bootstrap Image](./2_bootstrap_image.md#burn-the-zero-os-bootstrap-image), but with the Linux ISO instead of the Zero-OS ISO. [BalenaEtcher](https://www.balena.io/etcher/) is recommended as it formats your USB in the process, and it is available for MAC, Windows and Linux. The process here is the same as in section [Burning the Bootstrap Image](./2_bootstrap_image.md#burn-the-zero-os-bootstrap-image), but with the Linux ISO instead of the Zero-OS ISO. [BalenaEtcher](https://www.balena.io/etcher/) is recommended as it formats your USB in the process, and it is available for MAC, Windows and Linux.
## 2. Boot Linux in *Try Mode* ## 2. Boot Linux in *Try Mode*
When you boot the Linux ISO image, make sure to choose *Try Mode*. Otherwise, it will install Linux on your computer. You do not want this. When you boot the Linux ISO image, make sure to choose *Try Mode*. Otherwise, it will install Linux on your computer. You do not want this.
@ -49,58 +48,52 @@ When you boot the Linux ISO image, make sure to choose *Try Mode*. Otherwise, it
## 3. Use wipefs to Wipe All the Disks ## 3. Use wipefs to Wipe All the Disks
When you use wipefs, you are removing all the data on your disk. Make sure you have no important data on your disks, or make sure you have copies of your disks before doing this operation, if needed. We will now use `wipefs` to remove all the data on the disks.
Once Linux is booted, go into the terminal and write the following command lines. > Important: Make sure that you have no important data on your disks, or make sure that you have copies of your disks before proceeding.
First, you can check the available disks by writing in a terminal or in a shell: Once Linux is booted, open the terminal.
First, you can check the available disks by writing the command:
``` ```
lsblk lsblk
``` ```
To see what disks are connected, write this command: The types of disk you can see are:
- `sdX`
- SATA type
- e.g. `sda`
- Note: It can be an SSD disk or a USB key
- `nvmeX`
- NVMe type
- e.g. `nvme0n1`
### SATA Disks
To wipe one specific SATA disk at a time, use the following command by replacing `sdX` with the specific disk (e.g. `sdb`):
``` ```
fdisk -l sudo wipefs -af /dev/sdX
``` ```
If you want to wipe one specific disk, here we use *sda* as an example, write this command: To wipe all SATA disks (except the Linux distro USB disk you are currently using to run Ubuntu in *Try Mode*), take note of the Linux distro USB disk (e.g. `sdb`) and replace `sdX` with it in the following line:
``` ```
sudo wipefs -a /dev/sda sudo for i in /dev/sd*; do if [ "$i"!= "/dev/sdX"* ]; then wipefs -af $i; fi; done
``` ```
And replace the "a" in sda by the letter of your disk, as shown when you did *lsblk*. The term *sudo* gives you the correct permission to do this. ### NVMe Disks
To wipe all the disks in your 3Node, write the command: To wipe one specific NVMe disk at a time, use the following command by replacing `nvmeX` with the specific disk (e.g. `nvme0n1`) :
``` ```
sudo for i in /dev/sd*; do wipefs -a $i; done sudo wipefs -af /dev/nvmeX
``` ```
If you have any `fdisk` entries that look like `/dev/nvme`, you'll need to adjust the command line. To wipe all NVMe disks, use the following line:
For a nvme disk, here we use *nvme0* as an example, write:
``` ```
sudo wipefs -a /dev/nvme0 sudo for i in /dev/nvme*; do wipefs -af $i; done
``` ```
And replace the "0" in nvme0 by the number corresponding to your disk, as shown when you did *lsblk*.
To wipe all the nvme disks, write this command line:
```
sudo for i in /dev/nvme*; do wipefs -a $i; done
```
## Troubleshooting
If you're having issues wiping the disks, you might need to use **--force** or **-f** with wipefs (e.g. **sudo wipefs -af /dev/sda**).
If you're having trouble getting your disks recognized by Zero-OS, some farmers have had success enabling AHCI mode for SATA in their BIOS.
If you are using a server with onboard storage, you might need to re-flash the RAID card. [Read the FAQ](faq@@faq) for more information.

View File

@ -92,7 +92,7 @@ Note that any argument containing spaces needs to be wrapped in quotes (e.g. mne
- `start`: to start (power on) a node - `start`: to start (power on) a node
```bash ```bash
farmerbot start --node <node ID> -m "<mnemonic>" -n dev -d farmerbot start --node <node ID> -m "<mnemonic>" -n <network> -d
``` ```
Where: Where:
@ -112,7 +112,7 @@ Global Flags:
- `start all`: to start (power on) all nodes in a farm - `start all`: to start (power on) all nodes in a farm
```bash ```bash
farmerbot start all --farm <farm ID> -m "<mnemonic>" -n dev -d farmerbot start all --farm <farm ID> -m "<mnemonic>" -n <network> -d
``` ```
Where: Where:

View File

@ -32,6 +32,8 @@ To buy a certified node from an official ThreeFold vendor, check the [ThreeFold
- [Quick Guide](farmerbot_quick.md) - [Quick Guide](farmerbot_quick.md)
- [Additional Information](farmerbot_information.md) - [Additional Information](farmerbot_information.md)
- [Minting and the Farmerbot](farmerbot_minting.md) - [Minting and the Farmerbot](farmerbot_minting.md)
- [Node Status Bot](node_status_bot.md)
- [Farming Troubleshooting](farming_troubleshooting.md)
- [Farmers FAQ](faq@@faq) - [Farmers FAQ](faq@@faq)
> Note: Bugs in the code (e.g. ZOS or other components) can happen. If this is the case, there might be a loss of tokens during minting which won't be refunded by ThreeFold. If there are minting code errors, ThreeFold will try its best to fix the minting code and remint nodes that were affected by such errors. > Note: Bugs in the code (e.g. ZOS or other components) can happen. If this is the case, there might be a loss of tokens during minting which won't be refunded by ThreeFold. If there are minting code errors, ThreeFold will try its best to fix the minting code and remint nodes that were affected by such errors.

View File

@ -0,0 +1,507 @@
<h1> Farming Troubleshooting </h1>
<h2> Table of Contents </h2>
- [Introduction](#introduction)
- [General Troubleshooting Process](#general-troubleshooting-process)
- [Build Troubleshooting](#build-troubleshooting)
- [Set the BIOS](#set-the-bios)
- [BIOS Troubleshooting](#bios-troubleshooting)
- [When running wipefs to wipe my disks on Linux, I get either of the following errors: "syntax error near unexpected token" or "Probing Initialized Failed". Is there a fix?](#when-running-wipefs-to-wipe-my-disks-on-linux-i-get-either-of-the-following-errors-syntax-error-near-unexpected-token-or-probing-initialized-failed-is-there-a-fix)
- [Disk Not Recognized by Zero-OS](#disk-not-recognized-by-zero-os)
- [Onboard Storage](#onboard-storage)
- [When I tried to boot my 3Node, at some point the screen went black, with or without a blinking hyphen or dash. What could cause this and what could I do to resolve the issue?](#when-i-tried-to-boot-my-3node-at-some-point-the-screen-went-black-with-or-without-a-blinking-hyphen-or-dash-what-could-cause-this-and-what-could-i-do-to-resolve-the-issue)
- [I get the error Certificate is not yet valid when booting my 3Node server, what can I do?](#i--get-the-error-certificate-is-not-yet-valid-when-booting-my-3node-server-what-can-i-do)
- [My SSD is sometimes detected as HDD by Zero-OS when there is a reboot. Is there a fix or a way to test the SSD disk?](#my-ssd-is-sometimes-detected-as-hdd-by-zero-os-when-there-is-a-reboot-is-there-a-fix-or-a-way-to-test-the-ssd-disk)
- [My 3Node uses only PCIe adapters and SSD NVME disks. Do I need the RAID controller on?](#my-3node-uses-only-pcie-adapters-and-ssd-nvme-disks-do-i-need-the-raid-controller-on)
- [My 3Node has 2 ethernet ports in the back, with one written AMT above, what does it mean? Can I use this port to connect my 3Node to the ThreeFold Grid?](#my-3node-has-2-ethernet-ports-in-the-back-with-one-written-amt-above-what-does-it-mean-can-i-use-this-port-to-connect-my-3node-to-the-threefold-grid)
- [When I boot my Dell server, I get the message: All of the disks from your previous configuration are gone... Press any key to continue or 'C' to load the configuration utility. What can I do?](#when-i-boot-my-dell-server-i-get-the-message-all-of-the-disks-from-your-previous-configuration-are-gone-press-any-key-to-continue-or-c-to-load-the-configuration-utility-what-can-i-do)
- [When booting a 3Node, how to fix the error: "no disks: registration failed"?](#when-booting-a-3node-how-to-fix-the-error-no-disks-registration-failed)
- [I have trouble connecting the 3Node to the Grid with a 10GB NIC card. What can I do?](#i-have-trouble-connecting-the-3node-to-the-grid-with-a-10gb-nic-card-what-can-i-do)
- [What does it mean when I see, during the 3Node boot, the message: error = context deadline exceeded?](#what-does-it-mean-when-i-see-during-the-3node-boot-the-message-error--context-deadline-exceeded)
- [How can I fix the error messages: "context deadline exceeded" accompanied with "node is behind acceptable delay with timestamp"?](#how-can-i-fix-the-error-messages-context-deadline-exceeded-accompanied-with-node-is-behind-acceptable-delay-with-timestamp)
- [I try to boot a 3Node, but I get the error: "No Route to Host on Linux". What does it mean?](#i-try-to-boot-a-3node-but-i-get-the-error-no-route-to-host-on-linux-what-does-it-mean)
- [How can I fix the error: "Network configuration succeed but Zero-OS kernel could not be downloaded" when booting a 3Node?](#how-can-i-fix-the-error-network-configuration-succeed-but-zero-os-kernel-could-not-be-downloaded-when-booting-a-3node)
- [Using SAS disks, I get the error; "No ssd found, failed to register". What can I do to fix this?](#using-sas-disks-i-get-the-error-no-ssd-found-failed-to-register-what-can-i-do-to-fix-this)
- [When booting a 3Node, I get the message: failed to register node: failed to create node: failed to submit extrinsic: Invalid Transaction: registration failed. What could fix this?](#when-booting-a-3node-i-get-the-message-failed-to-register-node-failed-to-create-node-failed-to-submit-extrinsic-invalid-transaction-registration-failed-what-could-fix-this)
- [I did a format on my SSD disk, but Zero-OS still does not recognize them. What's wrong?](#i-did-a-format-on-my-ssd-disk-but-zero-os-still-does-not-recognize-them-whats-wrong)
- [My 3Node doesn't boot properly without a monitor plugged in. What can I do?](#my-3node-doesnt-boot-properly-without-a-monitor-plugged-in-what-can-i-do)
- [My 3Node won't boot without disabling the Secure Boot option, is it safe?](#my-3node-wont-boot-without-disabling-the-secure-boot-option-is-it-safe)
- [When booting the 3Node, I get the error Network interface detected but autoconfiguration failed. What can I do?](#when-booting-the-3node-i-get-the-error-network-interface-detected-but-autoconfiguration-failed-what-can-i-do)
- [When I try to boot my 3Node, the fans start spinning fast with a loud noise and the screen is black. What can I do to resolve this?](#when-i-try-to-boot-my-3node-the-fans-start-spinning-fast-with-a-loud-noise-and-the-screen-is-black-what-can-i-do-to-resolve-this)
- [When booting Zero-OS with IPV6 configurations, I get the errors (1) dial tcp: address IPV6-address too many columns in address and (2) no pools matches key: not routable. What can I do to fix this issue?](#when-booting-zero-os-with-ipv6-configurations-i-get-the-errors-1-dial-tcp-address-ipv6-address-too-many-columns-in-address-and-2-no-pools-matches-key-not-routable-what-can-i-do-to-fix-this-issue)
- [I try to boot a 3Node, but I get the message no route with default gateway found. What does it mean?](#i-try-to-boot-a-3node-but-i-get-the-message-no-route-with-default-gateway-found-what-does-it-mean)
- [When booting a 3Node, Zero-OS downloads fine, but then I get the message: error no route with default gateway found, and the message: info check if interface has a cable plugged in. What could fix this?](#when-booting-a-3node-zero-os-downloads-fine-but-then-i-get-the-message-error-no-route-with-default-gateway-found-and-the-message-info-check-if-interface-has-a-cable-plugged-in-what-could-fix-this)
- [How can I update Dell and HP servers to Intel E5-2600v2, E5-2400v2 and E5-4600v2, when applicable?](#how-can-i-update-dell-and-hp-servers-to-intel-e5-2600v2-e5-2400v2-and-e5-4600v2-when-applicable)
- [How can I update the firmware and driver of a Dell PowerEdge server?](#how-can-i-update-the-firmware-and-driver-of-a-dell-poweredge-server)
- [When I boot a 3Node in UEFI mode, it gets stuck at: Initializing Network Device, is there a way to fix this?](#when-i-boot-a-3node-in-uefi-mode-it-gets-stuck-at-initializing-network-device-is-there-a-way-to-fix-this)
- [When I boot my 3Node, it gets stuck during the Zero-OS download. It never reaches 100%. What can I do to fix this issue?](#when-i-boot-my-3node-it-gets-stuck-during-the-zero-os-download-it-never-reaches-100-what-can-i-do-to-fix-this-issue)
- [When booting a 3Node, I get the error=“context deadline exceeded” module=network error=failed to initialize rmb api failed to initialized admin mw: failed to get farm: farm not found: object not found. What can I do to fix this issue?](#when-booting-a-3node-i-get-the-errorcontext-deadline-exceeded-modulenetwork-errorfailed-to-initialize-rmb-api-failed-to-initialized-admin-mw-failed-to-get-farm-farm-not-found-object-not-found-what-can-i-do-to-fix-this-issue)
- [Memory Troubleshooting](#memory-troubleshooting)
- [Can I use different type of RAM for the same 3Node?](#can-i-use-different-type-of-ram-for-the-same-3node)
- [How can I know if the memory I am buying is correct for my specific hardware?](#how-can-i-know-if-the-memory-i-am-buying-is-correct-for-my-specific-hardware)
- [What do the terms RDIMM, LDIMM, UDIMM, LRDIMM, FBDIMM mean when it comes to RAM memory sticks?](#what-do-the-terms-rdimm-ldimm-udimm-lrdimm-fbdimm-mean-when-it-comes-to-ram-memory-sticks)
- [What is the difference between ECC and non-ECC memory?](#what-is-the-difference-between-ecc-and-non-ecc-memory)
- [How can I change the RAM memory sticks on my 3Nodes? How can I achieve dual channel configuration with sticks of RAM?](#how-can-i-change-the-ram-memory-sticks-on-my-3nodes-how-can-i-achieve-dual-channel-configuration-with-sticks-of-ram)
- [What does RAM mean?](#what-does-ram-mean)
- [What does DIMM mean when it comes to RAM sticks?](#what-does-dimm-mean-when-it-comes-to-ram-sticks)
- [I have 24 DIMMS ram slots on my server. Can I use them all?](#i-have-24-dimms-ram-slots-on-my-server-can-i-use-them-all)
- [Basic Post Build Troubleshooting](#basic-post-build-troubleshooting)
- [Reboot a 3Node](#reboot-a-3node)
- [Reboot a Router](#reboot-a-router)
- [Reboot a Modem with the Reset Button](#reboot-a-modem-with-the-reset-button)
- [My 3Nodes go offline after a modem reboot. Is there a way to prevent this?](#my-3nodes-go-offline-after-a-modem-reboot-is-there-a-way-to-prevent-this)
- [When I try to access iDRAC on a web browswer, even with protected mode off, I get the error The webpage cannot be found, what can I do?](#when-i-try-to-access-idrac-on-a-web-browswer-even-with-protected-mode-off-i-get-the-error-the-webpage-cannot-be-found-what-can-i-do)
- [When I boot my 3Node, it reaches the Welcome to Zero-OS window, but it doesn't boot properly and there's an error message: failed to load object : type substrate..., what can I do?](#when-i-boot-my-3node-it-reaches-the-welcome-to-zero-os-window-but-it-doesnt-boot-properly-and-theres-an-error-message-failed-to-load-object--type-substrate-what-can-i-do)
- [I want redundancy of power for my 3 nodes. I have two PSU on my Dell server. What can I do?](#i-want-redundancy-of-power-for-my-3-nodes-i-have-two-psu-on-my-dell-server-what-can-i-do)
- [I switch the ethernet cable to a different port when my 3Node was running. Internet connection is lost. What can I do?](#i-switch-the-ethernet-cable-to-a-different-port-when-my-3node-was-running-internet-connection-is-lost-what-can-i-do)
- [Advanced Post Build Troubleshooting](#advanced-post-build-troubleshooting)
- [Access the Error/Log Screen](#access-the-errorlog-screen)
- [Can I use a VGA to HDMI adaptor to connect a TV screen or monitor to the 3Node? I tried to boot a 3Node with a VGA to HDMI adaptor but the boot fails, what can I do?](#can-i-use-a-vga-to-hdmi-adaptor-to-connect-a-tv-screen-or-monitor-to-the-3node-i-tried-to-boot-a-3node-with-a-vga-to-hdmi-adaptor-but-the-boot-fails-what-can-i-do)
- [My 3Node is running on the Grid, but when I plugged in the monitor, it states: Disabling IR #16. Is there a problem?](#my-3node-is-running-on-the-grid-but-when-i-plugged-in-the-monitor-it-states-disabling-ir-16-is-there-a-problem)
- [Address Certain Errors](#address-certain-errors)
- [Get Further Assistance](#get-further-assistance)
---
## Introduction
We cover different ways and levels to troubleshoot farming issues.
## General Troubleshooting Process
When building a 3Node, we advise to follow carefully the 6 steps laid out in the [3Node building](3node_building.md) section of the manual. Make sure that the disks are properly wiped, that you have the correct bootstrap image and that the BIOS/UEFI is set correctly.
If you are still having issues, you may find solutions to your issues by reading the sections [Build Troubleshooting](#build-troubleshooting) and [Basic Post Build Troubleshooting](#basic-post-build-troubleshooting).
If your issues are related to memory, the section [Memory Troubleshooting](#memory-troubleshooting) should help.
If you still can't fix your issue, try to get more info by reading the Error/Log screen. Read the section [Advanced Post Build Troubleshooting](#advanced-post-build-troubleshooting) for more information. Once you have more information via the Error/Log screen, you should first try to find fixes to the errors by reading the troubleshooting section.
If you still can't find solutions to your issues, read the section [Get Further Assistance](#get-further-assistance) to ask for help.
## Build Troubleshooting
In this section, we cover notions such as how to wipe disks, how to set the BIOS configurations and more.
### Set the BIOS
You need to set the BIOS properly for your 3Node to boot with Zero-OS.
The basic information is available [here](5_set_bios_uefi.md#the-essential-features-of-biosuefi-for-a-3node).
### BIOS Troubleshooting
You might have to try UEFI first and if it doesn't work, try BIOS. Usually when this is the case (UEFI doesn't work with your current computer), the following message will be shown:
> Initializing Network Devices...
And then... nothing. This means that you are still in the BIOS of the hardware and boot is not even started yet. When this happens, try the BIOS mode of your computer.
### When running wipefs to wipe my disks on Linux, I get either of the following errors: "syntax error near unexpected token" or "Probing Initialized Failed". Is there a fix?
Many different reasons can cause this issue. When you get that error, sometimes it is because your are trying to wipe your boot USB by accident. If this is not the case, and you really are trying to wipe the correct disk, here are some fixes to try out, with the disk `sda` as an example:
* Fix 1:
* Force the wiping of the disk:
```
sudo wipefs -af /dev/sda
```
* Fix 2:
* Unmount the disk then wipe it:
```
sudo umount /dev/sda
sudo wipefs -a /dev/sda
```
### Disk Not Recognized by Zero-OS
If you're having trouble getting your disks recognized by Zero-OS, some farmers have had success enabling AHCI mode for SATA in their BIOS.
### Onboard Storage
If you are using a server with onboard storage and are having issues, there are many ways to troubleshooting this.
You can use the on board storage on a server without RAID. You can [re-flash](https://fohdeesha.com/docs/perc.html) the RAID card, turn on HBA/non-RAID mode, or install a different card. There is no need for RAID with ThreeFold farming.
It's usually easy to set servers such as a HP Proliant with the HBA mode. For Dell servers, you can either cross-flash the RAID controller with an “IT-mode-Firmware” (see this [video](https://www.youtube.com/watch?v=h5nb09VksYw)) or get a DELL H310-controller (which has the non-RAID option). Otherwise, you can install a NVME SSD with a PCIe adaptor, and turn off the RAID controller.
### When I tried to boot my 3Node, at some point the screen went black, with or without a blinking hyphen or dash. What could cause this and what could I do to resolve the issue?
There is a possibility that this happens because you are booting your 3Node on a HDD. A 3Node needs a minimum of 500GB of SSD to work properly.
Also, make sure that you are using the correct boot option (Legacy BIOS or UEFI) in Settings and that it corresponds to the correct booting image on the ThreeFold Bootstrap page.
This problem often arises when you plug your disks in the wrong controller. For example, try unplugging the disks from the SAS controller, and plug them in the SATA controller. Also, disable the SAS controller if needed.
In a Legacy BIOS boot, make sure Legacy is enabled and disable *Data Execution Prevention* if possible.
Also, it might have to do with your RAID controller configuration. Make sure this is properly set. For example, configuring all the HDD disks into one logical disk can fix this problem, or re-flashing the RAID card can also help.
### I get the error Certificate is not yet valid when booting my 3Node server, what can I do?
Make sure your firmware is up to date. If necessary, reinstall it. You might have to install and then re-install the firmware if your system is very old.
### My SSD is sometimes detected as HDD by Zero-OS when there is a reboot. Is there a fix or a way to test the SSD disk?
If your SSD disk shows as HDD, usually you can reboot the 3Node and Z-OS adjusts correctly.
Anyone experiencing frequently this issue where Z-OS sometimes detects an SSD as HDD can try the following:
* Boot up a live Ubuntu Desktop image
* Run the benchmark utility within the Disks app
* Check if the seektime of the disk is sufficient for Z-OS
* If the seektime is above 0.5ms, Z-OS will consider your SSD as HDD
**Detailed Steps:**
* Boot a Ubuntu Linux live USB
* Install **gnome-disks** if it isn't already installed:
```
sudo apt install gnome-disks
```
* Open the application launcher and search for **Disks**
* Select your disk
* Click on the tree dots menu
* Select **Benchmark Disk...**
* Use the default parameters
* **Transfer rate**: This is not relevant for our current test
* You can set to it to minimum (e.g. 2)
* **Sample size**: 10 MB is sufficient
* Check the average access time on the [ThreeFold repository](https://www.github.com/threefoldtech/seektime)
* Check seek time for HDD and SSD
* A SSD needs to be <=0.5ms
* If the result is above 0.5ms, this is why Z-OS doesn't recognize the disk properly
* You can then run diagnostics (e.g. smartmontools)
* If this is not fixable, you should change disk (e.g. take a more performing disk)
Note: The green dots on the output represent seektime and that's what Z-OS is looking at. Specifically, it checks that the average seektime is below 0.5ms. If the seektime is above this, Z-OS will consider your SSD as HDD.
### My 3Node uses only PCIe adapters and SSD NVME disks. Do I need the RAID controller on?
The onboard RAID controller is not linked to your PCIe SSDs. In this case, you can switch the RAID controller off.
### My 3Node has 2 ethernet ports in the back, with one written AMT above, what does it mean? Can I use this port to connect my 3Node to the ThreeFold Grid?
First, let's define the term AMT. It means: Active Management Technology. Without going into too much details, it is to remotely access servers via the network at the BIOS level. Thus, you should plug the ethernet cable in the port next to AMT, and not into the AMT port. You can explore AMT properties if you want remote access to your server.
### When I boot my Dell server, I get the message: All of the disks from your previous configuration are gone... Press any key to continue or 'C' to load the configuration utility. What can I do?
Many changes to your server can lead to this message.
Usually, the easiest solution is to reset the disk configuration in iDRAC's configuration utility.
What can causes this message:
1. During a new installation, the cables connecting to your external storage are not wired to the correct ports.
2. Your RAID adapter has failed.
3. Your SAS cables are not plugged properly or are malfunctioning.
Note: Resetting the configuration will destroy all data on all virtual disks. Make sure you know what you are doing! In doubt, ask the TF community.
### When booting a 3Node, how to fix the error: "no disks: registration failed"?
There can be many different fixes for this error. Here are some troubleshooting tips to test separately:
* In BIOS, enable AHCI
* Make sure to [wipe the disks](4_wipe_all_disks.md) of the 3Nodes
* If the 3Node has a RAID Controller:
* Disabled the RAID controller, OR;
* [Flash the RAID controller](https://fohdeesha.com/docs/perc.html) (i.e. crossflashing), OR;
* Change the controller to a Dell H310 controller (for Dell servers)
* Try the command **badblocks** (replace **sda** with your specific disk). Note that this command will delete all the data on the disk
```
sudo badblocks -svw -b 512 -t 0x00 /dev/sda
```
### I have trouble connecting the 3Node to the Grid with a 10GB NIC card. What can I do?
As of now, Zero-OS sometimes has trouble with 10GB NIC card. The easiest solution to this is to connect your 3Node with the 1GB NIC card. This should solve the issue. More fine tuning might be needed to get your 3Node to work with a 10GB NIC card. Future Zero-OS version might solve this issue.
### What does it mean when I see, during the 3Node boot, the message: error = context deadline exceeded?
In general, this message means that the ThreeFold Grid asked something to your 3Node, and your 3Node could not respond fast enough. It is usually necessary to read the following error message to understand the situation more specifically.
### How can I fix the error messages: "context deadline exceeded" accompanied with "node is behind acceptable delay with timestamp"?
This often indicates that the real-time clock of the system is not synced with current time. There have been different fixes reported to this issue.
You can boot the node using a Ubuntu live image to sync the hardware time. After that, you can reboot the node and it should boot normally.
You can fix this manually in the BIOS. Go to the BIOS settings and adjust the **Time** and **Date** settings.
You can also try to adjust the clock by NTP over the network, if it applies to your case.
### I try to boot a 3Node, but I get the error: "No Route to Host on Linux". What does it mean?
There are many potential answers to this. Perhaps the Host is offline, the service isn't running. This is usually the reason with TF Grid. It means the Grid is not responsive. In this case, try to boot the 3Node later. If it persists ask TF Support.
There can also be other reasons. You might have connected to the wrong port. Perhaps you have configured iptables to block connections on that port. Your DNS might be improperly configured. You might have an Incorrect Network or Host Configuration. Many troubleshoots are possible. Here's a [good place to start](https://www.maketecheasier.com/fix-no-route-to-host-error-linux/).
### How can I fix the error: "Network configuration succeed but Zero-OS kernel could not be downloaded" when booting a 3Node?
To fix the error "Network configuration succeed but Zero-OS kernel could not be downloaded", you can try to restart the router and reboot the 3Node. This usually fixes the issue. If this doesn't work, check if the router is still functional. The cause of this issue might be that your router is broken.
### Using SAS disks, I get the error; "No ssd found, failed to register". What can I do to fix this?
First make sure to wipe the disks and then boot your 3Node. If you've wiped the disks and it doesn't work, it's been reported that using the command "diskpart clean command" on Windows can fix this issue.
### When booting a 3Node, I get the message: failed to register node: failed to create node: failed to submit extrinsic: Invalid Transaction: registration failed. What could fix this?
The most probable fix to this error is simply to properly [wipe your disks](4_wipe_all_disks.md).
### I did a format on my SSD disk, but Zero-OS still does not recognize them. What's wrong?
Formatting is one thing, but to boot properly, Zero-OS needs to work on a completely wiped disk. Thus, make sure you [wipe your disks](4_wipe_all_disks.md). Formatting is not enough.
### My 3Node doesn't boot properly without a monitor plugged in. What can I do?
First, try to disable the "Halt On" mode in BIOS. If you do not have this option, try simply enabling Legacy Support (Dell BIOS for example). If this doesn't work, try to plug in a Dummy Plug/Headless Ghost/Display Emulator in your 3Node. This will simulate a plugged monitor. This should fix the problem.
### My 3Node won't boot without disabling the Secure Boot option, is it safe?
In the case where you want to boot Zero-OS, disabling Secure Boot option is safe. With Secure Boot disabled, it can be easier or even necessary when it comes to booting Zero-OS. Secure Boot is used when you want to lock the BIOS/UEFI settings.
### When booting the 3Node, I get the error Network interface detected but autoconfiguration failed. What can I do?
First make sure your network cable is plugged in and that your DHCP is working and responding. If you change the NIC port of the ethernet cable, make sure to reboot the 3Node so Zero-OS can change the NIC port attribution.
Some farmers reported that this got fixed by simply powering off the 3Node(s), the router and modem for 2 minutes then powering it all back on. Resetting the modem and router (switch on the hardware) in the process can also help.
If this doesn't work, try to upgrade the firmware of the NIC and the motherboard. If this still doesn't work, the NIC card might be broken. Try with another NIC card.
### When I try to boot my 3Node, the fans start spinning fast with a loud noise and the screen is black. What can I do to resolve this?
There may be several causes to this issue. You can try to remove all the RAM sticks, to clean the dust and then to reseat the RAM sticks. If it still doesn't resolve the issue, you can check the RAM sticks one by one to see if one is malfunctioning. This often resolves the issue. Also, some cables might not be properly connected.
### When booting Zero-OS with IPV6 configurations, I get the errors (1) dial tcp: address IPV6-address too many columns in address and (2) no pools matches key: not routable. What can I do to fix this issue?
This usually means that the IPV6 attributed is not valid. It is also often caused when the DNS configuration does not resolve IPV6 correctly.
To fix this issue, it is often necessary to adjust the IPV6 settings related to the router and the modem. Confirming with your Internet service provider (ISP) that the IPV6 settings are properly configured could also be necessary to fix the issue.
### I try to boot a 3Node, but I get the message no route with default gateway found. What does it mean?
First, let's see the main terms. Default gateway acts as an access point to other networks, in this case the TF Grid, when there is a back and forth exchange of data packets.
While the last question implied a communication problem from the Grid, this error message usually means that the 3Node has communication problem. In short, it has difficulty reaching the TF Grid. There are many ways to troubleshoot this error. First, let's give the most direct solution. Make sure you have a direct connection with your Internet Service Provider (ISP): your 3Node should be connected to a router or a switch via an ethernet cable. Wifi doesn't work. Make sure your DHCP is set correctly.
If the problem persists, check the default gateway of your 3Node and then make sure your router can reach it.
### When booting a 3Node, Zero-OS downloads fine, but then I get the message: error no route with default gateway found, and the message: info check if interface has a cable plugged in. What could fix this?
Make sure you have network stack enabled in BIOS. If so, check you ethernet port and make sure that it's clean. Also make sure the ethernet rj45 connectors are clean on both ends. If that does not work, verify the state of your SATA cables. If all this doesn't work, download and re-install Zero-OS.
### How can I update Dell and HP servers to Intel E5-2600v2, E5-2400v2 and E5-4600v2, when applicable?
There are many ressources online with steps on how to do this. You can check this [youtube video](https://www.youtube.com/watch?v=duzrULLtonM) on Dell and HP servers, as welll as this [documentation](https://ixnfo.com/en/hp-proliant-gen8-update-to-support-cpu-e5-2600v2-e5-2400v2-e5-4600v2.html) for HP Proliant Gen8.
### How can I update the firmware and driver of a Dell PowerEdge server?
Dell has excellen documentation for this. Read [this](https://www.dell.com/support/kbdoc/en-us/000128194/updating-firmware-and-drivers-on-dell-emc-poweredge-servers) for the detailed steps.
### When I boot a 3Node in UEFI mode, it gets stuck at: Initializing Network Device, is there a way to fix this?
In short, booting the 3Node in BIOS mode instead of UEFI mode usually fixes this issue.
You can make bootable USB with the USB option of the [Zero-OS bootstrap image page](https://bootstrap.grid.tf/). Make sure to boot your server using BIOS and not UEFI. In the boot sequence, make the USB as your first choice to boot.
### When I boot my 3Node, it gets stuck during the Zero-OS download. It never reaches 100%. What can I do to fix this issue?
Here are some ways to troubleshoot your 3Node when it cannot download Zero-OS completely (to 100%):
* Sometimes, just rebooting the 3Node and/or trying a little bit later can work.
* It can help to reboot the modem and the router.
* Make sure your BIOS/UEFI is up to date. Updating the BIOS/UEFI can help.
* It can also help to set the correct date and time.
### When booting a 3Node, I get the error=“context deadline exceeded” module=network error=failed to initialize rmb api failed to initialized admin mw: failed to get farm: farm not found: object not found. What can I do to fix this issue?
Usually, the simple fix to this issue is to make sure that your bootstrap image is on the same network as your farm. For example, if you created your farm on the Main net, you should use a Main net Zero-OS bootstrap image.
## Memory Troubleshooting
### Can I use different type of RAM for the same 3Node?
No. Always use the same type of RAM per 3Node. If you use RDIMM, go all RDIMM, etc. Check your hardware specifications to make sure you have the right type of memory.
### How can I know if the memory I am buying is correct for my specific hardware?
To be sure, look into the owner's manual of your specific computer.
In general, you can go to [Memory.net](https://memory.net/) and look for your specific computer model. As general steps, select your computer's system in *By system*, then select the series and then select the specific model of the series. You will then see available memories to buy from memory.net. You can also simply read the documentation at the bottom. The memory type supported by your computer will be explained. Then you can buy the memory needed from any other computer store.
For servers, you can check with Cloudninja's documentation [here](https://cloudninjas.com/pages/server-memory). Search for your specific hardware and look for the compatible memory. This reference is good for rack and tower servers.
### What do the terms RDIMM, LDIMM, UDIMM, LRDIMM, FBDIMM mean when it comes to RAM memory sticks?
Well first, the DIMM means dual inline memory module.
* U stands for or unregistered (or unbuffered).
* R stands for registered memory.
* LR stands for load-reduced.
* FB stands for fully-buffered.
### What is the difference between ECC and non-ECC memory?
ECC means error correction code memory. This type of memory can detect and correct data corruption. Non-ECC mostly cannot detect nor correct, but some can detect, but never correct data corruption. Check your hardware specifications to make sure you have the right type of memory (ECC or non-ECC).
### How can I change the RAM memory sticks on my 3Nodes? How can I achieve dual channel configuration with sticks of RAM?
First, always use RAM sticks of the same size and type. It should be noted on your motherboard which slots to populate first. As a general guide, there is usually 2 slots A and B, with each 2 memory stick entries. You must then install the ram sticks on A1 and B1 in order to achieve dual channel, then A2 and B2 if you have more (visual order: A1 A2 B1 B2).
> Example: You want to start with your largest sticks, evenly distributed between both processors and work your way down to your smallest. Let's take an example with 2 processors as well as 4x 16GB sticks and 4x 8GB sticks. The arrangement would be A1-16GB, B1-16GB, A2-16GB, B2-16GB, A3-8GB, B3-8GB, A4-8GB, B4-8GB. Avoid odd numbers as well. You optimally want pairs. So if you only have 5x 8GB sticks, only install 4 until you have an even 6.
### What does RAM mean?
RAM means random access memory. Those type of memory can be read and changed in any order.
### What does DIMM mean when it comes to RAM sticks?
It means *dual in-line memory module*. This type of computer memory is natively 64 bits, enabling fast data transfer.
### I have 24 DIMMS ram slots on my server. Can I use them all?
Be careful when installing memory on a server. Always check your server's documentation to make sure your RAM sticks combination are correct.
For example, on the Dell R720, you can have 24x16gb RAM ECC sticks, but it can only handle 16 Quad ranked DIMMs. In this case, you can fill up all slots with registered DIMMs if you have a maximum of 4 quad DIMMS ranked on each CPU.
## Basic Post Build Troubleshooting
In this section, we cover notions such as how to reboot node or a router, how to check the network signal path and more.
### Reboot a 3Node
To reboot your 3Node, simply turn if off manually then turn it back on.
### Reboot a Router
- Locate the power cord of your router and unplug it from the power outlet.
- Wait for at least 30 seconds to allow the router to completely shut down.
- Plug the power cord back into the power outlet.
- Wait for the router to boot up again. This may take around 2-5 minutes.
- Once the router is back up, check your internet connection to see if its working properly.
### Reboot a Modem with the Reset Button
- Find the reset button on the back or bottom of the modem.
- Press and hold the reset button for 30 seconds.
- Release the button when the power light turns another color (usually amber/orange).
- Wait for the modem to fully reboot and the lights to stabilize.
### My 3Nodes go offline after a modem reboot. Is there a way to prevent this?
Yes, there are many ways to prevent this. An easy solution is to set the DHCP server to reserve local IPs for the 3Nodes MAC addresses.
This problem is also preventable if your router stays online during the modem reboot.
Indeed, rebooting the 3Nodes is necessary when there are local IP changes, as 3Nodes are addressed a local IP addresses when they are booted.
The DHCP will addresses any local IP address that is available when you are booting a 3Node. Reserving local IP addresses is a good TF farming practice.
### When I try to access iDRAC on a web browswer, even with protected mode off, I get the error The webpage cannot be found, what can I do?
Open iDRAC in the Internet Explorer emulator extension (IE Tab) in Chrome, then update iDRAC. It should work elsewhere then. Sometimes, it will be needed to add "ST1=code" at the end of the IE Tab url.
### When I boot my 3Node, it reaches the Welcome to Zero-OS window, but it doesn't boot properly and there's an error message: failed to load object : type substrate..., what can I do?
Usually simply rebooting the 3Node fixes this problem.
### I want redundancy of power for my 3 nodes. I have two PSU on my Dell server. What can I do?
Make sure you enable the Hot Spare feature. This feature is accessible in iDRAC Settings - Power Configuration. Other servers might have this function, with a different name and configuration. Check the server's manual for more details.
### I switch the ethernet cable to a different port when my 3Node was running. Internet connection is lost. What can I do?
When your 3Node boots, Zero-OS marks the NIC port. This means you cannot change NIC port when your 3Node is running. You can either put back the ethernet cable in the initial NIC port, or reboot the 3Node. At boot, Zero-OS will marks the new NIC port as the main entry.
## Advanced Post Build Troubleshooting
In this section, we cover notions such as how to connect a screen and look for errors, how to address certain errors, etc.
### Access the Error/Log Screen
To access the error/log screen, connect a monitor to your 3Node and on the Zero-OS console, hit alt-F2 to open up the Error/Log Screen, and hit alt-F3 to go back to the main screen.
### Can I use a VGA to HDMI adaptor to connect a TV screen or monitor to the 3Node? I tried to boot a 3Node with a VGA to HDMI adaptor but the boot fails, what can I do?
This might work, but it has been reported by farmers that Zero-OS might have difficulties booting when this is done with a VGA/HDMI adaptor on a TV screen. This is most likely due to the TV screen not supporting the output once the system loaded into Zero-OS. The easy fix to this issue is to use a standard computer monitor with a VGA plug.
### My 3Node is running on the Grid, but when I plugged in the monitor, it states: Disabling IR #16. Is there a problem?
In general, you can simply ignore this error statement. This error is linked to the Nvidia binary driver. It simply means that your 3Node lost connection with the graphic card (by unplugging and replugging the monitor for example).
### Address Certain Errors
Once you had access to the error/log screen and took notes of the errors, you can look for fixes in the manual. This troubleshooting section is a good place to look for solutions.
If you could not find any fixes to your issues, go to the next section to ask for further assistance.
## Get Further Assistance
If you've read this whole section and tried different troubleshooting methods to no avail, do not lose hope! You can get further assistance and we will most surely resolve your issues.
You can contact the [ThreeFold support team](https://threefoldfaq.crisp.help/en/) and raise a ticket to get further assistance.
Also, you can ask questions on the [ThreeFold Forum](https://forum.threefold.io/) or on the [ThreeFold Farmer Telegram Channel](https://t.me/threefoldfarmers).

View File

@ -0,0 +1,123 @@
<h1> Node Status Bot </h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Disclaimer](#disclaimer)
- [Getting Started with the Bot](#getting-started-with-the-bot)
- [Commands](#commands)
- [Bugs and Features](#bugs-and-features)
- [Node Status Bot News](#node-status-bot-news)
---
## Introduction
We present the [Node Status Bot](https://t.me/tfnodestatusbot) and how to use it.
The Node Status Bot is a very helpful tool for farmers of the ThreeFold Grid. It can give you relevant information on your node status, notify you if the node status changes and also provide information on minting violations.
You can find the bot source code on GitHub [here](https://github.com/threefoldfoundation/node-status-bot).
## Disclaimer
Note that the bot is developed and operated on a best effort basis. You are responsible for your nodes' uptime and your farming rewards.
## Getting Started with the Bot
To get started with the bot, simply go to the [bot link on Telegram](https://t.me/tfnodestatusbot) and hit the start button to begin interacting with the bot.
You can get the real time status of a node with the status command. For example, this gives the status of node 42
```
/status 42
```
The bot can also send you a message when the status of a node changes. Use the subscribe command (or sub for short) to begin alerts for one or more nodes. Here we are subscribing to nodes 1, 2, and 3:
```
/sub 1 2 3
```
Once you have subscribed you can issue the status command with no input to get the current status of the nodes you are subscribed to:
```
/status
```
By default, the bot is on main network. To change the network to the dev or test networks, use the network (net) command. Changing the network does not affect any existing subscriptions, and the bot does not specify which network the nodes belong to in its messages. Here's an example to change the network to devnet:
```
/net dev
```
You can also check if there are any violations in the current minting period. Like status, this command takes a node id as input or works on the currently subscribed nodes if no input is given:
```
/violations
```
The next section covers in-depth the different commands available.
## Commands
Here is a reference for all supported commands and their different forms:
- `/help`
- Print the start message with all the available commands
- `/status`
- Check the current status of one or all nodes.
- This uses a similar method as the Dashboard for determining node status, and update may be delayed by an hour
- With no input, a status report will be generated for all subscribed nodes, if any
- Examples
- Check status of node ID 1
- `/status 1`
- Check status of all currently subscribed nodes
- `/status`
- `/violations`
- Scan for farmerbot related violations during the current and previous minting periods
- Like status, this works on all subscribed nodes when no input is given
- Examples
- Check violations of node ID 1
- `/violations 1`
- Check status of all currently subscribed nodes
- `/violations`
- `/subscribe`
- Subscribe to updates about one or more nodes
- You can use the shortcut `/sub`
- If you don't provide an input, the nodes you are currently subscribed to will be shown
- Examples
- Subscribe to node ID 1
- `/sub 1`
- Subscribe to node ID 1, 2, 3
- `/sub 1 2 3`
- Check all subscribed nodes
- `/sub`
- `/unsubscribe`
- Unsubscribe to updates about one or more nodes
- You can use the shortcut `/unsub`
- Examples
- Unsubscribe to node ID 1
- `/unsubscribe 1`
- Unsubscribe to node ID 1, 2, 3
- `/unsubscribe 1 2 3`
- Unsubscribe to all currently subscribed nodes
- `/unsub all`
- `/network`
- Change the network to `dev`, `test`, or `main`
- Default is `main`
- You can use the shortcut `/net`
- If you don't provide an input, the currently selected network is shown
- Examples
- Check current network
- `/network`
- Change to another network, e.g. to `dev`
- `/net dev`
## Bugs and Features
To report bugs and request features, please open an issue on the [GitHub repo](https://github.com/threefoldfoundation/node-status-bot) or contact [Scott Yeager on Telegram](https://t.me/scottyeager).
## Node Status Bot News
If you use the bot, please also subscribe to the [Node Status Bot News channel](https://t.me/node_bot_updates) on Telegram to receive occasional updates and news concerning the bot.

View File

@ -6,7 +6,8 @@ For complementary information on ThreeFold, refer to the [ThreeFold Knowledge Ba
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
- [Dashboard](dashboard@@dashboard) - [ThreeFold Dashboard](dashboard@@dashboard)
- [ThreeFold Connect](tfconnect@@tfconnect_toc)
- [Developers](developers@@developers) - [Developers](developers@@developers)
- [Farmers](farmers@@farmers) - [Farmers](farmers@@farmers)
- [System Administrators](system_administrators@@system_administrators) - [System Administrators](system_administrators@@system_administrators)

View File

@ -9,12 +9,29 @@ This manual is organized in two main sections:
The *ThreeFold Knowledge Base* section contains all information needed to understand how the whole ThreeFold ecosystem works. The *ThreeFold Knowledge Base* section contains all information needed to understand how the whole ThreeFold ecosystem works.
The *ThreeFold Documentation* section contains all the practical information of the ThreeFold Grid, from general information covering the multi-functional [Dashboard](dashboard@@dashboard), [TFT](threefold_token@@threefold_token) and our community-based [FAQ](faq@@faq), to specific tutorials for [developers](developers@@developers), [farmers](farmers@@farmers) and [system administrators](system_administrators@@system_administrators). The *ThreeFold Documentation* section contains all the practical information of the ThreeFold Grid, from general information covering the multi-functional [ThreeFold Dashboard](dashboard@@dashboard), the versatile [ThreeFold Connect app](tfconnect@@tfconnect_toc), [TFT](threefold_token@@threefold_token) and our community-based [FAQ](faq@@faq), to specific tutorials for [developers](developers@@developers), [farmers](farmers@@farmers) and [system administrators](system_administrators@@system_administrators).
> Explore the TFGrid status page for live updates on Threefold services! > Explore the TFGrid status page for live updates on Threefold services!
> >
> [Access with Grid.tf](https://status.grid.tf) | [Access with ThreeFold.io](https://status.threefold.io) > [Access with Grid.tf](https://status.grid.tf) | [Access with ThreeFold.io](https://status.threefold.io)
## Get Started
It's easy to get started on the TFGrid.
If you want to farm TFT, check out [how to build a 3Node](documentation@@3node_building).
If you want to deploy or develop on the grid, you will first need to get TFT on TFChain:
- [Create a TFChain account](dashboard@@wallet_connector)
- Get TFT in your TFChain account
- [Buy TFT](threefold_token@@buy_sell_tft)
- [Send TFT to TFChain](threefold_token@@tft_bridges)
To develop on the Grid, read the [developers documentation](developers@@developers).
To deploy applications, read the [deploy section](dashboard@@deploy) then [access the deployment via SSH](system_administrators@@ssh_guide).
## Join the ThreeFold Community ## Join the ThreeFold Community
The ThreeFold community is very active and its members will be more than happy to discuss and help you get started. The ThreeFold community is very active and its members will be more than happy to discuss and help you get started.

View File

@ -0,0 +1,8 @@
<h1>Ecommerce</h1>
You can easily deploy a free and open-source ecommerce on the TFGrid. We present here two of the most popular options.
<h2>Table of Contents</h2>
- [WooCommerce](./woocommerce.md)
- [nopCommerce](./nopcommerce.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

View File

@ -0,0 +1,265 @@
<h1>Ecommerce on the TFGrid</h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [Deploy a Full VM](#deploy-a-full-vm)
- [Create an SSH Tunnel](#create-an-ssh-tunnel)
- [Preparing the VM](#preparing-the-vm)
- [Set a Firewall](#set-a-firewall)
- [Download nopCommerce](#download-nopcommerce)
- [Access nopCommerce](#access-nopcommerce)
- [Install nopCommerce](#install-nopcommerce)
- [Access the Ecommerce from the Public Internet](#access-the-ecommerce-from-the-public-internet)
- [Set a DNS Record](#set-a-dns-record)
- [Access the Ecommerce](#access-the-ecommerce)
- [HTTPS with Caddy](#https-with-caddy)
- [Manage with Systemd](#manage-with-systemd)
- [Access Admin Panel](#access-admin-panel)
- [Manage nopCommerce with Systemd](#manage-nopcommerce-with-systemd)
- [References](#references)
---
## Introduction
We show how to deploy a free and open-source ecommerce on the ThreeFold Grid. We will be deploying on a full VM with an IPv4 address.
[nopCommerce](https://www.nopcommerce.com/en) is an open-source ecommerce platform based on Microsoft's ASP.NET Core framework and MS SQL Server 2012 (or higher) backend Database.
## Prerequisites
- [A TFChain account](dashboard@@wallet_connector)
- TFT in your TFChain account
- [Buy TFT](threefold_token@@buy_sell_tft)
- [Send TFT to TFChain](threefold_token@@tfchain_stellar_bridge)
## Deploy a Full VM
We start by deploying a full VM on the ThreeFold Dashboard.
* On the [Threefold Dashboard](https://dashboard.grid.tf/#/), go to the [full virtual machine deployment page](https://dashboard.grid.tf/#/deploy/virtual-machines/full-virtual-machine/)
* Deploy a full VM (Ubuntu 22.04) with an IPv4 address and at least the minimum specs shown below
* IPv4 Address
* Minimum vcores: 2 vcores
* Minimum GB of RAM: 4 GB
* Minimum storage: 50 GB
* After deployment, note the VM IPv4 address
## Create an SSH Tunnel
We create an SSH tunnel with port 5432:80, as it is this combination that we will set for nopCommerce on the docker-compose file.
- Open a terminal and create an SSH tunnel
```
ssh -4 -L 5432:127.0.0.1:80 root@VM_IPv4_address>
```
Simply leave this window open and follow the next steps.
## Preparing the VM
We prepare the full to run nopCommerce.
* Connect to the VM via SSH
```
ssh root@VM_IPv4_address
```
* Update the VM
```
apt update
```
* [Install Docker](docker_basics.html#install-docker-desktop-and-docker-engine)
* Install docker-compose
```
apt install docker-compose -y
```
## Set a Firewall
You can set a firewall to your VM for further security. This should be used in production mode.
* Add the permissions
```
ufw allow 80
ufw allow 443
ufw allow 22
```
* Enable the firewall
```
ufw enable
```
* Verify the fire wall status
```
ufw status verbose
```
## Download nopCommerce
* Clone the repository
```
git clone https://github.com/nopSolutions/nopCommerce.git
cd nopCommerce
```
* Build the image
```
cd nopCommerce
docker-compose -f ./postgresql-docker-compose.yml build
```
* Run the image
```
docker-compose -f ./postgresql-docker-compose.yml up
```
## Access nopCommerce
You can access the nopCommerce interface on a browser with port 5432 via the SSH tunnel:
```
localhost:5432
```
![](./img/nopcommerce_1.png)
For more information on how to use nopCommerce, refer to the [nopCommerce docs](https://docs.nopcommerce.com/en/index.html).
## Install nopCommerce
You will need to set your ecommerce store and database information.
- Enter an email for your website (e.g. `admin@example.com`)
- For the database, choose PostgreSQL and check both options `Create a database` and `Enter raw connection`. Enter the following information (as per the docker-compose information)
```
Server=nopcommerce_database;Port=5432;Database=nop;User Id=postgres;Password=nopCommerce_db_password;
```
- Note: For production, you will need to set your own username and password.
## Access the Ecommerce from the Public Internet
### Set a DNS Record
* Go to your domain name registrar
* In the section **Advanced DNS**, add a **DNS A Record** to your domain and link it to the IP address of the VM you deployed on:
* Type: A Record
* Host: @
* Value: <IPv4_Address>
* TTL: Automatic
* It might take up to 30 minutes to set the DNS properly.
* To check if the A record has been registered, you can use a common DNS checker:
```
https://dnschecker.org/#A/example.com
```
### Access the Ecommerce
You can now go on a web browser and access your website via your domain, e.g. `example.com`.
![](./img/nopcommerce_2.png)
### HTTPS with Caddy
We set HTTPS with Caddy.
- Install Caddy
```
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy
```
- Set a reverse proxy on port 80 with your own domain
```
caddy reverse-proxy -r --from example.com --to :80
```
You should see in the logs that it successfully obtains an SSL certificate, and after that you can try navigating to your site's domain again to verify it's working. Using a private window or adding `https://` specifically might be necessary until your browser drops its cache.
![](./img/nopcommerce_3.png)
When you're satisfied that everything looks good, hit `ctl-c` to exit Caddy and we'll proceed to making this persistent.
#### Manage with Systemd
We create a systemd service to always run the reverse proxy for port 80.
- Create a caddy service
```bash
nano /etc/systemd/system/caddy.service
```
- Set the service with your own domain
```
[Unit]
Description=Caddy Service
StartLimitIntervalSec=0
[Service]
Restart=always
RestartSec=5
ExecStart=caddy reverse-proxy -r --from example.com --to :80
[Install]
WantedBy=multi-user.target
```
- Enable the service
```
systemctl daemon-reload
systemctl enable caddy
systemctl start caddy
```
- Verify that the Caddy service is properly running
```
systemctl status caddy
```
Systemd will start up Caddy immediately, restart it if it ever crashes, and start it up automatically after any reboots.
## Access Admin Panel
You can access the admin panel by clicking on `Log in` and providing the admin username and password set during the nopCommerce installation.
![](./img/nopcommerce_4.png)
In `Add your store info`, you can set the HTTPS address of your domain and enable SSL.
You will need to properly configure your ecommerce instance for your own needs and products. Read the nopCommerce docs for more information.
## Manage nopCommerce with Systemd
We create a systemd service to always run the nopCommerce docker-compose file.
- Create a nopcommerce service
```bash
nano /etc/systemd/system/nopcommerce.service
```
- Set the service with your own domain
```
[Unit]
Description=nopCommerce Service
StartLimitIntervalSec=0
[Service]
Restart=always
RestartSec=5
StandardOutput=append:/root/nopcommerce.log
StandardError=append:/root/nopcommerce.log
ExecStart=docker-compose -f /root/nopCommerce/postgresql-docker-compose.yml up
[Install]
WantedBy=multi-user.target
```
- Enable the service
```
systemctl daemon-reload
systemctl enable nopcommerce
systemctl start nopcommerce
```
- Verify that the Caddy service is properly running
```
systemctl status nopcommerce
```
Systemd will start up the nopCommerce docker-compose file, restart it if it ever crashes, and start it up automatically after any reboots.
## References
For further information on how to set nopCommerce, read the [nopCommerce documentation](https://docs.nopcommerce.com/en/index.html?showChildren=false).

View File

@ -0,0 +1,152 @@
<h1>WooCommerce on the TFGrid</h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [Deploy Wordpress](#deploy-wordpress)
- [Set a DNS Record](#set-a-dns-record)
- [HTTPS with Caddy](#https-with-caddy)
- [Adjust the Firewall](#adjust-the-firewall)
- [Manage with zinit](#manage-with-zinit)
- [Access Admin Panel](#access-admin-panel)
- [Install WooCommerce](#install-woocommerce)
- [Troubleshooting](#troubleshooting)
- [References](#references)
---
## Introduction
We show how to deploy a free and open-source ecommerce on the ThreeFold Grid. We will be deploying on a micro VM with an IPv4 address.
[WooCommerce](https://woocommerce.com/) is the open-source ecommerce platform for [WordPress](https://wordpress.com/). The platform is free, flexible, and amplified by a global community. The freedom of open-source means you retain full ownership of your stores content and data forever.
## Prerequisites
- [A TFChain account](dashboard@@wallet_connector)
- TFT in your TFChain account
- [Buy TFT](threefold_token@@buy_sell_tft)
- [Send TFT to TFChain](threefold_token@@tfchain_stellar_bridge)
## Deploy Wordpress
We start by deploying Wordpress on the ThreeFold Dashboard.
* On the [Threefold Dashboard](https://dashboard.grid.tf/#/), go to the [Wordpress deloyment page](https://dashboard.test.grid.tf/#/deploy/applications/wordpress/)
* Deploy a Wordpress with an IPv4 address and sufficient resources to run Wordpress
* IPv4 Address
* Minimum vcores: 2vcore
* Minimum MB of RAM: 4GB
* Minimum storage: 50GB
* After deployment, note the VM IPv4 address
## Set a DNS Record
* Go to your domain name registrar
* In the section **Advanced DNS**, add a **DNS A Record** to your domain and link it to the IP address of the VM you deployed on:
* Type: A Record
* Host: @
* Value: <IPv4_Address>
* TTL: Automatic
* It might take up to 30 minutes to set the DNS properly.
* To check if the A record has been registered, you can use a common DNS checker:
```
https://dnschecker.org/#A/example.com
```
## HTTPS with Caddy
We set HTTPS with Caddy.
- Install Caddy
```
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy
```
- Set a reverse proxy on port 80 with your own domain
```
caddy reverse-proxy -r --from example.com --to :80
```
You should see in the logs that it successfully obtains an SSL certificate, and after that you can try navigating to your site's domain again to verify it's working. Using a private window or adding `https://` specifically might be necessary until your browser drops its cache.
When you're satisfied that everything looks good, hit `ctl-c` to exit Caddy and we'll proceed to making this persistent.
### Adjust the Firewall
By default, ufw is set on Wordpress application from the Dashboard. To use Caddy and set HTTPS, we want to allow port 443.
* Add the permissions
```
ufw allow 443
```
### Manage with zinit
We manage Caddy with zinit.
- Open the file for editing
```bash
nano /etc/zinit/caddy.yaml
```
- Insert the following line with your own domain and save the file
```
exec: caddy reverse-proxy -r --from example.com --to :80
```
- Add the new Caddy file to zinit
```bash
zinit monitor caddy
```
Zinit will start up Caddy immediately, restart it if it ever crashes, and start it up automatically after any reboots. Assuming you tested the Caddy invocation above and used the same form here, that should be all there is to it.
Here are some other Zinit commands that could be helpful to troubleshoot issues:
- See status of all services (same as "zinit list")
```
zinit
```
- Get logs for a service
```
zinit log caddy
```
- Restart a service (to test configuration changes, for example)
```
zinit stop caddy
zinit start caddy
```
## Access Admin Panel
You can access the admin panel by clicking on `Admin panel` under `Actions` on the Dashboard. You can also use the following template on a browser with your own domain:
```
example.com/wp-admin
```
If you've forgotten your credentials, just open the Wordpress info window on the Dashboard.
## Install WooCommerce
On the Wordpress admin panel, go to `Plugins` and search for WooCommerce.
![](./img/woocommerce_1.png)
Once this is done, you can open WooCommerce on the left-side menu.
![](./img/woocommerce_2.png)
You can then set your store and start your online business!
![](./img/woocommerce_3.png)
## Troubleshooting
You might need to deactivate some plugins that aren't compatible with WooCommerce, such as `MailPoet`.
## References
Make sure to read the [Wordpress and Woocommerce documentation](https://woocommerce.com/document/woocommerce-self-service-guide) to set your ecommerce.

View File

@ -0,0 +1,91 @@
<h1>HTTPS with Caddy</h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [Set HTTPS](#set-https)
- [Adjust the Firewall](#adjust-the-firewall)
- [Manage with zinit](#manage-with-zinit)
---
## Introduction
We show how to set HTTPS with Caddy for any deployment on the grid.
## Prerequisites
- A deployment on the TFGrid and SSH access
## Set HTTPS
We set HTTPS with Caddy.
- Install Caddy
```
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy
```
- Set a reverse proxy on port 80 with your own domain
```
caddy reverse-proxy -r --from example.com --to :80
```
You should see in the logs that it successfully obtains an SSL certificate, and after that you can try navigating to your site's domain again to verify it's working. Using a private window or adding `https://` specifically might be necessary until your browser drops its cache.
When you're satisfied that everything looks good, hit `ctl-c` to exit Caddy and we'll proceed to making this persistent.
### Adjust the Firewall
To use Caddy and set HTTPS, we want to allow port 443. If you are using `ufw`, add the permission for HTTPS:
- Add the permissions
```
ufw allow 443
```
### Manage with zinit
We manage Caddy with zinit.
- Open the file for editing
```bash
nano /etc/zinit/caddy.yaml
```
- Insert the following line with your own domain and save the file
```
exec: caddy reverse-proxy -r --from example.com --to :80
```
- Add the new Caddy file to zinit
```bash
zinit monitor caddy
```
Zinit will start up Caddy immediately, restart it if it ever crashes, and start it up automatically after any reboots. Assuming you tested the Caddy invocation above and used the same form here, that should be all there is to it.
Here are some other Zinit commands that could be helpful to troubleshoot issues:
- See status of all services (same as "zinit list")
```
zinit
```
- Get logs for a service
```
zinit log caddy
```
- Restart a service (to test configuration changes, for example)
```
zinit stop caddy
zinit start caddy
```

View File

@ -20,10 +20,10 @@ In this guide, we go through the basic steps to deploy a [Hummingbot](https://hu
## Prerequisites ## Prerequisites
- [A TFChain account](wallet_connector.md) - [A TFChain account](dashboard:wallet_connector.md)
- TFT in your TFChain account - TFT in your TFChain account
- [Buy TFT](buy_sell_tft.md) - [Buy TFT](threefold_token:buy_sell_tft.md)
- [Send TFT to TFChain](tfchain_stellar_bridge.md) - [Send TFT to TFChain](threefold_token:tft_bridges.md)
## Deploy a Full VM ## Deploy a Full VM

View File

@ -22,7 +22,7 @@ large scale AI/ML, data lake and database workloads. Helm is a package manager f
## Prerequisites ## Prerequisites
- TFChain account with TFT - TFChain account with TFT
- [Deploy Kubernetes cluster with one master and one worker (IPv4)](dashboard/@@k8s) - [Deploy Kubernetes cluster with one master and one worker (IPv4)](dashboard@@k8s)
- [Make sure you can connect via SSH on the terminal](system_administrators@@ssh_openssh) - [Make sure you can connect via SSH on the terminal](system_administrators@@ssh_openssh)
## Create an SSH Tunnel ## Create an SSH Tunnel

View File

@ -0,0 +1,127 @@
<h1> Node Status Bot </h1>
<h2>Table of Contents</h2>
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [Deploy a Micro VM](#deploy-a-micro-vm)
- [Network Choice](#network-choice)
- [Create a Telegram Bot](#create-a-telegram-bot)
- [Prepare the VM](#prepare-the-vm)
- [Set the Bot](#set-the-bot)
- [Start the Bot](#start-the-bot)
- [Set Zinit](#set-zinit)
---
## Introduction
We show how to deploy the [Telegram Node Status bot](https://github.com/threefoldfoundation/node-status-bot) on a micro VM running on the ThreeFold Grid.
The Node Status bot provides realtime status updates and alerts on status changes for nodes on the ThreeFold Grid. You can find an [instance live on Telegram](https://t.me/tfnodestatusbot).
## Prerequisites
To run the bot, you need to have a TFChain account activated with a twin. For this, you can simply create an account on the ThreeFold Dashboard.
- [A TFChain account](dashboard@@wallet_connector)
- TFT in your TFChain account
- [Buy TFT](threefold_token@@buy_sell_tft)
- [Send TFT to TFChain](threefold_token@@tft_bridges)
## Deploy a Micro VM
We start by deploying a micro VM on the ThreeFold Dashboard.
* On the [Threefold Dashboard](https://dashboard.grid.tf/#/), go to the [micro virtual machine deployment page](https://dashboard.test.grid.tf/#/deploy/virtual-machines/micro-virtual-machine/)
* Deploy a micro VM (Ubuntu 22.04) with the network connection of your choice
* Minimum vcores: 1vcore
* Minimum MB of RAM: 2048GB
* Minimum storage: 25GB
* After deployment, note the VM IP address
* Connect to the VM via SSH
```
ssh root@VM_IP_Address
```
### Network Choice
Since the bot works via an outbound connection to the Telegram servers, you do not need any public IP for it. It's thus cheaper to use either WireGuard, Planetary Network or Mycelium.
## Create a Telegram Bot
We create a Telegram bot using the [BotFather](https://t.me/BotFather).
Simply go to this link and follow the steps (`/newbot` ...). Make sure to take note of the bot token for the next steps.
## Prepare the VM
We prepare the micro VM to run the Node Status bot.
* Update the VM and install redis-server, git, nano, pip and python3-venv
```
apt update && apt install redis-server && apt install git && apt install nano && apt install pip && apt install python3.10-venv
```
## Set the Bot
Now that the VM is prepared, you can quickly set the bot.
```
git clone https://github.com/threefoldfoundation/node-status-bot.git
cd node-status-bot
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
wget https://github.com/threefoldtech/rmb-rs/releases/download/v1.0.7/rmb-peer
chmod u+x rmb-peer
```
## Start the Bot
Once the bot is set, you can start it with the following line.
```
python3 node-status-bot.py <bot_token> -s "<mnemonic>"
```
You can now go on Telegram and test the bot!
## Set Zinit
We can make sure the bot will start at any VM reboot by setting a zinit process. We set this using a simple script.
- Create a .yaml file in the zinit folder
```
nano /etc/zinit/node-status-bot.yaml
```
- The content should be the following
```
exec: /root/node-status-bot/start.sh
```
- Create a script to run the bot
```
nano start.sh
```
- The script should contain the following
```
#!/bin/bash
cd /root/node-status-bot
source venv/bin/activate
python3 node-status-bot.py <bot_token> -s "<mnemonic>" &>> /root/node-status-bot-logs
```
- Set permissions to the script
```
chmod +x start.sh
```
- Start the bot with the zinit command
```
zinit monitor node-status-bot
```
- Check if the bot is running
```
zinit status node-status-bot
```
You can then use the bot on Telegram and the Python program will restart every time the VM starts.

View File

@ -91,11 +91,11 @@ This means that, to execute, you just need to type `make run` and to destroy, yo
## Creating a Network ## Creating a Network
We address here how to create a [network](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/network). We address here how to create a [network](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/network).
### Pulumi File ### Pulumi File
You can find the original file [here](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/network/Pulumi.yaml). You can find the original file [here](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/network/Pulumi.yaml).
```yml ```yml
name: pulumi-provider-grid name: pulumi-provider-grid
@ -206,7 +206,7 @@ outputs:
## Creating a Virtual Machine ## Creating a Virtual Machine
Now, we will check an [example](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/virtual_machine) on how to create a virtual machine. Now, we will check an [example](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/virtual_machine) on how to create a virtual machine.
Just like we've seen above, we will have two files `Makefile` and `Pulumi.yaml` where we describe the infrastructure. Just like we've seen above, we will have two files `Makefile` and `Pulumi.yaml` where we describe the infrastructure.
@ -277,7 +277,7 @@ resources:
outputs: outputs:
node_deployment_id: ${deployment.node_deployment_id} node_deployment_id: ${deployment.node_deployment_id}
ygg_ip: ${deployment.vms_computed[0].ygg_ip} planetary_ip: ${deployment.vms_computed[0].planetary_ip}
``` ```
We have a scheduler, and a network just like before. But now, we also have a deployment `grid:internal:Deployment` object that can have one or more disks and virtual machines. We have a scheduler, and a network just like before. But now, we also have a deployment `grid:internal:Deployment` object that can have one or more disks and virtual machines.
@ -320,7 +320,7 @@ That's it! You can now execute `make run` to bring the infrastructure up.
## Kubernetes ## Kubernetes
We now see how to deploy a [Kubernetes cluster using Pulumi](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/kubernetes/Pulumi.yaml). We now see how to deploy a [Kubernetes cluster using Pulumi](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/kubernetes/Pulumi.yaml).
```yaml ```yaml
content was removed for brevity content was removed for brevity
@ -357,14 +357,14 @@ We now see how to deploy a [Kubernetes cluster using Pulumi](https://github.com/
outputs: outputs:
node_deployment_id: ${kubernetes.node_deployment_id} node_deployment_id: ${kubernetes.node_deployment_id}
ygg_ip: ${kubernetes.master_computed.ygg_ip} planetary_ip: ${kubernetes.master_computed.planetary_ip}
``` ```
Now, we define the Kubernetes resource `grid:internal:Kubernetes` that has master and workers slice. You define almost everything like a normal VM except for the FLiist. Also note that the token is the `cluster token`. This will ensure that the workers and the master communicate properly. Now, we define the Kubernetes resource `grid:internal:Kubernetes` that has master and workers slice. You define almost everything like a normal VM except for the FLiist. Also note that the token is the `cluster token`. This will ensure that the workers and the master communicate properly.
## Creating a Domain ## Creating a Domain
The ThreeFold Pulumi repository also covers examples on [how to work with TFGrid gateways](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/gateway_name/Pulumi.yaml). The ThreeFold Pulumi repository also covers examples on [how to work with TFGrid gateways](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/gateway_name/Pulumi.yaml).
The basic idea is that you have a virtual machine workload on a specific IP, e.g. public IPv4, IPv6, or Planetary Network, and you want to access it using domains. The basic idea is that you have a virtual machine workload on a specific IP, e.g. public IPv4, IPv6, or Planetary Network, and you want to access it using domains.
@ -420,7 +420,7 @@ Some things to note:
### Example of a Fully Controlled Domain ### Example of a Fully Controlled Domain
Here's an [example](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/gateway_fqdn/Pulumi.yaml) of a more complicated, but fully controlled domain. Here's an [example](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/gateway_fqdn/Pulumi.yaml) of a more complicated, but fully controlled domain.
```yml ```yml
code removed for brevity code removed for brevity
@ -435,7 +435,7 @@ Here's an [example](https://github.com/threefoldtech/pulumi-provider-grid/blob/d
node_id: 14 node_id: 14
fqdn: mydomain.com fqdn: mydomain.com
backends: backends:
- http://[${deployment.vms_computed[0].ygg_ip}]:9000 - http://[${deployment.vms_computed[0].planetary_ip}]:9000
``` ```
Here, we informed the gateway that any request coming for the domain `mydomain.com` needs to be balanced through the backends. Here, we informed the gateway that any request coming for the domain `mydomain.com` needs to be balanced through the backends.

View File

@ -85,5 +85,11 @@ For complementary information on ThreeFold grid and its cloud component, refer t
- [IPFS on a Full VM](ipfs_fullvm.md) - [IPFS on a Full VM](ipfs_fullvm.md)
- [IPFS on a Micro VM](ipfs_microvm.md) - [IPFS on a Micro VM](ipfs_microvm.md)
- [MinIO Operator with Helm3](minio_helm3.md) - [MinIO Operator with Helm3](minio_helm3.md)
- [Hummingbot](hummingbot.md)
- [AI & ML Workloads](ai_ml_workloads.md) - [AI & ML Workloads](ai_ml_workloads.md)
- [Hummingbot](hummingbot.md) - [Ecommerce](ecommerce.md)
- [WooCommerce](woocommerce.md)
- [nopCommerce](nopcommerce.md)
- [Hummingbot](hummingbot.md)
- [HTTPS with Caddy](https_caddy.md)
- [Node Status Bot](node_status_bot.md)

View File

@ -77,15 +77,15 @@ resource "grid_deployment" "d1" {
output "vm1_ip" { output "vm1_ip" {
value = grid_deployment.d1.vms[0].ip value = grid_deployment.d1.vms[0].ip
} }
output "vm1_ygg_ip" { output "vm1_planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "vm2_ip" { output "vm2_ip" {
value = grid_deployment.d1.vms[1].ip value = grid_deployment.d1.vms[1].ip
} }
output "vm2_ygg_ip" { output "vm2_planetary_ip" {
value = grid_deployment.d1.vms[1].ygg_ip value = grid_deployment.d1.vms[1].planetary_ip
} }
``` ```

View File

@ -237,11 +237,11 @@ output "node1_zmachine2_ip" {
value = grid_deployment.d2.vms[0].ip value = grid_deployment.d2.vms[0].ip
} }
output "ygg_ip1" { output "planetary_ip1" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "ygg_ip2" { output "planetary_ip2" {
value = grid_deployment.d2.vms[0].ygg_ip value = grid_deployment.d2.vms[0].planetary_ip
} }
output "ipv4_vm1" { output "ipv4_vm1" {

View File

@ -261,11 +261,11 @@ output "node1_zmachine2_ip" {
value = grid_deployment.d2.vms[0].ip value = grid_deployment.d2.vms[0].ip
} }
output "ygg_ip1" { output "planetary_ip1" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "ygg_ip2" { output "planetary_ip2" {
value = grid_deployment.d2.vms[0].ygg_ip value = grid_deployment.d2.vms[0].planetary_ip
} }
output "ipv4_vm1" { output "ipv4_vm1" {
@ -808,11 +808,11 @@ output "node1_zmachine1_ip" {
# value = grid_deployment.d2.vms[0].ip # value = grid_deployment.d2.vms[0].ip
#} #}
output "ygg_ip1" { output "planetary_ip1" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
#output "ygg_ip2" { #output "planetary_ip2" {
# value = grid_deployment.d2.vms[0].ygg_ip # value = grid_deployment.d2.vms[0].planetary_ip
#} #}
output "ipv4_vm1" { output "ipv4_vm1" {

View File

@ -213,8 +213,8 @@ output "node1_zmachine1_ip" {
value = grid_deployment.d1.vms[0].ip value = grid_deployment.d1.vms[0].ip
} }
output "ygg_ip1" { output "planetary_ip1" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "ipv4_vm1" { output "ipv4_vm1" {

View File

@ -234,19 +234,19 @@ output "client2_wg_ip" {
} }
output "server1_planetary_ip" { output "server1_planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "server2_planetary_ip" { output "server2_planetary_ip" {
value = grid_deployment.d1.vms[1].ygg_ip value = grid_deployment.d1.vms[1].planetary_ip
} }
output "server3_planetary_ip" { output "server3_planetary_ip" {
value = grid_deployment.d1.vms[2].ygg_ip value = grid_deployment.d1.vms[2].planetary_ip
} }
output "client1_planetary_ip" { output "client1_planetary_ip" {
value = grid_deployment.d1.vms[3].ygg_ip value = grid_deployment.d1.vms[3].planetary_ip
} }
output "client2_planetary_ip" { output "client2_planetary_ip" {
value = grid_deployment.d1.vms[4].ygg_ip value = grid_deployment.d1.vms[4].planetary_ip
} }
``` ```

View File

@ -61,7 +61,7 @@ resource "grid_deployment" "d1" {
type = "ssh" type = "ssh"
user = "root" user = "root"
agent = true agent = true
host = grid_deployment.d1.vms[0].ygg_ip host = grid_deployment.d1.vms[0].planetary_ip
} }
provisioner "remote-exec" { provisioner "remote-exec" {
@ -88,7 +88,7 @@ resource "grid_deployment" "d1" {
type = "ssh" type = "ssh"
user = "root" user = "root"
agent = true agent = true
host = grid_deployment.d1.vms[0].ygg_ip host = grid_deployment.d1.vms[0].planetary_ip
} }
``` ```

View File

@ -209,11 +209,11 @@ output "node1_zmachine2_ip" {
value = grid_deployment.d2.vms[0].ip value = grid_deployment.d2.vms[0].ip
} }
output "ygg_ip1" { output "planetary_ip1" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "ygg_ip2" { output "planetary_ip2" {
value = grid_deployment.d2.vms[0].ygg_ip value = grid_deployment.d2.vms[0].planetary_ip
} }
output "ipv4_vm1" { output "ipv4_vm1" {

View File

@ -136,8 +136,8 @@ resource "grid_deployment" "d0" {
output "wg_config" { output "wg_config" {
value = grid_network.net0.access_wg_config value = grid_network.net0.access_wg_config
} }
output "ygg_ip" { output "planetary_ip" {
value = grid_deployment.d0.vms[0].ygg_ip value = grid_deployment.d0.vms[0].planetary_ip
} }
output "vm_ip" { output "vm_ip" {
value = grid_deployment.d0.vms[0].ip value = grid_deployment.d0.vms[0].ip
@ -427,8 +427,8 @@ resource "grid_deployment" "d2" {
output "wg_config" { output "wg_config" {
value = grid_network.net2.access_wg_config value = grid_network.net2.access_wg_config
} }
output "ygg_ip" { output "planetary_ip" {
value = grid_deployment.d2.vms[0].ygg_ip value = grid_deployment.d2.vms[0].planetary_ip
} }
output "vm_ip" { output "vm_ip" {
value = grid_deployment.d2.vms[0].ip value = grid_deployment.d2.vms[0].ip

View File

@ -181,8 +181,8 @@ resource "grid_deployment" "qsfs" {
output "metrics" { output "metrics" {
value = grid_deployment.qsfs.qsfs[0].metrics_endpoint value = grid_deployment.qsfs.qsfs[0].metrics_endpoint
} }
output "ygg_ip" { output "planetary_ip" {
value = grid_deployment.qsfs.vms[0].ygg_ip value = grid_deployment.qsfs.vms[0].planetary_ip
} }
``` ```

View File

@ -266,8 +266,8 @@ resource "grid_deployment" "qsfs" {
output "metrics" { output "metrics" {
value = grid_deployment.qsfs.qsfs[0].metrics_endpoint value = grid_deployment.qsfs.qsfs[0].metrics_endpoint
} }
output "ygg_ip" { output "planetary_ip" {
value = grid_deployment.qsfs.vms[0].ygg_ip value = grid_deployment.qsfs.vms[0].planetary_ip
} }
``` ```
@ -337,7 +337,7 @@ To SSH with Planetary Network, write the following:
ssh root@planetary_IP ssh root@planetary_IP
``` ```
Note that the IP address should be the value of the parameter **ygg_ip** from the Terraform Outputs. Note that the IP address should be the value of the parameter **planetary_ip** from the Terraform Outputs.
You now have an SSH connection access to the VM over Planetary Network. You now have an SSH connection access to the VM over Planetary Network.

View File

@ -94,15 +94,15 @@ resource "grid_deployment" "d1" {
output "vm1_ip" { output "vm1_ip" {
value = grid_deployment.d1.vms[0].ip value = grid_deployment.d1.vms[0].ip
} }
output "vm1_ygg_ip" { output "vm1_planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "vm2_ip" { output "vm2_ip" {
value = grid_deployment.d1.vms[1].ip value = grid_deployment.d1.vms[1].ip
} }
output "vm2_ygg_ip" { output "vm2_planetary_ip" {
value = grid_deployment.d1.vms[1].ygg_ip value = grid_deployment.d1.vms[1].planetary_ip
} }
``` ```

View File

@ -87,15 +87,15 @@ resource "grid_deployment" "d1" {
output "vm1_ip" { output "vm1_ip" {
value = grid_deployment.d1.vms[0].ip value = grid_deployment.d1.vms[0].ip
} }
output "vm1_ygg_ip" { output "vm1_planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "vm2_ip" { output "vm2_ip" {
value = grid_deployment.d1.vms[1].ip value = grid_deployment.d1.vms[1].ip
} }
output "vm2_ygg_ip" { output "vm2_planetary_ip" {
value = grid_deployment.d1.vms[1].ygg_ip value = grid_deployment.d1.vms[1].planetary_ip
} }
``` ```
@ -276,7 +276,7 @@ output "public_ip" {
value = grid_deployment.d1.vms[0].computedip value = grid_deployment.d1.vms[0].computedip
} }
output "ygg_ip" { output "planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
``` ```

View File

@ -77,8 +77,8 @@ output "public_ip" {
value = split("/",grid_deployment.d1.vms[0].computedip)[0] value = split("/",grid_deployment.d1.vms[0].computedip)[0]
} }
output "ygg_ip" { output "planetary_ip" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
``` ```

View File

@ -196,8 +196,8 @@ output "node1_zmachine1_ip" {
value = grid_deployment.d1.vms[0].ip value = grid_deployment.d1.vms[0].ip
} }
output "ygg_ip1" { output "planetary_ip1" {
value = grid_deployment.d1.vms[0].ygg_ip value = grid_deployment.d1.vms[0].planetary_ip
} }
output "ipv4_vm1" { output "ipv4_vm1" {

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Some files were not shown because too many files have changed in this diff Show More