#!/bin/bash # Mawari node - Simple Management Script # CryptoCompass Branded Installation Script # Простой скрипт для управления Mawari node # Color functions for CryptoCompass branding show_red() { echo -e "\e[31m$1\e[0m"; } show_green() { echo -e "\e[32m$1\e[0m"; } show_yellow() { echo -e "\e[1;33m$1\e[0m"; } show_blue() { echo -e "\e[34m$1\e[0m"; } show_purple() { echo -e "\e[35m$1\e[0m"; } show_cyan() { echo -e "\e[36m$1\e[0m"; } show_white() { echo -e "\e[1;37m$1\e[0m"; } show_bold() { echo -e "\e[1m$1\e[0m"; } # Combined color functions show_success() { echo -e "\e[32m\e[1m$1\e[0m"; } show_error() { echo -e "\e[31m\e[1m$1\e[0m"; } show_warning() { echo -e "\e[1;33m\e[1m$1\e[0m"; } show_info() { echo -e "\e[36m\e[1m$1\e[0m"; } show_header() { echo -e "\e[1;37m\e[1m$1\e[0m"; } # CryptoCompass logo show_logo() { clear echo -e "\e[36m\e[1m" echo " ╔══════════════════════════════════════════════════════════════╗" echo " ║ ║" echo " ║ ██████╗██████╗ ██╗ ██╗██████╗ ████████╗ ██████╗ ║" echo " ║ ██╔════╝██╔══██╗╚██╗ ██╔╝██╔══██╗╚══██╔══╝██╔═══██╗ ║" echo " ║ ██║ ██████╔╝ ╚████╔╝ ██████╔╝ ██║ ██║ ██║ ║" echo " ║ ██║ ██╔══██╗ ╚██╔╝ ██╔═══╝ ██║ ██║ ██║ ║" echo " ║ ╚██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝ ║" echo " ║ ╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ║" echo " ║ ║" echo " ║ ██████╗ ██████╗ ███╗ ███╗██████╗ ██████╗ ███████╗███████╗ ║" echo " ║ ██╔════╝██╔═══██╗████╗ ████║██╔══██╗██╔══██╗██╔════╝██╔════╝ ║" echo " ║ ██║ ██║ ██║██╔████╔██║██████╔╝███████║███████╗███████╗ ║" echo " ║ ██║ ██║ ██║██║╚██╔╝██║██╔═══╝ ██╔══██║╚════██║╚════██║ ║" echo " ║ ╚██████╗╚██████╔╝██║ ██║██║ ██║ ██║███████║███████║ ║" echo " ║ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ║" echo " ║ ║" echo " ║ Mawari node ║" echo " ║ Simple Management Script ║" echo " ║ ║" echo " ╚══════════════════════════════════════════════════════════════╝" echo -e "\e[0m" echo "" echo -e "\e[1;37m\e[1m🌐 CryptoCompass Resources:\e[0m" echo -e "\e[36m\e[1m• Twitter/X:\e[0m \e[1;37mhttps://x.com/0xGreenFlag\e[0m" echo -e "\e[36m\e[1m• YouTube:\e[0m \e[1;37mhttps://www.youtube.com/@beloglazovpro\e[0m" echo -e "\e[36m\e[1m• Telegram:\e[0m \e[1;37mhttps://t.me/beloglazovpro\e[0m" echo "" } # Language selection select_language() { show_logo show_yellow "Выберите язык / Select Language:" show_white "1) Русский" show_white "2) English" echo "" read -p "$(show_cyan "Выбор / Choice [1-2]: ")" lang_choice case $lang_choice in 1) LANG="ru" ;; 2) LANG="en" ;; *) show_error "Неверный выбор / Invalid choice"; select_language ;; esac } # Text strings based on language get_text() { case $LANG in "ru") case $1 in "main_menu") echo "Главное меню" ;; "install") echo "Установка" ;; "manage") echo "Управление" ;; "remove") echo "Удаление" ;; "exit") echo "Выход" ;; "requirements") echo "Требования к системе:" ;; "cpu") echo "• CPU: 2 vCPU" ;; "ram") echo "• RAM: 4 GB" ;; "disk") echo "• Диск: 50 GB SSD или больше" ;; "bandwidth") echo "• Пропускная способность: 100Mbps" ;; "ports") echo "• Открытые порты: TCP 80, 443, 8080" ;; "continue") echo "Продолжить установку?" ;; "yes_no") echo "[y/n]: " ;; "installing") echo "Установка Mawari Node..." ;; "updating") echo "Обновление системы..." ;; "installing_packages") echo "Установка необходимых пакетов..." ;; "installing_docker") echo "Установка Docker..." ;; "installing_docker_compose") echo "Установка Docker Compose..." ;; "downloading_image") echo "Загрузка образа Mawari..." ;; "setup_owner_address") echo "Настройка адреса владельца..." ;; "enter_owner_address") echo "Введите адрес владельца NFT: " ;; "starting_node") echo "Запуск ноды..." ;; "installation_complete") echo "Установка завершена!" ;; "node_running") echo "Нода запущена" ;; "node_stopped") echo "Нода остановлена" ;; "press_enter") echo "Нажмите Enter для продолжения..." ;; "invalid_choice") echo "Неверный выбор!" ;; "logs") echo "Логи" ;; "restart") echo "Перезапуск" ;; "stop") echo "Остановка" ;; "start") echo "Запуск" ;; "back") echo "Назад" ;; "node_restarted") echo "Нода перезапущена!" ;; "node_stopped_msg") echo "Нода остановлена!" ;; "node_started") echo "Нода запущена!" ;; "remove_confirm") echo "Вы уверены, что хотите удалить Mawari Node?" ;; "removing") echo "Удаление Mawari Node..." ;; "removed") echo "Mawari Node удален!" ;; "not_installed") echo "Mawari Node не установлен" ;; "already_installed") echo "Mawari Node уже установлен" ;; "owner_address") echo "Адрес владельца NFT" ;; "show_owner_address") echo "Показать адрес владельца" ;; "change_owner_address") echo "Изменить адрес владельца" ;; "docker_not_installed") echo "Docker не установлен" ;; "docker_compose_not_installed") echo "Docker Compose не установлен" ;; "help_commands") echo "Команды помощи" ;; "manual_commands") echo "Ручные команды" ;; esac ;; "en") case $1 in "main_menu") echo "Main Menu" ;; "install") echo "Install" ;; "manage") echo "Manage" ;; "remove") echo "Remove" ;; "exit") echo "Exit" ;; "requirements") echo "System Requirements:" ;; "cpu") echo "• CPU: 2 vCPU" ;; "ram") echo "• RAM: 4 GB" ;; "disk") echo "• Disk: 50 GB SSD or higher" ;; "bandwidth") echo "• Bandwidth: 100Mbps" ;; "ports") echo "• Open ports: TCP 80, 443, 8080" ;; "continue") echo "Continue with installation?" ;; "yes_no") echo "[y/n]: " ;; "installing") echo "Installing Mawari Node..." ;; "updating") echo "Updating system..." ;; "installing_packages") echo "Installing required packages..." ;; "installing_docker") echo "Installing Docker..." ;; "installing_docker_compose") echo "Installing Docker Compose..." ;; "downloading_image") echo "Downloading Mawari image..." ;; "setup_owner_address") echo "Setting up owner address..." ;; "enter_owner_address") echo "Enter NFT owner address: " ;; "starting_node") echo "Starting node..." ;; "installation_complete") echo "Installation completed!" ;; "node_running") echo "Node is running" ;; "node_stopped") echo "Node is stopped" ;; "press_enter") echo "Press Enter to continue..." ;; "invalid_choice") echo "Invalid choice!" ;; "logs") echo "Logs" ;; "restart") echo "Restart" ;; "stop") echo "Stop" ;; "start") echo "Start" ;; "back") echo "Back" ;; "node_restarted") echo "Node restarted!" ;; "node_stopped_msg") echo "Node stopped!" ;; "node_started") echo "Node started!" ;; "remove_confirm") echo "Are you sure you want to remove Mawari Node?" ;; "removing") echo "Removing Mawari Node..." ;; "removed") echo "Mawari Node removed!" ;; "not_installed") echo "Mawari Node not installed" ;; "already_installed") echo "Mawari Node already installed" ;; "owner_address") echo "NFT Owner Address" ;; "show_owner_address") echo "Show Owner Address" ;; "change_owner_address") echo "Change Owner Address" ;; "docker_not_installed") echo "Docker not installed" ;; "docker_compose_not_installed") echo "Docker Compose not installed" ;; "help_commands") echo "Help Commands" ;; "manual_commands") echo "Manual Commands" ;; esac ;; esac } # Check if Mawari node is installed is_mawari_installed() { if [[ -d ~/mawari ]] && docker ps -a --format "table {{.Names}}" | grep -q "mawari-node"; then return 0 else return 1 fi } # Check if node is running is_node_running() { if docker ps --format "table {{.Names}}" | grep -q "mawari-node"; then return 0 else return 1 fi } # Show system requirements show_requirements() { show_yellow "$(get_text "requirements")" show_white "$(get_text "cpu")" show_white "$(get_text "ram")" show_white "$(get_text "disk")" show_white "$(get_text "bandwidth")" show_white "$(get_text "ports")" echo "" } # Update system update_system() { show_info "$(get_text "updating")" # Suppress VM warnings and update system sudo apt update 2>/dev/null || true sudo apt upgrade -y 2>/dev/null || true show_success "Система обновлена / System updated" } # Install required packages install_packages() { show_info "$(get_text "installing_packages")" sudo apt-get install -yq apt-utils dialog 2>/dev/null PACKAGES=( curl git jq lz4 build-essential unzip make gcc ncdu cmake clang pkg-config libssl-dev libzmq3-dev libczmq-dev python3-pip protobuf-compiler dos2unix screen ) for PACKAGE in "${PACKAGES[@]}"; do echo "Установка $PACKAGE..." sudo apt install -y "$PACKAGE" if [ $? -eq 0 ]; then echo "$PACKAGE успешно установлен." else echo "Ошибка при установке $PACKAGE. Пропускаем..." fi done } # Install Docker install_docker() { show_info "$(get_text "installing_docker")" # Check if Docker is already installed if command -v docker &> /dev/null; then show_success "Docker уже установлен / Docker already installed" return 0 fi # Install Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh rm get-docker.sh # Add user to docker group sudo usermod -aG docker $USER show_success "Docker установлен / Docker installed" show_warning "Перезайдите в систему для применения изменений / Please log out and log back in to apply changes" } # Install Docker Compose install_docker_compose() { show_info "$(get_text "installing_docker_compose")" # Check if Docker Compose is already installed if command -v docker-compose &> /dev/null || docker compose version &> /dev/null; then show_success "Docker Compose уже установлен / Docker Compose already installed" return 0 fi # Install Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose show_success "Docker Compose установлен / Docker Compose installed" } # Setup owner address setup_owner_address() { show_info "$(get_text "setup_owner_address")" while true; do read -p "$(show_cyan "$(get_text "enter_owner_address")")" owner_address if [[ -n "$owner_address" ]] && [[ "$owner_address" =~ ^0x[a-fA-F0-9]{40}$ ]]; then export OWNER_ADDRESS="$owner_address" echo "$owner_address" > ~/mawari/owner_address show_success "Адрес владельца установлен: $owner_address / Owner address set: $owner_address" break else show_error "Неверный формат адреса. Введите корректный Ethereum адрес / Invalid address format. Enter valid Ethereum address" fi done } # Download and run Mawari image download_and_run_mawari() { show_info "$(get_text "downloading_image")" # Set Mawari image export MNTESTNET_IMAGE="us-east4-docker.pkg.dev/mawarinetwork-dev/mwr-net-d-car-uses4-public-docker-registry-e62e/mawari-node:latest" # Create mawari directory mkdir -p ~/mawari show_info "$(get_text "starting_node")" # Run Mawari node docker run --pull always -d \ --name mawari-node \ -v ~/mawari:/app/cache \ -e OWNERS_ALLOWLIST="$OWNER_ADDRESS" \ "$MNTESTNET_IMAGE" sleep 5 if is_node_running; then show_success "$(get_text "installation_complete")" show_success "$(get_text "node_running")" else show_error "Ошибка запуска ноды / Error starting node" exit 1 fi } # Start node start_node() { show_info "$(get_text "starting_node")" if is_node_running; then show_warning "Нода уже запущена / Node is already running" return 0 fi # Load owner address if exists if [[ -f ~/mawari/owner_address ]]; then export OWNER_ADDRESS=$(cat ~/mawari/owner_address) fi # Set Mawari image export MNTESTNET_IMAGE="us-east4-docker.pkg.dev/mawarinetwork-dev/mwr-net-d-car-uses4-public-docker-registry-e62e/mawari-node:latest" # Start container docker start mawari-node 2>/dev/null || \ docker run --pull always -d \ --name mawari-node \ -v ~/mawari:/app/cache \ -e OWNERS_ALLOWLIST="$OWNER_ADDRESS" \ "$MNTESTNET_IMAGE" sleep 3 if is_node_running; then show_success "$(get_text "node_started")" else show_error "Ошибка запуска ноды / Error starting node" fi } # Stop node stop_node() { show_info "🛑 Остановка ноды / Stopping node..." docker stop mawari-node 2>/dev/null || true if ! is_node_running; then show_success "$(get_text "node_stopped_msg")" else show_error "Ошибка остановки ноды / Error stopping node" fi } # Restart node restart_node() { show_info "🔄 $(get_text "restart")..." docker restart mawari-node 2>/dev/null || { stop_node sleep 2 start_node } sleep 3 if is_node_running; then show_success "$(get_text "node_restarted")" else show_error "Ошибка перезапуска ноды / Error restarting node" fi } # View logs view_logs() { if is_node_running; then show_info "📋 Логи Mawari Node / Mawari Node Logs:" show_yellow "═══════════════════════════════════════════════════════════════" docker logs mawari-node --tail 100 show_yellow "═══════════════════════════════════════════════════════════════" echo "" show_info "Для просмотра логов в реальном времени используйте: / For real-time log viewing use:" show_cyan "docker logs mawari-node -f" else show_error "Нода не запущена / Node is not running" fi } # Show owner address show_owner_address() { if [[ -f ~/mawari/owner_address ]]; then owner_address=$(cat ~/mawari/owner_address) show_success "$(get_text "owner_address"):" show_cyan "$owner_address" else show_error "Адрес владельца не найден / Owner address not found" fi } # Change owner address change_owner_address() { show_info "Изменить адрес владельца / Change owner address" if is_node_running; then show_warning "Остановите ноду перед изменением адреса / Stop node before changing address" return 1 fi setup_owner_address show_success "Адрес владельца изменен / Owner address changed" } # Show help commands show_help_commands() { show_info "$(get_text "help_commands")" echo "" show_white "Основные команды Docker / Main Docker commands:" show_cyan "• docker ps -a # Показать все контейнеры / Show all containers" show_cyan "• docker logs mawari-node -f # Логи в реальном времени / Real-time logs" show_cyan "• docker restart mawari-node # Перезапуск ноды / Restart node" show_cyan "• docker stop mawari-node # Остановка ноды / Stop node" show_cyan "• docker start mawari-node # Запуск ноды / Start node" echo "" show_white "Полезные команды / Useful commands:" show_cyan "• docker system prune # Очистка неиспользуемых ресурсов / Clean unused resources" show_cyan "• docker images # Показать образы / Show images" show_cyan "• docker rmi # Удалить образ / Remove image" echo "" show_white "Файлы конфигурации / Configuration files:" show_cyan "• ~/mawari/ # Директория кэша / Cache directory" show_cyan "• ~/mawari/owner_address # Адрес владельца / Owner address" } # Remove Mawari node remove_mawari() { show_warning "⚠️ $(get_text "remove_confirm")" read -p "$(show_cyan "$(get_text "yes_no")")" confirm_remove if [[ $confirm_remove =~ ^[Yy]$ ]]; then show_info "$(get_text "removing")" # Stop and remove container docker stop mawari-node 2>/dev/null || true docker rm mawari-node 2>/dev/null || true # Remove directory rm -rf ~/mawari show_success "$(get_text "removed")" else show_warning "Удаление отменено / Removal cancelled" fi } # Main installation function main_installation() { if is_mawari_installed; then show_warning "$(get_text "already_installed")" read -p "$(show_cyan "$(get_text "press_enter")")" return fi show_requirements read -p "$(show_cyan "$(get_text "continue") $(get_text "yes_no")")" continue_install if [[ ! $continue_install =~ ^[Yy]$ ]]; then show_warning "Установка отменена / Installation cancelled" return fi show_info "$(get_text "installing")" update_system install_packages install_docker install_docker_compose setup_owner_address download_and_run_mawari echo "" show_warning "Важно / Important:" show_white "• Нода синхронизируется с сетью Mawari / Node is syncing with Mawari network" show_white "• Убедитесь, что у вас есть NFT для участия / Make sure you have NFT to participate" show_white "• Используйте команды управления для мониторинга / Use management commands for monitoring" echo "" read -p "$(show_cyan "$(get_text "press_enter")")" } # Management menu show_management_menu() { while true; do show_logo show_green "$(get_text "manage")" echo "" show_white "1) $(get_text "logs")" show_white "2) $(get_text "restart")" show_white "3) $(get_text "stop")" show_white "4) $(get_text "start")" show_white "5) $(get_text "show_owner_address")" show_white "6) $(get_text "change_owner_address")" show_white "7) $(get_text "help_commands")" show_white "0) $(get_text "back")" echo "" read -p "$(show_cyan "Выбор / Choice [0-7]: ")" choice case $choice in 1) view_logs echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 2) restart_node echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 3) stop_node echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 4) start_node echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 5) show_owner_address echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 6) change_owner_address echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 7) show_help_commands echo "" read -p "$(show_yellow "$(get_text "press_enter")")" ;; 0) return ;; *) show_error "$(get_text "invalid_choice")" sleep 2 ;; esac done } # Main menu show_main_menu() { while true; do show_logo show_green "$(get_text "main_menu")" echo "" show_white "1) 🚀 $(get_text "install")" show_white "2) ⚙️ $(get_text "manage")" show_white "3) 🗑️ $(get_text "remove")" show_white "0) ❌ $(get_text "exit")" echo "" read -p "$(show_cyan "Выбор / Choice [0-3]: ")" choice case $choice in 1) main_installation ;; 2) if is_mawari_installed; then show_management_menu else show_error "$(get_text "not_installed")" read -p "$(show_cyan "$(get_text "press_enter")")" fi ;; 3) if is_mawari_installed; then remove_mawari read -p "$(show_cyan "$(get_text "press_enter")")" else show_error "$(get_text "not_installed")" read -p "$(show_cyan "$(get_text "press_enter")")" fi ;; 0) show_success "До свидания! / Goodbye!" exit 0 ;; *) show_error "$(get_text "invalid_choice")" sleep 2 ;; esac done } # Main function main() { select_language show_main_menu } # Run main function main "$@"