<-- home

Удаленный сервер для разработки

English version

В этом руководстве я расскажу как создать удаленный сервер для разработки через mosh (аналог ssh) и как настроить iTerm2 для более комфортной работы.

Мои требования к серверу такие:

  • Убунта
  • Цена в пределах $15 в месяц. Лучше меньше $10
  • Диск от 30ГБ
  • Возможность увеличения диска
  • 2 CPU уровня дроплетов в DigitalOcean (лучше 4)
  • Желательно иметь возможность увеличения мощности

При этом сервер не нужен постоянно. Ожидаемое время использования менее 10%. То есть в месяц около 16 часов.

А зачем?

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

  • Нужна машина, которая будет всегда включена
  • Хочется использовать Linux, но под рукой только Windows
  • Не хочется использовать рабочий комп, при отсутствии своего
  • Доступ с любого девайса
  • Нужна машина со специфичной конфигурацией: много памяти, GPU, большой диск

И так далее.

Выбор провайдера

Первым делом я посмотрел на DigitalOcean, которым пользуюсь довольно давно. У них есть неплохой вариант за $15: 2 vCPU, 2GB. 60GB. Однако увеличение диска понесет за собой переход на новый тариф. К тому же нельзя просто остановить сервер, не убив диск — деньги всё равно будут капать.

Вторым в моём списке шёл AWS. И там я нашёл именно то, что мне нужно. А именно сервис EC2, который позволяет создавать виртуальные сервера по требованию. Инстанс с 2 vCPU и 2GB стоит $0.0536, что для условленных 16 часов в месяц выливается в $0.8. Очень неплохо.

При этом диска у таких серверов нет. В качестве подключаемого хранилища используется сервис EBS. Цена за 30GB диска будет $3.57. Диск при этом можно расширять.

Итого менее $5 месяц. Но самое интересное в том, что диск и машина по сути разделены, а значит, что при необходимости можно подключить диск к другой машине без каких-либо проблем.

Дополнительный бонус в том, что AWS позволяет делать с инфраструктурой что угодно через консольную утилиту, что позволит легко автоматизировать многие задачи.

И бонус для тех, кто не пользовался AWS. В первый год у них много бесплатных ресурсов (free tier). Например 750 часов EC2 и 30GB EBS. Это значит, что пользуясь этим гайдом вы можете получить сервер бесплатно (внимание, уточняйте цены на сайте амазона перед тем как делать что-либо).

Перейдём к самому интересному…

Настройка Mac OS

Если вы используете Mac OS как разработчик, скорее всего у вас уже установлен iTerm2. Если обычный терминал вам больше по душе, то просто пропустите часть про интеграцию с iTerm2 в конце.

Дополнительно нужен mosh, который легко поставить из brew

brew install mosh

Создание инстанса

Вам понадобится аккаунт AWS. После чего откройте консоль AWS.

Обратите внимание на верхний правый угол. Там есть селектор региона. Амазон имеет сервера по всему миру и вам нужно выбрать тот, до которого пинг меньше. Для европейской части России подойдёт Франкфурт.

Выбор региона

Откройте меню Services и найдите там ссылку на EC2. После чего жмите кнопку Launch Instance

Выбор раздела Services

После чего открывается помощник создания сервера. Пройдёмся по шагам.

Step 1: Choose an Amazon Machine Image (AMI)

Выбор начального образа. Я использую Ubuntu Server 16.04 LTS (HVM) и далее буду рассказывать о настройках именно этой ОС. При желании (и знании) вы можете использовать ту, которая вам нравится.

Step 2: Choose an Instance Type

Выбор типа инстанса. Тип отвечает за размер памяти, количество ядер процессора, наличие встроенного диска и качество канала. Для старта подойдёт t2.micro (он так же входит во Free tier).

Step 3: Configure Instance Details

Конфигурация инстанса. Тут ничего менять не нужно.

Step 4: Add Storage

Добавление EBS хранилища. Для начала 8GB будет с головой. А теперь важное: уберите галку с поля Delete on Termination. Нам важно, чтобы при удалении инстанса хранилище продолжало существовать.

Step 5: Add Tags

Пропускаем.

Step 6: Configure Security Group

Эта вкладка позволяет настроить начальные значения файрвола. По умолчанию в списке уже есть SHH на порту 22. Добавим еще один.

  • Type: Custom UDP Rule
  • Protocol: UDP
  • Port Range: 60000-61000
  • Source: 0.0.0.0/0
  • Description: mosh

Настройка портов

Step 7: Review Instance Launch

