#!/bin/bash
# ========== install_remnanode.sh ==========
# Подготовка окружения для RemnaNode:
# - создание каталогов
# - загрузка и распаковка шаблона сайта
# - создание конфигурационных файлов nginx и docker-compose.yml
# - настройка автоматического обновления geo-файлов (geoip.dat и geosite.dat)

# ---------- ЛОГИРОВАНИЕ ----------
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"
log_info "Подготовка RemnaNode для локации: $LOCATION"
log_info "Домен: $FULL_DOMAIN"

# ---------- СОЗДАНИЕ КАТАЛОГОВ ----------
log_step "Создание необходимых каталогов"
mkdir -p /opt/nginx
mkdir -p /opt/nginx/conf.d
mkdir -p /opt/nginx/html
mkdir -p /opt/log/nginx
mkdir -p /opt/log/remnanode
mkdir -p /opt/3x-ui/db
mkdir -p /etc/nginx/ssl
mkdir -p /opt/geofiles

log_success "Все каталоги созданы (включая /opt/geofiles)"

# ---------- ФАЙЛ /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               # хранить только 7 старых файлов (1 неделю)
    missingok              # если файла нет — не выдавать ошибку
    notifempty             # не вращать пустые файлы
    compress               # сжимать старые логи (.gz)
    delaycompress          # сжимать не текущий, а предыдущий лог
    copytruncate           # безопасно для сервисов, которые пишут в лог
    dateext                # добавлять дату к старым файлам
    create 0640 root root  # создавать новые файлы с правами 0640
}
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
if command -v curl &> /dev/null; then
    curl -L -o template.tar.gz "$TEMPLATE_URL"
elif command -v wget &> /dev/null; then
    wget -O template.tar.gz "$TEMPLATE_URL"
else
    log_error "Ни curl, ни wget не доступны. Невозможно скачать шаблон."
    exit 1
fi

if [[ ! -f template.tar.gz ]]; then
    log_error "Не удалось скачать шаблон."
    exit 1
fi

tar -xzf template.tar.gz -C /opt/nginx/html/
if [[ $? -eq 0 ]]; then
    log_success "Шаблон успешно распакован в /opt/nginx/html"
