diff --git a/Makefile b/Makefile index d23cf0c12..cd178429f 100755 --- a/Makefile +++ b/Makefile @@ -145,6 +145,9 @@ deep-clean: ##@Clean Stop services, clean docker images and remove mounted local make clean-images rm -rf $(LOCAL_STORAGE_PATH) +docs: + make doc + doc: ##@Documentation Build local online documentation and start serve command -v mkdocs >/dev/null 2>&1 || pip install -r docs/requirements.txt || pip3 -r docs/requirements.txt mkdocs serve -f mkdocs.yml @@ -216,7 +219,7 @@ images: api-engine docker-rest-agent fabric dashboard api-engine: docker build -t hyperledger/cello-api-engine:latest -f build_image/docker/common/api-engine/Dockerfile.in ./ --platform linux/$(ARCH) - + docker-rest-agent: docker build -t hyperledger/cello-agent-docker:latest -f build_image/docker/agent/docker-rest-agent/Dockerfile.in ./ --build-arg pip=$(PIP) --platform linux/$(ARCH) @@ -226,8 +229,11 @@ fabric: dashboard: docker build -t hyperledger/cello-dashboard:latest -f build_image/docker/common/dashboard/Dockerfile.in ./ +server: + docker compose -f bootup/docker-compose-files/docker-compose.server.dev.yml up -d --force-recreate --remove-orphans - +agent: + docker compose -f bootup/docker-compose-files/docker-compose.agent.dev.yml up -d --force-recreate --remove-orphans .PHONY: \ all \ @@ -235,6 +241,7 @@ dashboard: check \ check-api \ check-dashboard \ + docs \ doc \ help \ docker \ @@ -253,4 +260,6 @@ dashboard: clean-images \ start-docker-compose \ stop-docker-compose \ - images \ \ No newline at end of file + images \ + server \ + agent diff --git a/README.md b/README.md index fe8c95fda..1a450102a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Cello](docs/images/favicon.png) +![Cello](docs/images/logo.svg) [![Release](https://img.shields.io/github/v/release/hyperledger-cello/cello)](https://github.com/hyperledger-cello/cello/releases) [![Build Status](https://github.com/hyperledger/cello/actions/workflows/docker-image.yml/badge.svg)](https://github.com/hyperledger/cello/actions/workflows/docker-image.yml) diff --git a/bootup/docker-compose-files/docker-compose.agent.dev.yml b/bootup/docker-compose-files/docker-compose.agent.dev.yml new file mode 100644 index 000000000..22528fdf3 --- /dev/null +++ b/bootup/docker-compose-files/docker-compose.agent.dev.yml @@ -0,0 +1,27 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + +services: + cello-docker-agent: + image: hyperledger/cello-agent-docker + container_name: cello-docker-agent + hostname: cello.docker.agent + restart: always + ports: + - "2375:2375" + - "5001:5001" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - DOCKER_URL=unix://var/run/docker.sock + - STORAGE_PATH=${CELLO_STORAGE_PATH:-/opt/cello}/hyperledger + networks: + - cello-net + +networks: + cello-net: + name: cello-net + +volumes: + cello-docker-agent: diff --git a/bootup/docker-compose-files/docker-compose.server.dev.yml b/bootup/docker-compose-files/docker-compose.server.dev.yml new file mode 100644 index 000000000..ba37fcc88 --- /dev/null +++ b/bootup/docker-compose-files/docker-compose.server.dev.yml @@ -0,0 +1,67 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + +services: + cello-dashboard: + image: hyperledger/cello-dashboard + container_name: cello-dashboard + ports: + - "${DASHBOARD_SERVICE_PORT}:8081" + networks: + - cello-net + depends_on: + - cello-api-engine + + # pg database + cello-postgres: + image: postgres:12.0 + container_name: cello-postgres + restart: unless-stopped + environment: + - POSTGRES_DB=api_engine + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=123456 + ports: + - "5432:5432" + volumes: + - ${CELLO_STORAGE_PATH:-/opt/cello}/pgdata:/var/lib/postgresql/data + networks: + - cello-net + + # api engine service of cello + cello-api-engine: + image: hyperledger/cello-api-engine + container_name: cello-api-engine + restart: unless-stopped + stdin_open: true + dns_search: . + environment: + - GODEBUG=netdns=go + - DB_NAME=api_engine + - DB_USER=postgres + - DB_PASSWORD=123456 + - DB_HOST=cello-postgres + - CELERY_BROKER_URL=redis://redis + - DB_PORT=5432 + - DEBUG=True + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - FABRIC_LOGGING_SPEC=INFO + - API_ENGINE_ADMIN_EMAIL=admin@cello.com + ports: + - "8080:8080" + volumes: + - ${CELLO_STORAGE_PATH:-/opt/cello}:/opt/cello + networks: + - cello-net + depends_on: + - cello-postgres + +networks: + cello-net: + name: cello-net + +volumes: + cello-api-engine: + cello-postgres: + cello-dashboard: diff --git a/docs/concepts.md b/docs/concepts.md index 0f954346c..250b612d0 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -1,3 +1,8 @@ +--- +hide: + - navigation +--- + hero: All concepts related to cello # Concepts diff --git a/docs/contributing.md b/docs/contributing.md index 9561fafcf..574db7cd6 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,3 +1,8 @@ +--- +hide: + - navigation +--- + [//]: # (SPDX-License-Identifier: CC-BY-4.0) ## Introduction diff --git a/docs/design/arch.md b/docs/design/arch.md index c429bb627..4855d076f 100644 --- a/docs/design/arch.md +++ b/docs/design/arch.md @@ -1,3 +1,8 @@ +--- +hide: + - navigation +--- + # Architecture Design Here we discuss the architecture design for the mangement services on the Master node. diff --git a/docs/faq.md b/docs/faq.md index ea8edb80d..f409cf810 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,7 +1,5 @@ ## Questions -* [What is cello?](#what-is-cello) - ### What is cello? Hyperledger Cello is a blockchain provision and operation system, which helps manage blockchain networks in an efficient way. diff --git a/docs/images/logo.svg b/docs/images/logo.svg new file mode 100644 index 000000000..3efbde5dc --- /dev/null +++ b/docs/images/logo.svg @@ -0,0 +1,247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md index 2b9df2c94..21cac0ecf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,12 @@ +--- +hide: + - navigation +--- + Welcome to Hyperledger Cello === -![Typical Scenario](images/scenario.png) +![Logo](images/logo.svg) Hyperledger Cello (HLC) is a blockchain provision and operation system, which helps people use and manage blockchains in a more efficient way. @@ -19,16 +24,13 @@ Using Cello, blockchain developers can: * Check the system status and manage chains, upload smart contract and test... through dashboards. * Maintain a pool of running blockchain networks on top of bare-metals, virtual clouds (e.g., virtual machines, vsphere Clouds), container clusters (e.g., Docker, Swarm, Kubernetes). -## [Getting Started](setup/server.md) +![Typical Scenario](images/scenario.png) -**For beginners, it is highly recommended to read the [Setup](setup/server.md) first**. +## Getting Started -## Operation Guidelines -* [Operator operations in dashboard](operations/dashboard/operator.md) -* [Admin operations in dashboard](operations/dashboard/admin.md) -* [User operations in dashboard](operations/dashboard/user.md) +**For beginners, it is highly recommended to read the [*Tutorials*](tutorials/introduction.md) first**. -## [Contribute to the Project](contributing.md) +## Contribute to the Project * [How to Contribute](contributing.md) * [Code Style Guide](https://black.readthedocs.io/en/stable/the_black_code_style.html) diff --git a/docs/tutorials/agent.md b/docs/tutorials/agent.md new file mode 100644 index 000000000..1fcbe59b8 --- /dev/null +++ b/docs/tutorials/agent.md @@ -0,0 +1,56 @@ +# Lesson 3: Agent + +By the end of this lesson, you'll be able to set up a *Hyperledger Cello* agent on your computer. + +!!! note + Remember: You can totally follow this lesson on a different machine from where you follow the last lesson i.e. + The agents can be on a different machine from the server. + +!!! info + See also: [*Concepts*](../concepts.md). + +## Image +### Agent + +First, we have to build the image of the agent by running + +```bash +make docker-rest-agent +``` + +The image will be tagged as `hyperledger/cello-agent-docker:latest`. + +## Start the Agent + +Next, start the agent by running + +```bash +make agent +``` + +!!! tip + By doing so, you deploy the agent with a pre-written docker compose file `bootup/docker-compose-files/docker-compose.agent.dev.yml` Nevertheless, You can actually deploy the agent however you like if you want to write your own docker compose file with your own configurations. It's all up to you! + +If nothing goes wrong, you should see a container named `cello-docker-agent` running on your computer by executing + +```bash +docker ps +``` + +## Conclustion +That's it! You have successfully run a *Hyperledger Cello* agent on your computer🎉. + +In the next lesson, we'll talk about how you can create an organization and its first administrator. + +See you then👋! + +!!! info "P.S. The "Quickstart" Way" + Just as mentioned in the [last lesson](./server.md), alternatively, you can run + ```bash + make local + ``` + + to set up a *Hyperledger Cello* **server and agent** in the same place as quick as possible. + + However, in order to give you a deeper understanding of how everything works, + we instead walked through the entire setup step-by-step in this tutorial. diff --git a/docs/tutorials/channel.md b/docs/tutorials/channel.md new file mode 100644 index 000000000..dbbd57583 --- /dev/null +++ b/docs/tutorials/channel.md @@ -0,0 +1,78 @@ +# Lesson 6: Channel & Chaincode + +!!! bug + Currently, this feature only works if the server is on the same host with agents i.e. **You can create channels only if all your *Hyperledger Cello* components aren't deployed across multiple hosts**. + + This is a serious bug, and we've noticed that. For the latest information about this issue, follow [#733](https://github.com/hyperledger-cello/cello/issues/733). + +!!! info + If you don't what channels are, please check out [Channels](https://hyperledger-fabric.readthedocs.io/en/release-2.5/channels.html). + +!!! info + If you don't what chaincodes are, please check out [Smart Contracts and Chaincode](https://hyperledger-fabric.readthedocs.io/en/release-2.5/smartcontract/smartcontract.html). + +After all the previous 6 lessons, you now are ready to create your first ***Blockchain*** with *Hyperledger Cello*. + +*Channel* is the closest concept to what a *blockchain* is known by the general public, or more specifically, a *private* blockchain, in the *Hyperledger Fabric* world. + +In contrast, *Chaincode* is the closest concept to what a *smart contract* is known by the general public in the *Hyperledger Fabric* world. + +## Create a Channel + +Go to the channel management page and click on the "New" button. + +Then, name the channel and choose your peers and orderers. + +## Deploy a Chaincode + +Mainly, there are 4 steps you should do when you deploy a chaincode + +1. Package +2. Install +3. Approve (for your organization only) +4. Commit + +Each step has its own meaning. + +Without packaging, you can't install a chaincode on a peer. + +Without installing, you can't approve a chaincode for your organization. + +Without approving, you can't commit a chaincode to a channel. + +Finally, without commiting, you can't use a chaincode to send transactions. + +### Package + +You have to do it yourself for this step. Please refer to [Package the smart contract](https://hyperledger-fabric.readthedocs.io/en/release-2.5/deploy_chaincode.html#package-the-smart-contract). + +### Install + +Go to the chaincode management page and click on the "New" button. + +Upload your chaincode package from the last step. + +The uploaded chaincode package ID will be shown as the label of it (assigned during packaging) and a hash value. + +After that, click on the "Install" button shown on your chaincode. + +### Approve + +If nothing goes wrong, click on the "Approve" button then. + +### Commit + +Lastly, commit the chaincode by the "Commit" button. + +## Conclusion + +That's it! You have successfully created your first *Hyperledger Fabric* channel, which is your first *blockchain*, with *Hyperledger Cello*🎉! + +Moreover, you also deployed your first *Hyperledger Fabric* chaincode, which is your first *smart contract*! + +In the next lesson, we'll talk about how you can interact with it. + +See you then👋! + +!!! warning + **You can't**. Currently you still can't interact with your chaincode through the *Hyperledger Cello*. Such a feature is still under development. Thus, there is no next lesson, but there will be one once the feature is finished😊! diff --git a/docs/tutorials/introduction.md b/docs/tutorials/introduction.md new file mode 100644 index 000000000..247d84d71 --- /dev/null +++ b/docs/tutorials/introduction.md @@ -0,0 +1,9 @@ +# Lesson 0: Introduction + +*Creating a Hyperledger Fabric network is never an easy thing, and Hyperledger Cello has made it simpler.* + +Welcome to the *Hyperledger Cello* tutorials. In the following lessons, you will learn about how you can set up a *Hyperledger Cello* server and agent and use them to create a *Hyperledger Fabric* network with ease. + +The whole series is done using a *Ubuntu 22.04* computer, but it should be able to work on any *UNIX-like* operating system. If you encounter any problem trying to follow the tutorials, feel free to open an issue on our [*GitHub*](https://github.com/hyperledger-cello/cello/issues) page, or better, open a PR to solve it. For more infomation, please refer to the [*Contributing*](../contributing.md) page. + +Let's get started! diff --git a/docs/tutorials/node.md b/docs/tutorials/node.md new file mode 100644 index 000000000..c03f38766 --- /dev/null +++ b/docs/tutorials/node.md @@ -0,0 +1,82 @@ +# Lesson 5: Agent, Network, & Node + +Now, you're ready to connect your server with your agent. + +## Agent + +To do that, please login to your server and go to the agent management page. + +Click on the "New" button to register a new agent with a URL linked to your agent host. The default agent port is `5001`. + +!!! info + Even if you register the agent successfully, it doesn't mean that the server can access the agent successfully. The server will only try to connect the agent when it has to operate *nodes*, and this will happen later in this lesson when we create a *network*. + +## Nodes + +### Image + +Compared to the usual pratice of *Hyperledger Fabric*, *Hyperledger Cello* doesn't use the official peer and orderer images to deploy nodes. Instead, *Hyperledger Cello* uses its own {++customized++} *Hyperledger Fabric* node images, which combines all *Hyperledger Fabric* binaries into one single image. + +To build that, run + +```bash +make fabric +``` + +The image will be tagged as `hyperledger/fabric:2.5.10`. + +!!! info "The "Quickstart" way" + The quickstart `make local` command we mentioned in [lesson 2](./server.md) and [lesson 3](./agent.md) will also build the node image for you. + +### Create peers and orderers + +!!! info + If you don't know what *peers* and *orderers* are, please check out [*Peers*](https://hyperledger-fabric.readthedocs.io/en/latest/peers/peers.html). + +Go to the node management page and click on the "New" button. You can choose to create either a *peer* or an *orderer* and name it. + +To create a channel in the following lessons, you must create at least 1 peer and 1 orderer. + +You should name them like hostnames just as you do for your organization because their names will also be used as a part of their hostnames. + +## Network + +You may notice that currently the status of your nodes are "created", and you don't see any container like *Hyperledger Fabric* nodes +running on your agent host. That's because the server **won't ask agents to deploy nodes until they're in a network**. + +Thus, you have to create a *network* to place your *nodes*. + +!!! info + *Network* actually derives from a deprecated idea *system channel* in *Hyperledger Fabric*, which means it also will be deprecated in the near future. However, we still need it here to run our nodes currently. + +Go to the network management page and click on the "New" button to create a network. + +After you create a network successfully, even though it doesn't seem like there is anything happening, you can go to the node management page to see if your node status turns to green with a "running" label. Please wait about 5 minutes if you don't see any change. After that, there may be something wrong in your deployment. You can check the container logs by executing [the `docker logs` command](https://docs.docker.com/reference/cli/docker/container/logs/) with the api engine or agent container or consider [contacting us](../../#communication-channels). + +Otherwise, you should see your nodes running as containers on your agent host by executing + +```bash +docker ps +``` + +!!! info + A peer container will be named as the peer name concatenated with the organization name. + + An orderer container will be named as the organization name with its first part replaced with the orderer name. + + For example, if there is an organization named "org1.cello.com" with a peer named "peer1" and an orderer named "orderer1", their containers should be named as "peer1.org1.cello.com" and "orderer1.cello.com". + + Such a naming method emphasizes that an orderer doesn't solely belong to its organization in a *Hyperledger Fabric* network. + +## Conclusion + +That's it! You have successfully connected your *Hyperledger Cello* server with your agent🎉! + +Moreover, you also managed to deploy some *Hyperledger Fabric* running nodes! + +In the next lesson, we'll talk about how you can create a *channel* with them. + +See you then👋! + +!!! note + **Network* is not *Blockchain**, and there is no block on it. *Network* is just an abstract idea about what connects between organization *nodes*. diff --git a/docs/tutorials/organization.md b/docs/tutorials/organization.md new file mode 100644 index 000000000..434978383 --- /dev/null +++ b/docs/tutorials/organization.md @@ -0,0 +1,46 @@ +# Lesson 4: User & Organization + +Finally! After the previous lessons, you now are ready to enter and use *Hyperledger Cello*🎉! + +Remember the *Hyperledger Cello* server you built in the [lesson 2](./server.md)? + +By the end of that lesson, you should be able to enter [http://0.0.0.0:8081](http://0.0.0.0:8081) to see the login page. + +Now go back to it because we're going to enter the server. + +## Register + +The site asks for your email and password to login, but since we haven't registered before, just click on the "register" first. + +Once you switch to the registration form, you may notice that there is an admonition on it: + +> This registration form is only for setting up a new organization and its first administrator. If your organization already exists, please ask your administrator to create your account. + +It means that the registration is actually for **organizations**, and it will create a user for it incidentally to make sure that there won't be an organization without a user can login. + +In *Hyperledger Cello*, every user must belong to an organization just like they does in *Hyperledger Fabric*. + +To join an existing organization afterwards, ask its administrators to register you. Remember, a user can belong to only one organization. + +Now, fill in the form, so we can go to the next step. You must name your organization like hostnames (e.g. "org1.cello.com") because it will be used as a part of your *node* hostnames. (We'll talk about *nodes* in the following lessons.) + +You should see the "Register successfully!" message once you finish. Then, go to the login page and login with the email and password you just registered! + +## After login + +You can see the 2 concepts we talk about in this lesson by going to the "Organization" and "User" managerment page. You can see all organizations and users there. + +Additionally, you can start invite others to your organization by registering them on the user management page. + +## Conclusion + +That's it! You have successfully created your organization and register a user🎉! + +In the next lesson, we'll talk about how you can connect you server with your agent. + +See you then👋! + +!!! info "P.S. The "default" user" + You may have noticed that on the user management page, there is another user named "admin" created besides the user you just registered for yourself. That's the "default" user. The default user can't operate anything because it has no organization, but it allows one to login a *Hyperledger Cello* server to wander around and check if it's OK. + + The default user email and password is assigned by the environment varables `API_ENGINE_ADMIN_EMAIL` and `API_ENGINE_ADMIN_PASSWORD` of the api engine container. By default, they're `admin@cello.com` and `pass`. diff --git a/docs/tutorials/prerequisites.md b/docs/tutorials/prerequisites.md new file mode 100644 index 000000000..599b5eef8 --- /dev/null +++ b/docs/tutorials/prerequisites.md @@ -0,0 +1,31 @@ +# Lesson 1: Prerequisites + +## Knowledger Base + +Before we get into this tutorial, though not necessary, it would be better if you have a basic understanding of *Hyperledger Fabric*. You can get more information about it by checking out the [*Key Concepts*](https://hyperledger-fabric.readthedocs.io/en/latest/key_concepts.html). + +You should also have read the [*Concept*](../concepts.md) page, but still, we'll briefly revisit key ideas as they come up. + +## Environment + +To set up the environment for the following lessons, make sure you have these 3 tools installed on your computer: + +1. [*git*](https://git-scm.com/downloads) +2. [*make*](https://www.gnu.org/software/make) +3. [*docker*](https://docs.docker.com/get-started/get-docker) + +All of them are usually available through package managers. + +So far, no compatibility issues have been reported with the versions of these tools. However, if you encounter any problems, feel free to let us know via the [*GitHub*](https://github.com/hyperledger-cello/cello) page. + +Now, navigate to the directory where you want to place the project and run: +```bash +git clone https://github.com/hyperledger-cello/cello +``` + +If the command runs successfully, switch into the project directory: +```bash +cd cello +``` + +That's it for this lesson. See you in the next one👋! diff --git a/docs/tutorials/server.md b/docs/tutorials/server.md new file mode 100644 index 000000000..271d0093d --- /dev/null +++ b/docs/tutorials/server.md @@ -0,0 +1,77 @@ +# Lesson 2: Server + +By the end of this lesson, you'll be able to set up a *Hyperledger Cello* server on your computer. + +To do so, we'll set up 3 components of it: dashboard, database, and the api engine. + +!!! info + See also: [*Concepts*](../concepts.md). + +## Image +### Dashboard +First, we'll need a dashboard for our server, which is the UI for us. + +Thus, we have to build its image by running: + +```bash +make dashboard +``` + +The image will be tagged as `hyperledger/cello-dashboard:latest`. + +This step can take a while because it builds the `node_module` via `yarn install`. + +### Database +We'll directly use the official PostgreSQL image as our database, so there is no need to build another one. + +### API Engine +Next, we'll build the center of our *Hyperledger Cello* server, which is the *api engine*. + +```bash +make api-engine +``` + +The image will be tagged as `hyperledger/cello-api-engine:latest`. + +This step can take a while because it has to install all the dependencies needed for the engine. + +## Start the Server + +Finally, we can start the server by: + +```bash +make server +``` + +!!! tip + By doing so, you deploy the server with a pre-written docker compose file `bootup/docker-compose-files/docker-compose.server.dev.yml`. Nevertheless, You can actually deploy the server however you like if you want to write your own docker compose file with your own configurations. It's all up to you! + +If nothing goes wrong, you should see 3 containers running on your computer by executing + +```bash +docker ps +``` + +They should be named `cello-dashboard`, `cello-api-engine`, `cello-postgres` respectively. + +Go to [http://0.0.0.0:8081](http://0.0.0.0:8081) (replace the hostname with your connectable host e.g. [http://localhost:8081](http://localhost:8081)). + +If you can see the login page on your browser, you're good to go. + +## Conclusion +That's it! You have successfully run a *Hyperledger Cello* server on your computer🎉. + +In the next lesson, we'll talk about how you can run an agent for it. + +See you then👋! + +!!! info "P.S. The "Quickstart" Way" + Alternatively, you can run + ```bash + make local + ``` + + to set up a *Hyperledger Cello* **server and agent** in the same place as quick as possible. + + However, in order to give you a deeper understanding of how everything works, + we instead walked through the entire setup step-by-step in this tutorial. diff --git a/mkdocs.yml b/mkdocs.yml index 88bfd7c66..6bbcb031d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,18 +1,32 @@ site_name: Hyperledger Cello repo_name: "hyperledger/cello" repo_url: "https://github.com/hyperledger/cello" +dev_addr: 0.0.0.0:8000 theme: name: "material" logo: "images/favicon.png" favicon: "images/favicon.png" - feature: - tabs: true + features: + - navigation.tabs + - navigation.top + - navigation.footer + - content.code.copy palette: - primary: "light-blue" - accent: "light-blue" + - scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + primary: "light-blue" + accent: "light-blue" + - scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode + primary: "light-blue" + accent: "light-blue" font: - text: "Ubuntu" - code: "Ubuntu Mono" + text: "Ubuntu Sans" + code: "Ubuntu Sans Mono" markdown_extensions: - admonition - codehilite @@ -24,38 +38,35 @@ markdown_extensions: - markdown.extensions.meta - markdown.extensions.toc: permalink: true + - pymdownx.details - pymdownx.superfences: custom_fences: - name: mermaid class: mermaid - format: !!python/name:mermaid2.fence_mermaid + format: !!python/name:pymdownx.superfences.fence_code_format - pymdownx.mark - pymdownx.critic: mode: view docs_dir: docs nav: - - Docs: - - Overview: index.md - - Concepts: concepts.md - - Design: - - Architecture: design/arch.md - - Setup: - - Server: setup/server.md - - Agent: - - Kubernetes: agents/kubernetes.md - - Fabric operator: agents/fabric-operator.md - - Operations: - - Dashboard: - - Operator operations: operations/dashboard/operator.md - - Admin operations: operations/dashboard/admin.md - - User operations: operations/dashboard/user.md - - Reference: - - Configuration: - - Server Configuration: reference/configuration/server.md - - Commands: - - make: reference/commands/make.md - - cli: reference/commands/cli.md - - Contribute: contributing.md + - Home: index.md + - Concepts: concepts.md + - Design: + - Architecture: design/arch.md + - Tutorials: + - "Lesson 0: Introduction": tutorials/introduction.md + - "Lesson 1: Prerequisites": tutorials/prerequisites.md + - "Lesson 2: Server": tutorials/server.md + - "Lesson 3: Agent": tutorials/agent.md + - "Lesson 4: User & Organization": tutorials/organization.md + - "Lesson 5: Agent, Network, & Node": tutorials/node.md + - "Lesson 6: Channel": tutorials/channel.md + - Reference: + - Configuration: + - Server Configuration: reference/configuration/server.md + - Commands: + - make: reference/commands/make.md + - Contribute: contributing.md - FAQ: - faq.md - Release Notes: