# Konfiguracja VPS Hetzner

> Od pustego serwera do bezpiecznej maszyny gotowej na produkcję. Wybierz sposób konfiguracji swojego serwera.

:::tabs
=== Automatycznie (AI)
### Automatyczna konfiguracja przez AI
Przekaż swojemu asystentowi AI dostęp do tego repozytorium. Wykona on automatycznie wszystkie sprawdzenia, skonfiguruje zabezpieczenia i wygeneruje na Twoim komputerze plik z kompletem danych uwierzytelniających (credentials guide).

[Otwórz Repozytorium GitHub](https://github.com/orlovvugorivzai/vps-hetzner-setup-by-orlov)

=== Ręcznie
### Przygotowanie zmiennych
W poniższych poleceniach musisz zastąpić nawiasy klamrowe własnymi wartościami:

- `{username}` – nazwa zwykłego użytkownika (np. `dev`)
- `{nickname}` – krótka nazwa serwera dla wygody (np. `hetzner-main`)
- `{SERVER_IP}` – publiczny adres IP nowego serwera

:::

## 1. Tworzenie klucza SSH (Lokalnie)
Wykonywane na **Twoim komputerze** (Mac lub Linux) PRZED połączeniem się z serwerem.

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

Skopiuj wynik drugiego polecenia (zaczyna się od `ssh-ed25519 ...`). To jest Twój klucz publiczny.

## 2. Logowanie jako Root
Połącz się z serwerem za pomocą hasła wysłanego przez Hetzner na e-mail.

> [!WARNING]
> Hetzner może wymagać zmiany hasła. Wpisz obecne hasło, a następnie dwukrotnie nowe tymczasowe hasło. Jeśli połączenie zostanie zerwane po tej operacji – po prostu nawiąż je ponownie, używając nowego hasła.

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

## 3. Aktualizacja systemu
Aktualizacja wszystkich pakietów w trybie nieinteraktywnym (bez okien dialogowych grub).

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

## 4. Tworzenie użytkownika z sudo
Praca pod kontem root jest niebezpieczna. Tworzymy zwykłego użytkownika i nadajemy mu uprawnienia administratora.

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

## 5. Rozmieszczenie klucza SSH
Zapisujemy klucz publiczny skopiowany w Kroku 1 na serwerze.

```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. Weryfikacja logowania
> [!IMPORTANT]
> **OBOWIĄZKOWY CHECKPOINT**
> Nie zamykaj sesji root! Otwórz nowe okno terminala na swoim PC i spróbuj zalogować się za pomocą klucza. Dopiero po pomyślnym logowaniu możesz kontynuować.

Sprawdź, czy działa `sudo` (system powinien poprosić o hasło ustawione w Kroku 4 i wypisać "root"):

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

## 7. Firewall (UFW)
Wszystkie kolejne polecenia wykonuj jako nowy użytkownik (z użyciem sudo). Konfigurujemy politykę „zablokuj wszystko przychodzące, poza SSH, HTTP oraz 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. Zabezpieczenie jądra (sysctl)
Stosujemy parametry chroniące przed atakami sieciowymi.

```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. Podstawowe pakiety i czas
Dokładny czas jest krytyczny dla logów, certyfikatów SSL oraz fail2ban.

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

## 10. Lokalna konfiguracja SSH
Konfiguracja skrótu **na Twoim lokalnym PC**, aby w przyszłości łączyć się krótkim poleceniem `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. Kontrola bezpieczeństwa
Sprawdź, czy skrótowa komenda działa z lokalnego PC oraz czy podstawowe zabezpieczenia są aktywne.

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

## 12. Finalne blokady
Instalujemy ochronę przed brute-force (fail2ban) i trwale zakazujemy logowania przez hasło.