#!/bin/bash
# ========== install_remnanode.sh ==========
# Установка RemnaNode с генерацией SSL-сертификатов (RSA 4096)
# - проверка существующих сертификатов (срок > 30 дней, длина 4096 → пропуск)
# - генерация RSA 4096 сертификатов для основного домена через acme.sh
# - синхронизация сертификатов для Hysteria2 в /dev/shm
# - создание каталогов
# - создание единого nginx.conf
# - настройка автоматического обновления geo-файлов
# - создание docker-compose.yml (БЕЗ ЗАПУСКА)

# ---------- ЛОГИРОВАНИЕ ----------
log_info() {
    echo "ℹ️  [INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_success() {
    echo "✅ [SUCCESS] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
    echo "❌ [ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
}
log_warning() {
    echo "⚠️  [WARNING] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_step() {
    echo ""
    echo "📋 [STEP] $(date '+%Y-%m-%d %H:%M:%S') - $1"
    echo "=================================================="
}

# ---------- ПРОВЕРКА ROOT ----------
if [[ $EUID -ne 0 ]]; then
    log_error "Модуль install_remnanode.sh должен запускаться с правами root"
    exit 1
fi

# ---------- ПРОВЕРКА ПЕРЕМЕННОЙ LOCATION ----------
if [[ -z "$LOCATION" ]]; then
    log_error "Переменная LOCATION не установлена. Запустите главный скрипт и введите локацию."
    exit 1
fi

FULL_DOMAIN="${LOCATION}.8rmdgz.ru"
CERT_DIR="/opt/cert"

log_info "Установка RemnaNode для локации: $LOCATION"
log_info "Домен: $FULL_DOMAIN"

# ============================================================
# 1. ПРОВЕРКА И ГЕНЕРАЦИЯ SSL-СЕРТИФИКАТОВ (RSA 4096)
# ============================================================
log_step "Проверка SSL-сертификатов для $FULL_DOMAIN"

mkdir -p "$CERT_DIR"
log_success "Каталог $CERT_DIR создан/проверен"

# Пути к сертификатам
PRIVKEY_PATH="$CERT_DIR/${FULL_DOMAIN}_privkey.key"
FULLCHAIN_PATH="$CERT_DIR/${FULL_DOMAIN}_fullchain.pem"

# Функция проверки срока действия сертификата
check_cert_valid() {
    local cert_path="$1"
    local days_threshold=30
    
    if [[ ! -f "$cert_path" ]]; then
        return 1
    fi
    
    local expiry_date=$(openssl x509 -enddate -noout -in "$cert_path" 2>/dev/null | cut -d= -f2)
    if [[ -z "$expiry_date" ]]; then
        return 1
    fi
    
    local expiry_ts=$(date -d "$expiry_date" +%s 2>/dev/null)
    if [[ -z "$expiry_ts" || "$expiry_ts" -eq 0 ]]; then
        return 1
    fi
    
    local current_ts=$(date +%s)
    local days_left=$(( (expiry_ts - current_ts) / 86400 ))
    
    log_info "Сертификат истекает через $days_left дней"
    
    if [[ $days_left -gt $days_threshold ]]; then
        return 0
    else
        return 1
    fi
}

# Проверяем наличие, длину ключа и валидность сертификата
SSL_SKIPPED=false
if [[ -f "$PRIVKEY_PATH" && -f "$FULLCHAIN_PATH" ]]; then
    log_info "Сертификаты найдены в $CERT_DIR"
    
    # Проверяем длину ключа (должна быть 4096)
    KEY_LENGTH=$(openssl rsa -in "$PRIVKEY_PATH" -text -noout 2>/dev/null | grep "Private-Key" | grep -oE '[0-9]+' | head -1)
    if [[ -n "$KEY_LENGTH" && "$KEY_LENGTH" -lt 4096 ]]; then
        log_warning "Длина ключа $KEY_LENGTH бит (меньше 4096), требуется перегенерация"
        SSL_SKIPPED=false
    elif check_cert_valid "$FULLCHAIN_PATH"; then
        log_success "Сертификат валиден (срок > 30 дней, длина $KEY_LENGTH бит), пропускаем генерацию"
        SSL_SKIPPED=true
    else
        log_warning "Сертификат истекает скоро или уже истёк, обновляем..."
        SSL_SKIPPED=false
    fi
