From bd302126a392ee15d789cc1cc6b5af825ca1eafb Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo@trentesaux.fr> Date: Fri, 7 Oct 2022 15:56:20 +0200 Subject: [PATCH] wip document bootstrap process --- docs/dev/img/pipeline_screenshot.png | Bin 0 -> 27237 bytes docs/dev/launch-a-live-network.md | 103 ++++++++++++++++++++++++--- 2 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 docs/dev/img/pipeline_screenshot.png diff --git a/docs/dev/img/pipeline_screenshot.png b/docs/dev/img/pipeline_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2870de4baa32f9f9f0a5a18bb280c7be926366 GIT binary patch literal 27237 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 literal 0 HcmV?d00001 diff --git a/docs/dev/launch-a-live-network.md b/docs/dev/launch-a-live-network.md index a5d192e52..3c8513eeb 100644 --- a/docs/dev/launch-a-live-network.md +++ b/docs/dev/launch-a-live-network.md @@ -1,6 +1,59 @@ # How to launch a live network -## 1. Choose the currency type +Launching a new live network is more difficult than spawning a local blockchain. Follow this process if you know what you are doing and you already experimented a bit with local blockchains. Part of this process is automated with Rust scripts, including interaction with GitLab's GraphQL API. Do not hesitate to improve and complete it (see TODOs inside `xtask/**/*.rs` files). + +## Requirements + +In order to build in a standardized environment, you need Docker. + +- see docker docs to [install docker](https://docs.docker.com/engine/install/) +- make sure you can run docker as non-root user with `docker info` + +## Preparation + +### Runtime tag + +When launching a new network, you're likely to use a new runtime for the genesis. Our runtime tags use `xxyy` version numbers where `x` corresponds to major change and `y` hotfix or minor change. + +1. Make sure to move any issue or merge request assigned to the choosen milestone `runtime-xxyy` to the next one. This prevents from forgetting unfinished work. +1. Check that the [CI on master](https://git.duniter.org/nodes/rust/duniter-v2s/-/pipelines?scope=all&page=1&ref=master) is passing. This is necessary to build the docker images. +1. Increment the `spec_version` in the code. Example `spec_version: 300` -> `spec_version: 400`. + +At this point, you might want to merge this commit in master and publish the branch (TODO automate). + +### Release tasks + +We choose [`xtask`](https://github.com/matklad/cargo-xtask/) to run Rust scripts using `cargo`. To build these scripts, just run: + +```bash +cargo xtask # this will build the scripts and show the available commands +``` + +To interact with GitLab, the `release_runtime` script uses the environment variable `GITLAB_TOKEN` which must contain a token with write permission on the repository. Go to your [personal access token preferences](https://git.duniter.org/-/profile/personal_access_tokens) to generate one and `export` it (you might want to add it to your `.bashrc`). You can then run this command: + +```bash +cargo xtask release-runtime 400 # requires to run docker as non-root user +``` + +This command does the following things (use your system monitor to track de progress as it produces not log): + +1. download the [`paritytech/srtool`](https://docs.substrate.io/reference/command-line-tools/srtool/) (Substrate Runtime TOOLbox) docker image (about 2 minutes with a good connection). It is a docker container enabling to build the Substrate WebAssembly runtime in a deterministic way (machine-independant). +1. build gdev runtime in release mode using `srtool` (about 5 minutes depending on your computing power). The target is put in the `runtime/gdev/target` folder (about 2GB). +1. generate release notes using the template in `xtask/res` +1. publish the relase with the notes on GitLab using your `GITLAB_TOKEN` + +### Substrate client docker image + +Go to the pipeline and run the manual tasks as shown on the below screenshot. + +- `build_release_manual` +- `deploy_docker_release_sha` + + + +## Deployment + +### Choose the currency type Ensure that the currency type you want has the requirements. @@ -9,14 +62,14 @@ For now, only `gdev` is supported. In the commands that will be indicated afterwards, you will have to replace `CURRENCY` by the currency type you have chosen. -## 2. Choose the docker image +### Choose the docker image -Choose or build the docker image that contains the version of the code thut you want to use. +Choose the docker image that contains the version of the code that you want to use. In the commands that will be indicated afterwards, you will have to replace `TAG` by the tag of the docker image that you have chosen. -## 3. Generate the session keys of genesis authority +### Generate the session keys of genesis authority Generate a random secret phrase: @@ -39,17 +92,19 @@ $ docker run --rm -it --entrypoint duniter duniter/duniter-v2s:TAG key generate- Session Keys: 0x87189d723e1b2826c243bc433c718ac26ba60526932216a09102a254d54462b890a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d6290a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d6290a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d62 ``` -## 4. Paste sessions keys in the genesis configuration file +### Paste sessions keys in the genesis configuration file -An example of genesis configuration file: `resources/gdev.json` +An example of genesis configuration file: `resources/gdev.json`. Paste your session keys in your `smith` identity with key `session_keys`. -## 5. Generate raw spec +### Generate raw spec ```bash ./scripts/gen-live-network-raw-spec.sh CURRENCY "<path/to/your/genesis/config/file>" ``` -## 6. Generate the docker compose and prepare nodes keys +This builds the specs using debug version of Duniter. + +### Generate the docker compose and prepare nodes keys ```bash ./scripts/create-live-network.sh "<your secret phrase>" CURRENCY "<path/to/dist/folder>" @@ -60,8 +115,6 @@ root of the distribution folder: ```bash scp -r -P SSH_PORT "<path/to/dist/folder>" user@ip:/remote/dist/path -cd "<path/to/dist/folder>" -docker compose up -d ``` Then, on the server: @@ -70,3 +123,33 @@ Then, on the server: cd "<path/to/dist/folder>" docker compose up -d ``` + +## Finalization + +The following steps should be completed when you are satisfied with the network. + +### Rotate session keys + +You should rotate session keys for more secured keys (the one you used before are still in your bash history and your clipboard and could have been intercepted by an attacker). Update the raw chainspec json file with your new session keys. + +TODO explain how with polkadotjs + vpn + +### Inject chainspec + +Once you updated your session keys, inject the runtime code inside the raw chainspec. + +```bash +cargo xtask inject-runtime-code --runtime runtime/gdev/target/srtool/release/wbuild/gdev-runtime/gdev_runtime.compact.compressed.wasm --raw-spec resources/gdev-raw.json +``` + +### Publish image + +TODO + +### Tell the other smith + +Once you completed all these steps, the other smith can pull the docker image with a genesis containing your bootnode with the correct session keys. They can base their `docker-compose.yml` on the `duniter-validator` template. + +--- + +TODO rusty-hook pb? \ No newline at end of file -- GitLab