#!/bin/bash
set -e

echo "🚀 Начало настройки сервера..."

# ---------- ВВОД ДАННЫХ ----------
read -rp "Введите SSH порт для сервера (например 22): " SSH_PORT
if ! [[ "$SSH_PORT" =~ ^[0-9]+$ ]] || [ "$SSH_PORT" -lt 1 ] || [ "$SSH_PORT" -gt 65535 ]; then
    echo "❌ Некорректный порт"
    exit 1
fi

read -rp "Имя первого пользователя: " USER1
read -rp "Имя второго пользователя: " USER2

echo "Вставьте SSH PUBLIC ключ для $USER1:"
read -r SSH_KEY1
echo "Вставьте SSH PUBLIC ключ для $USER2:"
read -r SSH_KEY2

read -rp "Введите домен для HTTPS (например example.com): " DOMAIN
if [[ -z "$DOMAIN" ]]; then
    echo "❌ Домен не может быть пустым"
    exit 1
fi

read -rp "Введите NODE_PORT для контейнера (например 9873): " NODE_PORT
if ! [[ "$NODE_PORT" =~ ^[0-9]+$ ]] || [ "$NODE_PORT" -lt 1 ] || [ "$NODE_PORT" -gt 65535 ]; then
    echo "❌ Некорректный NODE_PORT"
    exit 1
fi

# ---------- ИЗМЕНЕНИЕ HOSTNAME ----------
echo "🏷 Меняем hostname на $DOMAIN..."
hostnamectl set-hostname "$DOMAIN"
if ! grep -q "$DOMAIN" /etc/hosts; then
    echo "127.0.0.1   $DOMAIN" >> /etc/hosts
fi
echo "✅ Hostname изменён на $DOMAIN"

# ---------- СОЗДАНИЕ ПОЛЬЗОВАТЕЛЕЙ ----------
create_user() {
    local USERNAME="$1"
    local SSH_KEY="$2"

    if ! id "$USERNAME" &>/dev/null; then
        useradd -m -s /bin/bash "$USERNAME"
        echo "Пользователь $USERNAME создан"
    fi

    usermod -aG sudo "$USERNAME"

    HOME_DIR=$(eval echo "~$USERNAME")
    mkdir -p "$HOME_DIR/.ssh"
    echo "$SSH_KEY" > "$HOME_DIR/.ssh/authorized_keys"

    chmod 700 "$HOME_DIR/.ssh"
    chmod 600 "$HOME_DIR/.ssh/authorized_keys"
    chown -R "$USERNAME:$USERNAME" "$HOME_DIR/.ssh"

    echo "SSH ключ добавлен, sudo включён для $USERNAME"
}

create_user "$USER1" "$SSH_KEY1"
create_user "$USER2" "$SSH_KEY2"

# ---------- НАСТРОЙКА SUDO БЕЗ ПАРОЛЯ ----------
echo "🔑 Настройка sudo без пароля для $USER1 и $USER2..."
SUDOERS_FILE="/etc/sudoers.d/custom_users"
echo "$USER1 ALL=(ALL) NOPASSWD:ALL" > "$SUDOERS_FILE"
echo "$USER2 ALL=(ALL) NOPASSWD:ALL" >> "$SUDOERS_FILE"
chmod 440 "$SUDOERS_FILE"
visudo -cf "$SUDOERS_FILE" >/dev/null
echo "✅ sudo без пароля настроен"

# ---------- НАСТРОЙКА SSH ----------
echo "⚙️ Настройка SSH..."
SSHD_CONFIG="/etc/ssh/sshd_config"
SSHD_BACKUP="/etc/ssh/sshd_config.bak"
[ ! -f "$SSHD_BACKUP" ] && cp "$SSHD_CONFIG" "$SSHD_BACKUP"

set_sshd_option() {
    local KEY="$1"
    local VALUE="$2"
    if grep -qE "^[#]*\s*$KEY" "$SSHD_CONFIG"; then
        sed -i "s|^[#]*\s*$KEY.*|$KEY $VALUE|" "$SSHD_CONFIG"
    else
        echo "$KEY $VALUE" >> "$SSHD_CONFIG"
    fi
}

set_sshd_option "Port" "$SSH_PORT"
set_sshd_option "PermitRootLogin" "no"
set_sshd_option "PasswordAuthentication" "no"
set_sshd_option "ChallengeResponseAuthentication" "no"
set_sshd_option "PubkeyAuthentication" "yes"
set_sshd_option "UsePAM" "yes"
set_sshd_option "AllowUsers" "$USER1 $USER2"

# ---------- ЖДЕМ, ПОКА ОСВОБОДИТСЯ LOCK APT ----------
echo "⏳ Проверяем блокировку apt/dpkg..."
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1; do
    echo "🔒 apt/dpkg заблокирован другим процессом. Ждем 5 секунд..."
    sleep 5