else
    log_info "Сертификаты не найдены, выполняем генерацию"
    SSL_SKIPPED=false
fi

# Генерация сертификата (если не пропущена)
if [[ "$SSL_SKIPPED" != "true" ]]; then
    ACME_SH="$HOME/.acme.sh/acme.sh"
    if [[ ! -f "$ACME_SH" ]]; then
        log_step "Установка acme.sh с email root@8rmdgz.ru"
        curl https://get.acme.sh | sh -s email=root@8rmdgz.ru
        if [[ $? -eq 0 ]]; then
            log_success "acme.sh успешно установлен"
        else
            log_error "Ошибка при установке acme.sh"
            exit 1
        fi
    else
        log_info "acme.sh уже установлен в $ACME_SH"
    fi

    log_step "Переключение CA на Let's Encrypt"
    "$ACME_SH" --set-default-ca --server letsencrypt
    if [[ $? -eq 0 ]]; then
        log_success "CA изменён на Let's Encrypt"
    else
        log_error "Не удалось переключить CA"
        exit 1
    fi

    # Проверка порта 80
    if ss -tln | grep -q ':80 '; then
        log_error "Порт 80 занят. Освободите порт для standalone-режима."
        exit 1
    fi
    log_info "Порт 80 свободен"

    log_step "Выпуск сертификата для $FULL_DOMAIN (RSA 4096)"

    # Генерация RSA 4096
    "$ACME_SH" --issue --standalone -d "$FULL_DOMAIN" \
        --key-file "$PRIVKEY_PATH" \
        --fullchain-file "$FULLCHAIN_PATH" \
        --keylength 4096 \
        --force

    if [[ $? -eq 0 ]]; then
        log_success "Сертификат для $FULL_DOMAIN получен (RSA 4096)"
    else
        log_error "Ошибка при получении сертификата для $FULL_DOMAIN"
        exit 1
    fi

    log_success "Сертификаты сохранены в $CERT_DIR"

    # Удаление cron-задачи acme.sh
    log_step "Удаление стандартной cron-задачи acme.sh"
    if crontab -l 2>/dev/null | grep -q "acme.sh"; then
        "$ACME_SH" --uninstall-cronjob
        log_success "Cron-задача acme.sh удалена"
    else
        log_info "Cron-задача acme.sh не найдена"
    fi

    # Создание systemd-таймера для автообновления (каждые 30 дней)
    log_step "Настройка systemd-таймера для автообновления каждые 30 дней"

    SERVICE_FILE="/etc/systemd/system/acme-renew.service"
    TIMER_FILE="/etc/systemd/system/acme-renew.timer"

    cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Renew Let's Encrypt certificates using acme.sh
After=network.target

[Service]
Type=oneshot
ExecStart=/root/.acme.sh/acme.sh --cron --home /root/.acme.sh
User=root
Group=root
StandardOutput=journal
StandardError=journal
EOF

    cat > "$TIMER_FILE" << EOF
[Unit]
Description=Timer for acme-renew service (every 30 days)
Requires=acme-renew.service

[Timer]
OnUnitActiveSec=30d
Unit=acme-renew.service

[Install]
WantedBy=timers.target
EOF

    chmod 644 "$SERVICE_FILE" "$TIMER_FILE"
    systemctl daemon-reload
    systemctl enable acme-renew.timer
    systemctl start acme-renew.timer

    log_success "Systemd-таймер создан: acme-renew.timer (интервал 30 дней)"
else
    log_info "Используем существующие сертификаты (RSA 4096), автообновление уже настроено"
fi

