SSH: подключение к серверу
SSH (Secure Shell) — протокол зашифрованного удалённого доступа к серверу: позволяет выполнять команды, передавать файлы и создавать туннели через защищённое соединение.
Зачем нужно
SSH — основной инструмент управления Linux-серверами. Без него невозможно настроить VPS, задеплоить приложение вручную или отладить проблему на сервере. Ключевая пара (key pair) вместо пароля — более безопасный и удобный способ аутентификации, используемый в CI/CD для автоматических деплоев.
Где используется
- Подключение к VPS (DigitalOcean, AWS EC2, Hetzner)
- Автоматический деплой из GitHub Actions через
appleboy/ssh-action - Копирование файлов на сервер (SCP, rsync)
- Туннелирование портов для доступа к закрытым сервисам
Основной контент
Генерация SSH-ключей
# Создать пару ключей (Ed25519 — современный, надёжный)
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
# Два файла:
# ~/.ssh/id_ed25519 — приватный ключ (НИКОМУ не давать!)
# ~/.ssh/id_ed25519.pub — публичный ключ (копируется на сервер)
# Просмотр публичного ключа
cat ~/.ssh/id_ed25519.pub
Добавление ключа на сервер
# Вариант 1: ssh-copy-id (если уже есть доступ с паролем)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
# Вариант 2: вручную
ssh user@server-ip
mkdir -p ~/.ssh
echo "ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Подключение
# Базовое подключение
ssh user@server-ip
ssh -i ~/.ssh/id_ed25519 user@server-ip # явно указать ключ
ssh -p 2222 user@server-ip # нестандартный порт
# ~/.ssh/config — алиасы для серверов
Host myserver
HostName 1.2.3.4
User ubuntu
IdentityFile ~/.ssh/id_ed25519
Port 22
# Теперь можно просто
ssh myserver
Передача файлов
# SCP — копирование файлов
scp file.txt user@server:/var/www/
scp -r ./dist user@server:/var/www/myapp/
# rsync — синхронизация (быстрее, передаёт только изменения)
rsync -avz --delete ./dist/ user@server:/var/www/myapp/
rsync -avz -e "ssh -i ~/.ssh/deploy_key" ./dist/ user@server:/var/www/
Туннели (port forwarding)
# Локальный туннель: доступ к удалённой БД через localhost
ssh -L 5433:localhost:5432 user@server
# Теперь postgres://localhost:5433 → server:5432
# Удалённый туннель: сервер перенаправляет трафик на локальный порт
ssh -R 8080:localhost:3000 user@server
SSH-ключ в GitHub Actions
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_HOST }}
username: deploy
key: ${{ secrets.SSH_PRIVATE_KEY }} # приватный ключ в GitHub Secret
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
pm2 restart myapp
Усиление безопасности SSH
# /etc/ssh/sshd_config
PasswordAuthentication no # отключить вход по паролю
PermitRootLogin no # запретить вход под root
Port 2222 # нестандартный порт
AllowUsers deploy # разрешить только конкретного пользователя
sudo systemctl restart sshd
Частые ошибки
- Хранить приватный ключ в репозитории — использовать только GitHub Secrets
- Права
644на~/.ssh/authorized_keysвместо600— SSH отказывает в подключении - Отключить вход по паролю до проверки что ключ работает — можно заблокировать себя
- Не добавить IP Cloudflare/firewall-правила — порт 22 открыт для всего интернета