#!/bin/bash
# ========== install_remnanode.sh ==========
# Подготовка окружения для RemnaNode:
# - создание каталогов
# - загрузка и распаковка шаблона сайта
# - создание конфигурационных файлов nginx и 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"
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

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               # хранить только 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"

# ---------- ФАЙЛ 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=eyJub2RlQ2VydFBlbSI6Ii0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJQmhqQ0NBUzJnQXdJQkFnSUhBWGNpRW5hRWh6QUtCZ2dxaGtqT1BRUURBakFpTVNBd0hnWURWUVFERXhkV1xuZGxwelNqaEhRM2RHUW5KYWVtWklUVWhqYzNwTWVEQWVGdzB5TmpBeU1qY3hOekU1TWpoYUZ3MHlPVEF5TWpjeFxuTnpFNU1qaGFNRGd4TmpBMEJnTlZCQU1UTFVSQlp6Sm9ZM2hSVURGbk5EaEVhSFJDYlVOTWVERktUbUZMUjAxNFxuUVdzM09ISm9ZVEJZUzJGRU4wdHViVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCTkFCU1ZOalxuYmo5WGhWTmQvajdUV0ZkRzMyR3RUTWUxT2plcVZ0akRnVy8zOXVYRi9iS29oa2FPN1FLd2V6UTUybHRnU3Q4Z1xuU2xUU0ovVEtGWXlIVDhLak9EQTJNQXdHQTFVZEV3RUIvd1FDTUFBd0RnWURWUjBQQVFIL0JBUURBZ1dnTUJZR1xuQTFVZEpRRUIvd1FNTUFvR0NDc0dBUVVGQndNQk1Bb0dDQ3FHU000OUJBTUNBMGNBTUVRQ0lBck9mOU85L1JJNFxucm5XOGpLeS9kekZZN2VJQ3pCaWtBaTMzWjlVZExBcnVBaUE5TGVGdnJKZ0tMNTJSWFIrRjU1S1BEYnVJcEVoZ1xuK0JPNEtGZGNuVmdmRFE9PVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSIsIm5vZGVLZXlQZW0iOiItLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cbk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ0RWNGw1U0lrTE5uMWZMRE9cblpUV1h3c010V1BCZ0FLb0xaYXNsM1lRVmNVS2hSQU5DQUFUUUFVbFRZMjQvVjRWVFhmNCswMWhYUnQ5aHJVekhcbnRUbzNxbGJZdzRGdjkvYmx4ZjJ5cUlaR2p1MENzSHMwT2RwYllFcmZJRXBVMGlmMHloV01oMC9DXG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tIiwiY2FDZXJ0UGVtIjoiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlCVlRDQi9LQURBZ0VDQWdFQk1Bb0dDQ3FHU000OUJBTUNNQ0l4SURBZUJnTlZCQU1URjFaMlduTktPRWREXG5kMFpDY2xwNlpraE5TR056ZWt4NE1CNFhEVEkyTURJeU56RXpNalF5TkZvWERUTTJNREl5TnpFek1qUXlORm93XG5JakVnTUI0R0ExVUVBeE1YVm5aYWMwbzRSME4zUmtKeVducG1TRTFJWTNONlRIZ3dXVEFUQmdjcWhrak9QUUlCXG5CZ2dxaGtqT1BRTUJCd05DQUFSN1B1c3FETTE4dHpGUmI3NldScS9MTFdwUEkrVlFpQ0hRL0hqcExNR05ocVN3XG5hWk01NHhkRFJjOFlRQnI0RFBzTWRLVm1RdEZYc3dPbDhlUk5nV3dYb3lNd0lUQVBCZ05WSFJNQkFmOEVCVEFEXG5BUUgvTUE0R0ExVWREd0VCL3dRRUF3SUNoREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUVBcGdsbi84RXZJSzF2XG44aDdMZXdWaklxVWRHL1owQlY4NGFteENYQWJxeFpRQ0lDaFJML2ZCZWRpVkVJYXlGYzRmazRwSFU2b1d0dnhjXG5Tb1Vjb0hxcWliS2Rcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iLCJqd3RQdWJsaWNLZXkiOiItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF6UzFKbEhwMllUNGNUa1c4N1J0S1xuT2lmNG4yNXAxRnhNMEVxMlNmSTlQMnhNQ0t2VmRCY2ZtaURKVkVpVHcvVU1RdlVEdEl1Q0pjZmRNeGUwTWdpN1xuNDRDWHE5L2VuTE9hVU91K2w3SWhGYzk1eHRudGxINmR1ZXdoamNwcStCVjFIQWxWY1A2UFg3akVBZmdzZW9TeFxubldtai9iZkhTd2cyZWs2dTZoZGhiY0JPWVViaXh4bVdQZnI0aUhkV2MxWFU0d2VqU2R4bi9DVXhpUVprL041YlxuYVlIN2JNd0RLekJjUno4Ti9aYlUwYVNIYmRlSEZFbStnMThqVC9EOCtaanNLamFZdHlMaXF5T1ZFV1hOQXVLeVxuUkZsNGcrNktXeFJEUmdPLzlWMnkxMGo1M0c5R3BxeXJNdWlwemhMWmEzRnZvV3orMGo5WndSL0lkbzBML1RCWFxuUFFJREFRQUJcbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIn0=
    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 создан"