# ============================================================
# 2. УСТАНОВКА REMNANODE
# ============================================================
log_step "Установка RemnaNode"

# ---------- СОЗДАНИЕ КАТАЛОГОВ ----------
mkdir -p /opt/nginx
mkdir -p /opt/nginx/html
mkdir -p /opt/log/nginx
mkdir -p /opt/log/remnanode
mkdir -p /opt/geofiles

log_success "Все каталоги созданы"

# ---------- ФАЙЛ /ETC/LOGROTATE.D/REMNANODE ----------
log_step "Создание /etc/logrotate.d/remnanode"
cat > /etc/logrotate.d/remnanode << 'EOF'
/opt/log/nginx/*.log
/opt/log/remnanode/*.log
{
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    dateext
    create 0640 root root
}
EOF
cat > /etc/logrotate.d/nginx << 'EOF'
/opt/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}
EOF
log_success "Конфигурация LogRotate создана"

# ---------- ЗАГРУЗКА И РАСПАКОВКА ШАБЛОНА САЙТА ----------
log_step "Загрузка и распаковка шаблона сайта в /opt/nginx/html"

TEMPLATE_URL="https://cloud.free-surf.ru/script/template.tar.gz"
TEMP_DIR=$(mktemp -d)

cd "$TEMP_DIR" || exit 1

HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$TEMPLATE_URL" 2>/dev/null)

if [[ "$HTTP_CODE" == "200" ]]; then
    log_info "Шаблон найден, скачиваю..."
    
    if command -v curl &> /dev/null; then
        curl -L -o template.tar.gz "$TEMPLATE_URL" --fail --silent --show-error
    elif command -v wget &> /dev/null; then
        wget -q -O template.tar.gz "$TEMPLATE_URL"
    else
        log_error "Ни curl, ни wget не доступны"
        exit 1
    fi
    
    if [[ -f template.tar.gz && -s template.tar.gz ]]; then
        tar -xzf template.tar.gz -C /opt/nginx/html/ 2>/dev/null
        if [[ $? -eq 0 ]]; then
            log_success "Шаблон успешно распакован в /opt/nginx/html"
        else
            log_warning "Ошибка при распаковке шаблона, создаю заглушку"
            cat > /opt/nginx/html/index.html << 'HTML'
<!DOCTYPE html>
<html>
<head><title>RemnaNode</title></head>
<body><h1>RemnaNode is running</h1></body>
</html>
HTML
            log_success "Создана заглушка index.html"
        fi
    else
        log_warning "Скачанный файл пустой или повреждён, создаю заглушку"
        cat > /opt/nginx/html/index.html << 'HTML'
<!DOCTYPE html>
<html>
<head><title>RemnaNode</title></head>
<body><h1>RemnaNode is running</h1></body>
</html>
HTML
        log_success "Создана заглушка index.html"
    fi
else
    log_warning "Шаблон не найден по URL: $TEMPLATE_URL (HTTP $HTTP_CODE), создаю заглушку"
    cat > /opt/nginx/html/index.html << 'HTML'
<!DOCTYPE html>
<html>
<head><title>RemnaNode</title></head>
<body><h1>RemnaNode is running</h1></body>
</html>
HTML
    log_success "Создана заглушка index.html"
fi

rm -rf "$TEMP_DIR"

# ---------- ФАЙЛ NGINX.CONF ----------
log_step "Создание /opt/nginx/nginx.conf"

cat > /opt/nginx/nginx.conf << 'EOF'
user  www-data;
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server_names_hash_bucket_size 64;

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ""      close;
    }

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    sendfile        on;
    keepalive_timeout  65;

    # Основной сервер
    server {
        server_name ${FULL_DOMAIN};
        listen unix:/dev/shm/nginx.sock ssl proxy_protocol;
        http2 on;

        ssl_certificate "/opt/cert/${FULL_DOMAIN}_fullchain.pem";
        ssl_certificate_key "/opt/cert/${FULL_DOMAIN}_privkey.key";
        ssl_trusted_certificate "/opt/cert/${FULL_DOMAIN}_fullchain.pem";

        root /opt/nginx/html;
        index index.html;
        add_header X-Robots-Tag "noindex, nofollow, noarchive, nosnippet, noimageindex" always;
    }

    # Дефолтный сервер для отбраковки
    server {
        listen unix:/dev/shm/nginx.sock ssl proxy_protocol default_server;
        server_name _;
        add_header X-Robots-Tag "noindex, nofollow, noarchive, nosnippet, noimageindex" always;
        ssl_reject_handshake on;
        return 444;
    }
}
EOF

sed -i "s/\${FULL_DOMAIN}/${FULL_DOMAIN}/g" /opt/nginx/nginx.conf
log_success "nginx.conf создан"

# ---------- НАСТРОЙКА GEO-ФАЙЛОВ ----------
log_step "Настройка автоматического обновления geo-файлов"

UPDATE_SCRIPT="/opt/geofiles/update_geofiles.sh"
GEO_LOG_FILE="/var/log/geofiles_update.log"

cat > "$UPDATE_SCRIPT" << 'EOF'
#!/bin/bash
GEO_DIR="/opt/geofiles"
LOG_FILE="/var/log/geofiles_update.log"

log_info() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - [INFO] $1" >> "$LOG_FILE"
}
log_success() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - [SUCCESS] $1" >> "$LOG_FILE"
}
log_error() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - [ERROR] $1" >> "$LOG_FILE"
}

echo "==================================================" >> "$LOG_FILE"
log_info "Начало обновления geo-файлов"

if ! command -v wget &> /dev/null; then
    log_error "wget не установлен"
    exit 1
fi

if wget -q -O "$GEO_DIR/geoip.dat.tmp" "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"; then
    mv "$GEO_DIR/geoip.dat.tmp" "$GEO_DIR/geoip.dat"
    chmod 644 "$GEO_DIR/geoip.dat"
    log_success "geoip.dat обновлен"
else
    log_error "Не удалось скачать geoip.dat"
    rm -f "$GEO_DIR/geoip.dat.tmp"
    exit 1
fi

if wget -q -O "$GEO_DIR/geosite.dat.tmp" "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"; then
    mv "$GEO_DIR/geosite.dat.tmp" "$GEO_DIR/geosite.dat"
    chmod 644 "$GEO_DIR/geosite.dat"
    log_success "geosite.dat обновлен"
else
    log_error "Не удалось скачать geosite.dat"
    rm -f "$GEO_DIR/geosite.dat.tmp"
    exit 1
fi

log_success "Обновление geo-файлов завершено"
echo "==================================================" >> "$LOG_FILE"
exit 0
EOF

chmod +x "$UPDATE_SCRIPT"
log_success "Скрипт обновления geo-файлов создан"

cat > /etc/systemd/system/geofiles-update.service << EOF
[Unit]
Description=Update geoip and geosite files
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=$UPDATE_SCRIPT
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

cat > /etc/systemd/system/geofiles-update.timer << EOF
[Unit]
Description=Run geofiles update daily at 3 AM
Requires=geofiles-update.service

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
EOF

cat > /etc/logrotate.d/geofiles << EOF
/var/log/geofiles_update.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}
EOF

systemctl daemon-reload
systemctl enable geofiles-update.timer
systemctl start geofiles-update.timer
log_success "Systemd таймер для geo-файлов активирован"

if [[ ! -f "/opt/geofiles/geoip.dat" || ! -f "/opt/geofiles/geosite.dat" ]]; then
    log_info "Первоначальная загрузка geo-файлов..."
    bash "$UPDATE_SCRIPT"
    if [[ $? -eq 0 ]]; then
        log_success "Geo-файлы успешно загружены"
    else
        log_warning "Проблема при загрузке geo-файлов, проверьте лог: $GEO_LOG_FILE"
    fi
else
    log_info "Geo-файлы уже существуют, пропускаем загрузку"
fi

# ---------- ФАЙЛ DOCKER-COMPOSE.YML ----------
log_step "Создание /opt/docker-compose.yml"

cat > /opt/docker-compose.yml << 'EOF'
x-common: &common
  ulimits:
    nofile:
      soft: 1048576
      hard: 1048576
  restart: always

x-logging: &logging
  logging:
    driver: json-file
    options:
      max-size: 100m
      max-file: 5

services:
  remnawave-nginx:
    image: nginx:1.28
    container_name: remnawave-nginx
    hostname: remnawave-nginx
    <<: [*common, *logging]
    network_mode: host
    volumes:
      - /opt/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - /opt/cert:/opt/cert:ro
      - /opt/log/nginx:/opt/log/nginx:rw
      - /opt/nginx/html:/opt/nginx/html:ro
      - /dev/shm:/dev/shm:rw
    command: sh -c 'rm -f /dev/shm/nginx.sock && exec nginx -g "daemon off;"'

  remnanode:
    image: remnawave/node:latest
    container_name: remnanode
    hostname: remnanode
    <<: [*common, *logging]
    network_mode: host
    cap_add:
      - NET_ADMIN
    environment:
      - NODE_PORT=9873
      - SECRET_KEY=eyJub2RlQ2VydFBlbSI6Ii0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJQmhqQ0NBUzJnQXdJQkFnSUhBWGNpRW5hRWh6QUtCZ2dxaGtqT1BRUURBakFpTVNBd0hnWURWUVFERXhkV1xuZGxwelNqaEhRM2RHUW5KYWVtWklUVWhqYzNwTWVEQWVGdzB5TmpBeU1qY3hOekU1TWpoYUZ3MHlPVEF5TWpjeFxuTnpFNU1qaGFNRGd4TmpBMEJnTlZCQU1UTFVSQlp6Sm9ZM2hSVURGbk5EaEVhSFJDYlVOTWVERktUbUZMUjAxNFxuUVdzM09ISm9ZVEJZUzJGRU4wdHViVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCTkFCU1ZOalxuYmo5WGhWTmQvajdUV0ZkRzMyR3RUTWUxT2plcVZ0akRnVy8zOXVYRi9iS29oa2FPN1FLd2V6UTUybHRnU3Q4Z1xuU2xUU0ovVEtGWXlIVDhLak9EQTJNQXdHQTFVZEV3RUIvd1FDTUFBd0RnWURWUjBQQVFIL0JBUURBZ1dnTUJZR1xuQTFVZEpRRUIvd1FNTUFvR0NDc0dBUVVGQndNQk1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lBck9mOU85L1JJNFxucm5XOGpLeS9kekZZN2VJQ3pCaWtBaTMzWjlVZExBcnVBaUE5TGVGdnJKZ0tMNTJSWFIrRjU1S1BEYnVJcEVoZ1xuK0JPNEtGZGNuVmdmRFE9PVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSIsIm5vZGVLZXlQZW0iOiItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cbk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ0RWNGw1U0lrTE5uMWZMRE9cblpUV1h3c010V1BCZ0FLb0xaYXNsM1lRVmNVS2hSQU5DQUFUUUFVbFRZMjQvVjRWVFhmNCswMWhYUnQ5aHJVekhcbnRUbzNxbGJZdzRGdjkvYmx4ZjJ5cUlaR2p1MENzSHMwT2RwYllFcmZJRXBVMGlmMHloV01oMC9DXG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tIiwiY2FDZXJ0UGVtIjoiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlCVlRDQi9LQURBZ0VDQWdFQk1Bb0dDQ3FHU000OUJBTUNNQ0l4SURBZUJnTlZCQU1URjFaMlduTktPRWREXG5kMFpDY2xwNlpraE5TR056ZWt4NE1CNFhEVEkyTURJeU56RXpNalF5TkZvWERUTTJNREl5TnpFek1qUXlORm93XG5JakVnTUI0R0ExVUVBeE1YVm5aYWMwbzRSME4zUmtKeVducG1TRTFJWTNONlRIZ3dXVEFUQmdjcWhrak9QUUlCXG5CZ2dxaGtqT1BRTUJCd05DQUFSN1B1c3FETTE4dHpGUmI3NldScS9MTFdwUEkrVlFpQ0hRL0hqcExNR05ocVN3XG5hWk01NHhkRFJjOFlRQnI0RFBzTWRLVm1RdEZYc3dPbDhlUk5nV3dYb3lNd0lUQVBCZ05WSFJNQkFmOEVCVEFEXG5BUUgvTUE0R0ExVWREd0VCL3dRRUF3SUNoREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUVBcGdsbi84RXZJSzF2XG44aDdMZXdWaklxVWRHL1owQlY4NGFteENYQWJxeFpRQ0lDaFJML2ZCZWRpVkVJYXlGYzRmazRwSFU2b1d0dnhjXG5Tb1Vjb0hxcWliS2Rcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iLCJqd3RQdWJsaWNLZXkiOiItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF6UzFKbEhwMllUNGNUa1c4N1J0S1xuT2lmNG4yNXAxRnhNMEVxMlNmSTlQMnhNQ0t2VmRCY2ZtaURKVkVpVHcvVU1RdlVEdEl1Q0pjZmRNeGUwTWdpN1xuNDRDWHE5L2VuTE9hVU91K2w3SWhGYzk1eHRudGxINmR1ZXdoamNwcStCVjFIQWxWY1A2UFg3akVBZmdzZW9TeFxubldtai9iZkhTd2cyZWs2dTZoZGhiY0JPWVViaXh4bVdQZnI0aUhkV2MxWFU0d2VqU2R4bi9DVXhpUVprL041YlxuYVlIN2JNd0RLekJjUno4Ti9aYlUwYVNIYmRlSEZFbStnMThqVC9EOCtaanNLamFZdHlMaXF5T1ZFV1hOQXVLeVxuUkZsNGcrNktXeFJEUmdPLzlWMnkxMGo1M0c5R3BxeXJNdWlwemhMWmEzRnZvV3orMGo5WndSL0lkbzBML1RCWFxuUFFJREFRQUJcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIn0=
    volumes:
      - /dev/shm:/dev/shm:rw
      - /opt/log/remnanode:/var/log/remnanode:rw
      - /opt/geofiles/geoip.dat:/usr/local/share/xray/geoip.dat
      - /opt/geofiles/geosite.dat:/usr/local/share/xray/geosite.dat
    healthcheck:
      test: ["CMD-SHELL", "test -S /dev/shm/xrxh.socket || exit 1"]
      interval: 5s
      timeout: 3s
      retries: 30
      start_period: 30s
EOF
log_success "docker-compose.yml создан"

# ---------- СИНХРОНИЗАЦИЯ СЕРТИФИКАТОВ В /DEV/SHM ----------
log_step "Синхронизация сертификатов в /dev/shm"

# Принудительно копируем сертификаты в /dev/shm
cp -f "$CERT_DIR/${FULL_DOMAIN}_fullchain.pem" /dev/shm/hysteria_cert.pem
cp -f "$CERT_DIR/${FULL_DOMAIN}_privkey.key" /dev/shm/hysteria_key.pem
chmod 644 /dev/shm/hysteria_*.pem
log_success "Сертификаты скопированы в /dev/shm"

# ---------- НАСТРОЙКА CRON ДЛЯ СИНХРОНИЗАЦИИ ----------
log_step "Настройка cron для автоматической синхронизации сертификатов"

# Формируем реальные пути для cron (без переменных)
CERT_PATH_REAL="$CERT_DIR/${FULL_DOMAIN}_fullchain.pem"
KEY_PATH_REAL="$CERT_DIR/${FULL_DOMAIN}_privkey.key"

# Удаляем старые записи о hysteria
crontab -l 2>/dev/null | grep -v "hysteria_cert.pem" | crontab - 2>/dev/null || true

# Добавляем новые записи с реальными путями
(crontab -l 2>/dev/null; echo "@reboot sleep 10 && cp -f $CERT_PATH_REAL /dev/shm/hysteria_cert.pem && cp -f $KEY_PATH_REAL /dev/shm/hysteria_key.pem && chmod 644 /dev/shm/hysteria_*.pem && sleep 15 && docker restart remnanode") | crontab -
(crontab -l 2>/dev/null; echo "0 4 * * * cp -f $CERT_PATH_REAL /dev/shm/hysteria_cert.pem && cp -f $KEY_PATH_REAL /dev/shm/hysteria_key.pem && chmod 644 /dev/shm/hysteria_*.pem && docker restart remnanode") | crontab -
(crontab -l 2>/dev/null; echo "30 4 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh && cp -f $CERT_PATH_REAL /dev/shm/hysteria_cert.pem && cp -f $KEY_PATH_REAL /dev/shm/hysteria_key.pem && chmod 644 /dev/shm/hysteria_*.pem && docker restart remnanode") | crontab -

log_success "Cron для сертификатов настроен с реальными путями:"
log_info "  Сертификат: $CERT_PATH_REAL"
log_info "  Ключ: $KEY_PATH_REAL"
echo ""
crontab -l | grep hysteria || echo " (записи добавлены)"

# ---------- ФИНАЛЬНЫЙ ВЫВОД ----------
log_success "Модуль install_remnanode.sh выполнен успешно"
echo ""
echo "=================================================="
echo "✅ Локация          : $LOCATION"
echo "✅ Домен            : $FULL_DOMAIN"
echo "✅ Порт ноды        : 9873"
echo "✅ SSL сертификаты  : $CERT_DIR/ (RSA 4096)"
if [[ "$SSL_SKIPPED" == "true" ]]; then
    echo "   (использованы существующие, срок > 30 дней, длина 4096)"
else
    echo "   (сгенерированы заново, RSA 4096)"
fi
echo "✅ Hysteria сертификаты : /dev/shm/hysteria_*.pem"
echo ""
echo "📁 Созданные каталоги:"
echo "  - /opt/nginx                - основной каталог nginx"
echo "  - /opt/nginx/html           - веб-файлы"
echo "  - /opt/log/nginx            - логи nginx"
echo "  - /opt/log/remnanode        - логи remnanode"
echo "  - /opt/geofiles             - geo-файлы (автообновление)"
echo "  - $CERT_DIR                 - SSL сертификаты"
echo ""
echo "📄 Созданные файлы:"
echo "  - /opt/nginx/nginx.conf"
echo "  - /opt/docker-compose.yml"
echo "  - /etc/logrotate.d/remnanode"
echo "  - /etc/logrotate.d/geofiles"
echo "  - /opt/geofiles/update_geofiles.sh"
echo "  - /etc/systemd/system/acme-renew.{service,timer}"
echo "  - /etc/systemd/system/geofiles-update.{service,timer}"
echo ""
echo "🔄 Автообновление:"
echo "  - SSL сертификаты (RSA 4096): каждые 30 дней (acme-renew.timer)"
echo "  - Geo-файлы: ежедневно в 3:00 (geofiles-update.timer)"
echo "  - Hysteria сертификаты: ежедневно в 4:00 (cron)"
echo ""
echo "📊 Полезные команды:"
echo "  - Запуск контейнеров:       docker compose -f /opt/docker-compose.yml up -d"
echo "  - Просмотр логов:           docker compose -f /opt/docker-compose.yml logs -f"
echo "  - Перезапуск контейнеров:   docker compose -f /opt/docker-compose.yml restart"
echo "  - Остановка контейнеров:    docker compose -f /opt/docker-compose.yml down"
echo "  - Ручное обновление geo:    systemctl start geofiles-update"
echo "  - Ручное обновление SSL:    /root/.acme.sh/acme.sh --cron"
echo "  - Проверка Hysteria сертов: ls -la /dev/shm/hysteria_*.pem"
echo "=================================================="
