From ff956c98da5b71dc8fbc901cb36c73248b138657 Mon Sep 17 00:00:00 2001 From: geoffsee <> Date: Sun, 15 Jun 2025 16:01:06 -0400 Subject: [PATCH] builds a network of nodes --- .dockerignore | 28 +++++++++++++++ Dockerfile | 73 +++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e8e8768 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,28 @@ +# Rust build artifacts +/target/ +**/*.rs.bk + +# Git directory +.git/ +.github/ +.gitignore + +# Editor files +.vscode/ +.idea/ +*.swp +*.swo + +# Node.js files (from packages directory) +node_modules/ +npm-debug.log + +# Other unnecessary files +*.md +LICENSE +*.log +.DS_Store + +# Keep necessary files +!Cargo.toml +!Cargo.lock diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c7b0c02 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,73 @@ +# Multistage Dockerfile for gsio-node + +# Build stage +FROM rust:slim as builder + +# Install build dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + pkg-config \ + libssl-dev \ + build-essential \ + git \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Create a new empty project +WORKDIR /app + +COPY Cargo.toml Cargo.lock ./ +COPY crates/gsio-node/Cargo.toml ./crates/gsio-node/ +COPY crates/gsio-relay/Cargo.toml ./crates/gsio-relay/ +COPY crates/gsio-client/Cargo.toml ./crates/gsio-client/ +COPY crates/gsio-wallet/Cargo.toml ./crates/gsio-wallet/ + +# Create dummy source files to build dependencies +RUN mkdir -p crates/gsio-node/src && \ + echo 'fn main() { println!("Dummy!"); }' > crates/gsio-node/src/main.rs && \ + mkdir -p crates/gsio-relay/src && \ + echo 'fn main() { println!("Dummy!"); }' > crates/gsio-relay/src/lib.rs && \ + mkdir -p crates/gsio-client/src && \ + echo 'fn main() { println!("Dummy!"); }' > crates/gsio-client/src/main.rs && \ + mkdir -p crates/gsio-wallet/src && \ + echo 'pub fn dummy() {}' > crates/gsio-wallet/src/lib.rs + +# Create dummy source files to build dependencies + + +# Build dependencies - this will be cached if dependencies don't change +RUN cargo build --release --bin gsio-node + +# Remove the dummy source files +RUN rm -rf crates/*/src + +# Copy the actual source code +COPY crates ./crates + +# Build the application +RUN cargo build --release --bin gsio-node + +# Runtime stage +FROM debian:bookworm-slim + +# Install runtime dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + libssl3 \ + wget \ + && rm -rf /var/lib/apt/lists/* + +# Create a non-root user to run the application +RUN useradd -m appuser +USER appuser +WORKDIR /home/appuser + +# Copy the binary from the builder stage +COPY --from=builder --chown=appuser:appuser /app/target/release/gsio-node . + +# Expose the port the app runs on +EXPOSE 3000 + +# Command to run the application +CMD ["./gsio-node"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..99bbac7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,86 @@ +version: '3.8' +# GSIO-Net Docker Compose Configuration +# +# This file defines a network of GSIO-Net nodes that can communicate with each other. +# It creates three nodes, each exposing the API on a different host port: +# - node1: http://localhost:3001 +# - node2: http://localhost:3002 +# - node3: http://localhost:3003 +# +# Usage: +# - Start the network: docker-compose up -d +# - View logs: docker-compose logs -f +# - Stop the network: docker-compose down +# - Stop and remove volumes: docker-compose down -v + +services: + # Node 1 + node1: + build: + context: . + dockerfile: Dockerfile + container_name: gsio-node1 + ports: + - "3001:3000" # Map to different host ports to avoid conflicts + volumes: + - node1-data:/home/appuser/data + networks: + - gsio-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + + # Node 2 + node2: + build: + context: . + dockerfile: Dockerfile + container_name: gsio-node2 + ports: + - "3002:3000" + volumes: + - node2-data:/home/appuser/data + networks: + - gsio-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + + # Node 3 + node3: + build: + context: . + dockerfile: Dockerfile + container_name: gsio-node3 + ports: + - "3003:3000" + volumes: + - node3-data:/home/appuser/data + networks: + - gsio-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + +# Define volumes for persistent storage +volumes: + node1-data: + node2-data: + node3-data: + +# Define a custom network for the nodes to communicate +networks: + gsio-network: + driver: bridge