Laconic

Step 1: Clone the Repository

git clone https://github.com/cerc-io/stack-orchestrator.git
cd stack-orchestrator

Step 2: Build the Project

Ensure Go is properly set up on your machine and the GOPATH is configured. Then build the project:

go build -o stack-orchestrator

This creates an executable named stack-orchestrator.

Step 3: Run the Binary

After building, you can execute the orchestrator:

./stack-orchestrator

3. Configuration

The Stack Orchestrator requires configuration files to define clusters, services, and resources. The configuration is generally provided in a config.yaml file.

Example config.yaml

version: "1.0"

cluster:
  name: "example-cluster"
  nodes:
    - address: "192.168.1.100"
    - address: "192.168.1.101"

services:
  - name: "web-service"
    image: "nginx:latest"
    replicas: 3
    ports:
      - 80:8080
  - name: "api-service"
    image: "my-api:latest"
    replicas: 2
    environment:
      - "ENV=production"
      - "DEBUG=false"

Place this file in the root directory or specify its path when running the orchestrator.


4. Usage

Starting the Orchestrator

To run the orchestrator with your configuration:

./stack-orchestrator --config config.yaml

Deploy Services

The orchestrator reads the services defined in the configuration file and deploys them automatically. It will:

  1. Pull the required Docker images.

  2. Distribute workloads across the cluster nodes.

  3. Manage replication and load balancing.

Scaling Services

You can scale a service dynamically using the CLI:

./stack-orchestrator scale --service web-service --replicas 5

Listing Services

Check the status of all running services:

./stack-orchestrator services list

Logs

Fetch logs for a specific service:

./stack-orchestrator logs --service api-service

5. Example Code

Below is a basic implementation snippet that shows how you might use the orchestrator's internal logic to deploy a service programmatically:

Example Deployment Code

package main

import (
	"fmt"
	"log"
	"os"

	"stack-orchestrator/orchestrator"
)

func main() {
	configFile := "config.yaml"
	if len(os.Args) > 1 {
		configFile = os.Args[1]
	}

	// Load Configuration
	config, err := orchestrator.LoadConfig(configFile)
	if err != nil {
		log.Fatalf("Failed to load config: %v", err)
	}

	// Initialize Orchestrator
	cluster, err := orchestrator.NewCluster(config.Cluster)
	if err != nil {
		log.Fatalf("Failed to initialize cluster: %v", err)
	}

	// Deploy Services
	for _, service := range config.Services {
		err := cluster.DeployService(service)
		if err != nil {
			log.Printf("Failed to deploy service %s: %v", service.Name, err)
		} else {
			fmt.Printf("Service %s deployed successfully\n", service.Name)
		}
	}
}

Running the Code

  1. Save the file as main.go.

  2. Build and execute:

    go run main.go config.yaml


Last updated