mirror of
https://github.com/l5yth/potato-mesh.git
synced 2026-03-28 17:42:48 +01:00
* feat: Add comprehensive Docker support - Add multi-container Docker setup with web app and data ingestor - Create production-ready Dockerfiles with multi-stage builds - Add Docker Compose configurations for dev, prod, and custom environments - Implement CI/CD pipeline with GitHub Actions for automated builds - Add comprehensive Docker documentation and setup guides - Include security scanning and multi-platform builds - Support for Meshtastic device integration via serial access - Persistent data storage with named volumes - Health checks and monitoring capabilities Addresses GitHub issue #120: Dockerize the project for easier community adoption Files added: - web/Dockerfile: Ruby web application container - data/Dockerfile: Python data ingestor container - data/requirements.txt: Python dependencies - docker-compose.yml: Base Docker Compose configuration - docker-compose.dev.yml: Development environment overrides - docker-compose.prod.yml: Production environment overrides - .env.example: Environment configuration template - .dockerignore: Docker build context optimization - .github/workflows/docker.yml: CI/CD pipeline - DOCKER.md: Comprehensive Docker documentation This implementation transforms PotatoMesh from a complex manual setup to a single-command deployment: docker-compose up -d * feat: Add Docker support with multi-architecture builds - Add web/Dockerfile with Ruby 3.4 Alpine base - Add data/Dockerfile with Python 3.13 Alpine base - Use Alpine's SQLite3 packages for cross-platform compatibility - Support AMD64, ARM64, ARMv7, and Windows architectures - Multi-stage builds for optimized production images - Non-root user security and proper file permissions * feat: Add Docker Compose configurations for different environments - docker-compose.yml: Production setup with GHCR images - docker-compose.dev.yml: Development setup with local builds - docker-compose.raspberry-pi.yml: Pi-optimized with resource limits - Support for all architectures (AMD64, ARM64, ARMv7) - Proper volume mounts and network configuration - Environment variable configuration for different deployments * feat: Add GitHub Actions workflows for Docker CI/CD - docker.yml: Multi-architecture build and push to GHCR - test-raspberry-pi-hardware.yml: ARM64 testing with QEMU - Support for manual workflow dispatch with version input - Build and test all Docker variants (AMD64, ARM64, ARMv7, Windows) - Automated publishing to GitHub Container Registry - Comprehensive testing for Raspberry Pi deployments * feat: Add Docker documentation and configuration tools - docs/DOCKER.md: Comprehensive Docker setup and usage guide - configure.sh: Interactive configuration script for deployment - Platform-specific setup instructions (macOS, Linux, Windows) - Raspberry Pi optimization guidelines - Environment variable configuration - Troubleshooting and best practices * docs: Update README with comprehensive Docker support - Add Docker Quick Start section with published images - Add comprehensive table of all available GHCR images - Include architecture-specific pull commands - Update manual installation instructions - Add platform-specific deployment examples - Document all supported architectures and use cases * chore: Update dependencies and project configuration - Update data/requirements.txt for Python 3.13 compatibility - Add v0.3.0 changelog entry documenting Docker support - Update .gitignore for Docker-related files - Prepare project for Docker deployment * feat: Update web interface for Denver Mesh Network - Update default configuration to center on Denver, Colorado - Set SITE_NAME to 'Denver Mesh Network' - Configure 915MHz frequency for US region - Update map center coordinates (39.7392, -104.9903) - Set appropriate node distance and Matrix room settings * Update Docker configuration and documentation - Remove Raspberry Pi specific Docker files and workflows - Update Docker workflow configuration - Consolidate Docker documentation - Add AGENTS.md for opencode integration - Update README with current project status * cleanup: workflow/readme * Update README.md Co-authored-by: l5y <220195275+l5yth@users.noreply.github.com> * Add .env.example and simplify documentation - Add comprehensive .env.example with all environment variables - Update web Dockerfile to use Berlin coordinates instead of Denver - Simplify README Docker quick start with helpful comments - Greatly simplify DOCKER.md with only essential information * cleanup: readme * Remove Stadia API key references - Remove STADIA_API_KEY from docker-compose.yml environment variables - Remove Stadia Maps configuration section from configure.sh - Remove Stadia API key references from .env.example - Simplify configuration to use basic OpenStreetMap tiles only * quickfix * cleanup: remove example usage from docker gh action output --------- Co-authored-by: l5y <220195275+l5yth@users.noreply.github.com>
156 lines
5.3 KiB
Bash
Executable File
156 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# PotatoMesh Configuration Script
|
|
# This script helps you configure your PotatoMesh instance with your local settings
|
|
|
|
set -e
|
|
|
|
echo "🥔 PotatoMesh Configuration"
|
|
echo "=========================="
|
|
echo ""
|
|
|
|
# Check if .env exists, if not create from .env.example
|
|
if [ ! -f .env ]; then
|
|
if [ -f .env.example ]; then
|
|
echo "📋 Creating .env file from .env.example..."
|
|
cp .env.example .env
|
|
else
|
|
echo "📋 Creating new .env file..."
|
|
touch .env
|
|
fi
|
|
fi
|
|
|
|
echo "🔧 Let's configure your PotatoMesh instance!"
|
|
echo ""
|
|
|
|
# Function to read input with default
|
|
read_with_default() {
|
|
local prompt="$1"
|
|
local default="$2"
|
|
local var_name="$3"
|
|
|
|
if [ -n "$default" ]; then
|
|
read -p "$prompt [$default]: " input
|
|
input=${input:-$default}
|
|
else
|
|
read -p "$prompt: " input
|
|
fi
|
|
|
|
eval "$var_name='$input'"
|
|
}
|
|
|
|
# Function to update .env file
|
|
update_env() {
|
|
local key="$1"
|
|
local value="$2"
|
|
|
|
if grep -q "^$key=" .env; then
|
|
# Update existing value
|
|
sed -i.bak "s/^$key=.*/$key=$value/" .env
|
|
else
|
|
# Add new value
|
|
echo "$key=$value" >> .env
|
|
fi
|
|
}
|
|
|
|
# Get current values from .env if they exist
|
|
SITE_NAME=$(grep "^SITE_NAME=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "My Meshtastic Network")
|
|
DEFAULT_CHANNEL=$(grep "^DEFAULT_CHANNEL=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "#MediumFast")
|
|
DEFAULT_FREQUENCY=$(grep "^DEFAULT_FREQUENCY=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "868MHz")
|
|
MAP_CENTER_LAT=$(grep "^MAP_CENTER_LAT=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "52.502889")
|
|
MAP_CENTER_LON=$(grep "^MAP_CENTER_LON=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "13.404194")
|
|
MAX_NODE_DISTANCE_KM=$(grep "^MAX_NODE_DISTANCE_KM=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "50")
|
|
MATRIX_ROOM=$(grep "^MATRIX_ROOM=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "")
|
|
API_TOKEN=$(grep "^API_TOKEN=" .env 2>/dev/null | cut -d'=' -f2- | tr -d '"' || echo "")
|
|
|
|
echo "📍 Location Settings"
|
|
echo "-------------------"
|
|
read_with_default "Site Name (your mesh network name)" "$SITE_NAME" SITE_NAME
|
|
read_with_default "Map Center Latitude" "$MAP_CENTER_LAT" MAP_CENTER_LAT
|
|
read_with_default "Map Center Longitude" "$MAP_CENTER_LON" MAP_CENTER_LON
|
|
read_with_default "Max Node Distance (km)" "$MAX_NODE_DISTANCE_KM" MAX_NODE_DISTANCE_KM
|
|
|
|
echo ""
|
|
echo "📡 Meshtastic Settings"
|
|
echo "---------------------"
|
|
read_with_default "Default Channel" "$DEFAULT_CHANNEL" DEFAULT_CHANNEL
|
|
read_with_default "Default Frequency (868MHz, 915MHz, etc.)" "$DEFAULT_FREQUENCY" DEFAULT_FREQUENCY
|
|
|
|
echo ""
|
|
echo "💬 Optional Settings"
|
|
echo "-------------------"
|
|
read_with_default "Matrix Room (optional, e.g., #meshtastic-berlin:matrix.org)" "$MATRIX_ROOM" MATRIX_ROOM
|
|
|
|
echo ""
|
|
echo "🔐 Security Settings"
|
|
echo "-------------------"
|
|
echo "The API token is used for secure communication between the web app and ingestor."
|
|
echo "You can provide your own custom token or let us generate a secure one for you."
|
|
echo ""
|
|
|
|
if [ -z "$API_TOKEN" ]; then
|
|
echo "No existing API token found. Generating a secure token..."
|
|
API_TOKEN=$(openssl rand -hex 32 2>/dev/null || python3 -c "import secrets; print(secrets.token_hex(32))" 2>/dev/null || echo "your-secure-api-token-here")
|
|
echo "✅ Generated secure API token: ${API_TOKEN:0:8}..."
|
|
echo ""
|
|
read -p "Use this generated token? (Y/n): " use_generated
|
|
if [[ "$use_generated" =~ ^[Nn]$ ]]; then
|
|
read -p "Enter your custom API token: " API_TOKEN
|
|
fi
|
|
else
|
|
echo "Existing API token found: ${API_TOKEN:0:8}..."
|
|
read -p "Keep existing token? (Y/n): " keep_existing
|
|
if [[ "$keep_existing" =~ ^[Nn]$ ]]; then
|
|
read -p "Enter new API token (or press Enter to generate): " new_token
|
|
if [ -n "$new_token" ]; then
|
|
API_TOKEN="$new_token"
|
|
else
|
|
echo "Generating new secure token..."
|
|
API_TOKEN=$(openssl rand -hex 32 2>/dev/null || python3 -c "import secrets; print(secrets.token_hex(32))" 2>/dev/null || echo "your-secure-api-token-here")
|
|
echo "✅ Generated new API token: ${API_TOKEN:0:8}..."
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "📝 Updating .env file..."
|
|
|
|
# Update .env file
|
|
update_env "SITE_NAME" "\"$SITE_NAME\""
|
|
update_env "DEFAULT_CHANNEL" "\"$DEFAULT_CHANNEL\""
|
|
update_env "DEFAULT_FREQUENCY" "\"$DEFAULT_FREQUENCY\""
|
|
update_env "MAP_CENTER_LAT" "$MAP_CENTER_LAT"
|
|
update_env "MAP_CENTER_LON" "$MAP_CENTER_LON"
|
|
update_env "MAX_NODE_DISTANCE_KM" "$MAX_NODE_DISTANCE_KM"
|
|
update_env "MATRIX_ROOM" "\"$MATRIX_ROOM\""
|
|
update_env "API_TOKEN" "$API_TOKEN"
|
|
|
|
# Add other common settings if they don't exist
|
|
if ! grep -q "^MESH_SERIAL=" .env; then
|
|
echo "MESH_SERIAL=/dev/ttyACM0" >> .env
|
|
fi
|
|
|
|
if ! grep -q "^DEBUG=" .env; then
|
|
echo "DEBUG=0" >> .env
|
|
fi
|
|
|
|
# Clean up backup file
|
|
rm -f .env.bak
|
|
|
|
echo ""
|
|
echo "✅ Configuration complete!"
|
|
echo ""
|
|
echo "📋 Your settings:"
|
|
echo " Site Name: $SITE_NAME"
|
|
echo " Map Center: $MAP_CENTER_LAT, $MAP_CENTER_LON"
|
|
echo " Max Distance: ${MAX_NODE_DISTANCE_KM}km"
|
|
echo " Channel: $DEFAULT_CHANNEL"
|
|
echo " Frequency: $DEFAULT_FREQUENCY"
|
|
echo " Matrix Room: ${MATRIX_ROOM:-'Not set'}"
|
|
echo " API Token: ${API_TOKEN:0:8}..."
|
|
echo ""
|
|
echo "🚀 You can now start PotatoMesh with:"
|
|
echo " docker-compose up -d"
|
|
echo ""
|
|
echo "📖 For more configuration options, see the README.md"
|