2022-08-24 20:31:44 +00:00
# Stack Orchestrator
2022-08-22 02:26:55 +00:00
2022-08-24 20:48:55 +00:00
Stack Orchestrator allows building and deployment of a Laconic stack on a single machine with minimial prerequisites.
2022-08-24 20:31:44 +00:00
## Setup
2022-11-14 18:28:44 +00:00
### User Mode
Developer mode runs the orchestrator from a "binary" single-file release.
2022-08-24 20:31:44 +00:00
#### Prerequisites
2022-08-24 20:48:55 +00:00
Stack Orchestrator is a Python3 CLI tool that runs on any OS with Python3 and Docker. Tested on: Ubuntu 20/22.
Ensure that the following are already installed:
2022-11-14 18:28:44 +00:00
1. Python3 (the stock Python3 version available in Ubuntu 20 and 22 is suitable)
2022-08-24 20:48:55 +00:00
```
$ python3 --version
Python 3.8.10
```
2022-09-29 18:46:21 +00:00
2. Docker (Install a current version from dockerco, don't use the version from any Linux distro)
2022-08-24 20:48:55 +00:00
```
$ docker --version
Docker version 20.10.17, build 100c701
```
2022-09-29 21:28:23 +00:00
3. If installed from regular package repository (not Docker Desktop), BE AWARE that the compose plugin may need to be installed, as well.
2022-09-29 18:46:21 +00:00
```
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
# see https://docs.docker.com/compose/install/linux/#install-the-plugin-manually for further details
# or to install for all users.
```
2022-08-24 20:31:44 +00:00
#### Install
2022-11-14 18:31:06 +00:00
1. Download the latest release from [this page ](https://github.com/cerc-io/stack-orchestrator/tags ), into a suitable directory (e.g. `~/bin` ):
2022-11-14 18:28:44 +00:00
```
$ cd ~/bin
$ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.0-alpha/laconic-so
```
1. Ensure `laconic-so` is on the `PATH`
1. Verify operation:
```
$ ~/bin/laconic-so --help
Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]...
Laconic Stack Orchestrator
Options:
--quiet
--verbose
--dry-run
--local-stack
-h, --help Show this message and exit.
Commands:
build-containers build the set of containers required for a complete...
deploy-system deploy a stack
setup-repositories git clone the set of repositories required to build...
```
### Developer mode
Suitable for developers either modifying or debugging the orchestrator Python code:
#### Prerequisites
In addition to the binary install prerequisites listed above, the following are required:
1. Python venv package
This may or may not be already installed depending on the host OS and version. Check by running:
```
$ python3 -m venv
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...]
venv: error: the following arguments are required: ENV_DIR
```
If the venv package is missing you should see a message indicating how to install it, for example with:
```
$ apt install python3.8-venv
```
#### Install
2022-08-24 20:31:44 +00:00
1. Clone this repository:
```
$ git clone (https://github.com/cerc-io/stack-orchestrator.git
```
2022-09-29 19:56:55 +00:00
4. Enter the project directory:
2022-08-24 20:31:44 +00:00
```
$ cd stack-orchestrator
```
2022-09-29 19:56:55 +00:00
5. Create and activate a venv:
2022-08-24 20:31:44 +00:00
```
$ python3 -m venv venv
$ source ./venv/bin/activate
(venv) $
```
2022-09-29 19:56:55 +00:00
6. Install the cli in edit mode:
2022-08-24 20:31:44 +00:00
```
$ pip install --editable .
```
2022-09-29 19:56:55 +00:00
7. Verify installation:
2022-08-24 20:31:44 +00:00
```
(venv) $ laconic-so
Usage: laconic-so [OPTIONS] COMMAND [ARGS]...
Laconic Stack Orchestrator
Options:
--quiet
--verbose
--dry-run
-h, --help Show this message and exit.
Commands:
build-containers build the set of containers required for a complete...
deploy-system deploy a stack
setup-repositories git clone the set of repositories required to build...
```
2022-11-14 18:28:44 +00:00
2022-09-27 21:40:00 +00:00
#### Build a zipapp (single file distributable script)
Use shiv to build a single file Python executable zip archive of laconic-so:
1. Install [shiv ](https://github.com/linkedin/shiv ):
```
$ (venv) pip install shiv
2022-11-14 17:59:32 +00:00
$ (venv) pip install wheel
2022-09-27 21:40:00 +00:00
```
1. Run shiv to create a zipapp file:
```
$ (venv) shiv -c laconic-so -o laconic-so .
```
This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3:
1. Verify it works:
```
$ cp stack-orchetrator/laconic-so ~/bin
$ laconic-so
Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]...
Laconic Stack Orchestrator
Options:
--quiet
--verbose
--dry-run
-h, --help Show this message and exit.
Commands:
build-containers build the set of containers required for a complete...
deploy-system deploy a stack
setup-repositories git clone the set of repositories required to build...
```
2022-08-24 20:31:44 +00:00
### CI Mode
_write-me_
## Usage
There are three sub-commands: `setup-repositories` , `build-containers` and `deploy-system` that are generally run in order:
2022-09-29 19:56:55 +00:00
Note: $ laconic-so will run the version installed to ~/bin, while ./laconic-so can be invoked to run locally built
version in a checkout
2022-08-24 20:31:44 +00:00
### Setup Repositories
Clones the set of git repositories necessary to build a system.
2022-08-24 20:48:55 +00:00
Note: the use of `ssh-agent` is recommended in order to avoid entering your ssh key passphrase for each repository.
2022-08-24 20:31:44 +00:00
```
2022-09-29 19:56:55 +00:00
$ laconic-so --verbose setup-repositories #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file
2022-10-06 13:18:29 +00:00
#$ ./laconic-so --verbose --local-stack setup-repositories #this will use cwd ../ as dev_root_path
2022-08-24 20:31:44 +00:00
```
### Build Containers
2022-08-24 20:48:55 +00:00
Builds the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from cold.
2022-08-22 02:26:55 +00:00
```
2022-09-29 19:56:55 +00:00
$ laconic-so --verbose build-containers #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file
2022-10-06 13:18:29 +00:00
#$ ./laconic-so --verbose --local-stack build-containers #this will use cwd ../ as dev_root_path
2022-09-29 19:56:55 +00:00
2022-08-24 20:31:44 +00:00
```
### Deploy System
Uses `docker compose` to deploy a system.
2022-08-24 20:48:55 +00:00
Use `---include <list of components>` to deploy a subset of all containers:
2022-08-24 20:31:44 +00:00
```
$ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry up
```
2022-08-24 20:48:55 +00:00
```
$ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry down
```
2022-09-29 19:56:55 +00:00
Note: deploy-system command interacts with most recently built container images.
2022-09-27 21:40:00 +00:00
## Platform Support
Native aarm64 is _not_ currently supported. x64 emulation on ARM64 macos should work (not yet tested).
2022-08-24 20:31:44 +00:00
## Implementation
2022-08-24 20:48:55 +00:00
The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains
the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container).
Files required to build each container image are stored under `./container-build/<container-name>`
Files required at deploy-time are stored under `./config/<component-name>`
2022-08-24 20:31:44 +00:00
```
2022-10-07 12:48:30 +00:00
├── pod-list.txt
2022-08-24 20:31:44 +00:00
├── compose
│ ├── docker-compose-contract.yml
│ ├── docker-compose-db-sharding.yml
│ ├── docker-compose-db.yml
│ ├── docker-compose-eth-statediff-fill-service.yml
│ ├── docker-compose-go-ethereum-foundry.yml
│ ├── docker-compose-ipld-eth-beacon-db.yml
│ ├── docker-compose-ipld-eth-beacon-indexer.yml
│ ├── docker-compose-ipld-eth-server.yml
│ ├── docker-compose-lighthouse.yml
│ └── docker-compose-prometheus-grafana.yml
├── config
│ └── ipld-eth-server
├── container-build
│ ├── cerc-eth-statediff-fill-service
│ ├── cerc-go-ethereum
│ ├── cerc-go-ethereum-foundry
│ ├── cerc-ipld-eth-beacon-db
│ ├── cerc-ipld-eth-beacon-indexer
│ ├── cerc-ipld-eth-db
│ ├── cerc-ipld-eth-server
│ ├── cerc-lighthouse
│ └── cerc-test-contract
├── container-image-list.txt
├── repository-list.txt
```
_write-more-of-me_