4 releases (breaking)
Uses new Rust 2024
| 0.8.0 | Feb 4, 2026 |
|---|---|
| 0.7.0 | Nov 29, 2025 |
| 0.6.1 | Nov 16, 2025 |
| 0.4.1 | Aug 22, 2025 |
#564 in Command line utilities
63KB
341 lines

opencloudtool
A tool to hide the complexity of the cloud.
Install oct-cli
curl -LsSf https://repo.opencloudtool.com/install.sh | sh
or
wget -qO- https://repo.opencloudtool.com/install.sh | sh
Install as Python library
pip install opencloudtool
See the Python library README for details: crates/oct-py/README.md
Log in to AWS
Basic login (docs):
aws configure
Using AWS SSO (docs):
aws configure sso
Deployment Examples
- Multiple REST services on the same host with NGINX load balancer
- Multiple REST services on different hosts with NGINX load balancer
- S3 remote state storage
- REST service with domain
- Single host multi services with domains
- Ray single worker
- Inject system env variables
- HTTP server with single dockerfile
- HTTP server with multiple dockerfiles
- Dedicated CS2 server
- FastAPI app via python library
Design
High-level

Decentralized oct
Infrastructure layers

- Base - base cloud resources (networking, VMs, IAM, etc.).
oct-ctl:- Consensus - Raft-based consensus mechanism to maintain a distributed state of the infrastructure.
- Management - management operations to control the infrastructure resources and user services.
- Service Discovery - DNS service to let the service communicate using domain name and hide the exact IPs.
- Workload - user services deployed along with proxy sidecars to implement service mesh approach.
Infrastructure lifecycle

- Genesis - step to setup the initial infrastructure to deploy a leader node that'll control everything.
- Life - the main period of infrastructure lifecycle where the leader is already deployed and all main operations with infrastructure and user services happen.
- Afterlife - the final step of the whole infrastructure destruction.
Node

Node can play the following roles:
- Leader - the main node that controls all infrastructure components (follower nodes and underlying infrastructure for them), the user services on the node itself and sends commands to the follower nodes to CRUD user services.
- Follower - the node type that accepts commands from the leader to CRUD user services. The follower node can become a leader if the current leader is not available anymore, according to the Raft consensus algorithm.
User-cloud interaction

Deployment process
The diagrams try to follow C4Model notation at component level.
L1 infrastructure (cloud resources)
In the current implementation Infra Graph is hard-coded.
It'll be updated to be adaptive to the User Services Graph at L2.

L2 infrastructure (user services)

Fixed infra graph
Shows the current state of the graph from crates/oct-cloud/src/infra.
The diagram can be moved to the infra-specific folder later, keeping it here for now to have all the design documents in one place.

Development
Command examples
Install pre-commit hooks
pre-commit install
Build project
cargo build
Run deploy command
cd dir/with/oct.toml
cargo run -p oct-cli deploy
Run destroy command
cargo run -p oct-cli destroy
Show all available commands
cargo run -p oct-cli --help
Show all available parameters for command
cargo run -p oct-cli command --help
For example:
cargo run -p oct-cli deploy --help
Writing tests
[WIP] Main principles:
- Each module provides its own mocks in a public
mocksmodule
...main code...
pub mod mocks {
...mocks...
}
#[cfg(test)]
mod tests {
...tests...
}
- Each module tests cover only the functionality in the module
- If a module uses external modules, they are mocked using mocks provided by the imported module's
mocksmodule
...other imports...
#[cfg(test)]
use module::mocks::MockModule as Module;
#[cfg(not(test))]
use module::Module;
...main code...
Imports ordering
When importing modules, the following order should be used:
- Standard library imports
- Third-party imports
- Local crate imports
use std::fs;
use serde::{Deserialize, Serialize};
use crate::aws::types::InstanceType;
Dev tools
Machete
Removes unused dependencies
cargo install cargo-machete
cargo machete
Cargo Features Manager
Removes unused features
cargo install cargo-features-manager
cargo features prune
Profile building time
Produces HTML file with building time report.
Can be found in target/cargo-timings.html
cargo build -p PACKAGE_NAME --release --timings
Pricing comparison
This section compares the cost of running a set of services in a cloud with different approaches which do not require the end user to manage underlying infrastructure (serverless).
Note that OpenCloudTool is a free to use open-source tool and there is no charge for using it.
Simple REST service
Main components:
- Django REST service (0.5 vCPU, 1GB RAM)
- Celery worker (0.5 vCPU, 1GB RAM)
- Redis (0.5 vCPU, 1GB RAM)
- Postgres (0.5 vCPU, 1GB RAM)
- Load Balancer (nginx, ELB, etc.)
AWS ECS Fargate
- 2 vCPU (1 vCPU per hour - $0.04048) - $61.5 per month
- 4 GB RAM (1 GB RAM per hour - $0.004445) - $13.5 per month
- Load Balancer ($0.0225 per hour) - $17 per month
Total: $92 per month
Single EC2 instance managed by OpenCloudTool
- 1 EC2 t4g.medium instance ($0.0336 per hour): $25.5 per month
Total: $25.5 per month
Repo stats
Dependencies
~147MB
~2M SLoC