# ---------- ПРОВЕРКА НАЛИЧИЯ СЕРТИФИКАТОВ ----------
log_step "Проверка наличия SSL сертификатов"

if [[ ! -f "/etc/nginx/ssl/${FULL_DOMAIN}_fullchain.pem" ]] || [[ ! -f "/etc/nginx/ssl/${FULL_DOMAIN}_privkey.key" ]]; then
    log_warning "Сертификаты для $FULL_DOMAIN не найдены в /etc/nginx/ssl/"
    log_warning "Сначала необходимо получить сертификаты и скопировать их в /etc/nginx/ssl/"
    log_info "Пример команды для получения сертификатов:"
    log_info "  certbot certonly --standalone -d $FULL_DOMAIN --non-interactive --agree-tos -m admin@$FULL_DOMAIN"
    log_info "Пример команды для копирования:"
    log_info "  cp /etc/letsencrypt/live/$FULL_DOMAIN/fullchain.pem /etc/nginx/ssl/${FULL_DOMAIN}_fullchain.pem"
    log_info "  cp /etc/letsencrypt/live/$FULL_DOMAIN/privkey.pem /etc/nginx/ssl/${FULL_DOMAIN}_privkey.key"
else
    log_success "Сертификаты для $FULL_DOMAIN найдены в /etc/nginx/ssl/"
fi

# ---------- ФИНАЛЬНЫЙ ВЫВОД ----------
log_success "Модуль install_remnanode.sh выполнен успешно"
echo ""
echo "=================================================="
echo "Локация          : $LOCATION"
echo "Домен            : $FULL_DOMAIN"
echo "Порт ноды        : 9873"
echo ""
echo "Созданные каталоги:"
echo "  - /opt/nginx                - основной каталог nginx"
echo "  - /opt/nginx/conf.d         - конфиги nginx"
echo "  - /opt/nginx/html           - веб-файлы"
echo "  - /opt/log/nginx             - логи nginx (формат: access-YYYYMMDD.log)"
echo "  - /opt/log/remnanode         - логи remnanode"
echo "  - /opt/3x-ui/db              - база данных 3x-ui"
echo "  - /etc/nginx/ssl             - SSL сертификаты"
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 ""
echo "Пути к сертификатам:"
echo "  - /etc/nginx/ssl/${FULL_DOMAIN}_fullchain.pem"
echo "  - /etc/nginx/ssl/${FULL_DOMAIN}_privkey.key"
echo ""
echo "Следующие шаги:"
echo "  1. Получить SSL сертификаты: certbot certonly --standalone -d $FULL_DOMAIN"
echo "  2. Скопировать сертификаты в /etc/nginx/ssl/:"
echo "     cp /etc/letsencrypt/live/$FULL_DOMAIN/fullchain.pem /etc/nginx/ssl/${FULL_DOMAIN}_fullchain.pem"
echo "     cp /etc/letsencrypt/live/$FULL_DOMAIN/privkey.pem /etc/nginx/ssl/${FULL_DOMAIN}_privkey.key"
echo "  3. Получить SECRET_KEY для ноды из панели управления"
echo "  4. Отредактировать /opt/docker-compose.yml и добавить SECRET_KEY"
echo "  5. Запустить контейнеры: docker-compose -f /opt/docker-compose.yml up -d"
echo "=================================================="
echo ""

exit 0
