# SSH-доступ к серверу Timeweb Cloud по ключу

Эта инструкция описывает, как создать SSH-ключ на локальном компьютере, добавить публичный ключ в Timeweb Cloud и проверить подключение к серверу без использования пароля.

> **Важно:** во всех примерах ниже используется тестовый IP-адрес `203.0.113.10`.  
> Это адрес только для примера. Перед выполнением команд замените `203.0.113.10` на **реальный IP-адрес вашего сервера в Timeweb Cloud**.

После настройки команда:

```bash
ssh root@203.0.113.10
```

должна подключать к серверу с использованием локального SSH-ключа.

> **Никогда не передавайте приватный SSH-ключ другим людям или сервисам.**  
> В Timeweb Cloud добавляется только публичная часть ключа.

---

## 1. Проверить, есть ли SSH-ключ на компьютере

### Windows

Откройте **PowerShell** и выполните:

```powershell
Get-ChildItem ~/.ssh
```

Если среди файлов есть, например:

```text
id_ed25519
id_ed25519.pub
```

значит SSH-ключ уже создан.

Файл:

```text
id_ed25519
```

— это **приватный ключ**.

Его нельзя передавать другим людям, агентам, сайтам или сервисам.

Файл:

```text
id_ed25519.pub
```

— это **публичный ключ**.

Именно его можно добавлять в Timeweb Cloud.

Если таких файлов нет — создайте новый ключ.

---

## 2. Создать SSH-ключ

В PowerShell выполните:

```powershell
ssh-keygen -t ed25519 -C "timeweb"
```

Появится запрос:

```text
Enter file in which to save the key
```

Если отдельный путь не нужен, просто нажмите:

```text
Enter
```

В Windows ключ обычно будет сохранён в:

```text
C:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ\.ssh\id_ed25519
```

После этого появится запрос:

```text
Enter passphrase
```

Можно установить пароль на SSH-ключ для дополнительной защиты.

Если пароль не нужен, дважды нажмите `Enter`.

После создания появятся два файла:

```text
id_ed25519
id_ed25519.pub
```

---

## 3. Скопировать публичный SSH-ключ

Чтобы посмотреть публичный ключ, выполните:

```powershell
Get-Content ~/.ssh/id_ed25519.pub
```

Вы увидите строку примерно такого вида:

```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI.................... timeweb
```

Нужно скопировать **всю строку целиком**.

Удобнее сразу скопировать ключ в буфер обмена:

```powershell
Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard
```

Теперь публичный ключ можно вставить в Timeweb Cloud.

---

## 4. Добавить SSH-ключ в Timeweb Cloud

Откройте:

**Timeweb Cloud → SSH-ключи**

Нажмите:

**Добавить ключ**

В поле **Ключ** вставьте содержимое файла:

```text
id_ed25519.pub
```

Например:

```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI.................... timeweb
```

В поле **Название ключа** укажите понятное название компьютера.

Например:

```text
Work-PC
```

или:

```text
Office-PC
```

или:

```text
Windows-PC-2026
```

После этого нажмите:

**Добавить**.

> **Важно:** не вставляйте в Timeweb содержимое файла `id_ed25519`.  
> Это приватный ключ.
> 
> Добавлять необходимо только файл с расширением `.pub`.

---

## 5. Добавить ключ на сервер

Есть два основных варианта.

### Вариант 1. Создаётся новый сервер

Если сервер только создаётся, выберите созданный SSH-ключ при настройке сервера в Timeweb Cloud.

Timeweb автоматически добавит публичный ключ на сервер.

После создания сервера можно проверить подключение:

```powershell
ssh root@203.0.113.10
```

> Замените `203.0.113.10` на реальный IP-адрес созданного сервера.

---

### Вариант 2. Сервер уже существует

Если сервер был создан ранее, простого добавления ключа в общий раздел **SSH-ключи** может быть недостаточно.

Публичный ключ должен присутствовать непосредственно на сервере в файле:

```text
/root/.ssh/authorized_keys
```

Сначала подключитесь к серверу по существующему паролю:

```powershell
ssh root@203.0.113.10
```

> Вместо `203.0.113.10` укажите реальный IP вашего сервера.

После входа выполните:

```bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
```

Вставьте в файл ваш публичный ключ:

```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI.................... timeweb
```

Сохраните файл.

Для редактора `nano`:

```text
Ctrl + O
Enter
Ctrl + X
```

Затем выполните:

```bash
chmod 600 ~/.ssh/authorized_keys
```

---

## 6. Проверить подключение по SSH

На локальном компьютере откройте PowerShell и выполните:

```powershell
ssh root@203.0.113.10
```

> **Не забудьте заменить `203.0.113.10` на реальный IP-адрес сервера Timeweb Cloud.**

При первом подключении может появиться сообщение:

