# Hetzner VPS Setup

> Від порожнього сервера до захищеної production-ready машини. Оберіть, як ви бажаєте налаштувати свій сервер.

:::tabs
=== Автоматично (AI)
### Автоматичне налаштування через AI
Надайте вашому AI-асистенту доступ до цього репозиторію. Він автоматично виконає всі перевірки, налаштує безпеку та згенерує файл з усіма доступами (credentials guide) на вашому комп'ютері.

[Відкрити GitHub Репозиторій](https://github.com/orlovvugorivzai/vps-hetzner-setup-by-orlov)

=== Мануально
### Підготовка змінних
У командах нижче вам потрібно буде підставляти свої значення замість фігурних дужок:

- `{username}` — ім'я вашого звичайного користувача (напр. `dev`)
- `{nickname}` — коротка назва сервера для зручності (напр. `hetzner-main`)
- `{SERVER_IP}` — публічна IP-адреса вашого нового сервера

:::

## 1. Створення SSH-ключа (Локально)
Виконується на **вашому комп'ютері** (Mac або Linux) ДО того, як ви підключитесь до сервера.

```bash
ssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""
cat ~/.ssh/{nickname}_key.pub
```

Скопіюйте вивід другої команди (він починається на ssh-ed25519 ...). Це ваш публічний ключ.

## 2. Вхід як Root
Підключіться до сервера за допомогою пароля, який Hetzner надіслав на пошту.

> [!WARNING]
> Hetzner може попросити змінити пароль. Введіть поточний пароль, потім двічі новий тимчасовий. Якщо після цього з'єднання розірветься — просто підключіться знову за допомогою нового пароля.

```bash
ssh root@{SERVER_IP}
```

## 3. Оновлення системи
Оновлення всіх пакетів у неінтерактивному режимі (без спливаючих вікон grub).

```bash
apt update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt upgrade -y
```

## 4. Створення користувача з sudo
Працювати з-під root небезпечно. Створюємо звичайного користувача та даємо йому права адміністратора.

```bash
useradd -m -s /bin/bash {username}
echo "{username}:YOUR_SECURE_PASSWORD" | chpasswd
usermod -aG sudo {username}
```

## 5. Розгортання SSH-ключа
Запишемо ваш публічний ключ, який ви скопіювали в Кроці 1, на сервер.

```bash
mkdir -p /home/{username}/.ssh
echo "{PUBLIC_KEY_CONTENT}" > /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.ssh
```

## 6. Перевірка входу
> [!IMPORTANT]
> **ОБОВ'ЯЗКОВИЙ ЧЕКПОІНТ**
> Не закривайте сесію root! Відкрийте нове вікно терміналу на своєму ПК та спробуйте зайти по ключу. Тільки після успішного входу можна продовжувати.

Перевірте, чи працює `sudo` (система має попросити пароль, який ви задали в Кроці 4, і вивести "root"):

```bash
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}
sudo whoami
```

## 7. Firewall (UFW)
Всі наступні команди виконуйте від імені вашого нового користувача (з sudo). Налаштовуємо політику "заборонити все вхідне, крім SSH, HTTP та HTTPS".

```bash
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status
```

## 8. Захист ядра (sysctl)
Застосовуємо параметри для захисту від мережевих атак.

```bash
sudo tee /etc/sysctl.d/99-security.conf << 'EOF'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-security.conf
```

## 9. Базові пакети та час
Точний час критичний для логів, SSL-сертифікатів та fail2ban.

```bash
sudo apt install -y chrony curl wget git unzip net-tools
sudo systemctl enable chrony
```

## 10. Локальний SSH-конфіг
Налаштування шорткату **на вашому локальному ПК**, щоб надалі підключатися короткою командою `ssh {nickname}`.

```bash
mkdir -p ~/.ssh && touch ~/.ssh/config && chmod 600 ~/.ssh/config
cat >> ~/.ssh/config << 'EOF'

Host {nickname}
    HostName {SERVER_IP}
    User {username}
    IdentityFile ~/.ssh/{nickname}_key
    IdentitiesOnly yes
EOF
```

## 11. Перевірка безпеки
Перевірте, чи працює коротка команда з локального ПК і чи увімкнені базові захисти.

```bash
ssh {nickname}
sudo ufw status
sysctl net.ipv4.tcp_syncookies
```

## 12. Фінальне блокування
Встановлюємо захист від брутфорсу (fail2ban) та назавжди забороняємо вхід по паролю і вхід для root.

```bash
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo tee /etc/ssh/sshd_config.d/99-hardening.conf << 'EOF'
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
EOF
sudo sshd -t && sudo systemctl restart ssh
```

> [!TIP]
> Готово! Сервер повністю налаштовано та захищено.