# Подключение к базе данных через SSH-туннель

Source: https://support.kapsulehost.com/ru-ru/database-ssh-tunnel

Сайт вашей базы данных слушает только собственный локальный адрес сервера (loopback), поэтому настольный инструмент вроде TablePlus, Sequel Ace, DBeaver или MySQL Workbench не может обратиться к ней напрямую. SSH-туннель даёт этим инструментам локальный порт, который перенаправляется на базу данных, именно так вы получаете полноценный графический интерфейс к своим данным, не открывая MySQL для всего интернета.

## Зачем нужен туннель

Откройте **Сайты**, нажмите на сайт, затем **База данных**. Карточка **Данные для подключения** показывает хост как `127.0.0.1` и порт как `3306`. Это не формальность: база данных действительно принимает подключения только с той машины, на которой она работает. Ничто из публичного интернета не может достучаться до порта 3306, что полностью устраняет целый класс атак.

SSH-туннель безопасно закрывает этот пробел. Ваш SSH-клиент открывает порт на вашем ноутбуке, шифрует всё, что вы в него отправляете, и передаёт это базе данных изнутри сервера, в точности так, как если бы к ней подключился локальный процесс.

![Вкладка «База данных» с данными для подключения в KPanel](https://support.kapsulehost.com/help/screenshots/database-ssh-tunnel.84df4ba6.webp)

## Что нужно сначала

> **Note:** Туннель, это SSH-соединение, поэтому прежде чем что-либо из этого заработает, для сайта должен быть зарегистрирован SSH-ключ. Сначала выполните инструкции из статьи [Добавление SSH-ключей к сайту](https://support.kapsulehost.com/ru-ru/adding-ssh-keys), затем возвращайтесь сюда.

Соберите четыре вещи:

- **Хост, порт и имя пользователя SSH**, из раздела **Настройки**, затем **SSH-ключи**, в карточке **Данные для подключения**.
- **Имя базы данных, имя пользователя и пароль**, из раздела **База данных**. Нажмите на значок глаза, чтобы увидеть пароль, и на значок копирования, чтобы скопировать его в буфер обмена.

Если на вкладке «База данных» написано **No database provisioned for this site type** («Для этого типа сайта база данных не предусмотрена»), значит у этого сайта её нет. Статические сайты и некоторые сайты на Node.js создаются без базы данных.

## Открытие туннеля из терминала

Общая схема такова: перенаправить локальный порт на `127.0.0.1:3306` на удалённой стороне SSH-соединения.

```sh
ssh -N -L 3307:127.0.0.1:3306 <ssh-username>@<ssh-host> -p <ssh-port>
```

- `-L 3307:127.0.0.1:3306` открывает порт 3307 на вашей машине и перенаправляет его на порт 3306 на интерфейсе loopback сервера.
- `-N` означает «не запускать оболочку, просто держать туннель открытым».
- Добавьте `-i /path/to/key`, если ключ для этого сайта отличается от вашего ключа по умолчанию.

Оставьте это окно терминала запущенным. Пока оно открыто, `127.0.0.1:3307` на вашем ноутбуке и есть база данных сайта.

> **Tip:** Используйте локально 3307, а не 3306. Если у вас на собственной машине установлены MySQL или MariaDB, они уже занимают порт 3306, и туннель не сможет привязаться к нему, выдав ошибку «address already in use». Подойдёт любой свободный локальный порт.

## Настройка клиента базы данных на туннель

В вашем графическом клиенте создайте обычное MySQL-подключение со следующими значениями:

| Поле | Значение |
|---|---|
| Хост | `127.0.0.1` |
| Порт | `3307` (тот локальный порт, который вы перенаправили) |
| Пользователь | **Имя пользователя** со вкладки «База данных» |
| Пароль | **Пароль** со вкладки «База данных» |
| База данных | Имя **базы данных** со вкладки «База данных» |

Не указывайте SSH-хост в поле «Хост». Для клиента всё выглядит так, будто он обращается к базе данных на вашей собственной машине.

### Клиенты со встроенной вкладкой SSH

TablePlus, Sequel Ace, DBeaver и MySQL Workbench умеют сами управлять туннелем, что избавляет от необходимости держать терминал открытым. Заполните две группы полей:

- **Раздел SSH**: хост, порт, имя пользователя и файл приватного ключа со страницы SSH-ключей.
- **Раздел базы данных**: хост `127.0.0.1`, порт `3306`, а также имя базы данных, пользователя и пароль со вкладки «База данных».

Когда клиент создаёт туннель, используйте `3306` в разделе базы данных, а не ваш локальный перенаправленный порт. Клиент подключается с точки зрения сервера, поэтому он видит настоящий порт.

## Использование phpMyAdmin вместо туннеля

Если вам нужно всего лишь быстро взглянуть на таблицу, туннель вообще не нужен. На вкладке «База данных» есть карточка **phpMyAdmin** с кнопкой **Открыть phpMyAdmin**. Она выполняет вход через KPanel, так что отдельный пароль запоминать не нужно, и открывается в новой вкладке, уже указывающей на базу данных этого сайта.

phpMyAdmin, более быстрый вариант для просмотра, выполнения разового запроса или проверки значения. Настольный клиент через туннель лучше подходит для больших экспортов, работы со схемой и всего, что вы хотите автоматизировать скриптом. Вариант через браузер описан в статье [Использование phpMyAdmin](https://support.kapsulehost.com/ru-ru/sites-phpmyadmin).

## Выполнение запросов и дампов через туннель

Когда туннель открыт, стандартные инструменты командной строки работают как обычно, направленные на ваш локальный перенаправленный порт:

```sh
mysql -h 127.0.0.1 -P 3307 -u <db-user> -p <db-name>

mysqldump -h 127.0.0.1 -P 3307 -u <db-user> -p <db-name> > backup.sql
```

> **Warning:** Ручной дамп, это удобная копия, а не стратегия резервного копирования. Она актуальна лишь на момент создания и хранится на том ноутбуке, с которого вы её сделали. KapsuleHost уже выполняет автоматическое ежедневное резервное копирование сайта с хранением в течение 30 дней. Прежде чем полагаться на локальный файл `.sql`, смотрите статью [Создание резервной копии](https://support.kapsulehost.com/ru-ru/taking-a-backup).

## Устранение неполадок

**«Address already in use» при открытии туннеля.** На вашей машине этот локальный порт уже занят чем-то другим. Выберите другой, например `-L 3399:127.0.0.1:3306`, и измените порт в клиенте соответствующим образом.

**«Connection refused» от клиента базы данных.** Туннель не установлен. Проверьте, что терминал SSH всё ещё работает и не вывел ошибку, а также что порт в вашем клиенте совпадает с локальным портом в аргументе `-L`.

**SSH подключается, но клиент всё равно обрывает соединение по тайм-ауту.** Убедитесь, что вы перенаправляете на `127.0.0.1:3306`, а не на публичное имя хоста. Перенаправление на публичное имя заставляет сервер обращаться к базе данных через интернет, а именно это и заблокировано.

**«Access denied for user».** Вход по SSH прошёл успешно, но учётные данные MySQL неверны. Скопируйте имя пользователя и пароль заново со вкладки «База данных» с помощью значков копирования, а не вводите их вручную, и проверьте, что вы подключаетесь к правильной базе данных.

**Permission denied (publickey) ещё до обращения к MySQL.** Это уровень SSH, а не базы данных. Пройдите раздел по устранению неполадок в статье [Добавление SSH-ключей к сайту](https://support.kapsulehost.com/ru-ru/adding-ssh-keys).

## Куда двигаться дальше

- [Загрузка файлов через SFTP](https://support.kapsulehost.com/ru-ru/sftp-access) использует те же учётные данные SSH для передачи файлов.
- [Использование phpMyAdmin](https://support.kapsulehost.com/ru-ru/sites-phpmyadmin) для работы с базой данных через браузер.
- [Восстановление из резервной копии](https://support.kapsulehost.com/ru-ru/restoring-from-backup), если запрос зашёл дальше, чем вы рассчитывали.
