#!/bin/bash # Скрипт запуска для контейнера Phantom Protocol set -e # Функция логирования log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # Функция для генерации конфигурации generate_config() { local node_name="${PHANTOM_NODE_NAME:-phantom-$(hostname)}" local config_file="/home/phantom/config/${node_name}.conf" log "Генерация конфигурации для узла: $node_name" # Вызов скрипта генерации конфигурации /usr/local/bin/generate-config.sh "$node_name" "$config_file" echo "$config_file" } # Функция для настройки сети setup_network() { log "Настройка сетевых интерфейсов..." # Проверка наличия TUN интерфейса if [ ! -c /dev/net/tun ]; then log "ПРЕДУПРЕЖДЕНИЕ: /dev/net/tun недоступен. Туннелирование может не работать." log "Запустите контейнер с --device /dev/net/tun или --privileged" fi # Настройка iptables если есть права if [ "$PHANTOM_SETUP_IPTABLES" = "true" ]; then log "Настройка правил iptables..." # Здесь можно добавить правила iptables для анонимизации fi } # Функция для проверки зависимостей check_dependencies() { log "Проверка зависимостей..." # Проверка наличия phantomd if ! command -v phantomd >/dev/null 2>&1; then log "ОШИБКА: phantomd не найден" exit 1 fi # Проверка OpenSSL if ! command -v openssl >/dev/null 2>&1; then log "ОШИБКА: OpenSSL не найден" exit 1 fi log "Все зависимости найдены" } # Функция для ожидания других узлов wait_for_peers() { if [ -n "$PHANTOM_WAIT_FOR_PEERS" ]; then log "Ожидание доступности узлов: $PHANTOM_WAIT_FOR_PEERS" IFS=',' read -ra PEERS <<< "$PHANTOM_WAIT_FOR_PEERS" for peer in "${PEERS[@]}"; do log "Ожидание узла: $peer" while ! nc -z "$peer" 8080 2>/dev/null; do sleep 2 done log "Узел $peer доступен" done fi } # Функция для запуска phantomd start_phantomd() { local config_file="$1" log "Запуск Phantom Protocol с конфигурацией: $config_file" # Установка переменных окружения export PHANTOM_CONFIG="$config_file" export PHANTOM_LOG_LEVEL="${PHANTOM_LOG_LEVEL:-INFO}" export PHANTOM_DATA_DIR="/home/phantom/data" # Запуск phantomd exec phantomd -h "$(basename "$config_file" .conf)" } # Основная функция main() { log "=== Запуск контейнера Phantom Protocol ===" # Вывод информации о контейнере log "Имя хоста: $(hostname)" log "IP адрес: $(hostname -i 2>/dev/null || echo 'неизвестен')" log "Пользователь: $(whoami)" # Проверка зависимостей check_dependencies # Настройка сети setup_network # Генерация конфигурации если нужно local config_file if [ -n "$PHANTOM_CONFIG_FILE" ] && [ -f "$PHANTOM_CONFIG_FILE" ]; then config_file="$PHANTOM_CONFIG_FILE" log "Использование существующей конфигурации: $config_file" else config_file=$(generate_config) fi # Ожидание других узлов wait_for_peers # Запуск приложения case "$1" in phantomd) start_phantomd "$config_file" ;; bash|sh) log "Запуск интерактивной оболочки" exec "$@" ;; *) log "Запуск пользовательской команды: $*" exec "$@" ;; esac } # Обработка сигналов для корректного завершения trap 'log "Получен сигнал завершения, останавливаем сервисы..."; exit 0' SIGTERM SIGINT # Запуск основной функции main "$@"