Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,33 @@ services:
- .env
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- prometheus_data:/app/prometheus
- nephelios_data:/app/config/prometheus
- registry_data:/var/lib/nephelios/registry
- grafana_data:/var/lib/nephelios/grafana
- grafana_provisioning:/app/config/grafana
- grafana_dashboard:/app/config/dashboards
ports:
- "3030:3030"

volumes:
grafana_data:
name: grafana_data

grafana_provisioning:
name: grafana_provisioning

grafana_dashboard:
name: grafana_dashboard

letsencrypt:
name: letsencrypt

prometheus_data:
name: prometheus_data

registry_data:
name: registry_data

nephelios_data:
name: nephelios_data
9 changes: 0 additions & 9 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ use warp::Filter;
mod metrics;
use crate::metrics::{CONTAINER_CPU, CONTAINER_MEM, CONTAINER_NET_IN, CONTAINER_NET_OUT, REGISTRY};

use self::services::helpers::docker_helper::ensure_volumes;

/// Entry point for the application.
///
/// Initializes and starts the Warp server. The server listens on `127.0.0.1:3030`
Expand Down Expand Up @@ -91,13 +89,6 @@ async fn main() {
Err(e) => eprintln!("❌ Failed to prune Docker images: {}", e),
}

println!("🚀 Ensuring Docker volumes exist...");
let res_ensure_volumes = ensure_volumes().await;
match res_ensure_volumes {
Ok(_) => println!("✅ Docker volumes ensured successfully"),
Err(e) => eprintln!("❌ Failed to ensure Docker volumes: {}", e),
}

println!("🚀 Check if Docker Swarm is initialized...");
let is_alive = check_swarm();
match is_alive {
Expand Down
93 changes: 0 additions & 93 deletions src/services/helpers/docker_helper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -983,92 +983,6 @@ pub fn check_swarm() -> Result<bool, String> {
Ok(String::from_utf8_lossy(&swarm_info.stdout).contains("Swarm: active"))
}

/// Ensures that all required Docker volumes exist for Nephelios.
/// If any volume doesn't exist, it will be created.
///
/// # Returns
/// * `Ok(())` if all volumes were successfully checked/created
/// * `Err(String)` if there was an error during the process
pub async fn ensure_volumes() -> Result<(), String> {
let docker = Docker::connect_with_local_defaults()
.map_err(|e| format!("Failed to connect to Docker: {}", e))?;

let required_volumes = vec![
NepheliosVolume {
name: "grafana_data",
mount_path: "/var/lib/nephelios/grafana",
},
NepheliosVolume {
name: "grafana_provisioning",
mount_path: "/app/config/grafana",
},
NepheliosVolume {
name: "grafana_dashboard",
mount_path: "/app/config/dashboards",
},
NepheliosVolume {
name: "prometheus_data",
mount_path: "/app/prometheus",
},
NepheliosVolume {
name: "registry_data",
mount_path: "/var/lib/nephelios/registry",
},
NepheliosVolume {
name: "nephelios_data",
mount_path: "/app/config/prometheus",
},
];

for volume in required_volumes {
// Check if volume exists
let filters: HashMap<String, Vec<String>> = {
let mut map = HashMap::new();
map.insert("name".to_string(), vec![volume.name.to_string()]);
map
};

let options = bollard::volume::ListVolumesOptions { filters };

let volumes = docker
.list_volumes(Some(options))
.await
.map_err(|e| format!("Failed to list volumes: {}", e))?;

if volumes.volumes.is_none() || volumes.volumes.as_ref().unwrap().is_empty() {
println!("Creating volume: {}", volume.name);

// Créer le volume avec les options de montage
let mountpoint = volume.mount_path.to_string();
let mut labels = HashMap::new();
labels.insert("com.nephelios.mountpoint", mountpoint.as_str());

let options = bollard::volume::CreateVolumeOptions {
name: volume.name,
labels: labels,
..Default::default()
};

docker
.create_volume(options)
.await
.map_err(|e| format!("Failed to create volume {}: {}", volume.name, e))?;

println!(
"✅ Volume {} created successfully (mount: {})",
volume.name, volume.mount_path
);
} else {
println!(
"✅ Volume {} already exists (mount: {})",
volume.name, volume.mount_path
);
}
}

Ok(())
}

/// Prunes unused Docker images.
///
/// Connects to the local Docker daemon and removes all dangling images.
Expand Down Expand Up @@ -1251,10 +1165,3 @@ fn parse_memory(val: &str) -> f64 {
.parse::<f64>()
.unwrap_or(0.0)
}

/// Structure définissant un volume Nephelios et son point de montage
#[derive(Debug)]
struct NepheliosVolume {
name: &'static str,
mount_path: &'static str,
}