else
    log_error "Ошибка при распаковке шаблона."
    exit 1
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       mime.types;
    default_type  application/octet-stream;
    server_names_hash_bucket_size 64;
    log_format main '$remote_addr [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'rt=$request_time '
                    'urt=$upstream_response_time '
                    'ua="$upstream_addr" '
                    'xff="$http_x_forwarded_for"'
                    '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" "$http_user_agent"';

    log_format grpc '$proxy_protocol_addr '
                    '[$time_local] '
                    '"$request" '
                    'http_status=$status '
                    'upstream_status=$upstream_status '
                    'rt=$request_time '
                    'urt=$upstream_response_time '
                    'upstream=$upstream_addr '
                    '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" "$http_user_agent"';
   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;
   include /etc/nginx/conf.d/*.conf;
}
EOF
log_success "nginx.conf создан"

# ---------- ФАЙЛ КОНФИГУРАЦИИ NGINX ДЛЯ ОСНОВНОГО ДОМЕНА ----------
log_step "Создание конфигурации nginx для домена $FULL_DOMAIN"

cat > /opt/nginx/conf.d/${LOCATION}.conf << EOF
map \$http_upgrade \$connection_upgrade {
    default upgrade;
    ""      close;
}

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

    ssl_certificate "/etc/nginx/ssl/${FULL_DOMAIN}_fullchain.pem";
    ssl_certificate_key "/etc/nginx/ssl/${FULL_DOMAIN}_privkey.key";
    ssl_trusted_certificate "/etc/nginx/ssl/${FULL_DOMAIN}_fullchain.pem";

    root /opt/nginx/html;
    index index.html;
    
    add_header X-Robots-Tag "noindex, nofollow, noarchive, nosnippet, noimageindex" always;
    
#    access_log /opt/log/nginx/access.log main;
#    error_log  /opt/log/nginx/error.log warn;

    # Проксирование XHTTP запросов
    location /xhttp/ {
        client_max_body_size 0;
        grpc_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        client_body_timeout 5m;
        grpc_read_timeout 315;
        grpc_send_timeout 5m;
        
#        access_log /opt/log/nginx/grpc_access.log grpc;
#        error_log /opt/log/nginx/grpc_error.log debug;
        
        grpc_pass unix:/dev/shm/xrxh.socket;
    }
}

# Дефолтный сервер для отбраковки
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;
    
#    error_log  /opt/log/nginx/default_error.log warn;
#    access_log /opt/log/nginx/default_access.log main;
    
    ssl_reject_handshake on;
    return 444;
}
EOF

log_success "Конфигурационный файл nginx создан: /opt/nginx/conf.d/${LOCATION}.conf"

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

# Создание скрипта обновления
UPDATE_SCRIPT="/opt/geofiles/update_geofiles.sh"
GEO_LOG_FILE="/var/log/geofiles_update.log"

log_info "Создание скрипта обновления: $UPDATE_SCRIPT"

cat > "$UPDATE_SCRIPT" << 'EOF'
#!/bin/bash

# Скрипт обновления geoip.dat и geosite.dat
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-файлов"

# Проверка доступности wget
if ! command -v wget &> /dev/null; then
    log_error "wget не установлен. Установите: apt install wget"
    exit 1
fi

# Скачивание geoip.dat
log_info "Скачивание geoip.dat..."
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

# Скачивание geosite.dat
log_info "Скачивание geosite.dat..."
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 "Скрипт обновления создан и сделан исполняемым"

# Создание systemd сервиса
log_info "Создание systemd сервиса..."

cat > /etc/systemd/system/geofiles-update.service << EOF
[Unit]
Description=Update geoip and geosite files for v2ray
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

log_success "Сервис /etc/systemd/system/geofiles-update.service создан"

# Создание systemd таймера
log_info "Создание systemd таймера (ежедневно в 3:00)..."

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

log_success "Таймер /etc/systemd/system/geofiles-update.timer создан"

# Настройка logrotate для логов geo-файлов
log_info "Настройка ротации логов geo-файлов..."

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

log_success "Ротация логов настроена в /etc/logrotate.d/geofiles"

# Активация таймера
systemctl daemon-reload
systemctl enable geofiles-update.timer
systemctl start geofiles-update.timer

log_success "Systemd таймер активирован и запущен"

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

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

cat > /opt/docker-compose.yml << 'EOF'
services:
  # Nginx веб-сервер
  remnawave-nginx:
    image: nginx:1.25
    container_name: remnawave-nginx
    hostname: remnawave-nginx
    network_mode: host
    restart: always
    ulimits:
      nofile:
        soft: 1048576
        hard: 1048576
    volumes:
      - /opt/nginx/conf.d:/etc/nginx/conf.d:ro
      - /opt/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - /opt/cert:/etc/nginx/ssl:ro
      - /opt/log/nginx:/opt/log/nginx:rw
      - /opt/nginx/html:/opt/nginx/html:ro
      - /dev/shm:/dev/shm:rw
    logging:
      driver: 'json-file'
      options:
        max-size: '30m'
        max-file: '5'
    depends_on:
      remnanode:
        condition: service_healthy

  # Основная RemnaNode
  remnanode:
    image: remnawave/node:latest
    container_name: remnanode
    hostname: remnanode
    restart: always
    ulimits:
      nofile:
        soft: 1048576
        hard: 1048576
    network_mode: host
    environment:
      - NODE_PORT=9873
      - SECRET_KEY=eyJub2RlQ2VydFBlbSI6Ii0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJQmhUQ0NBU3lnQXdJQkFnSUhBWGRoa3hGUUdEQUtCZ2dxaGtqT1BRUURBakFpTVNBd0hnWURWUVFERXhkV1xuZGxwelNqaEhRM2RHUW5KYWVtWklUVWhqYzNwTWVEQWVGdzB5TmpBME1UUXhPRFU0TXpWYUZ3MHlPVEEwTVRReFxuT0RVNE16VmFNRGN4TlRBekJnTlZCQU1NTEZFM2RuaDRjMUJ4TVdWVk5XWTNNMUp2TkdzMGNsazJja1l3WDBoMVxuYldSUUxUbFhNamRJVTNOalYwaFZNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUU2bUhvblozblxuWXRlVVZiK2tjVGJ2aWgvcjZEcWMyOUkwQ284SHlESkZ6elFaVzRmbFNuKzRESVBadkFoTXV5YlpQRXI5SlpxUFxuS1IvQlhYTjZaQm55dDZNNE1EWXdEQVlEVlIwVEFRSC9CQUl3QURBT0JnTlZIUThCQWY4RUJBTUNCYUF3RmdZRFxuVlIwbEFRSC9CQXd3Q2dZSUt3WUJCUVVIQXdFd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ05vbWNlVVVwYm54Z1xuRUMvTlRYeFduRDJWWCtCeWtLSnlwL2NoNkExeHJ1QUNJRVJjSmxkR1hQd2xWeGExWTYxMzQwZU9JVThjaWZrUFxuUEl4R3FRcTdteDFTXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIiwibm9kZUtleVBlbSI6Ii0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxuTUlHSEFnRUFNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQkcwd2F3SUJBUVFnK3RqbEFUcldEYUw4cTF0dVxuUEF6QkRWSTA5WkEvRTdnZGRSMFlXTUV2ek5LaFJBTkNBQVRxWWVpZG5lZGkxNVJWdjZSeE51K0tIK3ZvT3B6YlxuMGpRS2p3ZklNa1hQTkJsYmgrVktmN2dNZzltOENFeTdKdGs4U3YwbG1vOHBIOEZkYzNwa0dmSzNcbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0iLCJjYUNlcnRQZW0iOiItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbk1JSUJWVENCL0tBREFnRUNBZ0VCTUFvR0NDcUdTTTQ5QkFNQ01DSXhJREFlQmdOVkJBTVRGMVoyV25OS09FZERcbmQwWkNjbHA2WmtoTlNHTnpla3g0TUI0WERUSTJNREl5TnpFek1qUXlORm9YRFRNMk1ESXlOekV6TWpReU5Gb3dcbklqRWdNQjRHQTFVRUF4TVhWblphYzBvNFIwTjNSa0p5V25wbVNFMUlZM042VEhnd1dUQVRCZ2NxaGtqT1BRSUJcbkJnZ3Foa2pPUFFNQkJ3TkNBQVI3UHVzcURNMTh0ekZSYjc2V1JxL0xMV3BQSStWUWlDSFEvSGpwTE1HTmhxU3dcbmFaTTU0eGREUmM4WVFCcjREUHNNZEtWbVF0Rlhzd09sOGVSTmdXd1hveU13SVRBUEJnTlZIUk1CQWY4RUJUQURcbkFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQ2hEQUtCZ2dxaGtqT1BRUURBZ05JQURCRkFpRUFwZ2xuLzhFdklLMXZcbjhoN0xld1ZqSXFVZEcvWjBCVjg0YW14Q1hBYnF4WlFDSUNoUkwvZkJlZGlWRUlheUZjNGZrNHBIVTZvV3R2eGNcblNvVWNvSHFxaWJLZFxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSIsImp3dFB1YmxpY0tleSI6Ii0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXpTMUpsSHAyWVQ0Y1RrVzg3UnRLXG5PaWY0bjI1cDFGeE0wRXEyU2ZJOVAyeE1DS3ZWZEJjZm1pREpWRWlUdy9VTVF2VUR0SXVDSmNmZE14ZTBNZ2k3XG40NENYcTkvZW5MT2FVT3UrbDdJaEZjOTV4dG50bEg2ZHVld2hqY3BxK0JWMUhBbFZjUDZQWDdqRUFmZ3Nlb1N4XG5uV21qL2JmSFN3ZzJlazZ1NmhkaGJjQk9ZVWJpeHhtV1BmcjRpSGRXYzFYVTR3ZWpTZHhuL0NVeGlRWmsvTjViXG5hWUg3Yk13REt6QmNSejhOL1piVTBhU0hiZGVIRkVtK2cxOGpUL0Q4K1pqc0tqYVl0eUxpcXlPVkVXWE5BdUt5XG5SRmw0Zys2S1d4UkRSZ08vOVYyeTEwajUzRzlHcHF5ck11aXB6aExaYTNGdm9Xeiswajlad1IvSWRvMEwvVEJYXG5QUUlEQVFBQlxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4ifQ==
    cap_add:
      - NET_ADMIN
    volumes:
      - /opt/log/remnanode:/var/log/remnanode:rw
      - /dev/shm:/dev/shm:rw
      - '/opt/geofiles/geoip.dat:/usr/local/share/xray/geoip.dat'
      - '/opt/geofiles/geosite.dat:/usr/local/share/xray/geosite.dat'
    logging:
      driver: 'json-file'
      options:
        max-size: '30m'
        max-file: '5'
    healthcheck:
      test: ["CMD-SHELL", "test -S /dev/shm/xrxh.socket || exit 1"]
      interval: 5s
      timeout: 3s
      retries: 30
      start_period: 30s

  # 3X-UI панель
  3xui:
    image: ghcr.io/hydraponique/3x-ui:latest
    container_name: 3xui
    volumes:
      - /opt/3x-ui/db:/etc/x-ui/
      - /etc/nginx/ssl:/etc/nginx/ssl:ro
      - /dev/shm:/dev/shm:rw
    network_mode: host
    environment:
      XRAY_VMESS_AEAD_FORCED: "false"
      UI_BIND: "0.0.0.0"
    tty: true
    restart: unless-stopped

networks:
  default:
    driver: bridge
EOF
log_success "docker-compose.yml создан (с монтированием geo-файлов)"

# ---------- ФИНАЛЬНЫЙ ВЫВОД ----------
log_success "Модуль install_remnanode.sh выполнен успешно"
echo ""
echo "=================================================="
echo "✅ Локация          : $LOCATION"
echo "✅ Домен            : $FULL_DOMAIN"
echo "✅ Порт ноды        : 9873"
echo "✅ Контейнеры запущены и работают"
echo ""
echo "📁 Созданные каталоги:"
echo "  - /opt/nginx                - основной каталог nginx"
echo "  - /opt/nginx/conf.d         - конфиги nginx"
echo "  - /opt/nginx/html           - веб-файлы"
echo "  - /opt/log/nginx            - логи nginx"
echo "  - /opt/log/remnanode        - логи remnanode"
echo "  - /opt/3x-ui/db             - база данных 3x-ui"
echo "  - /etc/nginx/ssl            - SSL сертификаты"
echo "  - /opt/geofiles             - geo-файлы (автообновление)"
echo ""
echo "📄 Созданные файлы:"
echo "  - /opt/nginx/nginx.conf"
echo "  - /opt/nginx/conf.d/${LOCATION}.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/geofiles-update.{service,timer}"
echo ""
echo "🌍 Geo-файлы (автообновление в 3:00):"
echo "  - /opt/geofiles/geoip.dat"
echo "  - /opt/geofiles/geosite.dat"
echo "  - Лог обновлений: /var/log/geofiles_update.log"
echo ""
echo "📊 Полезные команды:"
echo "  - Просмотр логов:         $DOCKER_COMPOSE_CMD -f /opt/docker-compose.yml logs -f"
echo "  - Перезапуск контейнеров: $DOCKER_COMPOSE_CMD -f /opt/docker-compose.yml restart"
echo "  - Остановка контейнеров:  $DOCKER_COMPOSE_CMD -f /opt/docker-compose.yml down"
echo "  - Ручное обновление geo:  systemctl start geofiles-up
