Skip to content

A Rust library for developing application launchers. It uses a single TOML configuration file to automatically transform it into .env and YAML files. This library also allows you to easily switch between Docker Compose and Podman Compose.

License

Notifications You must be signed in to change notification settings

j-p-d-e-v/rustack-launcher

Repository files navigation

ruStack Launcher

A Rust library for developing application launchers. It uses a single TOML configuration file to automatically transform it into .env and YAML files. This library also allows you to easily switch between Docker Compose and Podman Compose.

NOTE: This is a personal project created for practicing Rust development. Feel free to modify this library as you see fit.

Crate: https://crates.io/crates/rustack-launcher

Configuration File

The launcher takes a configuration using TOML. See TOML for the guidelines.

Tables

[settings]

Provides insights into the launcher functionalities alongside frequently used configuration values.

Properties:

Property Usage Example
name Name of the application or stack ("Hello There")
description Description of the launcher ("MyAppStack launcher.")
author Author or creator of the launcher. Example: JP Mateo
base_dir Base directory for the launcher ("/mydirectory")
deploy_dir Directory where deployment artifacts are stored ("deploy")
services_dir Directory containing service configurations ("services")
compose_executable Executable used for Docker Compose. Values: "docker-compose", "podman-compose"
compose_file The compose file name used for deployment. Example: myapp-compose.yaml
compose_detached Whether to run Docker Compose in detached mode (true)

Example:

[settings]
name = "Hello There"
description = "MyAppStack launcher."
author = "JP Mateo"
base_dir = "/mydirectory"
deploy_dir = "deploy"
services_dir = "services"
compose_executable = "docker-compose"
compose_file = "docker-compose-test.yaml"
compose_detached = true

[[services]]

Comprises a list or array of services, structured in a format compatible with Docker Compose services. For further details, refer to: Docker Compose Services Documentation

Property Description Example
hostname Hostname of the service "db"
image Docker image to use for the service "postgres"
ports Ports to expose (host:container) ["5432:5432"]
environment Environment variables to set inside the container { POSTGRES_USER = "admin", ... }
env_file Path to the environment file to load variables from ["database"]
networks Networks the service is connected to ["mynetwork"]
volumes Volumes to mount (kind, source, target) [{ kind = "bind", source = ..., target = ... }]
depends_on Services this service depends on ["myserviceapp"]
restart Restart policy for the service "always"
tty Allocate a pseudo-TTY true

Example:

[[services]]
#This is the app service.
hostname = "db"
image = "postgres"
ports = [
    "5432:5432"
]
environment = { POSTGRES_USER = "admin", POSTGRES_PASSWORD = "admin123",  PGDATA="/var/lib/postgresql/data/pgdata" }
env_file = [
    "database",
]
networks = [
    "mynetwork"
]
volumes = [
    { kind = "bind", source = "/Users/jpmateo/Codes/rust/rustack-launcher/tests/testapp/data", target = "/var/lib/postgresql/data/pgdata"}
]
depends_on = [
    "myserviceapp"
]
restart = "always"
tty = true

[[networks]]

Consists of a list or array of networks, formatted in accordance with Docker Compose network specifications. For additional guidance, please consult: Docker Compose Network Documentation

Property Description Example
name Name of the network "mynetwork2"
driver Network driver: See. https://docs.docker.com/network/drivers/ "bridge"
labels Labels associated with the network (key-value) { "my.network.label.1" = ..., ... }
external Set to true if the network is external. Default: false external = false

Example:

[[networks]]
name = "mynetwork2"
driver = "bridge"
external = false
labels = { "my.network.label.1" = "This is a network label 1.", "my.network.label.2" = "This is a network label 2." }

[[volumes]]

Comprises a list or array of volumes, structured in a format compatible with Docker Compose volume specifications. For further information, refer to: Docker Compose Volume Documentation

Property Description Example serde(default)
name Name of the volume "testvolumes"
driver Volume driver. See: https://docs.docker.com/compose/compose-file/07-volumes/#driver "nfs"
driver_opts Options for the volume driver (name, value). See: https://docs.docker.com/compose/compose-file/07-volumes/#driver_opts [{ name = "type", value = "nfs" }, ... ]
external Indicates whether the volume is external. Default: false false
labels Labels associated with the volume (key-value) { "my.volume.label1" = ..., ... }
Example:
[[volumes]]
name = "testvolumes"
driver = "nfs"
driver_opts = [
    { name = "type", value = "nfs" },
    { name = "o", value = "addr=10.40.0.199,nolock,soft,rw" },
    { name = "device", value = ":/docker/example" },
]
external = false
labels = { "my.volume.label1" = "This is a volume label 1.", "my.volume.label2" = "This is a volume label 2." }

[[repositories]]

This encompasses a list or array of repositories that require pulling from the version control system.

Property Description Example serde(default)
service Service associated with the repository "app"
mount_target Target directory for mounting the repository "/var/db"
name Name of the repository "execism-diffie-hellman"
url URL of the repository "https://github.com/j-p-d-e-v/execism-diffie-hellman"
branch Branch of the repository to use "master"
clone Indicates whether to clone the repository false
Note: I did not include the authentication method. It is generally better to establish a connection between your machine/server and the desired Git server before proceeding.

Example:

[[repositories]]
service = "app"
mount_target = "/var/db"
name = "execism-diffie-hellman"
url = "https://github.com/j-p-d-e-v/execism-diffie-hellman"
branch = "master"
clone = false

Using Docker-Compose

Pre-requisites:

  1. Docker Engine must be installed in your system. See: https://docs.docker.com/
  2. Docker-Compose must be installed your system: See: https://docs.docker.com/compose/install/podman-compose
    //Load the toml configuration file.
    let config = Config::load("config-test-docker.toml".to_string());

    let deploy_dir: String = format!("{}/{}",config.settings.base_dir,&config.settings.deploy_dir);
    config.validate();
    let env_file_paths: Vec<String> = EnvironmentFile::generate(&config.env_files,&deploy_dir);
    let compose: Compose = Compose::new(config);
    compose.up();
    compose.down();

Using Podman-Compose

Pre-requisites:

  1. Podman must be installed in your system. See: https://podman.io/
  2. Podman-Compose must be installed your system: See: https://github.com/containers/podman-compose

Example:

    let config = Config::load("config-test-podman.toml".to_string());
    let deploy_dir: String = format!("{}/{}",config.settings.base_dir,&config.settings.deploy_dir);
    config.validate();
    let env_file_paths: Vec<String> = EnvironmentFile::generate(&config.env_files,&deploy_dir);
    let compose: Compose = Compose::new(config);
    compose.up();
    compose.down();

Unit Testing

cargo test -- --test-threads 1 --nocapture

Developer

  • JP Mateo

About

A Rust library for developing application launchers. It uses a single TOML configuration file to automatically transform it into .env and YAML files. This library also allows you to easily switch between Docker Compose and Podman Compose.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published