```text
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

Введите:

```text
yes
```

Если всё настроено правильно, откроется консоль сервера.

Например:

```text
root@server:~#
```

Это означает, что SSH-доступ работает.

---

## 7. Если SSH не использует нужный ключ

Можно явно указать путь к приватному ключу:

```powershell
ssh -i ~/.ssh/id_ed25519 root@203.0.113.10
```

Где:

```text
203.0.113.10
```

необходимо заменить на реальный IP вашего сервера.

Для диагностики подключения можно использовать подробный режим:

```powershell
ssh -v root@203.0.113.10
```

В выводе можно искать строки:

```text
Offering public key
```

и:

```text
Server accepts key
```

Они указывают на то, что SSH-клиент предлагает ключ серверу и сервер его принимает.

---

## 8. Проверить сервер перед передачей задачи AI-агенту

Перед тем как поручать агенту установку или настройку программ на сервере, самостоятельно убедитесь, что SSH-доступ работает.

Выполните:

```powershell
ssh root@203.0.113.10
```

> Вместо `203.0.113.10` подставьте реальный IP сервера.

После подключения полезно проверить, что уже работает на сервере.

### Проверить Docker-контейнеры

```bash
docker ps
```

Если Docker не установлен, команда может вернуть ошибку — это нормально.

### Проверить занятые сетевые порты

```bash
ss -tulpn
```

Особенно важно проверить порты:

```text
80
443
```

Порт `80` обычно используется для HTTP.

Порт `443` обычно используется для HTTPS.

> **Важно:** если на сервере уже работает сайт, Nginx, Apache, Docker, reverse proxy, VPN или другой сервис, обязательно сообщите об этом агенту.
> 
> Нельзя считать сервер «чистым» и без проверки изменять или удалять существующие сервисы, особенно использующие порты `80` и `443`.

---

## Быстрая памятка

### Создать SSH-ключ

```powershell
ssh-keygen -t ed25519 -C "timeweb"
```

### Скопировать публичный ключ

```powershell
Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard
```

### Добавить ключ

Открыть:

**Timeweb Cloud → SSH-ключи → Добавить ключ**

и вставить содержимое:

```text
id_ed25519.pub
```

### Проверить подключение

```powershell
ssh root@203.0.113.10
```

Перед выполнением заменить:

```text
203.0.113.10
```

на:

```text
РЕАЛЬНЫЙ_IP_СЕРВЕРА
```

Например, если Timeweb показывает IP:

```text
192.0.2.25
```

то команда будет выглядеть так:

```powershell
ssh root@192.0.2.25
```

### Явно указать SSH-ключ

```powershell
ssh -i ~/.ssh/id_ed25519 root@203.0.113.10
```

Здесь также необходимо заменить IP на реальный.

---

## Что можно и нельзя передавать

### ✅ Можно передавать

Публичный ключ:

```text
~/.ssh/id_ed25519.pub
```

Он выглядит примерно так:

```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI.................... timeweb
```

### ❌ Нельзя передавать

Приватный ключ:

```text
~/.ssh/id_ed25519
```

Приватный ключ должен оставаться только на вашем компьютере.

> **Простое правило:**  
> файл с `.pub` — публичный, его можно передавать.  
> файл без `.pub` — приватный, его передавать нельзя.

Да, это стоит добавить обязательно. Лучше сначала проверить содержимое `~/.ssh`, чтобы случайно не перезаписать существующий ключ.

Вот улучшенный фрагмент для вставки в инструкцию:

## Перенос SSH-ключа из Windows в WSL

Если SSH-ключ уже создан в Windows и настроен для доступа к серверу, новый ключ создавать не нужно. Его можно скопировать в WSL.

Допустим, ключ в Windows находится здесь:

```text
C:\Users\evgeny\.ssh\id_ed25519
C:\Users\evgeny\.ssh\id_ed25519.pub
```

Сначала проверьте, нет ли в WSL файлов с такими же именами:

```bash
ls -la ~/.ssh
```

Или точечно:

```bash
ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
```

Если файлов нет, можно копировать.

Если они уже существуют, **не копируйте поверх них**, пока не убедитесь, что это тот же ключ. Лучше либо сохранить существующие файлы под другим именем, либо скопировать Windows-ключ в WSL с новым именем, например:

```bash
cp /mnt/c/Users/evgeny/.ssh/id_ed25519 ~/.ssh/timeweb_id_ed25519
cp /mnt/c/Users/evgeny/.ssh/id_ed25519.pub ~/.ssh/timeweb_id_ed25519.pub
```

Если файлов с такими именами в WSL нет, можно использовать стандартные имена:

```bash
cp /mnt/c/Users/evgeny/.ssh/id_ed25519 ~/.ssh/
cp /mnt/c/Users/evgeny/.ssh/id_ed25519.pub ~/.ssh/
```

После копирования обязательно выставьте правильные права:

```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
```

Если ключ был скопирован под другим именем:

```bash
chmod 600 ~/.ssh/timeweb_id_ed25519
chmod 644 ~/.ssh/timeweb_id_ed25519.pub
```

Проверить права:

```bash
ls -la ~/.ssh
```

Для приватного ключа права должны выглядеть примерно так:

```text
-rw------- 1 user user ... id_ed25519
```

После этого можно проверить подключение:

```bash
ssh root@203.0.113.10
```

где `203.0.113.10` нужно заменить на реальный IP-адрес сервера.

Если ключ сохранён под нестандартным именем:

```bash
ssh -i ~/.ssh/timeweb_id_ed25519 root@203.0.113.10
```

> Используйте `cp`, а не `mv`, чтобы исходный ключ остался в Windows.
> 
> Перед копированием всегда проверяйте `~/.ssh`, чтобы случайно не затереть уже существующий приватный ключ.