done
echo "✅ Блокировка снята, можно продолжать"

# ---------- НАСТРОЙКА UFW ----------
echo "🔥 Настройка UFW..."
apt-get update -y
apt-get install -y ufw

ufw allow "$SSH_PORT"/tcp
ufw limit "$SSH_PORT"/tcp

ufw allow from 77.110.112.21 to any port 9100
ufw allow from 77.110.112.21 to any port 9873
ufw allow from 77.110.112.21 to any port 2112

ufw allow 80/tcp
ufw allow 443/tcp

ufw default deny incoming
ufw default allow outgoing

ufw --force enable
ufw status verbose
echo "✅ UFW настроен с rate limit для SSH"

# ---------- УСТАНОВКА DOCKER И DOCKER-COMPOSE ----------
echo "🐳 Установка Docker и Docker Compose..."
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io

docker --version

DOCKER_COMPOSE_VERSION="v2.27.3"
curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

docker-compose --version
echo "✅ Docker и Docker Compose установлены"

# ---------- УСТАНОВКА ACME.SH И HTTPS ----------
echo "🌐 Установка acme.sh и генерация сертификата для $DOMAIN..."
apt-get install -y socat

curl https://get.acme.sh | sh
export PATH="$HOME/.acme.sh:$PATH"

CERT_DIR="/opt/cert/$DOMAIN"
mkdir -p "$CERT_DIR"

~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
~/.acme.sh/acme.sh --issue -d "$DOMAIN" --standalone

~/.acme.sh/acme.sh --install-cert -d "$DOMAIN" \
    --key-file "$CERT_DIR/$DOMAIN.key" \
    --fullchain-file "$CERT_DIR/$DOMAIN.crt"

echo "✅ Сертификат установлен в $CERT_DIR"

CRON_CMD="~/.acme.sh/acme.sh --cron --home ~/.acme.sh > /dev/null"
( crontab -l 2>/dev/null | grep -v -F "$CRON_CMD" ; echo "0 0 * * * $CRON_CMD" ) | crontab -
echo "✅ Автопродление сертификатов настроено через cron"

# ---------- СКАЧИВАНИЕ И РАСПАКОВКА ARCHIVE ----------
echo "📦 Скачиваем и распаковываем remnanode.zip в /opt..."
ARCHIVE_URL="https://soft.free-surf.ru/remnanode.zip"
DEST_DIR="/opt"

apt-get install -y wget unzip
TMP_ARCHIVE="/tmp/remnanode.zip"
wget -O "$TMP_ARCHIVE" "$ARCHIVE_URL"

unzip -o "$TMP_ARCHIVE" -d "$DEST_DIR"
rm -f "$TMP_ARCHIVE"
echo "✅ Архив распакован в $DEST_DIR"

# ---------- ОБНОВЛЕНИЕ NGINX.CONF ----------
NGINX_CONF="/opt/remnanode/nginx.conf"
if [ -f "$NGINX_CONF" ]; then
    sed -i "0,/server_name .*;/s//server_name $DOMAIN;/" "$NGINX_CONF"
    echo "✅ nginx.conf обновлён: подставлен домен $DOMAIN"
fi

# ---------- ОБНОВЛЕНИЕ DOCKER-COMPOSE.YML ----------
COMPOSE_FILE="/opt/remnanode/docker-compose.yml"
if [ -f "$COMPOSE_FILE" ]; then
    sed -i "s|NODE_PORT=.*|NODE_PORT=$NODE_PORT|" "$COMPOSE_FILE"
    sed -i "s|/opt/remnanode/nginx/ssl/fullchain.pem|$CERT_DIR/$DOMAIN.crt|g" "$COMPOSE_FILE"
    sed -i "s|/opt/remnanode/nginx/ssl/privkey.key|$CERT_DIR/$DOMAIN.key|g" "$COMPOSE_FILE"
    echo "✅ docker-compose.yml обновлён: NODE_PORT=$NODE_PORT, пути к SSL сертификатам заменены"
fi

# ---------- ПЕРЕЗАПУСК SSH ----------
echo "🔄 Перезапускаем SSH для применения всех настроек..."
systemctl restart ssh
echo "✅ SSH перезапущен"

echo "🎉 Сервер полностью настроен!"
echo "SSH: ssh -p $SSH_PORT $USER1@<SERVER_IP>"
echo "HTTPS сертификат в: $CERT_DIR"
echo "Необходимо вставить SECRET_KEY в /opt/remnanode/docker-compose.yml"
echo "Docker контейнеры можно запустить: cd /opt/remnanode && docker-compose up -d"
