From 0c3311960153f2505a0b4ae389daa59896e4eefa Mon Sep 17 00:00:00 2001 From: mik-tf Date: Thu, 29 Aug 2024 19:22:26 -0400 Subject: [PATCH] finalized info_fgrid sync --- books/manual/SUMMARY.md | 60 ++-- collections/cloud/cloud_toc.md | 4 - .../cloud/resource_units_calc_cloudunits.md | 2 +- collections/dashboard/dashboard.md | 21 +- collections/dashboard/deploy/images.md | 4 +- collections/dashboard/deploy/node_finder.md | 7 +- collections/dashboard/farms/your_farms.md | 28 +- .../dashboard/img/node_finder_grafana.png | Bin 0 -> 165357 bytes collections/dashboard/solutions/caprover.md | 94 +++---- collections/dashboard/solutions/casper.md | 8 +- collections/dashboard/solutions/discourse.md | 6 +- collections/dashboard/solutions/fullvm.md | 2 +- collections/dashboard/solutions/funkwhale.md | 4 +- collections/dashboard/solutions/jenkins.md | 2 +- collections/dashboard/solutions/k8s.md | 2 +- collections/dashboard/solutions/mattermost.md | 5 +- collections/dashboard/solutions/nextcloud.md | 2 +- collections/dashboard/solutions/nodepilot.md | 4 +- collections/dashboard/solutions/peertube.md | 11 +- collections/dashboard/solutions/presearch.md | 3 +- .../dashboard/solutions/static_website.md | 4 +- collections/dashboard/solutions/subsquid.md | 5 +- collections/dashboard/solutions/taiga.md | 6 +- collections/dashboard/solutions/tfrobot.md | 8 +- collections/dashboard/solutions/umbrel.md | 8 +- collections/dashboard/solutions/wordpress.md | 4 +- .../javascript/grid3_javascript_readme.md | 1 + ...id3_javascript_vm_with_mycelium_network.md | 202 +++++++++++++ .../farmers/3node_building/6_boot_3node.md | 4 + .../advanced_methods/advanced_methods.md | 8 + .../advanced_methods/planetarynetwork.md | 224 +++++++++++++++ .../{ => advanced_methods}/ssh_wireguard.md | 28 +- .../getstarted/ssh_guide/ssh_guide.md | 4 +- .../getstarted/ssh_guide/ssh_openssh.md | 266 +++++------------- .../getstarted/ssh_guide/ssh_putty.md | 24 +- .../getstarted/ssh_guide/ssh_wsl.md | 9 +- .../getstarted/tfgrid3_getstarted.md | 32 +-- .../getstarted/tfgrid_deployments.md | 43 +++ .../tf_grid_services_readme.md | 46 +-- .../system_administrators/gpu/gpu_toc.md | 2 - .../pulumi_complete_guides_toc.md | 9 + .../pulumi_complete_guides/pulumi_go.md | 90 ++++++ .../pulumi_complete_guides/pulumi_python.md | 89 ++++++ .../pulumi_complete_guides/pulumi_yaml.md | 77 +++++ .../pulumi/pulumi_deployment_details.md | 51 ++-- .../pulumi/pulumi_examples.md | 12 +- .../pulumi/pulumi_intro.md | 12 +- .../pulumi/pulumi_readme.md | 3 +- .../resources/terraform_resources_readme.md | 2 - .../terraform/terraform_full_vm.md | 23 +- .../terraform/terraform_install.md | 29 +- .../terraform/terraform_readme.md | 36 +-- .../terraform/terraform_toc.md | 29 +- 53 files changed, 1088 insertions(+), 571 deletions(-) create mode 100644 collections/dashboard/img/node_finder_grafana.png create mode 100644 collections/developers/javascript/grid3_javascript_vm_with_mycelium_network.md create mode 100644 collections/system_administrators/getstarted/ssh_guide/advanced_methods/advanced_methods.md create mode 100644 collections/system_administrators/getstarted/ssh_guide/advanced_methods/planetarynetwork.md rename collections/system_administrators/getstarted/ssh_guide/{ => advanced_methods}/ssh_wireguard.md (84%) create mode 100644 collections/system_administrators/getstarted/tfgrid_deployments.md create mode 100644 collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_complete_guides_toc.md create mode 100644 collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_go.md create mode 100644 collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_python.md create mode 100644 collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_yaml.md diff --git a/books/manual/SUMMARY.md b/books/manual/SUMMARY.md index 2c43f2b..c74de50 100644 --- a/books/manual/SUMMARY.md +++ b/books/manual/SUMMARY.md @@ -17,9 +17,9 @@ - [Add a Domain to a VM](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) + - [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) @@ -66,6 +66,7 @@ - [Installation](developers/javascript/grid3_javascript_installation.md) - [Loading Client](developers/javascript/grid3_javascript_loadclient.md) - [Deploy a VM](developers/javascript/grid3_javascript_vm.md) + - [Deploy a VM with Mycelium Network](developers/javascript/grid3_javascript_vm_with_mycelium_network.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) @@ -197,23 +198,38 @@ - [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) + - [Advanced Methods](system_administrators/getstarted/ssh_guide/advanced_methods/advanced_methods.md) + - [SSH with PuTTY](system_administrators/getstarted/ssh_guide/ssh_putty.md) + - [SSH with WSL](system_administrators/getstarted/ssh_guide/ssh_wsl.md) + - [WireGuard](system_administrators/getstarted/ssh_guide/advanced_methods/ssh_wireguard.md) + - [Planetary Network](system_administrators/getstarted/ssh_guide/advanced_methods/planetarynetwork.md) + - [TFGrid Deployments](system_administrators/getstarted/tfgrid_deployments.md) - [TFGrid Services](system_administrators/getstarted/tfgrid_services/tf_grid_services_readme.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) + - [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) + - [Complete Guides](system_administrators/pulumi/pulumi_complete_guides/pulumi_complete_guides_toc.md) + - [Pulumi and YAML](system_administrators/pulumi/pulumi_complete_guides/pulumi_yaml.md) + - [Pulumi and Python](system_administrators/pulumi/pulumi_complete_guides/pulumi_python.md) + - [Pulumi and Go](system_administrators/pulumi/pulumi_complete_guides/pulumi_go.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) + - [Introduction to Terraform](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) + - [Terrafprm Basics](system_administrators/terraform/terraform_basics.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) @@ -227,6 +243,7 @@ - [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) + - [GPU Support](system_administrators/terraform/terraform_gpu_support.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) @@ -240,19 +257,6 @@ - [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) @@ -287,6 +291,10 @@ - [HTTPS with Caddy](system_administrators/advanced/https_caddy.md) - [Node Status Bot](system_administrators/advanced/node_status_bot.md) - [Minetest](system_administrators/advanced/minetest.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) - [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) diff --git a/collections/cloud/cloud_toc.md b/collections/cloud/cloud_toc.md index 48ae56a..6a1ef5c 100644 --- a/collections/cloud/cloud_toc.md +++ b/collections/cloud/cloud_toc.md @@ -8,9 +8,5 @@ To deploy on the ThreeFold Grid, refer to the [System Administrators](system_adm - [Cloud Units](cloudunits.md) - [Pricing](pricing_toc.md) - - [Pricing Overview](pricing.md) - - [Staking Discounts](staking_discount_levels.md) - - [Cloud Pricing Compare](cloud_pricing_compare.md) - - [Grid Billing](grid_billing.md) - [Resource Units](resource_units_calc_cloudunits.md) - [Resource Units Advanced](resourceunits_advanced.md) \ No newline at end of file diff --git a/collections/cloud/resource_units_calc_cloudunits.md b/collections/cloud/resource_units_calc_cloudunits.md index dda7c63..4d5a740 100644 --- a/collections/cloud/resource_units_calc_cloudunits.md +++ b/collections/cloud/resource_units_calc_cloudunits.md @@ -23,7 +23,7 @@ Resource units are used to measure and convert capacity on the hardware level in | ------------ | ------------------------------------ | ---- | | Core Unit | 1 Logical Core (Hyperthreaded Core) | CRU | | Mem Unit | 1 GB mem | MRU | -| HD Unit | 1 GB | HRU | +| HDD Unit | 1 GB | HRU | | SSD Unit | 1 GB | SRU | | Network Unit | 1 GB of bandwidth transmitted in/out | NRU | diff --git a/collections/dashboard/dashboard.md b/collections/dashboard/dashboard.md index fca40ee..5143d2b 100644 --- a/collections/dashboard/dashboard.md +++ b/collections/dashboard/dashboard.md @@ -15,10 +15,10 @@ The backend for the weblets is introduced with the [Javascript Client](developer

Table of Contents

- [Wallet Connector](wallet_connector.md) -- [TFGrid](tfgrid.md) -- [Deploy](deploy.md) -- [Farms](farms.md) -- [TFChain](tfchain.md) +- [TFGrid](tfgrid/tfgrid.md) +- [Deploy](deploy/deploy.md) +- [Farms](farms/farms.md) +- [TFChain](tfchain/tfchain.md) ## Advantages @@ -42,11 +42,12 @@ You can access the ThreeFold Dashboard on different TF Chain networks. - Deploys one thing at a time. - Might take sometime to deploy a solution like Peertube, so you should wait a little bit until it's fully running. -## Dashboard Backups +## List of Mainnet Backend Stacks -If the main Dashboard URLs are not working for any reason, the following URLs can be used. Those Dashboard URLs are fully independent of the main Dashboard URLs shown above. +We provide independent mainnet backend stacks. Here is the current list: -- [https://dashboard.02.dev.grid.tf](https://dashboard.02.dev.grid.tf) for Dev net -- [https://dashboard.02.qa.grid.tf](https://dashboard.02.qa.grid.tf) for QA net -- [https://dashboard.02.test.grid.tf](https://dashboard.02.test.grid.tf) for Test net -- [https://dashboard.02.grid.tf](https://dashboard.02.grid.tf) for Main net \ No newline at end of file +- [https://dashboard.grid.tf](https://dashboard.grid.tf) +- [https://dashboard.be.grid.tf](https://dashboard.be.grid.tf) +- [https://dashboard.fin.grid.tf](https://dashboard.fin.grid.tf) +- [https://dashboard.sg.grid.tf](https://dashboard.sg.grid.tf) +- [https://dashboard.us.grid.tf](https://dashboard.us.grid.tf) \ No newline at end of file diff --git a/collections/dashboard/deploy/images.md b/collections/dashboard/deploy/images.md index 2c27966..564e1e3 100644 --- a/collections/dashboard/deploy/images.md +++ b/collections/dashboard/deploy/images.md @@ -2,4 +2,6 @@ Find or Publish your Flist from [Zero-OS Hub](https://hub.grid.tf/) -![](../img/0_hub.png) \ No newline at end of file +![](../img/0_hub.png) + +Learn more about the Zero-OS Hub [here](developers@@zos_hub). \ No newline at end of file diff --git a/collections/dashboard/deploy/node_finder.md b/collections/dashboard/deploy/node_finder.md index 3d8b662..3d4d29a 100644 --- a/collections/dashboard/deploy/node_finder.md +++ b/collections/dashboard/deploy/node_finder.md @@ -45,11 +45,14 @@ If your deployment has some minimum requirements, you can easily filter relevant ## Node Details -You can see all of the node details when you click on its row. +You can see all of the node details when you click on its row: ![](../img/dashboard_node_finder_node_view.png) -Note that the network speed test displayed in the Node Finder is updated every 6 hours. +> Note: The network speed test displayed in the Node Finder is updated every 6 hours. +To access the public Grafana page displaying additional information, click on `Check Node Health`: + +![](../img/node_finder_grafana.png) ## Gateway Nodes diff --git a/collections/dashboard/farms/your_farms.md b/collections/dashboard/farms/your_farms.md index d1e1ae2..f9072ed 100644 --- a/collections/dashboard/farms/your_farms.md +++ b/collections/dashboard/farms/your_farms.md @@ -2,24 +2,24 @@ This comprehensive guide aims to provide users with detailed instructions and insights into efficiently managing their _Farms_. Farms encompass servers and storage devices contributing computational and storage capabilities to the grid, empowering users to oversee, maintain, and optimize their resources effectively. -- [Getting started](#getting-started) -- [Create a new Farm](#create-a-new-farm) +- [Getting Started](#getting-started) +- [Create a New Farm](#create-a-new-farm) - [Manage Your Farms](#manage-your-farms) - - [Add a public IP to your Farm](#add-a-public-ip-to-your-farm) - - [Add a Stellar address for payout](#add-a-stellar-address-for-payout) - - [Generate your node bootstrap image](#generate-your-node-bootstrap-image) - - [Additional information](#additional-information) + - [Add a Public IP to Your Farm](#add-a-public-ip-to-your-farm) + - [Add a Stellar Address for Payout](#add-a-stellar-address-for-payout) + - [Generate Your Node Bootstrap Image](#generate-your-node-bootstrap-image) + - [Additional Information](#additional-information) - [Manage Your Nodes](#manage-your-nodes) - - [Node information](#node-information) + - [Node Information](#node-information) - [Extra Fees](#extra-fees) - [Public Configuration](#public-configuration) - [The Difference Between IPs Assigned to Nodes Versus a Farm](#the-difference-between-ips-assigned-to-nodes-versus-a-farm) -## Getting started +## Getting Started After logging in to the TF Dashboard, on the sidebar click on **Dashboard** then _Your Farms_ . -## Create a new Farm +## Create a New Farm If you want to start farming, you need a farmID, the ID of the farm that is owning the hardware node(s) you connect to the TFGrid. @@ -47,7 +47,7 @@ You can browse your Farms in _Farms_ table; Farms table contains all your own fa ![](../img/dashboard_farms_farms_table.png) -### Add a public IP to your Farm +### Add a Public IP to Your Farm If you have public IPv4 addresses available that can be used for usage on the TFGrid, you can add them in your farm. Click `ADD IP`, specify the addresses, the gateway and click `CREATE`. @@ -69,7 +69,7 @@ Deleting IPv4 addresses is also possible here. The `Deployed Contract ID` gives ![ ](../img/dashboard_farms_ip_details.png) -### Add a Stellar address for payout +### Add a Stellar Address for Payout In a first phase, farming of tokens still results in payout on the Stellar network. So to get the farming reward, a Stellar address needs to be provided. @@ -79,7 +79,7 @@ In a first phase, farming of tokens still results in payout on the Stellar netwo You can read about different ways to store TFT [here](threefold_token@@storing_tft). Make sure to use a Stellar wallet for your farming rewards. -### Generate your node bootstrap image +### Generate Your Node Bootstrap Image Once you know your farmID, you can set up your node on TFGrid3. Click on `Bootstrap Node Image`. @@ -87,7 +87,7 @@ Once you know your farmID, you can set up your node on TFGrid3. Click on `Bootst Read more Zero-OS bootstrap image [here](farmers@@2_bootstrap_image). -### Additional information +### Additional Information After booting a node, the info will become available in `Your Nodes` table, including the status info along with the minting and fixup receipts. @@ -103,7 +103,7 @@ You can also download a single node's receipts using the `Download Receipts` but as in farms table _Nodes_ table contains all your own nodes and its your entry point to manage your farm as in the following sections. -### Node information +### Node Information Expand your node information by clicking on the expand button in the target node row. diff --git a/collections/dashboard/img/node_finder_grafana.png b/collections/dashboard/img/node_finder_grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..550fa34ce561519924ffb190f2d45a21ec39ff17 GIT binary patch literal 165357 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 H=kdP)#3M^E literal 0 HcmV?d00001 diff --git a/collections/dashboard/solutions/caprover.md b/collections/dashboard/solutions/caprover.md index aad0900..00a06ca 100644 --- a/collections/dashboard/solutions/caprover.md +++ b/collections/dashboard/solutions/caprover.md @@ -5,7 +5,7 @@ - [Introduction](#introduction) - [Requirements](#requirements) - [Configs Tab](#configs-tab) -- [Admin and Workers Tabs](#admin-and-workers-tabs) +- [Leader and Workers Tabs](#leader-and-workers-tabs) - [The Domain Name](#the-domain-name) - [Domain Name Example](#domain-name-example) - [How to Know the IP Address](#how-to-know-the-ip-address) @@ -31,10 +31,10 @@ Caprover is a very cool management app for containers based on Docker Swarm. It has following benefits : -- easy to deploy apps (in seconds) -- easy to create new apps -- super good monitoring -- can be extended over the TFGrid +- Easy to deploy apps (in seconds) +- Easy to create new apps +- Super good monitoring +- Can be extended over the TFGrid ## Requirements @@ -46,23 +46,51 @@ It has following benefits : ![ ](./img/solutions_caprover.png) -- Enter domain for you Caprover instance, Be very careful about the domain name: it needs to be a wildcard domain name you can configure in your chosen domain name system. +- Enter domain for you Caprover instance. + - Be very careful about the domain name: it needs to be a wildcard domain name you can configure in your chosen domain name system. - Enter password for you Caprover instance. 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 +## Leader and Workers Tabs + +Each deployment will have one leader and there can be many workers. By default, CapRover is deployed on nodes with IPv4. ![ ](./img/solutions_caprover_leader.png) ![ ](./img/solutions_caprover_workers.png) + +Use the Leader and Workers tabs to add nodes to your deployment. + +- Enter a name for the deployment or keep the default name +- Select a capacity package: + - **Small**: {cpu: 1, memory: 2, diskSize: 25 } + - **Medium**: {cpu: 2, memory: 4, diskSize: 50 } + - **Large**: {cpu: 4, memory: 16, diskSize: 100 } + - Or choose a **Custom** plan +- Choose the network + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes +- `Certified` flag to retrieve only certified nodes +- Choose the node + - Automated + - Choose the location of the node + - `Region` + - `Country` + - `Farm Name` + - Click on `Load Nodes` + - Click on the node you want to deploy on + - Manual selection + - Select a specific node ID +- Click `Deploy` + Note: Worker nodes only accept SSH keys of RSA format. Deployment will take couple of minutes. ## The Domain Name -As per the [CapRover documentation](https://caprover.com/docs/get-started.html), you need to point a wildcard DNS entry to the VM IP address of your CapRover instance. You have to do this after having deployed the CapRover instance, otherwise you won't have access to the VM IP address. +As per the [CapRover documentation](https://caprover.com/docs/get-started.html), you need to point a wildcard DNS entry to the VM IP address of your CapRover Leader instance. You have to do this after having deployed the CapRover instance, otherwise you won't have access to the VM IP address. Let’s say your domain is **example.com** and your subdomain is **subdomain**. You can set **\*.subdomain.example.com** as an A record in your DNS settings to point to the VM IP address of the server hosting the CapRover instance, where **\*** acts as the wildcard. To do this, go to the DNS settings of your domain name registrar, and set a wild card A record entry. @@ -97,54 +125,14 @@ Go back to your CapRover weblet and go to the deployment list. Click on `Show De ![ ](./img/solution_caprover_list.png) - The public IPv4 address is visible in here + +![](./img/solutions_caprover_ipaddress.png) + - Now you can configure the domain name (see above, don't forget to point the wildcard domain to the public IP address) -Click on details if you want to see more details +Go to the `JSON` tab to see the Json ouput: -```json - -{ - "version": 0, - "name": "caprover_leader_cr_156e44f0", - "created": 1637843368, - "status": "ok", - "message": "", - "flist": "https://hub.grid.tf/samehabouelsaad.3bot/tf-caprover-main-a4f186da8d.flist", - "publicIP": { - "ip": "185.206.122.136/24", - "gateway": "185.206.122.1" - }, - "planetary": false, - "yggIP": "", - "interfaces": [ - { - "network": "caprover_network_cr_156e44f0", - "ip": "10.200.4.2" - } - ], - "capacity": { - "cpu": 4, - "memory": 8192 - }, - "mounts": [ - { - "name": "data0", - "mountPoint": "/var/lib/docker", - "size": 107374182400, - "state": "ok", - "message": "" - } - ], - "env": { - "SWM_NODE_MODE": "leader", - "CAPROVER_ROOT_DOMAIN": "apps.openly.life", - "PUBLIC_KEY": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/9RNGKRjHvViunSOXhBF7EumrWvmqAAVJSrfGdLaVasgaYK6tkTRDzpZNplh3Tk1aowneXnZffygzIIZ82FWQYBo04IBWwFDOsCawjVbuAfcd9ZslYEYB3QnxV6ogQ4rvXnJ7IHgm3E3SZvt2l45WIyFn6ZKuFifK1aXhZkxHIPf31q68R2idJ764EsfqXfaf3q8H3u4G0NjfWmdPm9nwf/RJDZO+KYFLQ9wXeqRn6u/mRx+u7UD+Uo0xgjRQk1m8V+KuLAmqAosFdlAq0pBO8lEBpSebYdvRWxpM0QSdNrYQcMLVRX7IehizyTt+5sYYbp6f11WWcxLx0QDsUZ/J" - }, - "entrypoint": "/sbin/zinit init", - "metadata": "", - "description": "caprover leader machine/node" -} -``` +![](./img/solutions_caprover_json.png) ## How to Access the Admin Interface diff --git a/collections/dashboard/solutions/casper.md b/collections/dashboard/solutions/casper.md index 5131ee9..b2eb58e 100644 --- a/collections/dashboard/solutions/casper.md +++ b/collections/dashboard/solutions/casper.md @@ -30,8 +30,8 @@ __Process__ : - Or choose a **Custom** plan - Choose the network - `Public IPv4` flag gives the virtual machine a Public IPv4 - -- `Dedicated` flag to retrieve only dedeicated nodes + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` @@ -46,8 +46,8 @@ If you have more than one SSH keys set, you can click on `Manage SSH keys` to se After that is done you can see a list of all of your deployed instances -![ ](./img/casper4.png) +![](./img/casper4.png) Click on ***Visit*** to go to the homepage of your Casperlabs instance! The node takes a long time in order for the RPC service to be ready so be patient! -![ ](./img/casper5.png) \ No newline at end of file +![](./img/casper5.png) \ No newline at end of file diff --git a/collections/dashboard/solutions/discourse.md b/collections/dashboard/solutions/discourse.md index 3ffa093..8257717 100644 --- a/collections/dashboard/solutions/discourse.md +++ b/collections/dashboard/solutions/discourse.md @@ -27,8 +27,10 @@ - **Medium**: {cpu: 2, memory: 4, diskSize: 50 } - **Large**: {cpu: 4, memory: 16, diskSize: 100 } - Or choose a **Custom** plan - -- `Dedicated` flag to retrieve only dedeicated nodes +- Choose the network + - `Public IPv4` flag gives the virtual machine a Public IPv4 + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/fullvm.md b/collections/dashboard/solutions/fullvm.md index 8f4dfe9..b3b352f 100644 --- a/collections/dashboard/solutions/fullvm.md +++ b/collections/dashboard/solutions/fullvm.md @@ -40,7 +40,7 @@ Deploy a new full virtual machine on the Threefold Grid - `Public IPv4` flag gives the virtual machine a Public IPv4 - `Public IPv6` flag gives the virtual machine a Public IPv6 - `Planetary Network` to connect the Virtual Machine to Planetary network - - `Myceluim` to enable mycelium on the virtual machine + - `Mycelium` to enable Mycelium on the virtual machine - `Wireguard Access` to add a wireguard access to the Virtual Machine - `GPU` flag to add GPU to the Virtual machine - To deploy a Full VM with GPU, you first need to [rent a dedicated node](node_finder.md#dedicated-nodes) diff --git a/collections/dashboard/solutions/funkwhale.md b/collections/dashboard/solutions/funkwhale.md index b91da59..0756b44 100644 --- a/collections/dashboard/solutions/funkwhale.md +++ b/collections/dashboard/solutions/funkwhale.md @@ -37,8 +37,8 @@ __Process__ : - Or choose a **Custom** plan - Choose the network - `Public IPv4` flag gives the virtual machine a Public IPv4 - -- `Dedicated` flag to retrieve only dedeicated nodes + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/jenkins.md b/collections/dashboard/solutions/jenkins.md index 928f03e..bc76954 100644 --- a/collections/dashboard/solutions/jenkins.md +++ b/collections/dashboard/solutions/jenkins.md @@ -39,7 +39,7 @@ __Process__ : - `Public IPv6` flag gives the virtual machine a Public IPv6 - `Planetary Network` to connect the Virtual Machine to Planetary network - `Mycelium` flag gives the virtual machine a Mycelium address -- `Dedicated` flag to retrieve only dedeicated nodes +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/k8s.md b/collections/dashboard/solutions/k8s.md index 44a96c3..e892117 100644 --- a/collections/dashboard/solutions/k8s.md +++ b/collections/dashboard/solutions/k8s.md @@ -41,7 +41,7 @@ On the TF grid, Kubernetes clusters can be deployed out of the box. We have impl ## Kubeconfig Once the cluster is ready, you can SSH into the cluster using `ssh root@IP` -> IP can be the public IP or the planetary network IP +> IP can be the public IP, Mycelium or the Planetary Network IP Onced connected via SSH, you can execute commands on the cluster like `kubectl get nodes`, and to get the kubeconfig, you can find it in `/root/.kube/config` diff --git a/collections/dashboard/solutions/mattermost.md b/collections/dashboard/solutions/mattermost.md index cbd7f99..d738f2f 100644 --- a/collections/dashboard/solutions/mattermost.md +++ b/collections/dashboard/solutions/mattermost.md @@ -29,7 +29,10 @@ - **Medium**: {cpu: 2, memory: 4, diskSize: 50 } - **Large**: {cpu: 4, memory: 16, diskSize: 100 } - Or choose a **Custom** plan -- `Dedicated` flag to retrieve only dedeicated nodes +- Choose the network + - `Public IPv4` flag gives the virtual machine a Public IPv4 + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/nextcloud.md b/collections/dashboard/solutions/nextcloud.md index c2b0521..da22681 100644 --- a/collections/dashboard/solutions/nextcloud.md +++ b/collections/dashboard/solutions/nextcloud.md @@ -68,7 +68,7 @@ If you're not sure and just want the easiest, most affordable option, skip the p - Choose the network - `Public IPv4` flag gives the virtual machine a Public IPv4 - `Mycelium` flag gives the virtual machine a Mycelium address -- `Dedicated` flag to retrieve only dedeicated nodes +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/nodepilot.md b/collections/dashboard/solutions/nodepilot.md index 12f29da..f5580e8 100644 --- a/collections/dashboard/solutions/nodepilot.md +++ b/collections/dashboard/solutions/nodepilot.md @@ -29,7 +29,7 @@ This is a simple instance of upstream [Node Pilot](https://nodepilot.tech). - 256 MB of memory - 15 GB of storage -- `Dedicated` flag to retrieve only dedeicated nodes +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node @@ -40,7 +40,7 @@ This is a simple instance of upstream [Node Pilot](https://nodepilot.tech). > Or you can select a specific node with manual selection. -- When using the [flist](https://hub.grid.tf/tf-official-vms/node-pilot-zdbfs.flist) you get a node pilot instance ready out-of-box. You need to get a public ipv4 to get it to works. +- When using the [flist](https://hub.grid.tf/tf-official-vms/node-pilot-zdbfs.flist) you get a node pilot instance ready out-of-box. You need to get a public IPv4 to get it to works. After that is done you can see a list of all of your deployed instances diff --git a/collections/dashboard/solutions/peertube.md b/collections/dashboard/solutions/peertube.md index f9fc947..4f2bf77 100644 --- a/collections/dashboard/solutions/peertube.md +++ b/collections/dashboard/solutions/peertube.md @@ -30,13 +30,10 @@ - **Medium**: { cpu: 2, memory: 4, diskSize: 100 } - **Large**: { cpu: 4, memory: 16, diskSize: 250 } - Or choose a **Custom** plan - - - `Public IPv4` flag gives the virtual machine a Public IPv4 - - `Public IPv6` flag gives the virtual machine a Public IPv6 - - `Planetary Network` to connect the Virtual Machine to Planetary network - - `Wiregaurd Access` to add a wiregaurd acces to the Virtual Machine -- `Dedicated` flag to retrieve only dedeicated nodes -- `Certified` flag to retrieve only certified nodes +- Choose the network + - `Mycelium` flag gives the virtual machine a Mycelium address + - `Dedicated` flag to retrieve only dedicated nodes + - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` - `Country` diff --git a/collections/dashboard/solutions/presearch.md b/collections/dashboard/solutions/presearch.md index a1f2d65..4895cf8 100644 --- a/collections/dashboard/solutions/presearch.md +++ b/collections/dashboard/solutions/presearch.md @@ -33,8 +33,9 @@ - Choose the network - `Public IPv4` flag gives the virtual machine a Public IPv4 - `Planetary Network` to connect the Virtual Machine to Planetary network + - `Mycelium` flag gives the virtual machine a Mycelium address -- `Dedicated` flag to retrieve only dedeicated nodes +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/static_website.md b/collections/dashboard/solutions/static_website.md index 4f57b07..4fb25d2 100644 --- a/collections/dashboard/solutions/static_website.md +++ b/collections/dashboard/solutions/static_website.md @@ -34,7 +34,9 @@ Static Website is an application where a user provides a GitHub repository URL f - **Medium**: {cpu: 2, memory: 4, diskSize: 100 } - **Large**: {cpu: 4, memory: 16, diskSize: 250 } - Or choose a **Custom** plan - +- Choose the network + - `Public IPv4` flag gives the virtual machine a Public IPv4 + - `Mycelium` flag gives the virtual machine a Mycelium address - `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node diff --git a/collections/dashboard/solutions/subsquid.md b/collections/dashboard/solutions/subsquid.md index 5cd19f6..fd72ce5 100644 --- a/collections/dashboard/solutions/subsquid.md +++ b/collections/dashboard/solutions/subsquid.md @@ -32,8 +32,9 @@ - **Medium**: {cpu: 2, memory: 4, diskSize: 100 } - **Large**: {cpu: 4, memory: 16, diskSize: 250 } - Or choose a **Custom** plan - -- `Dedicated` flag to retrieve only dedeicated nodes +- Choose the network + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/taiga.md b/collections/dashboard/solutions/taiga.md index 5c95a7f..bbd9a16 100644 --- a/collections/dashboard/solutions/taiga.md +++ b/collections/dashboard/solutions/taiga.md @@ -31,8 +31,10 @@ - **Medium**: {cpu: 4, memory: 8, diskSize: 150 } - **Large**: {cpu: 4, memory: 16, diskSize: 250 } - Or choose a **Custom** plan - -- `Dedicated` flag to retrieve only dedeicated nodes +- Choose the network + - `Public IPv4` flag gives the virtual machine a Public IPv4 + - `Mycelium` flag gives the virtual machine a Mycelium address +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/tfrobot.md b/collections/dashboard/solutions/tfrobot.md index 601b37c..627cba2 100644 --- a/collections/dashboard/solutions/tfrobot.md +++ b/collections/dashboard/solutions/tfrobot.md @@ -41,10 +41,10 @@ - Choose the network - `Public IPv4` flag gives the virtual machine a Public IPv4 - `Public IPv6` flag gives the virtual machine a Public IPv6 - - `Planetary Network` to connect the Virtual Machine to Planetary network - - `Mycelium` to enable Mycelium on the virtual machine - - `Wireguard Access` to add a wireguard access to the Virtual Machine -- `Dedicated` flag to retrieve only dedeicated nodes + - `Planetary Network` flag gives the virtual machine an Yggdrasil address + - `Mycelium` flag gives the virtual machine a Mycelium address + - `Wireguard Access` to add a WireGuard acces to the Virtual Machine +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/umbrel.md b/collections/dashboard/solutions/umbrel.md index 39edaed..8d44b5c 100644 --- a/collections/dashboard/solutions/umbrel.md +++ b/collections/dashboard/solutions/umbrel.md @@ -31,8 +31,12 @@ - **Medium**: { cpu: 2, memory: 4 , diskSize: 50 } - **Large**: { cpu: 4, memory: 16 , diskSize: 100 } - Or choose a **Custom** plan - -- `Dedicated` flag to retrieve only dedeicated nodes +- Choose the network + - `Public IPv4` flag gives the virtual machine a Public IPv4 + - `Planetary Network` to connect the Virtual Machine to Planetary network + - `Mycelium` to enable Mycelium on the virtual machine + - `Wireguard Access` to add a wireguard acces to the Virtual Machine +- `Dedicated` flag to retrieve only dedicated nodes - `Certified` flag to retrieve only certified nodes - Choose the location of the node - `Region` diff --git a/collections/dashboard/solutions/wordpress.md b/collections/dashboard/solutions/wordpress.md index b5d7a9e..7144942 100644 --- a/collections/dashboard/solutions/wordpress.md +++ b/collections/dashboard/solutions/wordpress.md @@ -88,8 +88,8 @@ In this section, we cover the steps to deploy a WordPress instance on the Playgr - Or choose a **Custom** plan - Choose the network - - **Public IPv4** flag gives the virtual machine a Public IPv4 - + - `Public IPv4` flag gives the virtual machine a Public IPv4 + - `Mycelium` to enable Mycelium on the virtual machine - **Dedicated** flag to retrieve only dedicated nodes - **Certified** flag to retrieve only certified nodes - Choose the location of the node diff --git a/collections/developers/javascript/grid3_javascript_readme.md b/collections/developers/javascript/grid3_javascript_readme.md index dc98621..5c2579c 100644 --- a/collections/developers/javascript/grid3_javascript_readme.md +++ b/collections/developers/javascript/grid3_javascript_readme.md @@ -11,6 +11,7 @@ Please make sure to check the [basics](system_administrators@@tfgrid3_getstarted - [Installation](grid3_javascript_installation.md) - [Loading Client](grid3_javascript_loadclient.md) - [Deploy a VM](grid3_javascript_vm.md) +- [Deploy a VM with Mycelium Network](grid3_javascript_vm_with_mycelium_network.md) - [Capacity Planning](grid3_javascript_capacity_planning.md) - [Deploy Multiple VMs](grid3_javascript_vms.md) - [Deploy CapRover](grid3_javascript_caprover.md) diff --git a/collections/developers/javascript/grid3_javascript_vm_with_mycelium_network.md b/collections/developers/javascript/grid3_javascript_vm_with_mycelium_network.md new file mode 100644 index 0000000..08e7090 --- /dev/null +++ b/collections/developers/javascript/grid3_javascript_vm_with_mycelium_network.md @@ -0,0 +1,202 @@ +

Deploying a VM with Mycelium Network

+ +

Table of Contents

+ +- [Introduction](#introduction) +- [Example](#example) +- [Detailed Explanation](#detailed-explanation) + - [What is the Mycelium Network](#what-is-the-mycelium-network) + - [How to Deploy a Machine with the Mycelium Network](#how-to-deploy-a-machine-with-the-mycelium-network) +- [Summary](#summary) + - [Mycelium Flag Behavior](#mycelium-flag-behavior) + - [Mycelium Machine Seed](#mycelium-machine-seed) + - [Mycelium Network Seed](#mycelium-network-seed) + +*** + +## Introduction + +We present information on how to deploy a VM with `Mycelium network` by the Javascript client with concrete examples. + +Consult the [official Mycelium repo](https://github.com/threefoldtech/mycelium) to learn more. + +## Example + +Here is a simple example on how to use Mycelium with the Javascript client: + +```ts +import { generateRandomHexSeed, GridClient, MachinesDeleteModel, MachinesModel } from "../src"; +import { config, getClient } from "./client_loader"; +import { log } from "./utils"; + +async function deploy(client: GridClient, vms: MachinesModel) { + const res = await client.machines.deploy(vms); + log("================= Deploying VM ================="); + log(res); + log("================= Deploying VM ================="); +} + +async function getDeployment(client: GridClient, name: string) { + const res = await client.machines.getObj(name); + log("================= Getting deployment information ================="); + log(res); + log("================= Getting deployment information ================="); +} + +async function cancel(client: GridClient, options: MachinesDeleteModel) { + const res = await client.machines.delete(options); + log("================= Canceling the deployment ================="); + log(res); + log("================= Canceling the deployment ================="); +} + +async function main() { + const name = "newMY"; + const grid3 = await getClient(`vm/${name}`); + + const vms: MachinesModel = { + name, + network: { + name: "hellotest", + ip_range: "10.249.0.0/16", + myceliumSeeds: [ + { + nodeId: 168, + /** + * ### Mycelium Network Seed: + * - The `seed` is an optional field used to provide a specific seed for the Mycelium network. + * - If not provided, the `GridClient` will generate a seed automatically when the `mycelium` flag is enabled. + * - **Use Case:** If you need the new machine to have the same IP address as a previously deleted machine, you can reuse the old seed by setting the `myceliumSeed` field. + */ + seed: generateRandomHexSeed(32), + }, + ], + }, + machines: [ + { + name: "testvmMY", + node_id: 168, + disks: [ + { + name: "wedDisk", + size: 8, + mountpoint: "/testdisk", + }, + ], + public_ip: false, + public_ip6: false, + planetary: true, + /** + * ### Mycelium Flag Behavior: + * - When the `mycelium` flag is enabled, there’s no need to manually provide the `myceliumSeed` flag. + * - The `GridClient` will automatically generate the necessary seed for you. + * - **However**, if you have **an existing seed** from a previously deleted machine and wish to deploy a new machine that retains the same IP address, + * - **you can simply pass in the old seed during deployment instead of calling the `generateRandomHexSeed()` function**. + */ + mycelium: true, + /** + * ### Mycelium Seed: + * - The `myceliumSeed` is an optional field used to provide a specific seed for the Mycelium network. + * - If not provided, the `GridClient` will generate a seed automatically when the `mycelium` flag is enabled. + * - **Use Case:** If you need the new machine to have the same IP address as a previously deleted machine, you can reuse the old seed by setting the `myceliumSeed` field. + */ + myceliumSeed: generateRandomHexSeed(3), // (HexSeed of length 6) + cpu: 1, + memory: 1024 * 2, + rootfs_size: 0, + flist: "https://hub.grid.tf/tf-official-apps/base:latest.flist", + entrypoint: "/sbin/zinit init", + env: { + SSH_KEY: config.ssh_key, + }, + }, + ], + metadata: "", + description: "test deploying single VM with mycelium via ts grid3 client", + }; + + //Deploy VMs + await deploy(grid3, vms); + + //Get the deployment + await getDeployment(grid3, name); + + //Uncomment the line below to cancel the deployment + // await cancel(grid3, { name }); + + await grid3.disconnect(); +} + +main(); + +``` + +## Detailed Explanation + +### What is the Mycelium Network + +Mycelium is an IPv6 overlay network written in Rust. Each node that joins the overlay network will receive an overlay network IP in the 400::/7 range. + +### How to Deploy a Machine with the Mycelium Network + +You just need to enable `mycelium`: set it to true as we did in the example above. + +```ts +const machines = [ + { + // Other attrs + mycelium: true, + } +] +``` + +## Summary + +### Mycelium Flag Behavior + +```ts +const machines = [ + { + // Other attrs + mycelium: true, + } +] +``` + +- When the `mycelium` flag is enabled, there’s no need to manually provide the `myceliumSeed` flag. +- The `GridClient` will automatically generate the necessary seed for you. +- **However**, if you have **an existing seed** from a previously deleted machine and wish to deploy a new machine that retains the same IP address, +- **you can simply pass in the old seed during deployment instead of calling the `generateRandomHexSeed()` function**. + +### Mycelium Machine Seed + +```ts +const machines = [ + { + // Other attrs + myceliumSeed: generateRandomHexSeed(3), + } +] +``` + +- The `myceliumSeed` is an optional field used to provide a specific seed for the Mycelium network. +- If not provided, the `GridClient` will generate a seed automatically when the `mycelium` flag is enabled. +- **Use Case:** If you need the new machine to have the same IP address as a previously deleted machine, you can reuse the old seed by setting the `myceliumSeed` field. + +### Mycelium Network Seed + +```ts +const network = { + // Other attrs + myceliumSeeds: [ + { + nodeId: 1, + seed: generateRandomHexSeed(32), + } + ], +} +``` + +- The `seed` is an optional field used to provide a specific seed for the Mycelium network. +- If not provided, the `GridClient` will generate a seed automatically when the `mycelium` flag is enabled. +- **Use Case:** If you need the new machine to have the same IP address as a previously deleted machine, you can reuse the old seed by setting the `myceliumSeed` field. diff --git a/collections/farmers/3node_building/6_boot_3node.md b/collections/farmers/3node_building/6_boot_3node.md index 0b5a6be..549d5ff 100644 --- a/collections/farmers/3node_building/6_boot_3node.md +++ b/collections/farmers/3node_building/6_boot_3node.md @@ -5,6 +5,7 @@ - [Introduction](#introduction) - [1. Booting the 3Node with Zero-OS](#1-booting-the-3node-with-zero-os) - [2. Check the 3Node Status Online](#2-check-the-3node-status-online) + - [Check Node Health](#check-node-health) - [3. Receive the Farming Rewards](#3-receive-the-farming-rewards) - [Advanced Booting Methods (Optional)](#advanced-booting-methods-optional) - [PXE Booting with OPNsense](#pxe-booting-with-opnsense) @@ -42,6 +43,9 @@ You can use the ThreeFold [Node Finder](node_finder.md) to verify that your 3Nod * [ThreeFold Dev Net Dashboard](https://dashboard.dev.grid.tf/) * [ThreeFold QA Net Dashboard](https://dashboard.qa.grid.tf/) +### Check Node Health + +It is also possible to check the node health via the Node Finder. Read [this section](dashboard@@node_finder) for more information. ## 3. Receive the Farming Rewards diff --git a/collections/system_administrators/getstarted/ssh_guide/advanced_methods/advanced_methods.md b/collections/system_administrators/getstarted/ssh_guide/advanced_methods/advanced_methods.md new file mode 100644 index 0000000..88e5561 --- /dev/null +++ b/collections/system_administrators/getstarted/ssh_guide/advanced_methods/advanced_methods.md @@ -0,0 +1,8 @@ +# Advanced Methods + +

Table of Contents

+ +- [SSH with PuTTY](ssh_putty.md) +- [SSH with WSL](ssh_wsl.md) +- [WireGuard](ssh_wireguard.md) +- [Planetary Network](planetarynetwork.md) \ No newline at end of file diff --git a/collections/system_administrators/getstarted/ssh_guide/advanced_methods/planetarynetwork.md b/collections/system_administrators/getstarted/ssh_guide/advanced_methods/planetarynetwork.md new file mode 100644 index 0000000..35df85f --- /dev/null +++ b/collections/system_administrators/getstarted/ssh_guide/advanced_methods/planetarynetwork.md @@ -0,0 +1,224 @@ + +

Planetary Network

+ +

Table of Contents

+ +- [Introduction](#introduction) +- [Install](#install) +- [Run](#run) + - [Linux](#linux) + - [MacOS](#macos) +- [Test Connectivity](#test-connectivity) +- [Firewalls](#firewalls) + - [Linux](#linux-1) + - [MacOS](#macos-1) +- [Get Yggdrasil IP](#get-yggdrasil-ip) +- [Add Peers](#add-peers) +- [Peers](#peers) + - [Central Europe](#central-europe) + - [Ghent](#ghent) + - [Austria](#austria) +- [Planetary Network Clients](#planetary-network-clients) + +*** + +## Introduction + +In a first phase, to get started, you need to launch the planetary network by running [Yggdrasil](https://yggdrasil-network.github.io) from the command line. + +Yggdrasil is an implementation of a fully end-to-end encrypted IPv6 network. It is lightweight, self-arranging, supported on multiple platforms, and allows pretty much any IPv6-capable application to communicate securely with other nodes on the network. Yggdrasil does not require you to have IPv6 Internet connectivity - it also works over IPv4. + +## Install + +Yggdrasil is necessary for communication between your local machine and the nodes on the Grid that you deploy to. Binaries and packages are available for all major operating systems, or it can be built from source. Find installation instructions here. + +After installation, you'll need to add at least one publicly available peer to your Yggdrasil configuration file. By default on Unix based systems, you'll find the file at `/etc/yggdrasil.conf`. To find peers, check this site, which compiles and displays the peer information available on Github. + +Add peers to your configuration file like so: + +``` +Peers: ["PEER_URL:PORT", "PEER_URL:PORT", ...] +``` + +Please consult [yggdrasil installation page](https://yggdrasil-network.github.io/installation.html) for more information and clients + +## Run + +### Linux + +On Linux with `systemd`, Yggdrasil can be started and enabled as a service, or run manually from the command line: + +``` +sudo yggdrasil -useconffile /etc/yggdrasil.conf +``` + +Get your IPv6 address with following command : + +``` +yggdrasilctl getSelf +``` + +### MacOS + +The MacOS package will automatically install and start the `launchd` service. After adding peers to your config file, restart Yggdrasil by stopping the service (it will be restarted automatically): + +``` +sudo launchctl stop yggdrasil +``` + +Get your IPv6 address with following command : + +``` +sudo yggdrasilctl getSelf +``` + +## Test Connectivity + +To ensure that you have successfully connected to the Yggdrasil network, try loading the site in your browser: + +``` +http://[319:3cf0:dd1d:47b9:20c:29ff:fe2c:39be]/ +``` + +## Firewalls + +Creating deployments on the Grid also requires that nodes can reach your machine as well. This means that a local firewall preventing inbound connections will cause deployments to fail. + +### Linux + +On systems using `iptables`, check: +``` +sudo ip6tables -S INPUT +``` + +If the first line is `-P INPUT DROP`, then all inbound connections over IPv6 will be blocked. To open inbound connections, run: + +``` +sudo ip6tables -P INPUT ACCEPT +``` + +To make this persist after a reboot, run: + +``` +sudo ip6tables-save +``` + +If you'd rather close the firewall again after you're done, use: + +``` +sudo ip6tables -P INPUT DROP +``` + +### MacOS + +The MacOS system firewall is disabled by default. You can check your firewall settings according to instructions here. + +## Get Yggdrasil IP + +Once Yggdrasil is installed, you can find your Yggdrasil IP address using this command on both Linux and Mac: + +``` +yggdrasil -useconffile /etc/yggdrasil.conf -address +``` + +You'll need this address when registering your twin on TFChain later. + + +## Add Peers + + + - Add the needed [peers](https://publicpeers.neilalexander.dev/) in the config file generated under Peers. + + **example**: +``` + Peers: + [ + tls://54.37.137.221:11129 + ] +``` +- Restart yggdrasil by + + systemctl restart yggdrasil + +## Peers + +### Central Europe + +#### Ghent + +- tcp://gent01.grid.tf:9943 +- tcp://gent02.grid.tf:9943 +- tcp://gent03.grid.tf:9943 +- tcp://gent04.grid.tf:9943 +- tcp://gent01.test.grid.tf:9943 +- tcp://gent02.test.grid.tf:9943 +- tcp://gent01.dev.grid.tf:9943 +- tcp://gent02.dev.grid.tf:9943 + +### Austria + +- tcp://gw291.vienna1.greenedgecloud.com:9943 +- tcp://gw293.vienna1.greenedgecloud.com:9943 +- tcp://gw294.vienna1.greenedgecloud.com:9943 +- tcp://gw297.vienna1.greenedgecloud.com:9943 +- tcp://gw298.vienna1.greenedgecloud.com:9943 +- tcp://gw299.vienna2.greenedgecloud.com:9943 +- tcp://gw300.vienna2.greenedgecloud.com:9943 +- tcp://gw304.vienna2.greenedgecloud.com:9943 +- tcp://gw306.vienna2.greenedgecloud.com:9943 +- tcp://gw307.vienna2.greenedgecloud.com:9943 +- tcp://gw309.vienna2.greenedgecloud.com:9943 +- tcp://gw313.vienna2.greenedgecloud.com:9943 +- tcp://gw324.salzburg1.greenedgecloud.com:9943 +- tcp://gw326.salzburg1.greenedgecloud.com:9943 +- tcp://gw327.salzburg1.greenedgecloud.com:9943 +- tcp://gw328.salzburg1.greenedgecloud.com:9943 +- tcp://gw330.salzburg1.greenedgecloud.com:9943 +- tcp://gw331.salzburg1.greenedgecloud.com:9943 +- tcp://gw333.salzburg1.greenedgecloud.com:9943 +- tcp://gw422.vienna2.greenedgecloud.com:9943 +- tcp://gw423.vienna2.greenedgecloud.com:9943 +- tcp://gw424.vienna2.greenedgecloud.com:9943 +- tcp://gw425.vienna2.greenedgecloud.com:9943 + +## Planetary Network Clients + +``` + Peers: + [ + # Threefold Lochrist + tcp://gent01.grid.tf:9943 + tcp://gent02.grid.tf:9943 + tcp://gent03.grid.tf:9943 + tcp://gent04.grid.tf:9943 + tcp://gent01.test.grid.tf:9943 + tcp://gent02.test.grid.tf:9943 + tcp://gent01.dev.grid.tf:9943 + tcp://gent02.dev.grid.tf:9943 + # GreenEdge + tcp://gw291.vienna1.greenedgecloud.com:9943 + tcp://gw293.vienna1.greenedgecloud.com:9943 + tcp://gw294.vienna1.greenedgecloud.com:9943 + tcp://gw297.vienna1.greenedgecloud.com:9943 + tcp://gw298.vienna1.greenedgecloud.com:9943 + tcp://gw299.vienna2.greenedgecloud.com:9943 + tcp://gw300.vienna2.greenedgecloud.com:9943 + tcp://gw304.vienna2.greenedgecloud.com:9943 + tcp://gw306.vienna2.greenedgecloud.com:9943 + tcp://gw307.vienna2.greenedgecloud.com:9943 + tcp://gw309.vienna2.greenedgecloud.com:9943 + tcp://gw313.vienna2.greenedgecloud.com:9943 + tcp://gw324.salzburg1.greenedgecloud.com:9943 + tcp://gw326.salzburg1.greenedgecloud.com:9943 + tcp://gw327.salzburg1.greenedgecloud.com:9943 + tcp://gw328.salzburg1.greenedgecloud.com:9943 + tcp://gw330.salzburg1.greenedgecloud.com:9943 + tcp://gw331.salzburg1.greenedgecloud.com:9943 + tcp://gw333.salzburg1.greenedgecloud.com:9943 + tcp://gw422.vienna2.greenedgecloud.com:9943 + tcp://gw423.vienna2.greenedgecloud.com:9943 + tcp://gw424.vienna2.greenedgecloud.com:9943 + tcp://gw425.vienna2.greenedgecloud.com:9943 + ] +``` + diff --git a/collections/system_administrators/getstarted/ssh_guide/ssh_wireguard.md b/collections/system_administrators/getstarted/ssh_guide/advanced_methods/ssh_wireguard.md similarity index 84% rename from collections/system_administrators/getstarted/ssh_guide/ssh_wireguard.md rename to collections/system_administrators/getstarted/ssh_guide/advanced_methods/ssh_wireguard.md index a251f97..818fb51 100644 --- a/collections/system_administrators/getstarted/ssh_guide/ssh_wireguard.md +++ b/collections/system_administrators/getstarted/ssh_guide/advanced_methods/ssh_wireguard.md @@ -1,4 +1,4 @@ -

WireGuard Access

+

WireGuard

Table of Contents

@@ -11,7 +11,6 @@ - [Windows](#windows) - [Test the WireGuard Connection](#test-the-wireguard-connection) - [SSH into the Deployment with Wireguard](#ssh-into-the-deployment-with-wireguard) -- [Questions and Feedback](#questions-and-feedback) *** @@ -19,15 +18,14 @@ In this Threefold Guide, we show how to set up [WireGuard](https://www.wireguard.com/) to access a 3Node deployment with an SSH connection. -Note that WireGuard provides the connection to the 3Node deployment. It is up to you to decide which SSH client you want to use. This means that the steps to SSH into a 3Node deployment will be similar to the steps proposed in the guides for [Open-SSH](ssh_openssh.md), [PuTTy](ssh_putty.md) and [WSL](ssh_wsl.md). Please refer to [this documentation](ssh_guide.md) if you have any questions concerning SSH clients. The main difference will be that we connect to the 3Node deployment using a WireGuard connection instead of an IPv4 or a Planetary Network connection. - +Note that WireGuard provides the connection to the 3Node deployment. It is up to you to decide which SSH client you want to use. This means that the steps to SSH into a 3Node deployment will be similar to the steps proposed in the guides for [Open-SSH](ssh_openssh.md), [PuTTy](ssh_putty.md) and [WSL](ssh_wsl.md). The main difference will be that we connect to the 3Node deployment using a WireGuard connection instead of an IPv4 or a [Mycelium](mycelium_toc.md) connection. # Prerequisites Make sure to [read the introduction](tfgrid3_getstarted.md#get-started---your-first-deployment) before going further. -* SSH client of your choice +* SSH client of your choice: * [Open-SSH](ssh_openssh.md) * [PuTTy](ssh_putty.md) * [WSL](ssh_wsl.md) @@ -36,7 +34,7 @@ Make sure to [read the introduction](tfgrid3_getstarted.md#get-started---your-fi # Deploy a Weblet with WireGuard Access -For this guide on WireGuard access, we deploy a [Full VM](dashboard@fullvm). Note that the whole process is similar with other types of ThreeFold weblets on the Dashboard. +For this guide on WireGuard access, we deploy a [Full VM](dashboard@@fullVm). Note that the whole process is similar with other types of ThreeFold weblets on the Dashboard. * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine * Choose the parameters you want @@ -69,19 +67,19 @@ To set the WireGuard connection on Linux or MAC, create a WireGuard configuratio * Copy the content **WireGuard Config** from the Dashboard **Details** window * Paste the content to a file with the extension `.conf` (e.g. **wg.conf**) in the directory `/etc/wireguard` - ``` + * ``` sudo nano /etc/wireguard/wg.conf ``` * Start WireGuard with the command **wg-quick** and, as a parameter, pass the configuration file without the extension (e.g. *wg.conf -> wg*) - ``` + * ``` wg-quick up wg ``` * Note that you can also specify a config file by path, stored in any location - ``` + * ``` wg-quick up /etc/wireguard/wg.conf ``` * If you want to stop the WireGuard service, you can write the following in the terminal - ``` + * ``` wg-quick down wg ``` @@ -105,7 +103,7 @@ To set the WireGuard connection on Windows, add and activate a tunnel with the W As a test, you can [ping](cli_scripts_basics.md#test-the-network-connectivity-of-a-domain-or-an-ip-address-with-ping) the virtual IP address of the VM to make sure the WireGuard connection is properly established. Make sure to replace `VM_WireGuard_IP` with the proper WireGuard IP address: * Ping the deployment - ``` + * ``` ping VM_WireGuard_IP ``` @@ -116,14 +114,8 @@ As a test, you can [ping](cli_scripts_basics.md#test-the-network-connectivity-of To SSH into the deployment with Wireguard, use the **WireGuard IP** shown in the Dashboard **Details** window. * SSH into the deployment - ``` + * ``` ssh root@VM_WireGuard_IP ``` You now have access to the deployment over a WireGuard SSH connection. - - - -# Questions and Feedback - -If you have any questions, let us know by writing a post on the [Threefold Forum](http://forum.threefold.io/) or by reaching out to the [ThreeFold Grid Tester Community](https://t.me/threefoldtesting) on Telegram. \ No newline at end of file diff --git a/collections/system_administrators/getstarted/ssh_guide/ssh_guide.md b/collections/system_administrators/getstarted/ssh_guide/ssh_guide.md index 62b83a4..0b081ad 100644 --- a/collections/system_administrators/getstarted/ssh_guide/ssh_guide.md +++ b/collections/system_administrators/getstarted/ssh_guide/ssh_guide.md @@ -5,6 +5,4 @@ SSH is a secure protocol used as the primary means of connecting to Linux server

Table of Contents

- [SSH with OpenSSH](ssh_openssh.md) -- [SSH with PuTTY](ssh_putty.md) -- [SSH with WSL](ssh_wsl.md) -- [WireGuard Access](ssh_wireguard.md) \ No newline at end of file +- [Advanced Methods](advanced_methods.md) \ No newline at end of file diff --git a/collections/system_administrators/getstarted/ssh_guide/ssh_openssh.md b/collections/system_administrators/getstarted/ssh_guide/ssh_openssh.md index f782d79..85bc4fd 100644 --- a/collections/system_administrators/getstarted/ssh_guide/ssh_openssh.md +++ b/collections/system_administrators/getstarted/ssh_guide/ssh_openssh.md @@ -3,195 +3,104 @@

Table of Contents

- [Introduction](#introduction) -- [Main Steps and Prerequisites](#main-steps-and-prerequisites) -- [Step-by-Step Process with OpenSSH](#step-by-step-process-with-openssh) - - [Linux](#linux) - - [SSH into a 3Node with IPv4 on Linux](#ssh-into-a-3node-with-ipv4-on-linux) - - [SSH into a 3Node with the Planetary Network on Linux](#ssh-into-a-3node-with-the-planetary-network-on-linux) - - [MAC](#mac) - - [SSH into a 3Node with IPv4 on MAC](#ssh-into-a-3node-with-ipv4-on-mac) - - [SSH into a 3Node with the Planetary Network on MAC](#ssh-into-a-3node-with-the-planetary-network-on-mac) - - [Windows](#windows) - - [SSH into a 3Node with IPv4 on Windows](#ssh-into-a-3node-with-ipv4-on-windows) - - [SSH into a 3Node with the Planetary Network on Windows](#ssh-into-a-3node-with-the-planetary-network-on-windows) -- [Questions and Feedback](#questions-and-feedback) +- [Overview](#overview) +- [Linux](#linux) +- [MacOS](#macos) +- [Windows](#windows) *** -# Introduction +## Introduction -In this Threefold Guide, we show how easy it is to deploy a full virtual machine (VM) and SSH into a 3Node with [OpenSSH](https://www.openssh.com/) on Linux, MAC and Windows with both an IPv4 and a Planetary Network connection. To connect to the 3Node with WireGuard, read [this documentation](ssh_wireguard.md). +In this Threefold Guide, we show how easy it is to deploy a full virtual machine (VM) and SSH into a 3Node with [OpenSSH](https://www.openssh.com/) on Linux, MacOS and Windows with either an IPv4 or a Mycelium connection. To deploy different workloads, the SSH connection process should be very similar. -If you have any questions, feel free to write a post on the [Threefold Forum](http://forum.threefold.io/). +## Overview - -# Main Steps and Prerequisites - -Make sure to [read the introduction](../tfgrid3_getstarted.md#get-started---your-first-deployment) before going further. +Make sure to [read the introduction](tfgrid3_getstarted.md#get-started---your-first-deployment) before going further. The main steps for the whole process are the following: -* Create an SSH Key pair -* Deploy a 3Node - * Choose IPv4 or the Planetary Network +* Create an SSH key pair +* Deploy a VM on a 3Node * SSH into the 3Node - * For the Planetary Network, download the Planetary Network Connector - - - -# Step-by-Step Process with OpenSSH ## Linux -### SSH into a 3Node with IPv4 on Linux +Here are the steps to SSH into a 3Node with either IPv4 or Mycelium on Linux. -Here are the steps to SSH into a 3Node with IPv4 on Linux. +If you are using Mycelium, make sure to [read this section](mycelium_toc.md). * To create the SSH key pair, write in the terminal - ``` - ssh-keygen - ``` - * Save in default location - * Write a password (optional) +``` +ssh-keygen +``` +* Save in default location +* Write a password (optional) * To see the public key, write in the terminal - ``` - cat ~/.ssh/id_rsa.pub - ``` - * Select and copy the public key when needed +``` +cat ~/.ssh/id_rsa.pub +``` +* Select and copy the public key when needed * To deploy a full VM * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine * Choose the parameters you want * Minimum CPU: 1 vCore * Minimum Memory: 512 Mb * Minimum Disk Size: 15 Gb - * Select IPv4 in `Network` + * Select `IPv4` or `Mycelium` in `Network` * In `Node Selection`, click on `Load Nodes` * Click `Deploy` * To SSH into the VM once the 3Node is deployed - * Copy the IPv4 address + * Copy the IP address * Open the terminal, write the following with the deployment address and write **yes** to confirm - ``` - ssh root@IPv4_address - ``` +``` +ssh root@IP_address +``` -You now have an SSH connection on Linux with IPv4. +You now have an SSH connection on Linux. +## MacOS +Here are the steps to SSH into a 3Node with either IPv4 or Mycelium on MacOS. -### SSH into a 3Node with the Planetary Network on Linux - -Here are the steps to SSH into a 3Node with the Planetary Network on Linux. - -* Set a [Planetary Network connection](planetarynetwork.md) -* To create the SSH key pair, write in the terminal - ``` - ssh-keygen - ``` - * Save in default location - * Write a password (optional) -* To see the public key, write in the terminal - ``` - cat ~/.ssh/id_rsa.pub - ``` - * Select and copy the public key when needed -* To deploy a full VM - * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine - * Choose the parameters you want - * Minimum CPU: 1 vCore - * Minimum Memory: 512 Mb - * Minimum Disk Size: 15 Gb - * Select Planetary Network in `Network` - * In `Node Selection`, click on `Load Nodes` - * Click `Deploy` -* To SSH into the VM once the 3Node is deployed - * Copy the Planetary Network address - * Open the terminal, write the following with the deployment address and write **yes** to confirm - ``` - ssh root@planetary_network_address - ``` - -You now have an SSH connection on Linux with the Planetary Network. - - - -## MAC - -### SSH into a 3Node with IPv4 on MAC - -Here are the steps to SSH into a 3Node with IPv4 on MAC. +If you are using Mycelium, make sure to [read this section](mycelium_toc.md). * To create the SSH key pair, in the terminal write - ``` - ssh-keygen - ``` - * Save in default location - * Write a password (optional) +``` +ssh-keygen +``` +* Save in default location +* Write a password (optional) * To see the public key, write in the terminal - ``` - cat ~/.ssh/id_rsa.pub - ``` - * Select and copy the public key when needed +``` +cat ~/.ssh/id_rsa.pub +``` +* Select and copy the public key when needed * To deploy a full VM * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine * Choose the parameters you want * Minimum CPU: 1 vCore * Minimum Memory: 512 Mb * Minimum Disk Size: 15 Gb - * Select IPv4 in `Network` + * Select `IPv4` or `Mycelium` in `Network` * In `Node Selection`, click on `Load Nodes` * Click `Deploy` * To SSH into the VM once the 3Node is deployed - * Copy the IPv4 address + * Copy the IP address * Open the terminal, write the following with the deployment address and write **yes** to confirm - ``` - ssh root@IPv4_address - ``` - -You now have an SSH connection on MAC with IPv4. - - - -### SSH into a 3Node with the Planetary Network on MAC - -Here are the steps to SSH into a 3Node with the Planetary Network on MAC. - -* Set a [Planetary Network connection](planetarynetwork.md) -* To create the SSH key pair, write in the terminal - ``` - ssh-keygen - ``` - * Save in default location - * Write a password (optional) -* To see the public key, write in the terminal - ``` - cat ~/.ssh/id_rsa.pub - ``` - * Select and copy the public key when needed -* To deploy a full VM - * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine - * Choose the parameters you want - * Minimum CPU: 1 vCore - * Minimum Memory: 512 Mb - * Minimum Disk Size: 15 Gb - * Select Planetary Network in `Network` - * In `Node Selection`, click on `Load Nodes` - * Click `Deploy` -* To SSH into the VM once the 3Node is deployed - * Copy the Planetary Network address - * Open the terminal, write the following with the deployment address and write **yes** to confirm - ``` - ssh root@planetary_network_address - ``` - -You now have an SSH connection on MAC with the Planetary Network. - +``` +ssh root@IP_address +``` +You now have an SSH connection on MacOS. ## Windows -### SSH into a 3Node with IPv4 on Windows +Here are the steps to SSH into a 3Node with either IPv4 or Mycelium on Windows. + +If you are using Mycelium, make sure to [read this section](../../mycelium/mycelium_toc.md). * To download OpenSSH client and OpenSSH server * Open the `Settings` and select `Apps` @@ -203,79 +112,30 @@ You now have an SSH connection on MAC with the Planetary Network. * Search OpenSSH * Install OpenSSH Client and OpenSSH Server * To create the SSH key pair, open `PowerShell` and write - ``` - ssh-keygen - ``` - * Save in default location - * Write a password (optional) +``` +ssh-keygen +``` +* Save in default location +* Write a password (optional) * To see the public key, write in `PowerShell` - ``` - cat ~/.ssh/id_rsa.pub - ``` - * Select and copy the public key when needed +``` +cat ~/.ssh/id_rsa.pub +``` +* Select and copy the public key when needed * To deploy a full VM * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine * Choose the parameters you want * Minimum CPU: 1 vCore * Minimum Memory: 512 Mb * Minimum Disk Size: 15 Gb - * Select IPv4 in `Network` + * Select `IPv4` or `Mycelium` in `Network` * In `Node Selection`, click on `Load Nodes` * Click `Deploy` * To SSH into the VM once the 3Node is deployed - * Copy the IPv4 address + * Copy the IP address * Open `PowerShell`, write the following with the deployment address and write **yes** to confirm - ``` - ssh root@IPv4_address - ``` +``` +ssh root@IP_address +``` -You now have an SSH connection on Window with IPv4. - - - -### SSH into a 3Node with the Planetary Network on Windows - -* Set a [Planetary Network connection](planetarynetwork.md) -* To download OpenSSH client and OpenSSH server - * Open the `Settings` and select `Apps` - * Click `Apps & Features` - * Click `Optional Features` - * Verifiy if OpenSSH Client and OpenSSH Server are there - * If not - * Click `Add a feature` - * Search OpenSSH - * Install OpenSSH Client and OpenSSH Server -* To create the SSH key pair, open `PowerShell` and write - ``` - ssh-keygen - ``` - * Save in default location - * Write a password (optional) -* To see the public key, write in `PowerShell` - ``` - cat ~/.ssh/id_rsa.pub - ``` - * Select and copy the public key when needed -* To deploy a full VM - * On the [Threefold Dashboard](https://dashboard.grid.tf/), go to: Deploy -> Virtual Machines -> Full Virtual Machine - * Choose the parameters you want - * Minimum CPU: 1 vCore - * Minimum Memory: 512 Mb - * Minimum Disk Size: 15 Gb - * Select Planetary Network address in `Network` - * In `Node Selection`, click on `Load Nodes` - * Click `Deploy` -* To SSH into the VM once the 3Node is deployed - * Copy the Planetary Network address - * Open `PowerShell`, write the following with the deployment address and write **yes** to confirm - ``` - ssh root@planetary_network_address - ``` - -You now have an SSH connection on Window with the Planetary Network. - - - -# Questions and Feedback - -If you have any questions, let us know by writing a post on the [Threefold Forum](http://forum.threefold.io/). \ No newline at end of file +You now have an SSH connection on Window. \ No newline at end of file diff --git a/collections/system_administrators/getstarted/ssh_guide/ssh_putty.md b/collections/system_administrators/getstarted/ssh_guide/ssh_putty.md index 8e47559..39e46dc 100644 --- a/collections/system_administrators/getstarted/ssh_guide/ssh_putty.md +++ b/collections/system_administrators/getstarted/ssh_guide/ssh_putty.md @@ -5,7 +5,6 @@ - [Introduction](#introduction) - [Main Steps and Prerequisites](#main-steps-and-prerequisites) - [SSH with PuTTY on Windows](#ssh-with-putty-on-windows) -- [Questions and Feedback](#questions-and-feedback) *** @@ -13,23 +12,22 @@ In this Threefold Guide, we show how easy it is to deploy a full virtual machine (VM) and SSH into a 3Node on Windows with [PuTTY](https://www.putty.org/). -To deploy different workloads, the SSH connection process should be very similar. +To deploy different workloads, the SSH connection process should be very similar. -If you have any questions, feel free to write a post on the [Threefold Forum](http://forum.threefold.io/). +Make sure to read the [Mycelium section](mycelium_toc.md) if you use Mycelium for the network connection. ## Main Steps and Prerequisites -Make sure to [read the introduction](../tfgrid3_getstarted.md#get-started---your-first-deployment) before going further. +Make sure to [read the introduction](tfgrid3_getstarted.md#get-started---your-first-deployment) before going further. The main steps for the whole process are the following: * Create an SSH Key pair * Deploy a 3Node - * Choose IPv4 or the Planetary Network + * Choose IPv4 or Mycelium * SSH into the 3Node - * For the Planetary Network, set a [Planetary Network connection](planetarynetwork.md) ## SSH with PuTTY on Windows @@ -54,15 +52,15 @@ Here are the main steps to SSH into a full VM using PuTTY on a Windows machine. * Minimum CPU: 1 vCore * Minimum Memory: 512 Mb * Minimum Disk Size: 15 Gb - * Select IPv4 in `Network` + * Select IPv4 or Mycelium in `Network` * In `Node Selection`, click on `Load Nodes` * Click `Deploy` * To SSH into the VM once the 3Node is deployed - * Take note of the IPv4 address + * Take note of the IP address * Connect to the full VM with PuTTY * Open PuTTY * Go to the section `Session` - * Add the VM IPv4 address under `Host Name (or IP address)` + * Add the VM address under `Host Name (or IP address)` * Make sure `Connection type` is set to `SSH` * Go to the section `Connection` -> `SSH` -> `Auth` -> `Credentials` * Under `Private key file for authentication`, click on `Browse...` @@ -71,10 +69,4 @@ Here are the main steps to SSH into a full VM using PuTTY on a Windows machine. * In the PuTTY terminal window, enter `root` as the login parameter * Enter the passphrase for the private key if you set one -You now have an SSH connection on Windows using PuTTY. - - - -## Questions and Feedback - -If you have any questions, let us know by writing a post on the [Threefold Forum](http://forum.threefold.io/). \ No newline at end of file +You now have an SSH connection on Windows using PuTTY. \ No newline at end of file diff --git a/collections/system_administrators/getstarted/ssh_guide/ssh_wsl.md b/collections/system_administrators/getstarted/ssh_guide/ssh_wsl.md index 793f877..7a437ef 100644 --- a/collections/system_administrators/getstarted/ssh_guide/ssh_wsl.md +++ b/collections/system_administrators/getstarted/ssh_guide/ssh_wsl.md @@ -6,7 +6,6 @@ - [SSH Key Generation](#ssh-key-generation) - [Connect to Remote Host with SSH](#connect-to-remote-host-with-ssh) - [Enable Port 22 in Windows Firewall](#enable-port-22-in-windows-firewall) -- [Questions and Feedback](#questions-and-feedback) *** @@ -14,11 +13,11 @@ In this Threefold Guide, we show how easy it is to SSH into a 3node on Windows with [Windows Subsystem for Linux (WSL)](https://ubuntu.com/wsl). -If you have any questions, feel free to write a post on the [Threefold Forum](http://forum.threefold.io/). +Make sure to read the [Mycelium section](mycelium_toc.md) if you use Mycelium for the network connection. ## SSH Key Generation -Make sure SSH is installed by entering following command at the command prompt: +Make sure SSH is installed by entering the following command at the command prompt: ```sh sudo apt install openssh-client @@ -83,7 +82,3 @@ This is not recommend especially for portable device (Laptop, Tablets) that conn - under `Name` - Name: `SSH Server` - Description: `SSH Server` - -## Questions and Feedback - -If you have any questions, let us know by writing a post on the [Threefold Forum](http://forum.threefold.io/). \ No newline at end of file diff --git a/collections/system_administrators/getstarted/tfgrid3_getstarted.md b/collections/system_administrators/getstarted/tfgrid3_getstarted.md index d479cb3..c4f9d84 100644 --- a/collections/system_administrators/getstarted/tfgrid3_getstarted.md +++ b/collections/system_administrators/getstarted/tfgrid3_getstarted.md @@ -1,32 +1,26 @@ -# TFGrid Manual - Get Started +# Getting Started -## Get Started - Your First Deployment +## Your First Deployment -It's easy to get started on the TFGrid and deploy applications. +It's easy to get started on the TFGrid. + +For your first deployment on the grid, we will show you how to deploy a full virtual machine running on a ThreeFold node. - [Create a TFChain Account](dashboard@@wallet_connector) - [Get TFT](threefold_token@@buy_sell_tft) - [Bridge TFT to TChain](threefold_token@@tft_bridges) -- [Deploy an Application](dashboard@@deploy) -- [SSH Remote Connection](ssh_guide.md) - - [SSH with OpenSSH](ssh_openssh.md) - - [SSH with PuTTY](ssh_putty.md) - - [SSH with WSL](ssh_wsl.md) - - [SSH and WireGuard](ssh_wireguard.md) +- [Deploy and Connect to a VM](system_administrators@@ssh_openssh) -## Grid Platforms +Once you're acquainted with the basics, you can explore all types of ThreeFold deployments. -- [TF Dashboard](dashboard/dashboard@@) -- [TF Flist Hub](developers@@zos_hub) +## TFGrid Deployments -## TFGrid Services and Resources +From virtual machines to Kubernetes, to one-click apps to infrastructure-as-code workloads, the TFGrid provides syadmins control and flexibility. -- [TFGrid Services](tf_grid_services_readme.md) +- [ThreeFold Deployments](tfgrid_deployments.md) -## Advanced Deployment Techniques +## TFGrid Services -- [Advanced Topics](advanced.md) +Consult the list of TFGrid services to gain an overview of the ThreeFold ecosystem. -*** - -If you have any question, feel free to ask for help on the [Threefold Forum](https://forum.threefold.io/c/threefold-grid-utilization/support/). \ No newline at end of file +- [TFGrid Services](tf_grid_services_readme.md) \ No newline at end of file diff --git a/collections/system_administrators/getstarted/tfgrid_deployments.md b/collections/system_administrators/getstarted/tfgrid_deployments.md new file mode 100644 index 0000000..930f529 --- /dev/null +++ b/collections/system_administrators/getstarted/tfgrid_deployments.md @@ -0,0 +1,43 @@ +

TFGrid Deployments

+ +

Table of Contents

+ +- [Introduction](#introduction) +- [Dashboard UI](#dashboard-ui) +- [Infrastrure-As-Code](#infrastrure-as-code) +- [Command Line Interfaces](#command-line-interfaces) +- [GPU Workloads](#gpu-workloads) + +--- + +## Introduction + +There are many ways to interact with the ThreeFold Grid to deploy workloads. We present the main ones. + +## Dashboard UI + +We provide an easy-to-use user interface via the ThreeFold Dashboard and its many apps. + +- [ThreeFold Dashboard](dashboard@@dashboard) + +## Infrastrure-As-Code + +You can deploy infrastructure-as-code with Pulumi and Terraform/OpenTofu. + +- [Pulumi](pulumi_readme.md) +- [Terraform](terraform_toc.md) + +## Command Line Interfaces + +You can use our Go and Javascript/TypeScript command line interface tools to deploy workloads on the grid. + +- [Go Grid Client](developers@@grid3_go_readme) + - [TFCMD](developers@@tfcmd/tfcmd) + - [TFRobot](developers@@tfrobot/tfrobot) +- [TypeScript Grid Client](developers@@grid3_javascript_readme) + +## GPU Workloads + +There are many ways to deploy GPU workloads on the ThreeFold Grid. Check the GPU section for all the details. + +- [GPU Support](gpu_toc.md) \ No newline at end of file diff --git a/collections/system_administrators/getstarted/tfgrid_services/tf_grid_services_readme.md b/collections/system_administrators/getstarted/tfgrid_services/tf_grid_services_readme.md index 0e732c3..8009e97 100644 --- a/collections/system_administrators/getstarted/tfgrid_services/tf_grid_services_readme.md +++ b/collections/system_administrators/getstarted/tfgrid_services/tf_grid_services_readme.md @@ -7,13 +7,13 @@ - [QAnet](#qanet) - [Testnet](#testnet) - [Mainnet](#mainnet) - - [Supported Planetary Network Nodes](#supported-planetary-network-nodes) +- [General](#general) *** ## Introduction -On this article we have aggregated a list of all of the services running on Threefold Grid 3 infrastructure for your convenience +Here is a list of all of the services running on Threefold Grid 3 infrastructure. > Note: the usage of `dev` indicates a devnet service. > and usage of `test` indicates a testnet service. @@ -53,43 +53,7 @@ On this article we have aggregated a list of all of the services running on Thre - [TFGrid Proxy](https://gridproxy.grid.tf) - [Grid Dashboard](https://dashboard.grid.tf) -### Supported Planetary Network Nodes +## General -``` - Peers: - [ - # Threefold Lochrist - tcp://gent01.grid.tf:9943 - tcp://gent02.grid.tf:9943 - tcp://gent03.grid.tf:9943 - tcp://gent04.grid.tf:9943 - tcp://gent01.test.grid.tf:9943 - tcp://gent02.test.grid.tf:9943 - tcp://gent01.dev.grid.tf:9943 - tcp://gent02.dev.grid.tf:9943 - # GreenEdge - tcp://gw291.vienna1.greenedgecloud.com:9943 - tcp://gw293.vienna1.greenedgecloud.com:9943 - tcp://gw294.vienna1.greenedgecloud.com:9943 - tcp://gw297.vienna1.greenedgecloud.com:9943 - tcp://gw298.vienna1.greenedgecloud.com:9943 - tcp://gw299.vienna2.greenedgecloud.com:9943 - tcp://gw300.vienna2.greenedgecloud.com:9943 - tcp://gw304.vienna2.greenedgecloud.com:9943 - tcp://gw306.vienna2.greenedgecloud.com:9943 - tcp://gw307.vienna2.greenedgecloud.com:9943 - tcp://gw309.vienna2.greenedgecloud.com:9943 - tcp://gw313.vienna2.greenedgecloud.com:9943 - tcp://gw324.salzburg1.greenedgecloud.com:9943 - tcp://gw326.salzburg1.greenedgecloud.com:9943 - tcp://gw327.salzburg1.greenedgecloud.com:9943 - tcp://gw328.salzburg1.greenedgecloud.com:9943 - tcp://gw330.salzburg1.greenedgecloud.com:9943 - tcp://gw331.salzburg1.greenedgecloud.com:9943 - tcp://gw333.salzburg1.greenedgecloud.com:9943 - tcp://gw422.vienna2.greenedgecloud.com:9943 - tcp://gw423.vienna2.greenedgecloud.com:9943 - tcp://gw424.vienna2.greenedgecloud.com:9943 - tcp://gw425.vienna2.greenedgecloud.com:9943 - ] -``` +- [TF Flist Hub](developers@@/zos_hub) +- [TF Boot Generator](dashboard@@node_installer) \ No newline at end of file diff --git a/collections/system_administrators/gpu/gpu_toc.md b/collections/system_administrators/gpu/gpu_toc.md index b0ccaca..6c99cdf 100644 --- a/collections/system_administrators/gpu/gpu_toc.md +++ b/collections/system_administrators/gpu/gpu_toc.md @@ -10,8 +10,6 @@ Feel free to explore the different possibilities! - [Node Finder and GPU](dashboard@@node_finder) - [Javascript Client and GPU](developers@@grid3_javascript_gpu_support) - [GPU and Go](developers@@grid3_go_gpu) - - [GPU Support](developers@@grid3_go_gpu_support) - - [Deploy a VM with GPU](developers@@grid3_go_vm_with_gpu) - [TFCMD and GPU](developers@@tfcmd_vm) - [Terraform and GPU](terraform_gpu_support.md) - [Full VM and GPU](dashboard@@fullvm) diff --git a/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_complete_guides_toc.md b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_complete_guides_toc.md new file mode 100644 index 0000000..5a999a3 --- /dev/null +++ b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_complete_guides_toc.md @@ -0,0 +1,9 @@ +

Complete Guides

+ +This section covers complete guides to deploy workloads on the ThreeFold Grid with Pulumi. + +

Table of Contents

+ +- [Pulumi and YAML](./pulumi_yaml.md) +- [Pulumi and Python](./pulumi_python.md) +- [Pulumi and Go](./pulumi_go.md) \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_go.md b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_go.md new file mode 100644 index 0000000..b5b3a36 --- /dev/null +++ b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_go.md @@ -0,0 +1,90 @@ +

Pulumi Complete Go Guide

+ +

Table of Contents

+ +- [Introduction](#introduction) +- [Prerequisites](#prerequisites) +- [Steps](#steps) +- [Alternative to Make Commands](#alternative-to-make-commands) + +--- + +## Introduction + +In this guide, we cover the complete steps to deploy a virtual machine on the grid with Pulumi via Go. + +To provide a uniform deployment method, we use Docker for this guide. It is optional but will greatly facilitate the deployment as the steps will be similar for Linux, MacOS and Windows. + +This guide is useful to get you started quickly with Pulumi on the TFGrid. + +Once you've successfully deployed a VM, you can try all the different Go examples within the [pulumi-threefold repository](https://github.com/threefoldtech/pulumi-threefold). The examples are available in the subdirectory `/examples/go/`. + +## Prerequisites + +- [A TFChain account](dashboard@@wallet_connector) +- TFT in your TFChain account + - [Buy TFT](threefold_token@@buy_sell_tft) + - [Send TFT to TFChain](threefold_token@@tfchain_stellar_bridge) +- [Get Docker](https://docs.docker.com/get-docker/) + +## Steps + +- Deploy a Docker Ubuntu container in interactive mode: +``` +sudo docker run -it --net=host ubuntu:jammy /bin/bash +``` + +- In Docker Ubuntu, deploy a VM with Pulumi. Make sure to add your `MNEMONIC` and `SSH_KEY` below before running the script. For this deployment we use `main` as the `NETWORK`. Change this if needed. + +``` +# Install the prerequisites +apt update && apt install -y curl git wget make + +# Install Pulumi +curl -fsSL https://get.pulumi.com | sh +export PATH=$PATH=:/root/.pulumi/bin + +# Clone the ThreeFold Pulumi repo +git clone https://github.com/threefoldtech/pulumi-threefold.git +cd pulumi-threefold/examples/go/virtual_machine + +# Prepare the Pulumi Go environment +# Install Go +wget https://go.dev/dl/go1.23.0.linux-amd64.tar.gz +rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz +export PATH=$PATH:/usr/local/go/bin + +# Export the variables +export NETWORK="main" +export SSH_KEY="" +export MNEMONIC="" + +# Start Pulumi +make run +``` + +- You can now SSH into the deployment from your local machine terminal +``` +ssh root@VM_IP +``` +- To destroy the deployment, run the following line within the Docker Ubuntu terminal. +``` +make destroy +``` + +## Alternative to Make Commands + +You can use direct Pulumi commands instead of the Make commands above. + +- You can replace `make run` with: +``` +pulumi login --local +pulumi up +``` +- You can replace `make destroy` with: +``` +pulumi down +pulumi stack rm +``` + +That being said, the Make commands run additional features. Feel free to explore the possibilities and consult the files within the repo for more information. \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_python.md b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_python.md new file mode 100644 index 0000000..c995e3d --- /dev/null +++ b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_python.md @@ -0,0 +1,89 @@ +

Pulumi Complete Python Guide

+ +

Table of Contents

+ +- [Introduction](#introduction) +- [Prerequisites](#prerequisites) +- [Steps](#steps) +- [Alternative to Make Commands](#alternative-to-make-commands) + +--- + +## Introduction + +In this guide, we cover the complete steps to deploy a virtual machine on the grid with Pulumi via Python. + +To provide a uniform deployment method, we use Docker for this guide. It is optional but will greatly facilitate the deployment as the steps will be similar for Linux, MacOS and Windows. + +This guide is useful to get you started quickly with Pulumi on the TFGrid. + +Once you've successfully deployed a VM, you can try all the different Python examples within the [pulumi-threefold repository](https://github.com/threefoldtech/pulumi-threefold). The examples are available in the subdirectory `/examples/python/`. + +## Prerequisites + +- [A TFChain account](dashboard@@wallet_connector) +- TFT in your TFChain account + - [Buy TFT](threefold_token@@buy_sell_tft) + - [Send TFT to TFChain](threefold_token@@tfchain_stellar_bridge) +- [Get Docker](https://docs.docker.com/get-docker/) + +## Steps + +- Deploy a Docker Ubuntu container in interactive mode: +``` +sudo docker run -it --net=host ubuntu:jammy /bin/bash +``` + +- In Docker Ubuntu, deploy a VM with Pulumi. Make sure to add your `MNEMONIC` and `SSH_KEY` below before running the script. For this deployment we use `main` as the `NETWORK`. Change this if needed. +``` +# Install the prerequisites +apt update && apt install -y curl git python3 python-is-python3 python3-venv python3-pip + +# Install Pulumi +curl -fsSL https://get.pulumi.com | sh +export PATH=$PATH=:/root/.pulumi/bin + +# Clone the ThreeFold Pulumi repo +git clone https://github.com/threefoldtech/pulumi-threefold.git +cd pulumi-threefold + +# Prepare the Pulumi Python environment +cd examples/python +python -m venv venv +source venv/bin/activate +cd virtual_machine +pip install -r requirements.txt + +# Export the variables +export NETWORK="main" +export SSH_KEY="" +export MNEMONIC="" + +# Start Pulumi +make run +``` +- You can now SSH into the deployment from your local machine terminal +``` +ssh root@VM_IP +``` +- To destroy the deployment, run the following line within the Docker Ubuntu terminal. +``` +make destroy +``` + +## Alternative to Make Commands + +You can use direct Pulumi commands instead of the Make commands above. + +- You can replace `make run` with: +``` +pulumi login --local +pulumi up +``` +- You can replace `make destroy` with: +``` +pulumi down +pulumi stack rm +``` + +That being said, the Make commands run additional features. Feel free to explore the possibilities and consult the files within the repo for more information. \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_yaml.md b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_yaml.md new file mode 100644 index 0000000..3ba7033 --- /dev/null +++ b/collections/system_administrators/pulumi/pulumi_complete_guides/pulumi_yaml.md @@ -0,0 +1,77 @@ +

Pulumi Complete YAML Guide

+ +

Table of Contents

+ +- [Introduction](#introduction) +- [Prerequisites](#prerequisites) +- [Steps](#steps) +- [Alternative to Make Commands](#alternative-to-make-commands) + +--- + +## Introduction + +In this guide, we cover the complete steps to deploy a virtual machine on the grid with Pulumi via a YAML file. + +To provide a uniform deployment method, we use Docker for this guide. It is optional but will greatly facilitate the deployment as the steps will be similar for Linux, MacOS and Windows. + +This guide is useful to get you started quickly with Pulumi on the TFGrid. + +Once you've successfully deployed a VM, you can try all the different YAML examples within the [pulumi-threefold repository](https://github.com/threefoldtech/pulumi-threefold). The examples are available in the subdirectory `/examples/yaml/`. + +## Prerequisites + +- [A TFChain account](dashboard@@wallet_connector) +- TFT in your TFChain account + - [Buy TFT](threefold_token@@buy_sell_tft) + - [Send TFT to TFChain](threefold_token@@tfchain_stellar_bridge) +- [Get Docker](https://docs.docker.com/get-docker/) + +## Steps + +- Deploy a Docker Ubuntu container in interactive mode: +``` +sudo docker run -it --net=host ubuntu:jammy /bin/bash +``` +- In Docker Ubuntu, deploy a VM with Pulumi. Make sure to add your `MNEMONIC` and `SSH_KEY` below before running the script. For this deployment we use `main` as the `NETWORK`. Change this if needed. +``` +# Install the prerequisites +apt update && apt install -y curl git make +curl -fsSL https://get.pulumi.com | sh +export PATH=$PATH=:/root/.pulumi/bin +git clone https://github.com/threefoldtech/pulumi-threefold.git +cd pulumi-threefold/examples/yaml/virtual_machine + +# Export the variables +export NETWORK="main" +export SSH_KEY="" +export MNEMONIC="" + +# Start Pulumi +make run +``` +- You can now SSH into the deployment from your local machine terminal +``` +ssh root@VM_IP +``` +- To destroy the deployment, run the following line within the Docker Ubuntu terminal. +``` +make destroy +``` + +## Alternative to Make Commands + +You can use direct Pulumi commands instead of the Make commands above. + +- You can replace `make run` with: +``` +pulumi login --local +pulumi up +``` +- You can replace `make destroy` with: +``` +pulumi down +pulumi stack rm +``` + +That being said, the Make commands provide additional commands. Feel free to explore the possibilities and consult the files within the repo for more information. \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_deployment_details.md b/collections/system_administrators/pulumi/pulumi_deployment_details.md index 9052a0a..5946ca7 100644 --- a/collections/system_administrators/pulumi/pulumi_deployment_details.md +++ b/collections/system_administrators/pulumi/pulumi_deployment_details.md @@ -98,7 +98,7 @@ We address here how to create a [network](https://github.com/threefoldtech/pulum You can find the original file [here](https://github.com/threefoldtech/pulumi-provider-grid/blob/development/examples/yaml/network/Pulumi.yaml). ```yml -name: pulumi-provider-grid +name: pulumi-threefold runtime: yaml plugins: @@ -113,7 +113,7 @@ resources: mnemonic: scheduler: - type: grid:internal:Scheduler + type: threefold:provider:Scheduler options: provider: ${provider} properties: @@ -139,13 +139,14 @@ outputs: We will now go through this file section by section to properly understand what is happening. +Here we set the name for the project. It can be anything. We also set the runtime. It can be some code in YAML, Python, Go, etc. + ```yml name: pulumi-provider-grid runtime: yaml ``` -- name is for the project name (can be anything) -- runtime: the runtime we are using can be code in yaml, python, go, etc. +We then start by initializing the resources. The provider which we loaded in the plugins section is also a resource that has properties (the main one now is just the mnemonic of TFChain). ```yml plugins: @@ -160,13 +161,15 @@ Here, we define the plugins we are using within our project and their locations. ```yml resources: provider: - type: pulumi:providers:grid + type: pulumi:providers:threefold + options: + pluginDownloadURL: github://api.github.com/threefoldtech/pulumi-threefold # optional properties: mnemonic: ``` -We then start by initializing the resources. The provider which we loaded in the plugins section is also a resource that has properties (the main one now is just the mnemonic of TCHhain). +Then, we create a scheduler `threefold:provider:Scheduler`, that does the planning for us. Instead of being too specific about node IDs, we just give it some generic information. For example, "I want to work against these data centers (farms)". As long as the necessary criteria are provided, the scheduler can be more specific in the planning and select the appropriate resources available on the TFGrid. ```yaml scheduler: @@ -177,7 +180,7 @@ We then start by initializing the resources. The provider which we loaded in the farm_ids: [1] ``` -Then, we create a scheduler `grid:internal:Scheduler`, that does the planning for us. Instead of being too specific about node IDs, we just give it some generic information. For example, "I want to work against these data centers (farms)". As long as the necessary criteria are provided, the scheduler can be more specific in the planning and select the appropriate resources available on the TFGrid. +Now, that we created the scheduler, we can go ahead and create the network resource `grid:internal:Network`. Please note that the network depends on the scheduler's existence. If we remove it, the scheduler and the network will be created in parallel, that's why we have the `dependsOn` section. We then proceed to specify the network resource properties, e.g. the name, the description, which nodes to deploy our network on, the IP range of the network. In our case, we only choose one node. ```yaml network: @@ -194,8 +197,6 @@ Then, we create a scheduler `grid:internal:Scheduler`, that does the planning fo ip_range: 10.1.0.0/16 ``` -Now, that we created the scheduler, we can go ahead and create the network resource `grid:internal:Network`. Please note that the network depends on the scheduler's existence. If we remove it, the scheduler and the network will be created in parallel, that's why we have the `dependsOn` section. We then proceed to specify the network resource properties, e.g. the name, the description, which nodes to deploy our network on, the IP range of the network. In our case, we only choose one node. - To access information related to our deployment, we set the section **outputs**. This will display results that we can use, or reuse, while we develop our infrastructure further. ```yaml @@ -211,7 +212,7 @@ Now, we will check an [example](https://github.com/threefoldtech/pulumi-provider Just like we've seen above, we will have two files `Makefile` and `Pulumi.yaml` where we describe the infrastructure. ```yml -name: pulumi-provider-grid +name: pulumi-threefold runtime: yaml plugins: @@ -221,12 +222,14 @@ plugins: resources: provider: - type: pulumi:providers:grid + type: pulumi:providers:threefold + options: + pluginDownloadURL: github://api.github.com/threefoldtech/pulumi-threefold # optional properties: mnemonic: scheduler: - type: grid:internal:Scheduler + type: threefold:provider:Scheduler options: provider: ${provider} properties: @@ -280,11 +283,11 @@ outputs: planetary_ip: ${deployment.vms_computed[0].planetary_ip} ``` -We have a scheduler, and a network just like before. But now, we also have a deployment `grid:internal:Deployment` object that can have one or more disks and virtual machines. +We have a scheduler, and a network just like before. But now, we also have a deployment `threefold:provider:Deployment` object that can have one or more disks and virtual machines. ```yaml deployment: - type: grid:internal:Deployment + type: threefold:provider:Deployment options: provider: ${provider} dependsOn: @@ -301,11 +304,13 @@ deployment: cpu: 2 memory: 256 planetary: true + mycelium: true + # mycelium_ip_seed: b60f2b7ec39c # hex encoded 6 bytes [example] mounts: - disk_name: data mount_point: /app env_vars: - SSH_KEY: + SSH_KEY: disks: - name: data @@ -325,7 +330,7 @@ We now see how to deploy a [Kubernetes cluster using Pulumi](https://github.com/ ```yaml content was removed for brevity kubernetes: - type: grid:internal:Kubernetes + type: threefold:provider:Kubernetes options: provider: ${provider} dependsOn: @@ -383,7 +388,7 @@ We present here the file for a simple domain prefix. ```yml content was removed for brevity scheduler: - type: grid:internal:Scheduler + type: threefold:provider:Scheduler options: provider: ${provider} properties: @@ -393,7 +398,7 @@ We present here the file for a simple domain prefix. free_ips: 1 gatewayName: - type: grid:internal:GatewayName + type: threefold:provider:GatewayName options: provider: ${provider} dependsOn: @@ -404,10 +409,6 @@ We present here the file for a simple domain prefix. backends: - "http://69.164.223.208" -outputs: - node_deployment_id: ${gatewayName.node_deployment_id} - fqdn: ${gatewayName.fqdn} - ``` In this example, we create a gateway name resource `grid:internal:GatewayName` for the name `pulumi.gent01.dev.grid.tf`. @@ -425,7 +426,7 @@ Here's an [example](https://github.com/threefoldtech/pulumi-provider-grid/blob/d ```yml code removed for brevity gatewayFQDN: - type: grid:internal:GatewayFQDN + type: threefold:provider:GatewayFQDN options: provider: ${provider} dependsOn: @@ -444,6 +445,4 @@ Here, we informed the gateway that any request coming for the domain `mydomain.c ## Conclusion -We covered in this guide some basic details concerning the use of the ThreeFold Pulumi plugin. - -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. \ No newline at end of file +We covered in this guide some basic details concerning the use of the ThreeFold Pulumi plugin. \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_examples.md b/collections/system_administrators/pulumi/pulumi_examples.md index 9910d49..75278ed 100644 --- a/collections/system_administrators/pulumi/pulumi_examples.md +++ b/collections/system_administrators/pulumi/pulumi_examples.md @@ -3,11 +3,11 @@

Table of Contents

- [Introduction](#introduction) +- [Check All the Examples](#check-all-the-examples) - [Prerequisites](#prerequisites) - [Set the Environment Variables](#set-the-environment-variables) - [Test the Plugin](#test-the-plugin) - [Destroy the Deployment](#destroy-the-deployment) -- [Questions and Feedback](#questions-and-feedback) *** @@ -19,6 +19,12 @@ We present here the basic steps to test the examples within the [ThreeFold Pulum Please note that the Pulumi plugin for ThreeFold Grid is not yet officially published. We look forward to your feedback on this project. +## Check All the Examples + +In the manual, we cover some basic examples of Pulumi deployments on the grid. + +You can access all the Pulumi deployment examples on the ThreeFold Pulumi repository [here](https://github.com/threefoldtech/pulumi-threefold/tree/development/examples). + ## Prerequisites There are a few things to set up before exploring Pulumi. Since we will be using the examples in the ThreeFold Pulumi repository, we must clone the repository before going further. @@ -83,7 +89,3 @@ You can destroy your Pulumi deployment at any time with the following make comma ``` make destroy ``` - -## Questions and Feedback - -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. \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_intro.md b/collections/system_administrators/pulumi/pulumi_intro.md index 4595724..fd9aad9 100644 --- a/collections/system_administrators/pulumi/pulumi_intro.md +++ b/collections/system_administrators/pulumi/pulumi_intro.md @@ -8,13 +8,13 @@ With Pulumi, you can express your infrastructure requirements using the language - [Benefits of Using Pulumi](#benefits-of-using-pulumi) - [Declarative vs. Imperative Programming](#declarative-vs-imperative-programming) - [Declaration Programming Example](#declaration-programming-example) - - [Benefits of declarative programming in IaC](#benefits-of-declarative-programming-in-iac) + - [Benefits of Declarative Programming in IaC](#benefits-of-declarative-programming-in-iac) - [Concepts](#concepts) - [Pulumi Project](#pulumi-project) - [Project File](#project-file) - [Stacks](#stacks) - [Resources](#resources) -- [Questions and Feedback](#questions-and-feedback) +- [Pulumi Registry](#pulumi-registry) *** @@ -22,7 +22,7 @@ With Pulumi, you can express your infrastructure requirements using the language [ThreeFold Grid](https://threefold.io) is a decentralized cloud infrastructure platform that provides developers with a secure and scalable way to deploy and manage their applications. It is based on a peer-to-peer network of nodes that are distributed around the world. -[Pulumi](https://www.pulumi.com/) is a cloud-native infrastructure as code (IaC) platform that allows developers to manage their infrastructure using code. It supports a wide range of cloud providers, including ThreeFold Grid. +[Pulumi](https://www.pulumi.com/) is a cloud-native infrastructure as code (IaC) platform that allows developers to manage their infrastructure using code. It supports a wide range of cloud providers, including ThreeFold Grid. Consult the official [Pulumi documentation](https://www.pulumi.com/docs/) for more information. The [Pulumi plugin for ThreeFold Grid](https://github.com/threefoldtech/pulumi-provider-grid) provides developers with a way to deploy and manage their ThreeFold Grid resources using Pulumi. This means that developers can benefit from all of the features and benefits that Pulumi offers, such as cross-cloud support, type safety, preview and diff, and parallel execution -still in the works-. @@ -55,7 +55,7 @@ Say I want an infrastructure of two virtual machines with X disks. The following As you can see, the declarative code is much simpler and easier to read. It also makes it easier to make changes to your infrastructure, as you only need to change the desired state, and the IaC tool will figure out how to achieve it. -### Benefits of declarative programming in IaC +### Benefits of Declarative Programming in IaC There are several benefits to using declarative programming in IaC: @@ -125,6 +125,6 @@ resources: options: ...options ``` -## Questions and Feedback +## Pulumi Registry -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. \ No newline at end of file +You can visit the Pulumi registry to access the ThreeFold package [here](https://www.pulumi.com/registry/packages/threefold/). \ No newline at end of file diff --git a/collections/system_administrators/pulumi/pulumi_readme.md b/collections/system_administrators/pulumi/pulumi_readme.md index 31b4cf0..f4704fd 100644 --- a/collections/system_administrators/pulumi/pulumi_readme.md +++ b/collections/system_administrators/pulumi/pulumi_readme.md @@ -9,4 +9,5 @@ In this section, we will explore the dynamic world of infrastructure as code (Ia - [Introduction to Pulumi](pulumi_intro.md) - [Installing Pulumi](pulumi_install.md) - [Deployment Examples](pulumi_examples.md) -- [Deployment Details](pulumi_deployment_details.md) \ No newline at end of file +- [Deployment Details](pulumi_deployment_details.md) +- [Complete Guides](pulumi_complete_guides_toc.md) \ No newline at end of file diff --git a/collections/system_administrators/terraform/resources/terraform_resources_readme.md b/collections/system_administrators/terraform/resources/terraform_resources_readme.md index ed8e50a..ad2c79e 100644 --- a/collections/system_administrators/terraform/resources/terraform_resources_readme.md +++ b/collections/system_administrators/terraform/resources/terraform_resources_readme.md @@ -9,6 +9,4 @@ - [ZDB](./terraform_zdb.html) - [Zlogs](./terraform_zlogs.md) - [Quantum Safe Filesystem](terraform_qsfs.md) - - [QSFS on Micro VM](terraform_qsfs_on_microvm.md) - - [QSFS on Full VM](terraform_qsfs_on_full_vm.md) - [CapRover](./terraform_caprover.html) diff --git a/collections/system_administrators/terraform/terraform_full_vm.md b/collections/system_administrators/terraform/terraform_full_vm.md index 11d88bc..901c17c 100644 --- a/collections/system_administrators/terraform/terraform_full_vm.md +++ b/collections/system_administrators/terraform/terraform_full_vm.md @@ -1,4 +1,4 @@ -

Terraform Complete Full VM Deployment

+

Terraform Full VM Deployment

Table of Contents

@@ -22,7 +22,7 @@ This short ThreeFold Guide will teach you how to deploy a Full VM on the TFGrid The steps are very simple. You first need to create the Terraform files, the variables file and the deployment file, and then deploy the full VM. After the deployment is done, you can SSH into the full VM. -The main goal of this guide is to show you all the necessary steps to deploy a Full VM on the TGrid using Terraform. Once you get acquainted with this first basic deployment, you should be able to explore on your own the possibilities that the TFGrid and Terraform combined provide. +The main goal of this guide is to show you all the necessary steps to deploy a Full VM on the TFGrid using Terraform. Once you get acquainted with this first basic deployment, you should be able to explore on your own the possibilities that the TFGrid and Terraform combined provide. @@ -71,10 +71,11 @@ We show here how to find a suitable 3Node using the ThreeFold Explorer. - For proper understanding, we give further information on some relevant columns: - `ID` refers to the node ID - `Free Public IPs` refers to available IPv4 public IP addresses - - `HRU` refers to HDD storage - - `SRU` refers to SSD storage - - `MRU` refers to RAM (memory) - - `CRU` refers to virtual cores (vcores) + - Resource unit codes (consult [this page](cloud@@esource_units_calc_cloudunits) for more information) + - `HRU` is the code for the HDD unit (storage capacity in GB) + - `SRU` is the code for the SSD unit (storage capacity in GB) + - `MRU` is the code for the the memory unit (memory capacity in GB) + - `CRU` is the code for the core unit (virtual cores capacity) - To quicken the process of finding a proper 3Node, you can narrow down the search by adding filters: - At the top left of the screen, in the `Filters` box, select the parameter(s) you want. - For each parameter, a new field will appear where you can enter a minimum number requirement for the 3Nodes. @@ -227,11 +228,9 @@ cpu = "1" memory = "512" ``` -Make sure to add your own seed phrase and SSH public key. You will also need to specify the node ID of the server used. Simply replace the three dots by the content. - -We set here the minimum specs for a full VM, but you can adjust these parameters. - +Make sure to add your own mnemonics and SSH public key. You will also need to specify the node ID of the server used. Simply replace the three dots by the content. +We set here the minimum specs for a full VM, but you can adjust these parameters. Here `size` is the SSD storage capacity in GB, `cpu` is the number of virtual core and `memory` is the memory capacity in MB. ## Deploy the Full VM with Terraform @@ -275,6 +274,4 @@ Make sure that you are in the Terraform directory you created for this deploymen ## Conclusion -You now have the basic knowledge and know-how to deploy on the TFGrid using Terraform. - -As always, 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. +You now have the basic knowledge and know-how to deploy on the TFGrid using Terraform. \ No newline at end of file diff --git a/collections/system_administrators/terraform/terraform_install.md b/collections/system_administrators/terraform/terraform_install.md index f125b7d..062e361 100644 --- a/collections/system_administrators/terraform/terraform_install.md +++ b/collections/system_administrators/terraform/terraform_install.md @@ -4,11 +4,10 @@ - [Introduction](#introduction) - [Install Terraform](#install-terraform) - - [Install Terraform on Linux](#install-terraform-on-linux) - - [Install Terraform on MAC](#install-terraform-on-mac) - - [Install Terraform on Windows](#install-terraform-on-windows) + - [Linux](#linux) + - [MacOS](#macos) + - [Windows](#windows) - [ThreeFold Terraform Plugin](#threefold-terraform-plugin) -- [Questions and Feedback](#questions-and-feedback) *** @@ -22,32 +21,28 @@ You can get Terraform from the Terraform website [download page](https://www.ter We cover here the basic steps for Linux, MAC and Windows for convenience. Refer to the official Terraform documentation if needed. -### Install Terraform on Linux +### Linux To install Terraform on Linux, we follow the official [Terraform documentation](https://developer.hashicorp.com/terraform/downloads). -* [Install Terraform on Linux](../computer_it_basics/cli_scripts_basics.md#install-terraform) +* [Install Terraform on Linux](cli_scripts_basics.md#install-terraform) -### Install Terraform on MAC +### MacOS To install Terraform on MAC, install Brew and then install Terraform. -* [Install Brew](../computer_it_basics/cli_scripts_basics.md#install-brew) -* [Install Terraform with Brew](../computer_it_basics/cli_scripts_basics.md#install-terraform-with-brew) +* [Install Brew](cli_scripts_basics.md#install-brew) +* [Install Terraform with Brew](cli_scripts_basics.md#install-terraform-with-brew) -### Install Terraform on Windows +### Windows To install Terraform on Windows, a quick way is to first install Chocolatey and then install Terraform. -* [Install Chocolatey](../computer_it_basics/cli_scripts_basics.md#install-chocolatey) -* [Install Terraform with Chocolatey](../computer_it_basics/cli_scripts_basics.md#install-terraform-with-chocolatey) +* [Install Chocolatey](cli_scripts_basics.md#install-chocolatey) +* [Install Terraform with Chocolatey](cli_scripts_basics.md#install-terraform-with-chocolatey) ## ThreeFold Terraform Plugin The ThreeFold [Terraform plugin](https://github.com/threefoldtech/terraform-provider-grid) is supported on Linux, MAC and Windows. -There's no need to specifically install the ThreeFold Terraform plugin. Terraform will automatically load it from an online directory according to instruction within the deployment file. - -## Questions and Feedback - -If you have any questions, let us know by writing a post on the [Threefold Forum](http://forum.threefold.io/) or by reaching out to the [ThreeFold Grid Tester Community](https://t.me/threefoldtesting) on Telegram. \ No newline at end of file +There's no need to specifically install the ThreeFold Terraform plugin. Terraform will automatically load it from an online directory according to instruction within the deployment file. \ No newline at end of file diff --git a/collections/system_administrators/terraform/terraform_readme.md b/collections/system_administrators/terraform/terraform_readme.md index 5ca1cb3..1582daf 100644 --- a/collections/system_administrators/terraform/terraform_readme.md +++ b/collections/system_administrators/terraform/terraform_readme.md @@ -1,16 +1,12 @@ -

Terraform

- -Welcome to the *Terraform* section of the ThreeFold Manual! - -In this section, we'll embark on a journey to explore the powerful capabilities of Terraform within the ThreeFold Grid ecosystem. Terraform, a cutting-edge infrastructure as code (IaC) tool, empowers you to define and provision your infrastructure efficiently and consistently. +

Introduction to Terraform

Table of Contents

- [What is Terraform?](#what-is-terraform) -- [Terraform on ThreeFold Grid: Unleashing Power and Simplicity](#terraform-on-threefold-grid-unleashing-power-and-simplicity) - [Get Started](#get-started) +- [Deployment Examples](#deployment-examples) - [Features](#features) - [What is Not Supported](#what-is-not-supported) - [OpenTofu: Alternative to Terraform](#opentofu-alternative-to-terraform) @@ -19,32 +15,36 @@ In this section, we'll embark on a journey to explore the powerful capabilities ## What is Terraform? -Terraform is an open-source tool that enables you to describe and deploy infrastructure using a declarative configuration language. With Terraform, you can define your infrastructure components, such as virtual machines, networks, and storage, in a human-readable configuration file. This file, often referred to as the Terraform script, becomes a blueprint for your entire infrastructure. +[Terraform](https://www.terraform.io/) is an open-source tool that enables you to describe and deploy infrastructure using a declarative configuration language. With Terraform, you can define your infrastructure components, such as virtual machines, networks, and storage, in a human-readable configuration file. This file, often referred to as the Terraform script, becomes a blueprint for your entire infrastructure. The beauty of Terraform lies in its ability to automate the provisioning and management of infrastructure across various cloud providers, ensuring that your deployments are reproducible and scalable. It promotes collaboration, version control, and the ability to treat your infrastructure as code, providing a unified and seamless approach to managing complex environments. -## Terraform on ThreeFold Grid: Unleashing Power and Simplicity - -Within the ThreeFold Grid ecosystem, Terraform plays a pivotal role in streamlining the deployment and orchestration of decentralized, peer-to-peer infrastructure. Leveraging the unique capabilities of the ThreeFold Grid, you can use Terraform to define and deploy your workloads, tapping into the TFGrid decentralized architecture for unparalleled scalability, reliability, and sustainability. - -This manual will guide you through the process of setting up, configuring, and managing your infrastructure on the ThreeFold Grid using Terraform. Whether you're a seasoned developer, a DevOps professional, or someone exploring the world of decentralized computing for the first time, this guide is designed to provide clear and concise instructions to help you get started. +This section of the manual will guide you through the process of setting up, configuring, and managing your infrastructure on the ThreeFold Grid using Terraform. Whether you're a seasoned developer, a DevOps professional, or someone exploring the world of decentralized computing for the first time, this guide is designed to provide clear and concise instructions to help you get started. ## Get Started -![ ](../terraform/img//terraform_works.png) +To get started, [install Terraform](./terraform_install.md) and [deploy a full VM](./terraform_full_vm.md) on the grid with Terraform. -Threefold loves Open Source! In v3.0 we are integrating one of the most popular 'Infrastructure as Code' (IaC) tools of the cloud industry, [Terraform](https://terraform.io). Utilizing the Threefold grid v3 using Terraform gives a consistent workflow and a familiar experience for everyone coming from different background. Terraform describes the state desired of how the deployment should look like instead of imperatively describing the low level details and the mechanics of how things should be glued together. +Once you're acquainted with the basics, you can explore different [Terraform deployment examples](https://github.com/threefoldtech/terraform-provider-grid/tree/development/examples). + +## Deployment Examples + +Consult the ThreeFold `terraform-provider-grid` repo for different [Terraform deployment examples](https://github.com/threefoldtech/terraform-provider-grid/tree/development/examples). + +You can also read the [Resources](terraform_resources_readme.md) section for more details on different Terraform deployments. ## Features -- All basic primitives from ThreeFold grid can be deployed, which is a lot. -- Terraform can destroy a deployment +- All basic primitives from ThreeFold grid can be deployed +- Terraform can destroy deployments - Terraform shows all the outputs ## What is Not Supported -- we don't support updates/upgrades, if you want a change you need to destroy a deployment & re-create your deployment this in case you want to change the current running instances properties or change the node, but adding a vm to an existing deployment this shouldn't affect other running vm and same if we need to decommission a vm from a deployment this also shouldn't affect the others - +- We do not support updates nor upgrades. + - If you want a change, you need to destroy a deployment & re-create your deployment in case you want to change the current running instances properties or change the node. +- Adding a VM to an existing deployment or decommissioning a vm from a deployment shouldn't affect other running VMs. + ## OpenTofu: Alternative to Terraform [OpenTofu](https://opentofu.org/) is a fully open-source Terraform fork that is backward compatible with all prior versions of Terraform up to version 1.6. This alternative can be used instead of Terraform for the following sections. You might need to make changes depending on the version you are working with. Check the [OpenTofu Docs](https://opentofu.org/docs/) for more information. \ No newline at end of file diff --git a/collections/system_administrators/terraform/terraform_toc.md b/collections/system_administrators/terraform/terraform_toc.md index 16c7724..5d91cd9 100644 --- a/collections/system_administrators/terraform/terraform_toc.md +++ b/collections/system_administrators/terraform/terraform_toc.md @@ -2,37 +2,12 @@

Table of Contents

-- [Overview](terraform_readme.md) +- [Introduction to Terraform](terraform_readme.md) - [Installing Terraform](terraform_install.md) - [Terraform Basics](terraform_basics.md) - [Full VM Deployment](terraform_full_vm.md) - [GPU Support](terraform_gpu_support.md) - [Resources](terraform_resources_readme.md) - - [Using Scheduler](terraform_scheduler.md) - - [Virtual Machine](terraform_vm.md) - - [Web Gateway](terraform_vm_gateway.md) - - [Kubernetes Cluster](terraform_k8s.md) - - [ZDB](terraform_zdb.md) - - [Zlogs](terraform_zlogs.md) - - [Quantum Safe Filesystem](terraform_qsfs.md) - - [QSFS on Micro VM](terraform_qsfs_on_microvm.md) - - [QSFS on Full VM](terraform_qsfs_on_full_vm.md) - - [CapRover](terraform_caprover.md) - [QSFS on Micro VM](terraform_qsfs_on_microvm.md) - [QSFS on Full VM](terraform_qsfs_on_full_vm.md) - - [CapRover](terraform_caprover.md) -- [Advanced](terraform_advanced_readme.md) - - [Terraform Provider](terraform_provider.md) - - [Terraform Provisioners](terraform_provisioners.md) - - [Mounts](terraform_mounts.md) - - [Capacity Planning](terraform_capacity_planning.md) - - [Updates](terraform_updates.md) - - [SSH Connection with Wireguard](terraform_wireguard_ssh.md) - - [Set a Wireguard VPN](terraform_wireguard_vpn.md) - - [Synced MariaDB Databases](terraform_mariadb_synced_databases.md) - - [Nomad](terraform_nomad.md) - - [Nextcloud Deployments](terraform_nextcloud_toc.md) - - [Nextcloud All-in-One Deployment](terraform_nextcloud_aio.md) - - [Nextcloud Single Deployment](terraform_nextcloud_single.md) - - [Nextcloud Redundant Deployment](terraform_nextcloud_redundant.md) - - [Nextcloud 2-Node VPN Deployment](terraform_nextcloud_vpn.md) \ No newline at end of file +- [Advanced](terraform_advanced_readme.md) \ No newline at end of file -- 2.40.1