Нажимаем кнопку Launch.

После нажатия появляется окно для выбора ключей. Выбираем опцию Create a new key pair, а в поле key pair name пишем remote_server. После чего надо скачать ключ, нажав Download key pair

Внимание, не потеряйте ключ (remote_server.pem), без него доступа на сервер не будет.

После чего запускаем сервер

Хранение ключа

Стандартный местом для хранения ключей является папка ~/.ssh. перенесите ключ туда.

Некоторый SSH клиенты требуют чтобы на файле-ключе был ограниченый доступ (во всяком случае я с этим столкнулся). Поэтому добавим нужные права доступа.

chmod 600 .ssh/remote_server.pem

Настройка сервера

Переходим в список инстансов и ждём, когда сервер будет в состоянии “running”. После чего копируем адрес (Public DNS).

Список инстансов

Подключимся по SSH (значение после @ — скопированный адрес).

ssh -i ~/.ssh/remote_server.pem ubuntu@<public dns>

Если всё сделано правильно, то вы увидите приветственное сообщение.

Следующий пункт это установка mosh на сервер

sudo apt-get update
sudo apt-get install mosh

На этом базовая настройка сервера закончена. Выходим из оболочки, нажав Ctrl+d.

Важно: я пропустил большую часть настройки для реального сервера. В конце поста будет список того, что нужно сделать, если вы собираетесь использовать такой сервер для работы.

Проверка работы mosh

Перед тем как продолжить надо проверить, что всё работает.

mosh --ssh="ssh -i ~/.ssh/remote_server.pem" \
   ubuntu@<public dns> \
  -- sh -c "tmux ls | grep -vq attached && tmux a || tmux new"

Замените значение __ на адрес сервера. Если удалось подключиться, то всё отлично.

Настройка iTerm2

iTerm2 позволяет создавать несколько раздельных профилей с разными сочетаниями клавиш и разными настройками (например, цветами).

Откройте настройки iTerm2, перейдите в раздел Profiles и добавьте новый. Во вкладке General выберите пункт Login shell, а в поле Sent text at start скопируйте предыдущую команду для подключению к серверу.

Для удобства работы с Tmux я использую несколько горячих клавиш. Настроить их можно во вкладке Keys. Жмёте плюс, указываете шоткат, в Action выбираете Send Hex Code, потом добавляете нужный код.

Добавление горячих клавиш

Клавиши такие

  • Новое Tmux окно. Shortcut Cmd+t, Code 0x02 0x63
  • Закрыть окно. Shortcut Cmd+t, Code 0x02 0x78
  • Предыдущее окно. Shortcut Cmd+ стрелка влево, Code 0x02 0x70
  • Следующее окно. Shortcut Cmd+ стрелка вправо, Code 0x02 0x6e

Вы можете легко добавлять нужные горячие клавиши. Чтобы узнать коды, можете использовать совет, описанный по этой ссылке

Написание кода

Для удаленного сервера вариантов не так много. Это или Vim или Emacs. Я предпочитаю первый. Vim отлично работает через Mosh. Современные IDE, такие как WebStorm могут синхронизировать файлы по SSH. Но это вне данного руководства.

Выключение сервера

Из списка инстансов можно управлять текущим состоянием. Включать и выключать сервер. Там же можно менять тип инстанса (предварительно его выключив). Плата идет только за работающий (running) инстанс с посекундной тарификацией.

Выключение

Изменение размера диска

В консоли амазона есть раздел Volumes. Там показаны текущие разделы в регионе. Можно менять их размер, создавать новые и так далее.

Что я пропустил

Я пропустил некоторые вещи, чтобы не делать пост слишком большим. Поэтому пройдусь по тем вещам, которые нужно учитывать, если вы захотите всерьез использовать удаленный сервер.

Первое и самое важное — безопасность; Наличие сервера с доступом снаружи — это всегда риск взлома. Есть небольшой, но важный комплекс задач, который стоит сделать при создании нового сервера. Начальный гайд можно найти тут

У амазона есть консольная утилита aws-cli, которая позволяет производить любые операции. Для себя я накидал скрипт, который автоматически поднимает инстанса и коннектится к нему, когда он готов. И этот скрипт запускается при открытии профиля iTerm2. Если читателям будет интересно, то я приведу этот скрипт в нормальный вид и выложу тут.

В зависимости от шаблона использования я вижу различные автоматизации, которые можно сделать. Например включать и выключать сервер в определенное время. Или сделать скрипт для быстрого изменения типа инстанса.

Comments