Merge pull request 'development to main periodic update' (#102) from development into main

Reviewed-on: #102
This commit is contained in:
mik-tf 2024-06-14 16:52:01 +00:00
commit 60134e79b9
362 changed files with 4998 additions and 1442 deletions

1
CODEOWNERS Normal file
View File

@ -0,0 +1 @@
* @despiegk @mik-tf @gosam @scott

View File

@ -8,6 +8,9 @@
- [Create a New mdBook](#create-a-new-mdbook)
- [Use Hero with Docker](#use-hero-with-docker)
- [Contribute](#contribute)
- [Branches and Forks](#branches-and-forks)
- [Overview](#overview-1)
- [Content Update Procedure](#content-update-procedure)
## Overview
@ -57,7 +60,29 @@ You can use Hero with Docker. Read the docs [here](https://git.ourworld.tf/tfgri
## Contribute
To contribute to this repository, make a pull request of your changes.
To optimize updates to this repository, we propose a uniform way to collaborate.
### Branches and Forks
To contribute to this repository, make a pull request of your changes. There are two main methods.
1. Fork the repository and make a pull requests with your changes
2. If you have access, create a new branch in this repo and make a pull request with your changes
2. If you have access, create a new branch in this repo and make a pull request with your changes
### Overview
- The production-ready content is published on the **main** branch
- The staging content is published on the **development** branch
- Any changes to development must go through a pull request (PR) and its associated review from a different branch with the prefix `development_`.
- The name of the branch should indicate the work being done, e.g. working on the readme, `development_readme_work`
- Once staging is done on development, the code owners will merge development branch to main branch.
- The mdbooks will be updated online.
### Content Update Procedure
- Create new branch out of development (e.g. `development_work`)
- Make changes to the files
- Make a PR to merge to development
- Get reviewed and adjust accordingly
- PR is approved and the content is merged to development
- Code owners will merge development to main to update the books online

View File

@ -0,0 +1,4 @@
build:
./scripts/generate_wallets.sh
./scripts/calculate_marketcap.sh
./scripts/calculate_cloud_pricing.sh

179
books/developers/SUMMARY.md Normal file
View File

@ -0,0 +1,179 @@
- [Table of Contents](developers/developers_book_toc.md)
- [Javascript Client](developers/javascript/grid3_javascript_readme.md)
- [Installation](developers/javascript/grid3_javascript_installation.md)
- [Loading Client](developers/javascript/grid3_javascript_loadclient.md)
- [Deploy a VM](developers/javascript/grid3_javascript_vm.md)
- [Capacity Planning](developers/javascript/grid3_javascript_capacity_planning.md)
- [Deploy Multiple VMs](developers/javascript/grid3_javascript_vms.md)
- [Deploy CapRover](developers/javascript/grid3_javascript_caprover.md)
- [Gateways](developers/javascript/grid3_javascript_vm_gateways.md)
- [Deploy a Kubernetes Cluster](developers/javascript/grid3_javascript_kubernetes.md)
- [Deploy a ZDB](developers/javascript/grid3_javascript_zdb.md)
- [Deploy ZDBs for QSFS](developers/javascript/grid3_javascript_qsfs_zdbs.md)
- [QSFS](developers/javascript/grid3_javascript_qsfs.md)
- [Key Value Store](developers/javascript/grid3_javascript_kvstore.md)
- [VM with Wireguard and Gateway](developers/javascript/grid3_wireguard_gateway.md)
- [GPU Support](developers/javascript/grid3_javascript_gpu_support.md)
- [Go Client](developers/go/grid3_go_readme.md)
- [Installation](developers/go/grid3_go_installation.md)
- [Loading Client](developers/go/grid3_go_load_client.md)
- [Deploy a VM](developers/go/grid3_go_vm.md)
- [Deploy Multiple VMs](developers/go/grid3_go_vms.md)
- [Deploy Gateways](developers/go/grid3_go_gateways.md)
- [Deploy Kubernetes](developers/go/grid3_go_kubernetes.md)
- [Deploy a QSFS](developers/go/grid3_go_qsfs.md)
- [GPU and Go](developers/go/grid3_go_gpu.md)
- [GPU Support](developers/go/grid3_go_gpu_support.md)
- [Deploy a VM with GPU](developers/go/grid3_go_vm_with_gpu.md)
- [TFCMD](developers/tfcmd/tfcmd.md)
- [Getting Started](developers/tfcmd/tfcmd_basics.md)
- [Deploy a VM](developers/tfcmd/tfcmd_vm.md)
- [Deploy Kubernetes](developers/tfcmd/tfcmd_kubernetes.md)
- [Deploy ZDB](developers/tfcmd/tfcmd_zdbs.md)
- [Gateway FQDN](developers/tfcmd/tfcmd_gateway_fqdn.md)
- [Gateway Name](developers/tfcmd/tfcmd_gateway_name.md)
- [Contracts](developers/tfcmd/tfcmd_contracts.md)
- [TFROBOT](developers/tfrobot/tfrobot.md)
- [Installation](developers/tfrobot/tfrobot_installation.md)
- [Configuration File](developers/tfrobot/tfrobot_config.md)
- [Deployment](developers/tfrobot/tfrobot_deploy.md)
- [Commands and Flags](developers/tfrobot/tfrobot_commands_flags.md)
- [Supported Configurations](developers/tfrobot/tfrobot_configurations.md)
- [ThreeFold Chain](developers/tfchain/dev_tfchain.md)
- [Introduction](developers/tfchain/introduction.md)
- [Farming Policies](developers/tfchain/farming_policies.md)
- [External Service Contract](developers/tfchain/tfchain_external_service_contract.md)
- [Solution Provider](developers/tfchain/tfchain_solution_provider.md)
- [Grid Proxy](developers/proxy/proxy_readme.md)
- [Introducing Grid Proxy](developers/proxy/proxy.md)
- [Setup](developers/proxy/setup.md)
- [DB Testing](developers/proxy/db_testing.md)
- [Commands](developers/proxy/commands.md)
- [Contributions](developers/proxy/contributions.md)
- [Explorer](developers/proxy/explorer.md)
- [Database](developers/proxy/database.md)
- [Production](developers/proxy/production.md)
- [Release](developers/proxy/release.md)
- [Flist](developers/flist/flist.md)
- [Zero-OS Hub](developers/flist/flist_hub/zos_hub.md)
- [Generate an API Token](developers/flist/flist_hub/api_token.md)
- [Convert Docker Image Into Flist](developers/flist/flist_hub/convert_docker_image.md)
- [Supported Flists](developers/flist/grid3_supported_flists.md)
- [Flist Case Studies](developers/flist/flist_case_studies/flist_case_studies.md)
- [Case Study: Debian 12](developers/flist/flist_case_studies/flist_debian_case_study.md)
- [Case Study: Nextcloud AIO](developers/flist/flist_case_studies/flist_nextcloud_case_study.md)
- [Internals](developers/internals/internals.md)
- [Reliable Message Bus - RMB](developers/internals/rmb/rmb_toc.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 Peer](developers/internals/rmb/uml/peer.md)
- [RMB Relay](developers/internals/rmb/uml/relay.md)
- [Zero-OS](developers/internals/zos/zos_readme.md)
- [Manual](developers/internals/zos/manual/manual.md)
- [Workload Types](developers/internals/zos/manual/workload_types.md)
- [Internal Modules](developers/internals/zos/internals/zos_internals.md)
- [Identity](developers/internals/zos/internals/identity/identity_readme.md)
- [Node ID Generation](developers/internals/zos/internals/identity/identity.md)
- [Node Upgrade](developers/internals/zos/internals/identity/upgrade.md)
- [Node](developers/internals/zos/internals/node/node_readme.md)
- [Storage](developers/internals/zos/internals/storage/storage_readme.md)
- [Network](developers/internals/zos/internals/network/network_readme.md)
- [Introduction](developers/internals/zos/internals/network/introduction.md)
- [Definitions](developers/internals/zos/internals/network/definitions.md)
- [Mesh](developers/internals/zos/internals/network/mesh.md)
- [Setup](developers/internals/zos/internals/network/setup_farm_network.md)
- [Flist](developers/internals/zos/internals/flist/flist_readme.md)
- [Container](developers/internals/zos/internals/container/container_readme.md)
- [VM](developers/internals/zos/internals/vmd/vmd_readme.md)
- [Provision](developers/internals/zos/internals/provision/provision_readme.md)
- [Capacity](developers/internals/zos/internals/capacity.md)
- [Performance Monitor Package](developers/internals/zos/performance/performance.md)
- [Public IPs Validation Task](developers/internals/zos/performance/publicips.md)
- [CPUBenchmark](developers/internals/zos/performance/cpubench.md)
- [IPerf](developers/internals/zos/performance/iperf.md)
- [Health Check](developers/internals/zos/performance/healthcheck.md)
- [API](developers/internals/zos/manual/api.md)
- [Grid Deployment](developers/grid_deployment/grid_deployment.md)
- [TFGrid Stacks](developers/grid_deployment/tfgrid_stacks.md)
- [Full VM Grid Deployment](developers/grid_deployment/grid_deployment_full_vm.md)
- [Grid Snapshots](developers/grid_deployment/snapshots.md)
- [Deploy the Dashboard](developers/grid_deployment/deploy_dashboard.md)
- [Application Case Study: Nextcloud](developers/grid_deployment/app_case_study_nextcloud.md)
- [ThreeFold Dashboard](dashboard/dashboard.md)
- [Wallet Connector](dashboard/wallet_connector.md)
- [TFGrid](dashboard/tfgrid/tfgrid.md)
- [Grid Status](dashboard/tfgrid/grid_status.md)
- [Node Statistics](dashboard/tfgrid/node_statistics.md)
- [Node Monitoring](dashboard/tfgrid/node_monitoring.md)
- [Deploy](dashboard/deploy/deploy.md)
- [Pricing Calculator](dashboard/deploy/pricing_calculator.md)
- [Node Finder](dashboard/deploy/node_finder.md)
- [Virtual Machines](dashboard/solutions/vm_intro.md)
- [Micro and Full VM Differences ](dashboard/solutions/vm_differences.md)
- [Full Virtual Machine](dashboard/solutions/fullvm.md)
- [Micro Virtual Machine](dashboard/solutions/microvm.md)
- [Nixos MicroVM](dashboard/solutions/nixos_micro.md)
- [Add a Domain](dashboard/solutions/add_domain.md)
- [Orchestrators](dashboard/deploy/orchestrators.md)
- [Kubernetes](dashboard/solutions/k8s.md)
- [Caprover](dashboard/solutions/caprover.md)
- [Caprover Admin](dashboard/solutions/caprover_admin.md)
- [Caprover Worker](dashboard/solutions/caprover_worker.md)
- [Applications](dashboard/deploy/applications.md)
- [Algorand](dashboard/solutions/algorand.md)
- [CasperLabs](dashboard/solutions/casper.md)
- [Discourse](dashboard/solutions/discourse.md)
- [Funkwhale](dashboard/solutions/funkwhale.md)
- [Mattermost](dashboard/solutions/mattermost.md)
- [Nextcloud](dashboard/solutions/nextcloud.md)
- [Node Pilot](dashboard/solutions/nodepilot.md)
- [Peertube](dashboard/solutions/peertube.md)
- [Presearch](dashboard/solutions/presearch.md)
- [Static Website](dashboard/solutions/static_website.md)
- [Subsquid](dashboard/solutions/subsquid.md)
- [Taiga](dashboard/solutions/taiga.md)
- [Umbrel](dashboard/solutions/umbrel.md)
- [WordPress](dashboard/solutions/wordpress.md)
- [Your Contracts](dashboard/deploy/your_contracts.md)
- [Images](dashboard/deploy/images.md)
- [SSH Keys](dashboard/deploy/ssh_keys.md)
- [Farms](dashboard/farms/farms.md)
- [Your Farms](dashboard/farms/your_farms.md)
- [Farm Finder](dashboard/farms/farms_finder.md)
- [Node Installer](dashboard/farms/node_installer.md)
- [Simulator](dashboard/farms/simulator.md)
- [TFChain](dashboard/tfchain/tfchain.md)
- [Your Profile](dashboard/tfchain/your_profile.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 Transfer](dashboard/tfchain/tf_token_transfer.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)
- [ThreeFold Token](threefold_token/threefold_token.md)
- [TFT Bridges](threefold_token/tft_bridges/tft_bridges.md)
- [TFChain-Stellar Bridge](threefold_token/tft_bridges/tfchain_stellar_bridge.md)
- [BSC-Stellar Bridge](threefold_token/tft_bridges/bsc_stellar_bridge.md)
- [BSC-Stellar Bridge Verification](threefold_token/tft_bridges/bsc_stellar_bridge_verification.md)
- [Ethereum-Stellar Bridge](threefold_token/tft_bridges/tft_ethereum/tft_ethereum.md)
- [Storing TFT](threefold_token/storing_tft/storing_tft.md)
- [ThreeFold Connect App - Stellar](threefold_token/storing_tft/tf_connect_app.md)
- [Lobstr Wallet - Stellar](threefold_token/storing_tft/lobstr_wallet.md)
- [MetaMask - BSC & ETH](threefold_token/storing_tft/metamask.md)
- [Hardware Wallet](threefold_token/storing_tft/hardware_wallet.md)
- [Buy and Sell TFT](threefold_token/buy_sell_tft/buy_sell_tft.md)
- [Quick Start - Stellar](threefold_token/buy_sell_tft/tft_lobstr/tft_lobstr_short_guide.md)
- [Lobstr Wallet - Stellar](threefold_token/buy_sell_tft/tft_lobstr/tft_lobstr_complete_guide.md)
- [MetaMask - BSC & ETH](threefold_token/buy_sell_tft/tft_metamask/tft_metamask.md)
- [Pancake Swap - BSC](threefold_token/buy_sell_tft/pancakeswap.md)
- [Liquidity Provider - LP](threefold_token/liquidity/liquidity_readme.md)
- [Pancake Swap LP](threefold_token/liquidity/liquidity_pancake.md)
- [1inch.io LP](threefold_token/liquidity/liquidity_1inch.md)
- [Albedo LP](threefold_token/liquidity/liquidity_albedo.md)
- [Transaction Fees](threefold_token/transaction_fees.md)
- [FAQ](faq/faq.md)

View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
value=$(cat tft_value.md)
CU=$(cat cu_musd_hour.md)
CUTFT=$(echo "$CU / $value" | bc -l)
printf "%.2f" $CUTFT > cu_mtft_hour.md
SU=$(cat su_musd_hour.md)
SUTFT=$(echo "$SU / $value" | bc -l)
printf "%.2f" $SUTFT > su_mtft_hour.md
NU=$(cat nu_musd_hour.md)
NUTFT=$(echo "$NU / $value" | bc -l)
printf "%.2f" $NUTFT > nu_mtft_hour.md
IP=$(cat ip_musd_hour.md)
IPTFT=$(echo "$IP / $value" | bc -l)
printf "%.2f" $IPTFT > ip_mtft_hour.md
NAME=$(cat name_musd_hour.md)
NAME=$(echo "$NAME / $value" | bc -l)
printf "%.2f" $NAME > name_mtft_hour.md
DNAME=$(cat dname_musd_hour.md)
DNAME=$(echo "$DNAME / $value" | bc -l)
printf "%.2f" $DNAME > dname_mtft_hour.md

View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
coinId="threefold-token"
url="https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd";
curl -sL ${url} \
-H 'Accept: application/json' | jq '."threefold-token".usd' | xargs printf "%.3f" > tft_value.md
supply=$(cat tft_supply.md)
value=$(cat tft_value.md)
TFT_MARKETCAP=$(echo "$supply * $value" | bc -l)
printf "%'.0f" $TFT_MARKETCAP > tft_marketcap.md

View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
mkdir -p ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
cd ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
wallets=(
GA7OPN4A3JNHLPHPEWM4PJDOYYDYNZOM7ES6YL3O7NC3PRY3V3UX6ANM
GDSKFYNMZWTB3V5AN26CEAQ27643Q3KB4X6MY4UTO2LIIDFND4SPQZYU
GBQHN7RL4LSRPR2TT74ID2UJPZ2AXCHQY2WKGCTDLJM3NXVJ7GQHUCOD
GBTPAXXP6534UPC4MLNGFGJWCD6DNSRVIPPOZWXAQAWI4FKTLOJY2A2S
GB2C5HCZYWNGVM6JGXDWQBJTMUY4S2HPPTCAH63HFAQVL2ALXDW7SSJ7
GDLVIB44LVONM5K67LUPSFZMSX7G2RLYVBM5MMHUJ4NAQJU7CH4HBJBO
GDKXTUYNW4BJKDM2L7B5XUYFUISV52KUU4G7VPNLF4ZSIKBURM622YPZ
GDIJY6K2BBRIRX423ZFUYKKFDN66XP2KMSBZFQSE2PSNDZ6EDVQTRLSU
GCWHWDRXYPXQAOYMQKB66SZPLM6UANKGMSL4SP7LSOIA6OTTOYQ6HBIH
GBV734I2SV4YDDPVJMYXU3IZ2AIU5GEAJRAD4E4BQG7CA2N63NXSPMD6
GAI4C2BGOA3YHVQZZW7OW4FHOGGYWTUBEVNHB6MW4ZAFG7ZAA7D5IPC3
GCEJ7DMULFTT25UH4FAAGOZ6KER4WXAYQGJUSIITQD527DGTKSXKBQGR
GAQXBLFG4BZGIVY6DBJVWE5EAP3UNHMIA2PYCUVLY2JUSPVWPUF36BW4
GAUGOSYLCX7JZTQYF2K7RIMHFWKSA3WSI2OQ4IRKXMDMVE6ABJIJMFQR
)
for wallet in "${wallets[@]}"; do
curl -sL "https://horizon.stellar.org/accounts/${wallet}" -H 'Accept: application/json' | jq --raw-output '.balances[] | select(.asset_code == "TFT") | .balance' | xargs printf "%.2f" > ${wallet,,}.md
done

View File

@ -1,5 +1,5 @@
#!/bin/bash
set -ex
export NAME=projectmycelium
hero mdbook -u https://git.ourworld.tf/tfgrid/info_tfgrid/src/branch/main/heroscript/$NAME
export NAME=developers
hero mdbook -u https://git.ourworld.tf/tfgrid/info_tfgrid/src/branch/manual/heroscript/$NAME
rsync -rv ~/hero/www/info/$NAME/ root@info.ourworld.tf:/root/hero/www/info/$NAME/

4
books/farmers/Makefile Normal file
View File

@ -0,0 +1,4 @@
build:
./scripts/generate_wallets.sh
./scripts/calculate_marketcap.sh
./scripts/calculate_cloud_pricing.sh

104
books/farmers/SUMMARY.md Normal file
View File

@ -0,0 +1,104 @@
- [Table of Contents](farmers/farmers_book_toc.md)
- [Build a 3Node](farmers/3node_building/3node_building.md)
- [1. Create a Farm](farmers/3node_building/1_create_farm.md)
- [2. Create a Zero-OS Bootstrap Image](farmers/3node_building/2_bootstrap_image.md)
- [3. Set the Hardware](farmers/3node_building/3_set_hardware.md)
- [4. Wipe All the Disks](farmers/3node_building/4_wipe_all_disks.md)
- [5. Set the BIOS/UEFI](farmers/3node_building/5_set_bios_uefi.md)
- [6. Boot the 3Node](farmers/3node_building/6_boot_3node.md)
- [Farming Optimization](farmers/farming_optimization/farming_optimization.md)
- [GPU Farming](farmers/3node_building/gpu_farming.md)
- [Set Additional Fees](farmers/farming_optimization/set_additional_fees.md)
- [Minting Receipts](farmers/3node_building/minting_receipts.md)
- [Minting Periods](farmers/farming_optimization/minting_periods.md)
- [Room Parameters](farmers/farming_optimization/farm_room_parameters.md)
- [Farming Costs](farmers/farming_optimization/farming_costs.md)
- [Calculate Your ROI](farmers/farming_optimization/calculate_roi.md)
- [Farming Requirements](farmers/farming_optimization/farming_requirements.md)
- [Advanced Networking](farmers/advanced_networking/advanced_networking_toc.md)
- [Networking Overview](farmers/advanced_networking/networking_overview.md)
- [Network Considerations](farmers/advanced_networking/network_considerations.md)
- [Network Setup](farmers/advanced_networking/network_setup.md)
- [Farmerbot](farmers/farmerbot/farmerbot_intro.md)
- [Quick Guide](farmers/farmerbot/farmerbot_quick.md)
- [Additional Information](farmers/farmerbot/farmerbot_information.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)
- [ThreeFold Dashboard](dashboard/dashboard.md)
- [Wallet Connector](dashboard/wallet_connector.md)
- [TFGrid](dashboard/tfgrid/tfgrid.md)
- [Grid Status](dashboard/tfgrid/grid_status.md)
- [Node Statistics](dashboard/tfgrid/node_statistics.md)
- [Node Monitoring](dashboard/tfgrid/node_monitoring.md)
- [Deploy](dashboard/deploy/deploy.md)
- [Pricing Calculator](dashboard/deploy/pricing_calculator.md)
- [Node Finder](dashboard/deploy/node_finder.md)
- [Virtual Machines](dashboard/solutions/vm_intro.md)
- [Micro and Full VM Differences ](dashboard/solutions/vm_differences.md)
- [Full Virtual Machine](dashboard/solutions/fullvm.md)
- [Micro Virtual Machine](dashboard/solutions/microvm.md)
- [Nixos MicroVM](dashboard/solutions/nixos_micro.md)
- [Add a Domain](dashboard/solutions/add_domain.md)
- [Orchestrators](dashboard/deploy/orchestrators.md)
- [Kubernetes](dashboard/solutions/k8s.md)
- [Caprover](dashboard/solutions/caprover.md)
- [Caprover Admin](dashboard/solutions/caprover_admin.md)
- [Caprover Worker](dashboard/solutions/caprover_worker.md)
- [Applications](dashboard/deploy/applications.md)
- [Algorand](dashboard/solutions/algorand.md)
- [CasperLabs](dashboard/solutions/casper.md)
- [Discourse](dashboard/solutions/discourse.md)
- [Funkwhale](dashboard/solutions/funkwhale.md)
- [Mattermost](dashboard/solutions/mattermost.md)
- [Nextcloud](dashboard/solutions/nextcloud.md)
- [Node Pilot](dashboard/solutions/nodepilot.md)
- [Peertube](dashboard/solutions/peertube.md)
- [Presearch](dashboard/solutions/presearch.md)
- [Static Website](dashboard/solutions/static_website.md)
- [Subsquid](dashboard/solutions/subsquid.md)
- [Taiga](dashboard/solutions/taiga.md)
- [Umbrel](dashboard/solutions/umbrel.md)
- [WordPress](dashboard/solutions/wordpress.md)
- [Your Contracts](dashboard/deploy/your_contracts.md)
- [Images](dashboard/deploy/images.md)
- [SSH Keys](dashboard/deploy/ssh_keys.md)
- [Farms](dashboard/farms/farms.md)
- [Your Farms](dashboard/farms/your_farms.md)
- [Farm Finder](dashboard/farms/farms_finder.md)
- [Node Installer](dashboard/farms/node_installer.md)
- [Simulator](dashboard/farms/simulator.md)
- [TFChain](dashboard/tfchain/tfchain.md)
- [Your Profile](dashboard/tfchain/your_profile.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 Transfer](dashboard/tfchain/tf_token_transfer.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)
- [ThreeFold Token](threefold_token/threefold_token.md)
- [TFT Bridges](threefold_token/tft_bridges/tft_bridges.md)
- [TFChain-Stellar Bridge](threefold_token/tft_bridges/tfchain_stellar_bridge.md)
- [BSC-Stellar Bridge](threefold_token/tft_bridges/bsc_stellar_bridge.md)
- [BSC-Stellar Bridge Verification](threefold_token/tft_bridges/bsc_stellar_bridge_verification.md)
- [Ethereum-Stellar Bridge](threefold_token/tft_bridges/tft_ethereum/tft_ethereum.md)
- [Storing TFT](threefold_token/storing_tft/storing_tft.md)
- [ThreeFold Connect App - Stellar](threefold_token/storing_tft/tf_connect_app.md)
- [Lobstr Wallet - Stellar](threefold_token/storing_tft/lobstr_wallet.md)
- [MetaMask - BSC & ETH](threefold_token/storing_tft/metamask.md)
- [Hardware Wallet](threefold_token/storing_tft/hardware_wallet.md)
- [Buy and Sell TFT](threefold_token/buy_sell_tft/buy_sell_tft.md)
- [Quick Start - Stellar](threefold_token/buy_sell_tft/tft_lobstr/tft_lobstr_short_guide.md)
- [Lobstr Wallet - Stellar](threefold_token/buy_sell_tft/tft_lobstr/tft_lobstr_complete_guide.md)
- [MetaMask - BSC & ETH](threefold_token/buy_sell_tft/tft_metamask/tft_metamask.md)
- [Pancake Swap - BSC](threefold_token/buy_sell_tft/pancakeswap.md)
- [Liquidity Provider - LP](threefold_token/liquidity/liquidity_readme.md)
- [Pancake Swap LP](threefold_token/liquidity/liquidity_pancake.md)
- [1inch.io LP](threefold_token/liquidity/liquidity_1inch.md)
- [Albedo LP](threefold_token/liquidity/liquidity_albedo.md)
- [Transaction Fees](threefold_token/transaction_fees.md)
- [FAQ](faq/faq.md)

View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
value=$(cat tft_value.md)
CU=$(cat cu_musd_hour.md)
CUTFT=$(echo "$CU / $value" | bc -l)
printf "%.2f" $CUTFT > cu_mtft_hour.md
SU=$(cat su_musd_hour.md)
SUTFT=$(echo "$SU / $value" | bc -l)
printf "%.2f" $SUTFT > su_mtft_hour.md
NU=$(cat nu_musd_hour.md)
NUTFT=$(echo "$NU / $value" | bc -l)
printf "%.2f" $NUTFT > nu_mtft_hour.md
IP=$(cat ip_musd_hour.md)
IPTFT=$(echo "$IP / $value" | bc -l)
printf "%.2f" $IPTFT > ip_mtft_hour.md
NAME=$(cat name_musd_hour.md)
NAME=$(echo "$NAME / $value" | bc -l)
printf "%.2f" $NAME > name_mtft_hour.md
DNAME=$(cat dname_musd_hour.md)
DNAME=$(echo "$DNAME / $value" | bc -l)
printf "%.2f" $DNAME > dname_mtft_hour.md

View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
coinId="threefold-token"
url="https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd";
curl -sL ${url} \
-H 'Accept: application/json' | jq '."threefold-token".usd' | xargs printf "%.3f" > tft_value.md
supply=$(cat tft_supply.md)
value=$(cat tft_value.md)
TFT_MARKETCAP=$(echo "$supply * $value" | bc -l)
printf "%'.0f" $TFT_MARKETCAP > tft_marketcap.md

View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
mkdir -p ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
cd ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
wallets=(
GA7OPN4A3JNHLPHPEWM4PJDOYYDYNZOM7ES6YL3O7NC3PRY3V3UX6ANM
GDSKFYNMZWTB3V5AN26CEAQ27643Q3KB4X6MY4UTO2LIIDFND4SPQZYU
GBQHN7RL4LSRPR2TT74ID2UJPZ2AXCHQY2WKGCTDLJM3NXVJ7GQHUCOD
GBTPAXXP6534UPC4MLNGFGJWCD6DNSRVIPPOZWXAQAWI4FKTLOJY2A2S
GB2C5HCZYWNGVM6JGXDWQBJTMUY4S2HPPTCAH63HFAQVL2ALXDW7SSJ7
GDLVIB44LVONM5K67LUPSFZMSX7G2RLYVBM5MMHUJ4NAQJU7CH4HBJBO
GDKXTUYNW4BJKDM2L7B5XUYFUISV52KUU4G7VPNLF4ZSIKBURM622YPZ
GDIJY6K2BBRIRX423ZFUYKKFDN66XP2KMSBZFQSE2PSNDZ6EDVQTRLSU
GCWHWDRXYPXQAOYMQKB66SZPLM6UANKGMSL4SP7LSOIA6OTTOYQ6HBIH
GBV734I2SV4YDDPVJMYXU3IZ2AIU5GEAJRAD4E4BQG7CA2N63NXSPMD6
GAI4C2BGOA3YHVQZZW7OW4FHOGGYWTUBEVNHB6MW4ZAFG7ZAA7D5IPC3
GCEJ7DMULFTT25UH4FAAGOZ6KER4WXAYQGJUSIITQD527DGTKSXKBQGR
GAQXBLFG4BZGIVY6DBJVWE5EAP3UNHMIA2PYCUVLY2JUSPVWPUF36BW4
GAUGOSYLCX7JZTQYF2K7RIMHFWKSA3WSI2OQ4IRKXMDMVE6ABJIJMFQR
)
for wallet in "${wallets[@]}"; do
curl -sL "https://horizon.stellar.org/accounts/${wallet}" -H 'Accept: application/json' | jq --raw-output '.balances[] | select(.asset_code == "TFT") | .balance' | xargs printf "%.2f" > ${wallet,,}.md
done

View File

@ -0,0 +1,5 @@
#!/bin/bash
set -ex
export NAME=farmers
hero mdbook -u https://git.ourworld.tf/tfgrid/info_tfgrid/src/branch/manual/heroscript/$NAME
rsync -rv ~/hero/www/info/$NAME/ root@info.ourworld.tf:/root/hero/www/info/$NAME/

View File

@ -0,0 +1,4 @@
build:
./scripts/generate_wallets.sh
./scripts/calculate_marketcap.sh
./scripts/calculate_cloud_pricing.sh

View File

@ -0,0 +1,112 @@
- [Table of Contents](knowledge_base/knowledge_base_toc.md)
- [About](about/about.md)
- [ThreeFold History](about/threefold_history.md)
- [Token History](about/token_history.md)
- [Genesis Pool](about/genesis_pool.md)
- [Genesis Pool Dubai](about/genesis_pool_dubai.md)
- [Genesis Pool Ghent](about/genesis_pool_ghent.md)
- [Genesis Pool Details](about/genesis_block_pool_details.md)
- [ThreeFold Tech](about/threefold_tech.md)
- [Organisation Structure](about/orgstructure.md)
- [Governance](about/governance.md)
- [ThreeFold Companies](about/threefold_companies.md)
- [ThreeFold Dubai](about/threefold_dubai.md)
- [ThreeFold VZW](about/threefold_vzw.md)
- [ThreeFold AG](about/threefold_ag.md)
- [Mazraa](about/mazraa.md)
- [BetterToken](about/bettertoken.md)
- [DAO](about/dao/dao.md)
- [ThreeFold DAO](about/dao/tfdao.md)
- [TFChain](about/tfchain.md)
- [ThreeFold Roadmap](about/roadmap/roadmap_readme.md)
- [Release Notes](about/roadmap/releasenotes/releasenotes_readme.md)
- [TFGrid v3.10.0](about/roadmap/releasenotes/tfgrid_release_3_10_0.md)
- [TFGrid v3.9.0](about/roadmap/releasenotes/tfgrid_release_3_9_0.md)
- [TFGrid v3.8.0](about/roadmap/releasenotes/tfgrid_release_3_8_0.md)
- [TFGrid v3.7.0](about/roadmap/releasenotes/tfgrid_release_3_7_0.md)
- [TFGrid v3.6.1](about/roadmap/releasenotes/tfgrid_release_3_6_1.md)
- [TFGrid v3.6.0](about/roadmap/releasenotes/tfgrid_release_3_6_0.md)
- [TFGrid v3.0.0 Alpha-5](about/roadmap/releasenotes/tfgrid_release_3_0_a5.md)
- [TFGrid v3.0.0 Alpha-4](about/roadmap/releasenotes/tfgrid_release_3_0_a4.md)
- [TFGrid v3.0.0 Alpha-2](about/roadmap/releasenotes/tfgrid_release_3_0_a2.md)
- [TFGrid v3.0.0](about/roadmap/releasenotes/tfgrid_release_3_0.md)
- [ThreeFold Token](about/token_overview/token_overview.md)
- [Technology](tech/technology_toc.md)
- [Introduction](tech/technology.md)
- [The Internet Today](tech/internet_today.md)
- [History of Computers](tech/history/c64.md)
- [Too Many Layers](tech/history/layers.md)
- [The Internet Re-invented](tech/how_does_it_work.md)
- [World Records](tech/world_records.md)
- [Key Innovations](tech/key_innovations_overview.md)
- [Mycelium Network](tech/mycelium_innovation.md)
- [Zero-OS](tech/zos_innovation.md)
- [Quantum Safe Storage](tech/zstor_innovation.md)
- [Quantum Safe Filesystem](tech/qsfs_innovation.md)
- [FList: Better OS Images](tech/flist_innovation.md)
- [FungiStor](tech/fungistor_innovation.md)
- [Network Wall](tech/network_wall_innovation.md)
- [Architecture](tech/architecture.md)
- [Energy Efficient](tech/energy_efficient.md)
- [Decentralized Cloud Core Capabilities](tech/features.md)
- [Storage](tech/qsss_home.md)
- [Quantum Safe Storage Algo](tech/qss_algorithm.md)
- [Zero Knowledge proof](tech/qss_zero_knowledge_proof.md)
- [NFT Storage](tech/nft_storage.md)
- [S3 Storage](tech/s3_interface)
- [File System](tech/qss_filesystem.md)
- [Network](tech/networking.md)
- [Mycelium](tech/mycelium.md)
- [Web Gateway](tech/webgw.md)
- [Partners](partners_utilization/partners.md)
- [Sikana](partners_utilization/sikana.md)
- [Vindo](partners_utilization/vindo.md)
- [Mkondo](partners_utilization/mkondo.md)
- [Vverse](partners_utilization/vverse.md)
- [Earth Wallet](partners_utilization/earth_wallet.md)
- [Elestio](partners_utilization/elestio.md)
- [OW Freezone](partners_utilization/freezone.md)
- [Helium](partners_utilization/helium.md)
- [Holochain](partners_utilization/holochain.md)
- [TZG](partners_utilization/tanzania.md)
- [Tier-S DC](partners_utilization/tier_s_datacenter.md)
- [Farming](farming/farming_toc.md)
- [Farming Rewards](farming/farming_reward.md)
- [Proof-of-Capacity](farming/proof_of_capacity.md)
- [Proof-of-Utilization](farming/proof_of_utilization.md)
- [PoC DAO Rules](farming/poc_dao_rules.md)
- [Cloud](cloud/cloud_toc.md)
- [Cloud Units](cloud/cloudunits.md)
- [Pricing](cloud/pricing/pricing_toc.md)
- [Pricing Overview](cloud/pricing/pricing.md)
- [Staking Discounts](cloud/pricing/staking_discount_levels.md)
- [Cloud Pricing Compare](cloud/pricing/cloud_pricing_compare.md)
- [Grid Billing](cloud/grid_billing/grid_billing.md)
- [Resource Units](cloud/resource_units_calc_cloudunits.md)
- [Resource Units Advanced](cloud/resourceunits_advanced.md)
- [Collaboration](collaboration/collaboration_toc.md)
- [How to Contribute](collaboration/contribute.md)
- [Development Process](collaboration/development_process.md)
- [Feature Request](collaboration/feature_request.md)
- [Bug Report](collaboration/bug_report.md)
- [Issue Labels](collaboration/issue_labels.md)
- [Development Cycle](collaboration/development_cycle.md)
- [Release Process](collaboration/release_process.md)
- [Pull Request Template](collaboration/PULL_REQUEST_TEMPLATE.md)
- [Collaboration Tools](collaboration/collaboration_tools/collaboration_tools.md)
- [Circle Tool](collaboration/collaboration_tools/circle_tool.md)
- [Website Deployer](collaboration/collaboration_tools/website_tool.md)
- [Website Link Checker](collaboration/collaboration_tools/website_link_checker.md)
- [How to Test](collaboration/testing/testing_readme.md)
- [TestLodge](collaboration/testing/testlodge.md)
- [Code of Conduct](collaboration/code_conduct.md)
- [Legal](legal/legal_home.md)
- [Disclaimer](legal/disclaimer.md)
- [Definitions](legal/definitions_legal.md)
- [Terms & Conditions](legal/terms_conditions/terms_conditions_toc.md)
- [Terms and Conditions Websites](legal/terms_conditions_websites.md)
- [Terms and Conditions Users](legal/terms_conditions_griduser.md)
- [TFTA to TFT](legal/tfta_to_tft.md)
- [Terms and Conditions Farmers](legal/terms_conditions_farmer3.md)
- [Terms and Conditions Sales](legal/terms_conditions_sales.md)
- [Privacy Policy](legal/privacypolicy.md)

View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
value=$(cat tft_value.md)
CU=$(cat cu_musd_hour.md)
CUTFT=$(echo "$CU / $value" | bc -l)
printf "%.2f" $CUTFT > cu_mtft_hour.md
SU=$(cat su_musd_hour.md)
SUTFT=$(echo "$SU / $value" | bc -l)
printf "%.2f" $SUTFT > su_mtft_hour.md
NU=$(cat nu_musd_hour.md)
NUTFT=$(echo "$NU / $value" | bc -l)
printf "%.2f" $NUTFT > nu_mtft_hour.md
IP=$(cat ip_musd_hour.md)
IPTFT=$(echo "$IP / $value" | bc -l)
printf "%.2f" $IPTFT > ip_mtft_hour.md
NAME=$(cat name_musd_hour.md)
NAME=$(echo "$NAME / $value" | bc -l)
printf "%.2f" $NAME > name_mtft_hour.md
DNAME=$(cat dname_musd_hour.md)
DNAME=$(echo "$DNAME / $value" | bc -l)
printf "%.2f" $DNAME > dname_mtft_hour.md

View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
coinId="threefold-token"
url="https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd";
curl -sL ${url} \
-H 'Accept: application/json' | jq '."threefold-token".usd' | xargs printf "%.3f" > tft_value.md
supply=$(cat tft_supply.md)
value=$(cat tft_value.md)
TFT_MARKETCAP=$(echo "$supply * $value" | bc -l)
printf "%'.0f" $TFT_MARKETCAP > tft_marketcap.md

View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
mkdir -p ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
cd ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
wallets=(
GA7OPN4A3JNHLPHPEWM4PJDOYYDYNZOM7ES6YL3O7NC3PRY3V3UX6ANM
GDSKFYNMZWTB3V5AN26CEAQ27643Q3KB4X6MY4UTO2LIIDFND4SPQZYU
GBQHN7RL4LSRPR2TT74ID2UJPZ2AXCHQY2WKGCTDLJM3NXVJ7GQHUCOD
GBTPAXXP6534UPC4MLNGFGJWCD6DNSRVIPPOZWXAQAWI4FKTLOJY2A2S
GB2C5HCZYWNGVM6JGXDWQBJTMUY4S2HPPTCAH63HFAQVL2ALXDW7SSJ7
GDLVIB44LVONM5K67LUPSFZMSX7G2RLYVBM5MMHUJ4NAQJU7CH4HBJBO
GDKXTUYNW4BJKDM2L7B5XUYFUISV52KUU4G7VPNLF4ZSIKBURM622YPZ
GDIJY6K2BBRIRX423ZFUYKKFDN66XP2KMSBZFQSE2PSNDZ6EDVQTRLSU
GCWHWDRXYPXQAOYMQKB66SZPLM6UANKGMSL4SP7LSOIA6OTTOYQ6HBIH
GBV734I2SV4YDDPVJMYXU3IZ2AIU5GEAJRAD4E4BQG7CA2N63NXSPMD6
GAI4C2BGOA3YHVQZZW7OW4FHOGGYWTUBEVNHB6MW4ZAFG7ZAA7D5IPC3
GCEJ7DMULFTT25UH4FAAGOZ6KER4WXAYQGJUSIITQD527DGTKSXKBQGR
GAQXBLFG4BZGIVY6DBJVWE5EAP3UNHMIA2PYCUVLY2JUSPVWPUF36BW4
GAUGOSYLCX7JZTQYF2K7RIMHFWKSA3WSI2OQ4IRKXMDMVE6ABJIJMFQR
)
for wallet in "${wallets[@]}"; do
curl -sL "https://horizon.stellar.org/accounts/${wallet}" -H 'Accept: application/json' | jq --raw-output '.balances[] | select(.asset_code == "TFT") | .balance' | xargs printf "%.2f" > ${wallet,,}.md
done

View File

@ -0,0 +1,5 @@
#!/bin/bash
set -ex
export NAME=knowledge_base
hero mdbook -u https://git.ourworld.tf/tfgrid/info_tfgrid/src/branch/manual/heroscript/$NAME
rsync -rv ~/hero/www/info/$NAME/ root@info.ourworld.tf:/root/hero/www/info/$NAME/

1
books/library/SUMMARY.md Normal file
View File

@ -0,0 +1 @@
- [Library](library/library.md)

View File

@ -0,0 +1,5 @@
#!/bin/bash
set -ex
export NAME=library
hero mdbook -u https://git.ourworld.tf/tfgrid/info_tfgrid/src/branch/manual/heroscript/$NAME
rsync -rv ~/hero/www/info/$NAME/ root@info.ourworld.tf:/root/hero/www/info/$NAME/

View File

@ -1,6 +1,6 @@
- [Introduction](manual/intro.md)
- [Documentation](manual/documentation.md)
- [Dashboard](dashboard/dashboard.md)
- [ThreeFold Dashboard](dashboard/dashboard.md)
- [Wallet Connector](dashboard/wallet_connector.md)
- [TFGrid](dashboard/tfgrid/tfgrid.md)
- [Grid Status](dashboard/tfgrid/grid_status.md)
@ -28,7 +28,6 @@
- [Mattermost](dashboard/solutions/mattermost.md)
- [Nextcloud](dashboard/solutions/nextcloud.md)
- [Node Pilot](dashboard/solutions/nodepilot.md)
- [ownCloud](dashboard/solutions/owncloud.md)
- [Peertube](dashboard/solutions/peertube.md)
- [Presearch](dashboard/solutions/presearch.md)
- [Static Website](dashboard/solutions/static_website.md)
@ -47,9 +46,15 @@
- [TFChain](dashboard/tfchain/tfchain.md)
- [Your Profile](dashboard/tfchain/your_profile.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 Transfer](dashboard/tfchain/tf_token_transfer.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)
- [Javascript Client](developers/javascript/grid3_javascript_readme.md)
- [Installation](developers/javascript/grid3_javascript_installation.md)
@ -117,13 +122,14 @@
- [Internals](developers/internals/internals.md)
- [Reliable Message Bus - RMB](developers/internals/rmb/rmb_toc.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 Peer](developers/internals/rmb/uml/peer.md)
- [RMB Relay](developers/internals/rmb/uml/relay.md)
- [Zero-OS](developers/internals/zos/zos_readme.md)
- [Manual](developers/internals/zos/manual/manual.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)
- [Node ID Generation](developers/internals/zos/internals/identity/identity.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)
- [Grid Snapshots](developers/grid_deployment/snapshots.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)
- [Build a 3Node](farmers/3node_building/3node_building.md)
- [1. Create a Farm](farmers/3node_building/1_create_farm.md)
@ -175,6 +182,8 @@
- [Quick Guide](farmers/farmerbot/farmerbot_quick.md)
- [Additional Information](farmers/farmerbot/farmerbot_information.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)
- [Getting Started](system_administrators/getstarted/tfgrid3_getstarted.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 Micro VM](system_administrators/advanced/ipfs/ipfs_microvm.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)
- [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)
- [TFT Bridges](threefold_token/tft_bridges/tft_bridges.md)
- [TFChain-Stellar Bridge](threefold_token/tft_bridges/tfchain_stellar_bridge.md)

View File

@ -9,9 +9,9 @@
- [TFT](projectinca/tft.md)
- [INCA Grants](projectinca/grants.md)
- [v3.x Grants](projectinca/grants_tft.md)
- [Deploy AI Blocks](projectinca/grant_aiblock.md)
- [Deploy Cloud Blocks](projectinca/grant_cloudblock.md)
- [Deploy Storage Blocks](projectinca/grant_storageblock.md)
- [Deploy AISlices](projectinca/grant_aislice.md)
- [Deploy CloudSlices](projectinca/grant_cloudslice.md)
- [Deploy StorageSlices](projectinca/grant_storageslice.md)
- [Develop INCA Marketplace](projectinca/marketplace_grant.md)
- [Contributor Rewards](projectinca/contributor_rewards.md)
- [Chapter Tanzania](projectinca/chapter_tanzania.md)
@ -24,11 +24,14 @@
- [Grant Voting Process](projectinca/grant_voting_process.md)
- [INCA Marketplace](projectinca/marketplace.md)
- [Pricing](projectinca/marketplace_pricing.md)
- [AI Blocks](tfgrid4/aiblock.md)
- [Cloud Blocks](tfgrid4/cloudblock.md)
- [Storage Blocks](tfgrid4/storageblock.md)
- [AI Slices](tfgrid4/aislice.md)
- [Cloud Slices](tfgrid4/cloudslice.md)
- [Storage Slices](tfgrid4/storageslice.md)
- [INCA Farming](projectinca/inca_farming.md)
- [INCA Hosts](projectinca/inca_nodes.md)
- [INCA Nodes](projectinca/inca_nodes.md)
- [INCA Node Silver](projectinca/inca_node_silver.md)
- [INCA Node Platinum](projectinca/inca_node_platinum.md)
- [INCA Node AI](projectinca/inca_node_ai.md)
- [INCA Routers](projectinca/inca_routers.md)
- [INCA Network Map](projectinca/networkmap.md)
- [Reward Simulation](projectinca/inca_farming_reward.md)
@ -37,6 +40,8 @@
- [Promotion Effort](tfgrid3/promotion.md)
- [Messaging](tfgrid3/messaging.md)
- [Teams](projectinca/teams.md)
- [INCA Stories](projectinca/stories.md)
- [INCA App Spec](projectinca/inca_app.md)
- [INCA Grid Utilization](partners_utilization/partners.md)
- [Hero - Project Mycelium](projectinca/hero.md)
- [Digital Freezone](partners_utilization/freezone.md)
@ -88,7 +93,6 @@
- [Mycelium](tech/mycelium.md)
- [Web Gateway](tech/webgw.md)
- [Appendix](projectinca/appendix.md)
- [TFConnect NG Spec](projectinca/tfconnect.md)
- [Tokenomics TFGrid 3.14](tfgrid3/tokenomics.md)
- [Farming Reward TFGrid 3](tfgrid3/farming_reward.md)
- [Tokens Overview TFGrid 3](tfgrid3/tokens_overview.md)

View File

@ -1,41 +0,0 @@
- [Introduction](projectmycelium/intro.md)
- [Product Vision](projectmycelium/product_slides.md)
- [Tokenomics](projectmycelium/tokenomics.md)
- [Tokens](projectmycelium/tokens.md)
- [Solana Launch](projectmycelium/solana.md)
- [Mycelium Routers & Nodes](projectmycelium/farming.md)
- [Mycelium Nodes](projectmycelium/mycelium_nodes.md)
- [Mycelium Routers](projectmycelium/mycelium_routers.md)
- [Network Map](projectinca/networkmap.md)
- [Planet and People First Values](values/planet_people_first.md)
- [Layers](projectmycelium/participants.md)
- [Decentralized Cloud](bestkeptsecret/tfgrid_intro.md)
- [ThreeFold Cloud Intro](bestkeptsecret/tf_architecture.md)
- [ThreeFold Links](bestkeptsecret/references.md)
- [Hero Layer](projectmycelium/hero_layer.md)
- [Mycelium Layer](projectmycelium/mycelium_layer.md)
- [Transactional Layer](projectmycelium/transactional_layer.md)
- [Digital Freezone Layer](projectmycelium/digital_freezone_layer.md)
- [Appendix Internet and Cloud](projectmycelium/appendix.md)
- [ThreeFold Cloud in Nutshell](tfgrid3/who_are_we.md)
- [Background: What is Internet](bestkeptsecret/concept.md)
- [The Internet is Broken](tech/internet_today.md)
- [Build Internet from Scratch](bestkeptsecret/we_have_all_needed.md)-
- [The Internet today](tech/internet_today.md)
- [History of Computers](tech/history/c64.md)
- [Too Many Layers](tech/history/layers.md)
- [Why New Internet](why/why.md)
- [Cloud Too Centralized](why/current_cloud_too_centralized.md)
- [Countries Don't Have Their Own Internet](why/countries_no_internet.md)
- [Human Right](why/internet_human_right.md)
- [Social Warming](why/social_warming.md)
- [Solutions to Problems](problems/problems.md)
- [Painkillers and Onions](problems/no_pain_killer.md)
- [Clouds are Complicated](problems/cd_issues_cloud_not_enough.md)
- [Content Delivery is Expensive](solutions/cdn_cost.md)
- [Governance](projectmycelium/governance.md)
- [All Trust](tfgrid4/alltrust.md)
- [Proof of Authenticity](p2p/poa.md)
-

View File

@ -0,0 +1,4 @@
build:
./scripts/generate_wallets.sh
./scripts/calculate_marketcap.sh
./scripts/calculate_cloud_pricing.sh

View File

@ -0,0 +1,164 @@
- [Table of Contents](system_administrators/system_administrators_book_toc.md)
- [Getting Started](system_administrators/getstarted/tfgrid3_getstarted.md)
- [SSH Remote Connection](system_administrators/getstarted/ssh_guide/ssh_guide.md)
- [SSH with OpenSSH](system_administrators/getstarted/ssh_guide/ssh_openssh.md)
- [SSH with PuTTY](system_administrators/getstarted/ssh_guide/ssh_putty.md)
- [SSH with WSL](system_administrators/getstarted/ssh_guide/ssh_wsl.md)
- [WireGuard Access](system_administrators/getstarted/ssh_guide/ssh_wireguard.md)
- [Remote Desktop and GUI](system_administrators/getstarted/remote-desktop_gui/remote-desktop_gui.md)
- [Cockpit: a Web-based Interface for Servers](system_administrators/getstarted/remote-desktop_gui/cockpit_guide/cockpit_guide.md)
- [XRDP: an Open-Source Remote Desktop Protocol](system_administrators/getstarted/remote-desktop_gui/xrdp_guide/xrdp_guide.md)
- [Apache Guacamole: a Clientless Remote Desktop Gateway](system_administrators/getstarted/remote-desktop_gui/guacamole_guide/guacamole_guide.md)
- [Planetary Network](system_administrators/getstarted/planetarynetwork.md)
- [TFGrid Services](system_administrators/getstarted/tfgrid_services/tf_grid_services_readme.md)
- [GPU](system_administrators/gpu/gpu_toc.md)
- [GPU Support](system_administrators/gpu/gpu.md)
- [Terraform](system_administrators/terraform/terraform_toc.md)
- [Overview](system_administrators/terraform/terraform_readme.md)
- [Installing Terraform](system_administrators/terraform/terraform_install.md)
- [Terraform Basics](system_administrators/terraform/terraform_basics.md)
- [Full VM Deployment](system_administrators/terraform/terraform_full_vm.md)
- [GPU Support](system_administrators/terraform/terraform_gpu_support.md)
- [Resources](system_administrators/terraform/resources/terraform_resources_readme.md)
- [Using Scheduler](system_administrators/terraform/resources/terraform_scheduler.md)
- [Virtual Machine](system_administrators/terraform/resources/terraform_vm.md)
- [Web Gateway](system_administrators/terraform/resources/terraform_vm_gateway.md)
- [Kubernetes Cluster](system_administrators/terraform/resources/terraform_k8s.md)
- [ZDB](system_administrators/terraform/resources/terraform_zdb.md)
- [Zlogs](system_administrators/terraform/resources/terraform_zlogs.md)
- [Quantum Safe Filesystem](system_administrators/terraform/resources/terraform_qsfs.md)
- [QSFS on Micro VM](system_administrators/terraform/resources/terraform_qsfs_on_microvm.md)
- [QSFS on Full VM](system_administrators/terraform/resources/terraform_qsfs_on_full_vm.md)
- [CapRover](system_administrators/terraform/resources/terraform_caprover.md)
- [Advanced](system_administrators/terraform/advanced/terraform_advanced_readme.md)
- [Terraform Provider](system_administrators/terraform/advanced/terraform_provider.md)
- [Terraform Provisioners](system_administrators/terraform/advanced/terraform_provisioners.md)
- [Mounts](system_administrators/terraform/advanced/terraform_mounts.md)
- [Capacity Planning](system_administrators/terraform/advanced/terraform_capacity_planning.md)
- [Updates](system_administrators/terraform/advanced/terraform_updates.md)
- [SSH Connection with Wireguard](system_administrators/terraform/advanced/terraform_wireguard_ssh.md)
- [Set a Wireguard VPN](system_administrators/terraform/advanced/terraform_wireguard_vpn.md)
- [Synced MariaDB Databases](system_administrators/terraform/advanced/terraform_mariadb_synced_databases.md)
- [Nomad](system_administrators/terraform/advanced/terraform_nomad.md)
- [Nextcloud Deployments](system_administrators/terraform/advanced/terraform_nextcloud_toc.md)
- [Nextcloud All-in-One Deployment](system_administrators/terraform/advanced/terraform_nextcloud_aio.md)
- [Nextcloud Single Deployment](system_administrators/terraform/advanced/terraform_nextcloud_single.md)
- [Nextcloud Redundant Deployment](system_administrators/terraform/advanced/terraform_nextcloud_redundant.md)
- [Nextcloud 2-Node VPN Deployment](system_administrators/terraform/advanced/terraform_nextcloud_vpn.md)
- [Pulumi](system_administrators/pulumi/pulumi_readme.md)
- [Introduction to Pulumi](system_administrators/pulumi/pulumi_intro.md)
- [Installing Pulumi](system_administrators/pulumi/pulumi_install.md)
- [Deployment Examples](system_administrators/pulumi/pulumi_examples.md)
- [Deployment Details](system_administrators/pulumi/pulumi_deployment_details.md)
- [Mycelium](system_administrators/mycelium/mycelium_toc.md)
- [Overview](system_administrators/mycelium/overview.md)
- [Installation](system_administrators/mycelium/installation.md)
- [Additional Information](system_administrators/mycelium/information.md)
- [Message](system_administrators/mycelium/message.md)
- [Packet](system_administrators/mycelium/packet.md)
- [Data Packet](system_administrators/mycelium/data_packet.md)
- [API YAML](system_administrators/mycelium/api_yaml.md)
- [Computer and IT Basics](system_administrators/computer_it_basics/computer_it_basics.md)
- [CLI and Scripts Basics](system_administrators/computer_it_basics/cli_scripts_basics.md)
- [Docker Basics](system_administrators/computer_it_basics/docker_basics.md)
- [Git and GitHub Basics](system_administrators/computer_it_basics/git_github_basics.md)
- [Firewall Basics](system_administrators/computer_it_basics/firewall_basics/firewall_basics.md)
- [UFW Basics](system_administrators/computer_it_basics/firewall_basics/ufw_basics.md)
- [Firewalld Basics](system_administrators/computer_it_basics/firewall_basics/firewalld_basics.md)
- [File Transfer](system_administrators/computer_it_basics/file_transfer.md)
- [Screenshots](system_administrators/computer_it_basics/screenshots.md)
- [Advanced](system_administrators/advanced/advanced.md)
- [Token Transfer Keygenerator](system_administrators/advanced/token_transfer_keygenerator.md)
- [Cancel Contracts](system_administrators/advanced/cancel_contracts.md)
- [Contract Bills Reports](system_administrators/advanced/contract_bill_report.md)
- [Listing Free Public IPs](system_administrators/advanced/list_public_ips.md)
- [Cloud Console](system_administrators/advanced/cloud_console.md)
- [Redis](system_administrators/advanced/grid3_redis.md)
- [IPFS](system_administrators/advanced/ipfs/ipfs_toc.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)
- [MinIO Operator with Helm3](system_administrators/advanced/minio_helm3.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 Dashboard](dashboard/dashboard.md)
- [Wallet Connector](dashboard/wallet_connector.md)
- [TFGrid](dashboard/tfgrid/tfgrid.md)
- [Grid Status](dashboard/tfgrid/grid_status.md)
- [Node Statistics](dashboard/tfgrid/node_statistics.md)
- [Node Monitoring](dashboard/tfgrid/node_monitoring.md)
- [Deploy](dashboard/deploy/deploy.md)
- [Pricing Calculator](dashboard/deploy/pricing_calculator.md)
- [Node Finder](dashboard/deploy/node_finder.md)
- [Virtual Machines](dashboard/solutions/vm_intro.md)
- [Micro and Full VM Differences ](dashboard/solutions/vm_differences.md)
- [Full Virtual Machine](dashboard/solutions/fullvm.md)
- [Micro Virtual Machine](dashboard/solutions/microvm.md)
- [Nixos MicroVM](dashboard/solutions/nixos_micro.md)
- [Add a Domain](dashboard/solutions/add_domain.md)
- [Orchestrators](dashboard/deploy/orchestrators.md)
- [Kubernetes](dashboard/solutions/k8s.md)
- [Caprover](dashboard/solutions/caprover.md)
- [Caprover Admin](dashboard/solutions/caprover_admin.md)
- [Caprover Worker](dashboard/solutions/caprover_worker.md)
- [Applications](dashboard/deploy/applications.md)
- [Algorand](dashboard/solutions/algorand.md)
- [CasperLabs](dashboard/solutions/casper.md)
- [Discourse](dashboard/solutions/discourse.md)
- [Funkwhale](dashboard/solutions/funkwhale.md)
- [Mattermost](dashboard/solutions/mattermost.md)
- [Nextcloud](dashboard/solutions/nextcloud.md)
- [Node Pilot](dashboard/solutions/nodepilot.md)
- [Peertube](dashboard/solutions/peertube.md)
- [Presearch](dashboard/solutions/presearch.md)
- [Static Website](dashboard/solutions/static_website.md)
- [Subsquid](dashboard/solutions/subsquid.md)
- [Taiga](dashboard/solutions/taiga.md)
- [Umbrel](dashboard/solutions/umbrel.md)
- [WordPress](dashboard/solutions/wordpress.md)
- [Your Contracts](dashboard/deploy/your_contracts.md)
- [Images](dashboard/deploy/images.md)
- [SSH Keys](dashboard/deploy/ssh_keys.md)
- [Farms](dashboard/farms/farms.md)
- [Your Farms](dashboard/farms/your_farms.md)
- [Farm Finder](dashboard/farms/farms_finder.md)
- [Node Installer](dashboard/farms/node_installer.md)
- [Simulator](dashboard/farms/simulator.md)
- [TFChain](dashboard/tfchain/tfchain.md)
- [Your Profile](dashboard/tfchain/your_profile.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 Transfer](dashboard/tfchain/tf_token_transfer.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)
- [ThreeFold Token](threefold_token/threefold_token.md)
- [TFT Bridges](threefold_token/tft_bridges/tft_bridges.md)
- [TFChain-Stellar Bridge](threefold_token/tft_bridges/tfchain_stellar_bridge.md)
- [BSC-Stellar Bridge](threefold_token/tft_bridges/bsc_stellar_bridge.md)
- [BSC-Stellar Bridge Verification](threefold_token/tft_bridges/bsc_stellar_bridge_verification.md)
- [Ethereum-Stellar Bridge](threefold_token/tft_bridges/tft_ethereum/tft_ethereum.md)
- [Storing TFT](threefold_token/storing_tft/storing_tft.md)
- [ThreeFold Connect App - Stellar](threefold_token/storing_tft/tf_connect_app.md)
- [Lobstr Wallet - Stellar](threefold_token/storing_tft/lobstr_wallet.md)
- [MetaMask - BSC & ETH](threefold_token/storing_tft/metamask.md)
- [Hardware Wallet](threefold_token/storing_tft/hardware_wallet.md)
- [Buy and Sell TFT](threefold_token/buy_sell_tft/buy_sell_tft.md)
- [Quick Start - Stellar](threefold_token/buy_sell_tft/tft_lobstr/tft_lobstr_short_guide.md)
- [Lobstr Wallet - Stellar](threefold_token/buy_sell_tft/tft_lobstr/tft_lobstr_complete_guide.md)
- [MetaMask - BSC & ETH](threefold_token/buy_sell_tft/tft_metamask/tft_metamask.md)
- [Pancake Swap - BSC](threefold_token/buy_sell_tft/pancakeswap.md)
- [Liquidity Provider - LP](threefold_token/liquidity/liquidity_readme.md)
- [Pancake Swap LP](threefold_token/liquidity/liquidity_pancake.md)
- [1inch.io LP](threefold_token/liquidity/liquidity_1inch.md)
- [Albedo LP](threefold_token/liquidity/liquidity_albedo.md)
- [Transaction Fees](threefold_token/transaction_fees.md)
- [FAQ](faq/faq.md)

View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
value=$(cat tft_value.md)
CU=$(cat cu_musd_hour.md)
CUTFT=$(echo "$CU / $value" | bc -l)
printf "%.2f" $CUTFT > cu_mtft_hour.md
SU=$(cat su_musd_hour.md)
SUTFT=$(echo "$SU / $value" | bc -l)
printf "%.2f" $SUTFT > su_mtft_hour.md
NU=$(cat nu_musd_hour.md)
NUTFT=$(echo "$NU / $value" | bc -l)
printf "%.2f" $NUTFT > nu_mtft_hour.md
IP=$(cat ip_musd_hour.md)
IPTFT=$(echo "$IP / $value" | bc -l)
printf "%.2f" $IPTFT > ip_mtft_hour.md
NAME=$(cat name_musd_hour.md)
NAME=$(echo "$NAME / $value" | bc -l)
printf "%.2f" $NAME > name_mtft_hour.md
DNAME=$(cat dname_musd_hour.md)
DNAME=$(echo "$DNAME / $value" | bc -l)
printf "%.2f" $DNAME > dname_mtft_hour.md

View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
cd ../../collections/manual/values
coinId="threefold-token"
url="https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd";
curl -sL ${url} \
-H 'Accept: application/json' | jq '."threefold-token".usd' | xargs printf "%.3f" > tft_value.md
supply=$(cat tft_supply.md)
value=$(cat tft_value.md)
TFT_MARKETCAP=$(echo "$supply * $value" | bc -l)
printf "%'.0f" $TFT_MARKETCAP > tft_marketcap.md

View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
mkdir -p ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
cd ../../collections/manual/knowledge_base/about/token_overview/special_wallets/wallet_data
wallets=(
GA7OPN4A3JNHLPHPEWM4PJDOYYDYNZOM7ES6YL3O7NC3PRY3V3UX6ANM
GDSKFYNMZWTB3V5AN26CEAQ27643Q3KB4X6MY4UTO2LIIDFND4SPQZYU
GBQHN7RL4LSRPR2TT74ID2UJPZ2AXCHQY2WKGCTDLJM3NXVJ7GQHUCOD
GBTPAXXP6534UPC4MLNGFGJWCD6DNSRVIPPOZWXAQAWI4FKTLOJY2A2S
GB2C5HCZYWNGVM6JGXDWQBJTMUY4S2HPPTCAH63HFAQVL2ALXDW7SSJ7
GDLVIB44LVONM5K67LUPSFZMSX7G2RLYVBM5MMHUJ4NAQJU7CH4HBJBO
GDKXTUYNW4BJKDM2L7B5XUYFUISV52KUU4G7VPNLF4ZSIKBURM622YPZ
GDIJY6K2BBRIRX423ZFUYKKFDN66XP2KMSBZFQSE2PSNDZ6EDVQTRLSU
GCWHWDRXYPXQAOYMQKB66SZPLM6UANKGMSL4SP7LSOIA6OTTOYQ6HBIH
GBV734I2SV4YDDPVJMYXU3IZ2AIU5GEAJRAD4E4BQG7CA2N63NXSPMD6
GAI4C2BGOA3YHVQZZW7OW4FHOGGYWTUBEVNHB6MW4ZAFG7ZAA7D5IPC3
GCEJ7DMULFTT25UH4FAAGOZ6KER4WXAYQGJUSIITQD527DGTKSXKBQGR
GAQXBLFG4BZGIVY6DBJVWE5EAP3UNHMIA2PYCUVLY2JUSPVWPUF36BW4
GAUGOSYLCX7JZTQYF2K7RIMHFWKSA3WSI2OQ4IRKXMDMVE6ABJIJMFQR
)
for wallet in "${wallets[@]}"; do
curl -sL "https://horizon.stellar.org/accounts/${wallet}" -H 'Accept: application/json' | jq --raw-output '.balances[] | select(.asset_code == "TFT") | .balance' | xargs printf "%.2f" > ${wallet,,}.md
done

View File

@ -0,0 +1,5 @@
#!/bin/bash
set -ex
export NAME=system_administrators
hero mdbook -u https://git.ourworld.tf/tfgrid/info_tfgrid/src/branch/manual/heroscript/$NAME
rsync -rv ~/hero/www/info/$NAME/ root@info.ourworld.tf:/root/hero/www/info/$NAME/

View File

@ -0,0 +1,45 @@
- [Introduction](bestkeptsecret/home.md)
- [Why](why/why.md)
- [Cloud Too Centralized](why/current_cloud_too_centralized.md)
- [Countries Don't Have Their Own Internet](why/countries_no_internet.md)
- [Human Right](why/internet_human_right.md)
- [Social Warming](why/social_warming.md)
- [Farming](farming_v4/farming.md)
- [TF Nodes](farming_v4/tf_nodes.md)
- [TF Routers](farming_v4/tf_routers.md)
- [Network Map](farming_v4/networkmap.md)
- [Grid Economy](economy/economy.md)
- [INCA](economy/inca.md)
- [INCA Reserve](economy/incareserve.md)
- [TFT](economy/tft.md)
- [Mutual Credit](p2p/mutualcredit.md)
- [Proof of Authenticity](p2p/poa.md)
- [Partners Utilization](partners_utilization/partners.md)
- [Sikana](partners_utilization/sikana.md)
- [Vindo](partners_utilization/vindo.md)
- [Mkondo](partners_utilization/mkondo.md)
- [Vverse](partners_utilization/vverse.md)
- [Earth Wallet](partners_utilization/earth_wallet.md)
- [Elestio](partners_utilization/elestio.md)
- [OW Freezone](partners_utilization/freezone.md)
- [Helium](partners_utilization/helium.md)
- [Holochain](partners_utilization/holochain.md)
- [TZG](partners_utilization/tanzania.md)
- [Tier-S DC](partners_utilization/tier_s_datacenter.md)
- [Solutions](solutions/solutions.md)
- [Decentralized Cloud](solutions/cloud/cloud.md)
- [Content Providers](solutions/content_providers/content_providers.md)
- [Web4](web4/web4.md)
- [Technology](tech/technology.md)
- [Key Innovations](tech/key_innovations.md)
- [Vision](values/values.md)
- [Planet and People First](values/planet_people_first.md)
- [Solutions to Problems](problems/problems.md)
- [Painkillers and Onions](problems/no_pain_killer.md)
- [Clouds Are Complicated](problems/cd_issues_cloud_not_enough.md)
- [Content Delivery is Expensive](solutions/cdn_cost.md)
- [How You Can Participate](dy_intro/how_you_can_participate/participate.md)
- [Host a Node](dy_intro/how_you_can_participate/host_a_node.md)
- [Build on Top of Tanzania's Decentralised Internet](dy_intro/how_you_can_participate/build.md)
- [Join Our Coding Academy](dy_intro/how_you_can_participate/coding_participate.md)
- [Join Our Community](dy_intro/how_you_can_participate/community_participate.md)

View File

@ -0,0 +1,9 @@
# OurWorld
## Overview
OurWorld is a Venture Creator that aims to enable an Internet Infrastructure that supports access to essential digital services at a fraction of todays cost. It owns and supports multiple ventures, including TF Tech NV, ThreeFold, Sikana, OurWorld Zanzibar (a digital FreeZone) and Hero (a protocol for the self-sovereign web).
## Legal Information
OurWorld Holding GBC, a private company limited by shares incorporated under the laws of Mauritius, and which has its registered office at 5th Floor, The CORE Building, No.62, ICT Avenue, Cybercity, Ebene, Mauritius.

View File

@ -0,0 +1,53 @@
# ThreeFold DMCC
## Overview
ThreeFold DMCC (aka ThreeFold Dubai) is the company behind the open-source movement "ThreeFold" that allows anyone to become a cloud service provider on the ThreeFold Grid.
ThreeFold DMCC is the original team of ThreeFold operated from Dubai and Belgium. We started in 2016.
## Legal Information
ThreeFold DMCC, a company incorporated and registered with the Dubai Multi Commodities Centre (DMCC), United Arab Emirates, whose registered office is at Unit No. 30-01-BA1120, Jewellery & Gemplex 3, Plot no. DMCC-PH2-J&GPlexS, Jewellery & Gemplex, Dubai, United Arab Emirates, company registration number DMCC 189608.
## Responsibilities
- promote ThreeFold Grid and the ThreeFold Token
- work with tf_tech for the creation and maintenance of the technology.
- legal: signing party with all T&C (terms and conditions) with all future farmers
- work with many people and companies around the world to grow the threefold ecosystem
- look for partners who are willing to grow the threefold ecosystem
## Some memories from 2015+
At one point in time we had our office on the 74th floor of a building close to the Dubai International Airport. It was a cool spot with a great view, but we also realized the importance of being located closer to the ground. We only stayed there for just a little more than 1 year.
![](img/view_dubai.jpg)
![](img/dubai_office1.jpg)
Our main office was and still is in Al Jadaf which is, interestingly enough, a boat shipyard. This is where a lot of the ideas and work has been done to make ThreeFold possible.
![](img/al_jadaf.jpg)
![](img/aljadaf2.jpg)
The tower on the left in the photo above is where our office was. The place behind (to the right) is called Al Jadaf. We decided to do something different compared to most. No office in a fancy office building. Instead we have our office next to the water in a very old shipyard. Very unique, and it much more cost effective as well. (-:
Still today there are more than 100 servers located there in our testlab, and the ThreeFold Dubai was run from there.
## Structure: Oct 2021 - Dec 2022
- ThreeFold Dubai is our operational HQ from where all Foundation activities are coordinated.
- ThreeFold Dubai was mainly funded from TFTech (during 2019-2022), this will now change in 2023
- ThreeFold Dubai sometimes uses ThreeFold Labs IT which is a Dubai onshore company for when we need onshore activities like visa's for our people, workpermits, invoicing, ... ThreeFold Labs IT is just a services company to deal with some of these practical elements.
Adnan Fatayerji is the managing director and shareholder, in the future the shares of ThreeFold Dubai will be 100% owned by The OurWorld Venture Creator
## Official License
Please see below the ThreeFold DMCC license:
![](img/threefold_dmcc_license_certificate.jpg)
!!wiki.def alias:threefold_fzc,tf_fzc,threefold_dubai,tf_dubai

View File

@ -2,6 +2,16 @@
![](img/threefold_tech.jpg)
## Overview
TFTech is a software company that has developed an a decentralized autonomous edge cloud infrastructure designed to support emerging IT workloads and ESG requirements with more autonomy, scalability and efficiency.
## Legal Information
TF Tech NV a Belgian limited liability company, having its registered office at Antwerpse Steenweg 19, B-9080 Lochristi, Belgium, registered with the Belgian Crossroads Bank of Enterprises under company number 0712.845.674 (RLP Gent, district Gent).
## Additional Information
Company developing & promoting software for self-healing, self-driving cloud & blockchain workloads. Has developed most of the software as used in the ThreeFold_Grid.
- TFTech is working together with industry partners to sell its software

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -4,10 +4,9 @@
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [Algorand Structure](#algorand-structure)
- [Algorand Structure](#algorand-structure)
- [Run Default Node](#run-default-node)
- [Run Relay Node](#run-relay-node)
- [Run Participant Node](#run-participant-node)
- [Run Indexer Node](#run-indexer-node)
- [Select Capacity](#select-capacity)
@ -23,75 +22,56 @@
- From the sidebar click on **Applications**
- 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:
- Defualt:
This is a Non-relay and Non-participant
It can run on (Devnet, Testnet, Betanet, Mainnet)
- Relay:
Relay node Can't be participant.
It can run only on (Testnet, Mainnet)
- Participant:
Can run on any of the four nets.
- Indexer:
It is a default node but with Archival Mode enbled which will make you able to query the data of the blockchain.
An Algorand node can be either a `Default`, `Relay` or `Indexer` node.
- Default:
- This is a non-relay node.
- It can run on Devnet, Testnet, Betanet and Mainnet.
- Relay:
- It can run only on Testnet and Mainnet.
- Indexer:
- It is a default node but with Archival Mode enabled which will make you able to query the data of the blockchain.
## 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)
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)
here you see your node run against mainnet.
## 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.
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)
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)
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 blocks 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 blocks. 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
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)
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
The default scinario the 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`
The default scenario capacity is computed based on the node (network/type) accourding to this [reference](https://howbigisalgorand.com/).
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 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
![ ](./img/solutions_caprover_leader.png)

View File

@ -42,6 +42,8 @@ __Process__ :
- `Custom Domain` flag lets the user to use a custom domain
- 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
![ ](./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
![](./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
![ ](./img/new_vm3.png)
- Disk name
- 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)
You can also go to JSON tab for full details
You can also go to JSON tab for full details:
![ ](./img/new_vm6.png)
## Difference Between Full VM and Micro VM

View File

@ -5,6 +5,7 @@
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [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!
![ ](./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
![](./img/vm_list.png)
You can also go to JSON tab for full details
![ ](./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)
- [Peertube](peertube.md)
- [Taiga](taiga.md)
- [Owncloud](owncloud.md)
- [Nextcloud](nextcloud.md)
- [Discourse](discourse.md)
- [Mattermost](mattermost.md)

View File

@ -10,7 +10,7 @@
## Introduction
[Subsquid](https://www.subsquid.io/) indexer is a piece of software that reads all the blocks from a Substrate based blockchain, decodes and stores them for processing in a later stage.
[Subsquid](https://www.subsquid.io/) indexer is a piece of software that reads all the slice from a Substrate based blockchain, decodes and stores them for processing in a later stage.
## Prerequisites

View File

@ -5,6 +5,7 @@
- [Introduction](#introduction)
- [Prerequisites](#prerequisites)
- [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!
![ ](./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)
- 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)
and for more detailed information switch to `JSON` tap.
- For more detailed information, you can switch to `JSON` tab
![ ](./img/umbrel4.png)
- 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.

View File

@ -14,7 +14,7 @@
- [WordPress Instance Website](#wordpress-instance-website)
- [WordPress Instance Admin Page](#wordpress-instance-admin-page)
- [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)
# 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)
```
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)
- [Manual](manual.md)
- [Workload Types](workload_types.md)
- [Internal Modules](internals.md)
- [Internal Modules](zos_internals.md)
- [Capacity](capacity.md)
- [Performance Monitor Package](performance.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)
- [Full VM Grid Deployment](grid_deployment_full_vm.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

@ -0,0 +1,90 @@
# ThreeFold Developers Manual
This manual covers all practical tutorials on how to develop and build on the ThreeFold Grid.
<h2> Table of Contents </h2>
- [Javascript Client](grid3_javascript_readme.md)
- [Installation](grid3_javascript_installation.md)
- [Loading Client](grid3_javascript_loadclient.md)
- [Deploy a VM](grid3_javascript_vm.md)
- [Capacity Planning](grid3_javascript_capacity_planning.md)
- [Deploy Multiple VMs](grid3_javascript_vms.md)
- [Deploy CapRover](grid3_javascript_caprover.md)
- [Gateways](grid3_javascript_vm_gateways.md)
- [Deploy a Kubernetes Cluster](grid3_javascript_kubernetes.md)
- [Deploy a ZDB](grid3_javascript_zdb.md)
- [Deploy ZDBs for QSFS](grid3_javascript_qsfs_zdbs.md)
- [QSFS](grid3_javascript_qsfs.md)
- [Key Value Store](grid3_javascript_kvstore.md)
- [VM with Wireguard and Gateway](grid3_wireguard_gateway.md)
- [GPU Support](grid3_javascript_gpu_support.md)
- [Go Client](grid3_go_readme.md)
- [Installation](grid3_go_installation.md)
- [Loading Client](grid3_go_load_client.md)
- [Deploy a VM](grid3_go_vm.md)
- [Deploy Multiple VMs](grid3_go_vms.md)
- [Deploy Gateways](grid3_go_gateways.md)
- [Deploy Kubernetes](grid3_go_kubernetes.md)
- [Deploy a QSFS](grid3_go_qsfs.md)
- [GPU Support](grid3_go_gpu.md)
- [TFCMD](tfcmd.md)
- [Getting Started](tfcmd_basics.md)
- [Deploy a VM](tfcmd_vm.md)
- [Deploy Kubernetes](tfcmd_kubernetes.md)
- [Deploy ZDB](tfcmd_zdbs.md)
- [Gateway FQDN](tfcmd_gateway_fqdn.md)
- [Gateway Name](tfcmd_gateway_name.md)
- [Contracts](tfcmd_contracts.md)
- [TFROBOT](tfrobot.md)
- [Installation](tfrobot_installation.md)
- [Configuration File](tfrobot_config.md)
- [Deployment](tfrobot_deploy.md)
- [Commands and Flags](tfrobot_commands_flags.md)
- [Supported Configurations](tfrobot_configurations.md)
- [ThreeFold Chain](tfchain.md)
- [Introduction](introduction.md)
- [Farming Policies](farming_policies.md)
- [External Service Contract](tfchain_external_service_contract.md)
- [Solution Provider](tfchain_solution_provider.md)
- [Grid Proxy](proxy_readme.md)
- [Introducing Grid Proxy](proxy.md)
- [Setup](setup.md)
- [DB Testing](db_testing.md)
- [Commands](commands.md)
- [Contributions](contributions.md)
- [Explorer](explorer.md)
- [Database](database.md)
- [Production](production.md)
- [Release](release.md)
- [Flist](flist.md)
- [ThreeFold Hub Intro](zos_hub.md)
- [Generate an API Token](api_token.md)
- [Convert Docker Image Into Flist](convert_docker_image.md)
- [Supported Flists](grid3_supported_flists.md)
- [Flist Case Studies](flist_case_studies.md)
- [Case Study: Debian 12](flist_debian_case_study.md)
- [Case Study: Nextcloud AIO](flist_nextcloud_case_study.md)
- [Internals](internals.md)
- [Reliable Message Bus (RMB)](rmb_toc.md)
- [Introduction to RMB](rmb_intro.md)
- [RMB Specs](rmb_specs.md)
- [RMB Peer](peer.md)
- [RMB Relay](relay.md)
- [ZOS](index.md)
- [Manual](manual.md)
- [Workload Types](workload_types.md)
- [Internal Modules](zos_internals.md)
- [Capacity](capacity.md)
- [Performance Monitor Package](performance.md)
- [Public IPs Validation Task](publicips.md)
- [CPUBenchmark](cpubench.md)
- [IPerf](iperf.md)
- [Health Check](healthcheck.md)
- [API](api.md)
- [Grid Deployment](grid_deployment.md)
- [TFGrid Stacks](tfgrid_stacks.md)
- [Full VM Grid Deployment](grid_deployment_full_vm.md)
- [Grid Snapshots](snapshots.md)
- [Deploy the Dashboard](deploy_dashboard.md)
- [Application Case Study: Nextcloud](app_case_study_nextcloud.md)

View File

@ -179,7 +179,7 @@ We can see in the first section (`trusted_proxies static`) that we set a range o
After the global config at the top, the line `{$DOMAIN}:{$PORT}` defines the port that Caddy will listen to and the domain that we are using for our site. This is important, because in the case that port `443` is specified, Caddy will handle SSL certificates automatically.
The following blocks define behavior for different URL paths that users might try to access.
The following slice define behavior for different URL paths that users might try to access.
To begin, we have `/aio*`. This is how we place the AIO management app in a "subfolder" of our main domain. To accomplish that we need a few rules that rewrite the contents of the returned pages to correct the links. We also add some text replacements here to accomplish the enhancements mentioned earlier, like automatically filling the domain entry field.
@ -819,8 +819,8 @@ output "wg_config" {
output "vm1_ip" {
value = grid_deployment.d1.vms[0].ip
}
output "vm1_ygg_ip" {
value = grid_deployment.d1.vms[0].ygg_ip
output "vm1_planetary_ip" {
value = grid_deployment.d1.vms[0].planetary_ip
}
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)
- [Full VM Grid Deployment](grid_deployment_full_vm.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)
- [Introduction to RMB](rmb_intro.md)
- [Coding Guides](rmb_coding_guides.md)
- [RMB Specs](rmb_specs.md)
- [RMB Peer](peer.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)
- [Manual](manual.md)
- [Workload Types](workload_types.md)
- [Internal Modules](internals.md)
- [Internal Modules](zos_internals.md)
- [Capacity](capacity.md)
- [Performance Monitor Package](performance.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>
- [What is RMB](#what-is-rmb)
- [Why](#why)
- [Specifications](#specifications)
- [How to Use RMB](#how-to-use-rmb)
- [Libraries](#libraries)
- [Known Libraries](#known-libraries)
- [No Known Libraries](#no-known-libraries)
- [What is rmb-peer](#what-is-rmb-peer)
- [Download](#download)
- [Building](#building)
- [Running tests](#running-tests)
- [Introduction](#introduction)
- [Overview of the Operation of RMB Relay](#overview-of-the-operation-of-rmb-relay)
- [Connections](#connections)
- [Federations](#federations)
- [Peer](#peer)
- [Peer Implementation](#peer-implementation)
- [`rmb-peer` message types](#rmb-peer-message-types)
- [Output Requests](#output-requests)
- [Incoming Response](#incoming-response)
- [Incoming Request](#incoming-request)
- [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
- End to End encryption
- 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`
- Twin ID (numeric ID) of where the service can be found
- Command (string) is simply the function to call
- 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
- Minimize and completely eliminate message loss
- Reduce downtime
- Node need to authenticate and authorize calls
- Guarantee identity of the other peer so only owners of data can see it
- Fast request response time
- A twin establish a WS connection to his relays
- A twin create an `envelope` as defined by the protobuf schema
- Twin fill end all envelope information (more about this later)
- Twin pushes the envelope to one of his relays
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:
- 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`
- 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
This rmb-peer tool makes it possible to run multiple services behind this twin and push replies back to their initiators
## 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)
- Typescript [rmb-sdk-ts](https://github.com/threefoldtech/rmb-sdk-ts)
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).
### 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
- If it's too much to do all the signing, verification, e2e in your language then use `rmb-peer`
Example:
## What is rmb-peer
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
```
rmb-relay --substrate wss://tfchain.dev.grid.tf:443 --domain r1.3x0.me --ranker-period 1800
```
## 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
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>
- [Introduction to RMB](rmb_intro.md)
- [Coding Guides](rmb_coding_guides.md)
- [RMB Specs](rmb_specs.md)
- [RMB Peer](peer.md)
- [RMB Relay](relay.md)

View File

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

View File

@ -36,7 +36,7 @@ But we need to stress the importance of IPv6 availability when you're running a
grid is boldly claiming to be a new Internet, we should make sure we adhere to the new protocols that are future-proof.
Hence: IPv6 is the base, and IPv4 is just there to accomodate the transition.
Nowadays, RIPE can't even hand out consecutive /22 IPv4 blocks any more for new LIRs, so you'll be bound to market to
Nowadays, RIPE can't even hand out consecutive /22 IPv4 slice any more for new LIRs, so you'll be bound to market to
get IPv4, mostly at rates of 10-15 Euro per IP. Things tend to get costly that way.
So anyway, IPv6 is not an afterthought in 0-OS, we're starting with it.

View File

@ -36,7 +36,7 @@ But we need to stress the importance of IPv6 availability when you're running a
grid is boldly claiming to be a new Internet, we should make sure we adhere to the new protocols that are future-proof.
Hence: IPv6 is the base, and IPv4 is just there to accomodate the transition.
Nowadays, RIPE can't even hand out consecutive /22 IPv4 blocks any more for new LIRs, so you'll be bound to market to
Nowadays, RIPE can't even hand out consecutive /22 IPv4 slice any more for new LIRs, so you'll be bound to market to
get IPv4, mostly at rates of 10-15 Euro per IP. Things tend to get costly that way.
So anyway, IPv6 is not an afterthought in 0-OS, we're starting with it.

View File

@ -63,7 +63,7 @@ A council member can create a Farming Policy (DAO) in the following way:
6: Select an actions `tfgridModule` -> `createFarmingPolicy` and fill in all the fields.
7: Create a forum post with the details of the farming policy and fill in the link of that post in the `link` field
8: Give it some good `description`.
9: Duration is optional (by default it's 7 days). A proposal cannot be closed before the duration is "expired". If you wish to set a duration, the duration should be expressed in number of blocks from `now`. For example, 2 hours is equal to 1200 blocks (blocktime is 6 seconds) in this case, the duration should be filled in as `1200`.
9: Duration is optional (by default it's 7 days). A proposal cannot be closed before the duration is "expired". If you wish to set a duration, the duration should be expressed in number of slice from `now`. For example, 2 hours is equal to 1200 slice (blocktime is 6 seconds) in this case, the duration should be filled in as `1200`.
10: If all the fields are filled in, click `Propose`, now Farmers can vote. A proposal can be closed manually once there are enough votes AND the proposal is expired. To close go to extrinsics -> `dao` -> `close` -> fill in proposal hash and index (both can be found in chainstate).
All (su, cu, nu, ipv4) values should be expressed in units USD. Minimal uptime should be expressed as integer that represents an percentage (example: `95`).
@ -86,7 +86,7 @@ First identify the policy ID to link to a farm. You can check for farming polici
6: Limits contains a `farming_policy_id` (Required) and cu, su, end, node count (which are all optional). It also contains `node_certification`, if this is set to true only certified nodes can have this policy.
7: Create a forum post with the details of why we want to link that farm to that policy and fill in the link of that post in the `link` field
8: Give it some good `description`.
9: Duration is optional (by default it's 7 days). A proposal cannot be closed before the duration is "expired". If you wish to set a duration, the duration should be expressed in number of blocks from `now`. For example, 2 hours is equal to 1200 blocks (blocktime is 6 seconds) in this case, the duration should be filled in as `1200`.
9: Duration is optional (by default it's 7 days). A proposal cannot be closed before the duration is "expired". If you wish to set a duration, the duration should be expressed in number of slice from `now`. For example, 2 hours is equal to 1200 slice (blocktime is 6 seconds) in this case, the duration should be filled in as `1200`.
10: If all the fields are filled in, click `Propose`, now Farmers can vote. A proposal can be closed manually once there are enough votes AND the proposal is expired. To close go to extrinsics -> `dao` -> `close` -> fill in proposal hash and index (both can be found in chainstate).
For reference:

View File

@ -54,4 +54,4 @@ The projects can be seen in [projects](incaprojects.md)
### More Info
> we are learning from [https://medium.com/h-o-l-o/holo-fuel-economics(https://medium.com/h-o-l-o/holo-fuel-economics-101-c9631d63014a) and many of their concepts will be implemented in our reserve.
> we are learning from [https://medium.com/h-o-l-o/holo-fuel-economics](https://medium.com/h-o-l-o/holo-fuel-economics-101-c9631d63014a) and many of their concepts will be implemented in our reserve.

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)
- [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 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)
- [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)
@ -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)
- [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)
- [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)
- [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)
@ -81,9 +77,6 @@
- [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)
- [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)
- [DEVELOPERS FAQ](#developers-faq)
- [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)
- [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)
- [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)
- [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)
@ -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)
- [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)
- [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)
- [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)
- [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)
- [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)
- [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)
- [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)
- [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)
@ -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)
- [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)
- [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)
***
@ -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*.
### 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?
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
* 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
## TF Grid Functionalities
@ -888,7 +797,7 @@ The ThreeFold Grid is basically agnostic when it comes to how you structure your
If you want to put all your storage and compute on one node and lose everything if it goes down, you can do so.
If you want a highly distributed and fault tolerant system with high availability where data is never lost, you can also do so. You could build an architecture with single nodes running single workloads as the building blocks.
If you want a highly distributed and fault tolerant system with high availability where data is never lost, you can also do so. You could build an architecture with single nodes running single workloads as the building slice.
Containerized micro service architectures running on e.g. Kubernetes are basically the way that compute is being "sharded" already in the mainstream of IT, especially at large scales. Such applications fit well on the ThreeFold Grid today, since they account for the possibility that individual nodes may fail. However, many applications aren't built this way and it takes work to adapt them.
@ -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.
## 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?
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.
### 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?
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.
### 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?
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.
### 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?
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?
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
### 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?
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
@ -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?
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
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)
- [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)
- [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.
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.
## 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.
@ -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.
## 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.
@ -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
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
```
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.
For a nvme disk, here we use *nvme0* as an example, write:
To wipe all NVMe disks, use the following line:
```
sudo wipefs -a /dev/nvme0
```
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.
sudo for i in /dev/nvme*; do wipefs -af $i; done
```

View File

@ -48,7 +48,7 @@ But we need to stress the importance of IPv6 availability when you're running a
grid is boldly claiming to be a new Internet, we should make sure we adhere to the new protocols that are future-proof.
Hence: IPv6 is the base, and IPv4 is just there to accomodate the transition.
Nowadays, RIPE can't even hand out consecutive /22 IPv4 blocks any more for new LIRs, so you'll be bound to market to
Nowadays, RIPE can't even hand out consecutive /22 IPv4 slice any more for new LIRs, so you'll be bound to market to
get IPv4, mostly at rates of 10-15 Euro per IP. Things tend to get costly that way.
So anyway, IPv6 is not an afterthought in 0-OS, we're starting with it.

View File

@ -22,7 +22,7 @@ In this section, we provide advanced networking tips for farms with public IPs a
For farmers who have public IPs, extra considerations are needed in setting up the network of the farm. We will go through the main considerations in this section.
First, we must acknowledge that by the open-source and design of ThreeFold farming, a farm can range from a simple [single 3Node](3node_building.md) setup, to a multi-rack farm hosted in a typical data center, and everything in-between, from the farmer experiencing with public IP blocks, to the entrepreneur who builds their own data center at home.
First, we must acknowledge that by the open-source and design of ThreeFold farming, a farm can range from a simple [single 3Node](3node_building.md) setup, to a multi-rack farm hosted in a typical data center, and everything in-between, from the farmer experiencing with public IP slice, to the entrepreneur who builds their own data center at home.
There are thus many types of farms and each will have varying configurations. The simplest way to set up a farm has been extensively discussed in the first steps of creating a farm. But what are the other more complex configurations possible? Let's go through some of those:
@ -42,7 +42,7 @@ There are thus many types of farms and each will have varying configurations. Th
## Overall Requirements
There are overall requirements for any 3Node farm using IP address blocks in a data centere or at home:
There are overall requirements for any 3Node farm using IP address slice in a data centere or at home:
- There must be at least one interface that provide DHCP to each node
- Public IPs must be routable from at least one interface

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
```bash
farmerbot start --node <node ID> -m "<mnemonic>" -n dev -d
farmerbot start --node <node ID> -m "<mnemonic>" -n <network> -d
```
Where:
@ -112,7 +112,7 @@ Global Flags:
- `start all`: to start (power on) all nodes in a farm
```bash
farmerbot start all --farm <farm ID> -m "<mnemonic>" -n dev -d
farmerbot start all --farm <farm ID> -m "<mnemonic>" -n <network> -d
```
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)
- [Additional Information](farmerbot_information.md)
- [Minting and the Farmerbot](farmerbot_minting.md)
- [Node Status Bot](node_status_bot.md)
- [Farming Troubleshooting](farming_troubleshooting.md)
- [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.

View File

@ -0,0 +1,34 @@
# ThreeFold Farmers Manual
This manual covers all practical information on how to become a cloud service provider (farmer) on the ThreeFold Grid.
<h2> Table of Contents </h2>
- [Build a 3Node](3node_building.md)
- [1. Create a Farm](1_create_farm.md)
- [2. Create a Zero-OS Bootstrap Image](2_bootstrap_image.md)
- [3. Set the Hardware](3_set_hardware.md)
- [4. Wipe All the Disks](4_wipe_all_disks.md)
- [5. Set the BIOS/UEFI](5_set_bios_uefi.md)
- [6. Boot the 3Node](6_boot_3node.md)
- [Farming Optimization](farming_optimization.md)
- [GPU Farming](gpu_farming.md)
- [Set Additional Fees](set_additional_fees.md)
- [Minting Receipts](minting_receipts.md)
- [Minting Periods](minting_periods.md)
- [Room Parameters](farm_room_parameters.md)
- [Farming Costs](farming_costs.md)
- [Calculate Your ROI](calculate_roi.md)
- [Farming Requirements](farming_requirements.md)
- [Advanced Networking](advanced_networking_toc.md)
- [Networking Overview](networking_overview.md)
- [Network Considerations](network_considerations.md)
- [Network Setup](network_setup.md)
- [Farmerbot](farmerbot_intro.md)
- [Quick Guide](farmerbot_quick.md)
- [Additional Information](farmerbot_information.md)
- [Minting and the Farmerbot](farmerbot_minting.md)
- [Node Status Bot](node_status_bot.md)
- [Farming Troubleshooting](farming_troubleshooting.md)
> 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

@ -44,7 +44,7 @@ The TF_Farmer has to promise to keep the farm operational till the end as specif
### TFGrid User Can Have Support
All support inquiries will be handled through blocks of 15 minutes which are paid for in ThreeFold Support Tokens(TFTS).
All support inquiries will be handled through slice of 15 minutes which are paid for in ThreeFold Support Tokens(TFTS).
Any TFGrid user can ask for support but only for certified farms.

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