История о том, как обойти грабли в процессе разработки
По мотивам вебинара “LAMP, VBOX & Git — маленькие радости разработчика” от 07.06.2020, запись https://webinars.zbrain.org/webinar/1
Знатно потоптавшись по различным граблям, связанным с разницей окружений, версий и инфраструктуры production-server и локального developer-server, я пришёл к выводу, что спасти меня от набития одних и тех же шишек может разработка в условиях, аналогичных тем, в которых продукт будет работать. Данный подход может показаться новичкам страшным и не комфортным, но он позволяет значительно сэкономить время и сберечь нервы.
Главным помощником в этой задаче будет Виртуализация. Именно виртуальные машины я предпочитаю другим решениям, из-за обособленности ресурсов. Кроме того, “виртуалка” имеет приятный бонус в виде Snapshot’а (снимка), когда мы можем сохранить текущее состояние машины перед экспериментом, а потом смело ронять её, не боясь потерять при этом данные.
Немного о преимуществах такого подхода:
- На виртуальную машину можно установить необходимые вам инструменты от редакторов до пакетных менеджеров и менеджеров зависимостей и создавать ваш код прямо там. Мы получаем выделенную машину, сконфигурированную под разработку, не покупая при этом новое железо, а используя ресурсы имеющейся системы.
- Разработка на Linux куда более комфортна, необходимые решения устанавливаются в одну команду в консоли, вы избежите огромного количества ошибок, появляющихся при разработке на Windows. А самое важное — ваш код будет отрабатываться именно в тех условиях, в которых он будет работать на Production-сервере. Таким образом, вы защитите себя от трудностей, вызванных разницей версий окружения или архитектуры. Cтоить отметить, что Linux изначально “заточен” под работу в серверном исполнении.
Одна и та же Linux-машина может быть сконфигурирована и как сервер, и как десктоп, и как и то и другое одновременно. Windows, с другой стороны, нативно не поддерживает серверные особенности, и установка на неё серверных инструментов, к тому же инструментов *nix-систем — это целая драма в десяти действиях. А, как известно, костыли — это неудачное решение.
- Не стоит упускать из вида так же и нюансы безопасности. При таком подходе вам не нужно открывать лишние порты на хостовой машине, а так же устанавливать на неё огромное количество инструментов разработчика, которые при слабых навыках серверного администрирования могут превратиться в уязвимость вашей основной операционной системы. И хотя отсутствие выделенного IP является преградой для многих злоумышленников, тем не менее, нет гарантии, что, условно, ваш сосед не взломает ваш роутер и не проникнет в вашу сеть. Уязвимость и открытые порты на виртуалке поставят в рисковое положение только проект, а на хосте — всю имеющуюся на нём информацию, в том числе и ваши личные данные.
В этой статье мы разберём создание сервера LAMP (Linux, Apache, MySql, PHP), как самый простой для новичков набор инструментов, на базе Ubuntu (одной из самых распространённых сборок для серверов).
Нам понадобятся:
- дистрибутив VirtualBox c официального сайта https://www.virtualbox.org/wiki/Downloads и там же рядом лежащий Oracle VM VirtualBox Extension Pack
- iso-образ Ubuntu с официального сайта https://ubuntu.com. В данной статье мы рассмотрим вариант работы “с полным погружением”, когда весь процесс разработки происходит на виртуалке (я буду показывать на примере Xubuntu https://xubuntu.org, как обладательницы более легковесного GUI), а так же вариант установки машины без Desktop Environment и подключение IDE к ней через ssh.
- хостовая машина, на которой и будет происходить вся магия, для нашего примера я использую Windows — систему, доставляющую наибольшую боль при разработке.
Скачав дистрибутив VBox и не забыв сверить хэш-сумму (она лежит рядышком с дистрибутовом на странице разработчиков), запускаем и следуем инструкциям в установщике. После завершения стоит перезагрузить компьютер, что бы быть уверенными, что все необходимые компоненты установились правильно и запустились. В процессе установки гипервизора произойдёт создание виртуального сетевого адептера. Также, уже в самой VirtualBox, устанавливаем VirtualBox Extension Pack.
Запускаем гипервизор, выбираем Machine → New. В открывшемся окне указываем название будущей виртуалки, какое нам удобнее, можем изменить папку, установленную для сохранения машины по умолчанию, указывем тип устанавливаемой операционной системы (Ubuntu x64).
В следующем пункте нам предложат выделить размер оперативной памяти, который мы согласны “оторвать” от хоста в пользу виртуальной машины. Помните, что машины с Desktop Environment потребуют больше ресурсов
На последующих вкладках оставляем значения по умолчанию:
- Hard disk: Create a virtual hard disk now
- Hard disk file type: VDI (VirtualBox Disk Image)
- Storage on physical hard disk: Dynamically allocated
На вкладке File location and size мы можем выбрать место, где будет лежать наш виртуальный диск, и указать его размер. Размер диска лучше продумать заранее, исходя из технологий, которые вы будете использовать. Однако, если вдруг вам не хватит места, VirtualBox позволяет расширить размер, хоть и с небольшими танцами с бубном.
По завершению этих манипуляций мы станем обладателем жёсткого диска, пока ещё пустого и ничем не обременённого.
В интерфейсе VirtualBox появится наша новая машина. Выделяем её, заходим в настройки и выбираем Storage. Мы увидим там диск, который мы только что создали. Теперь нам нужно на этот диск записать Операционную систему. Выбираем иконку оптического диска в разделе Controller: IDE (Adds optical drive) и попадаем в перечень дисков, уже известный нашему VirtualBox. Поскольку гипервизор мы только что установили, об имеющихся iso-образах он ещё не в курсе. Нажимаем иконку диска с большим зелённым плюсиком на ней — Add и ищем скачанный образ на нашей хостовой (реальной) машине. По окончании поисков и добавления образа, Ubuntu появится в списке дисков, подключенных к контроллеру.
На всякий случай заглянем в пункт настроек System и проверим порядок загрузки. По умолчанию загрузка с оптических дисков происходит перед загрузкой с жёстких дисков. Нажимаем OK и стартуем нашу виртуалку кнопкой с большой зелёной стрелкой и надписью Start, которую сложно не заметить.
Запуск системы будет происходить с iso-образа. Нас приветливо спросят, хотим ли мы просто посмотреть на Ubuntu или хотим установить. Выбираем “Установить” и следуем инструкциям установщика. Если вы не уверены, что из предложенно в процессе установки выбрать, оставляйте значение по умолчанию. После всех манипуляций с выбором языка системы, часового пояса и пр. начнётся запись ОС на виртуальный жёсткий диск. Процесс займёт минут 10. Можно сделать паузу и выпить кофе.
По завершению установки нас попросят перезагрузить машину, а так же убедиться, что в настройках Controller: IDE оптический диск изъят. Поздравляю. Мы с вами установили виртуалку.
При запуске неприяной особенностью окажется то, что виртуалка открывается не на весь экран, а маленьким окошком. Что бы исправить ситуацию, при запущенной системе выбираем в интерфейсе меню окна (вверху) Devices — Insert Guest Additions CD image. Когда-то образ этих дополнений нужно было качать отдельно. Последние верисии VirtualBox уже поставляются с включённым Guest Additions CD. И всё, что нам остаётся — просто подключить его к машине. Далее нам потребуется в виртуалке с подключенного диска Guest Additions CD скопировать файл VBoxLinuxAdditions.run, например, в папку Downloads, открыть в папке куда скопировали файл терминал и установить для него права на запуск:
sudo chmod +x ./VBoxLinuxAdditions.run
Остаётся только запустить установку самих гостевых дополнений и следовать инструкциям:
sudo ./VBoxLinuxAdditions.run
После окончания установки гостевых дополнений рекомендуется перезагрузиться — так у нас будет уверенность что всё в порядке, драйверы установились и запускаются при старте системы. Заметьте — разрешение экрана стало динамическим — вы можете задать любой размер окна виртуалки.
Linux мы установили. Следующим шагом мы будем разворачивать Apache — Mysql — PHP.
Существует огромное количество мануалов по установке и настройке данного кружения. Но сегодня я хочу вам показать небольшой “лайфхак”, позволяющий установить необходимые инструменты без чтения огромных инструкций.
Мы будем использовать Tasksel. Tasksel — это инструмент для установки нескольких связанных пакетов в системе одной скоординированной задачей. Однако, я не рекомендую вам использовать Tasksel необдуманно и пытаться заменить им пакетный менеджер. Для нашей же конкретной задачи по развёртыванию LAMP, Tasksel подходит идеально.
Открывем консоль из стартового меню системы или просто нажатием Ctrl + Alt + T. Для начала нам надо обновить данные репозиториев.
sudo apt-get update
Далее устанавливаем Tasksel
sudo apt-get install tasksel
И уже с помощью Tasksel устанавливаем LAMP
sudo tasksel
В открывшемся меню при помощи стелок клавиатуры вверх/вниз находим пункт LAMP server, пробелом устанавливаем выбор, и далее, ничего более не трогая, при помощи Tab выбираем <OK>, нажимаем Enter и наблюдаем за процессом установки. Пара минут — и наше окружение готово.
Теперь можно зайти в MySQL
sudo mysql
для создания баз, таблиц, пользователей и прочих манипуляций, необходимых проекту, который вы разрабатываете.
Дефолтная приветственная станица Apache встретит нас по адресу в браузере виртуалки 127.0.0.1 или просто localhost.
Зайдя во вкладку Network в настройках виртуальной машины в интерфейсе VirtualBox мы увидим пункт Attached to с выпадаюшим списком выбора. По умолчанию виртуалка устанавливатся за NAT хостовой машины. Выбрав Bridge мы можем завести виртуалку в домашнуюю локальную сеть (мы рассматриваем домашнюю сеть, управляемую вашим роутером). В этом случае вы можете просмотреть проект, находящийся у вас на виртуалке, с любого девайса домашней сети.
Для этого нам понадобиться узнать IP, который был присвоен виртуальной машине. Сделать это можно при помощи команды в терминале:
ifconfig, или
ip a
К примеру, если присвоенный IP будет 198.168.1.110, то на вашем компьютере/ноуте и т.д. домашней сети в адресной строке браузера указываем http://198.168.1.110 и попадаем на страницу, которую бодро отдаёт Apache на виртуалке.
Пожалуй, единственный недостаток полного переноса разработки на виртуальную машину — высокое ресурсопотребление, особенно заметное при использовании тяжеловесных графических интерфейсов на слабом железе. Именно для таких случаев мы рассмотрим вариант, когда код пишется с помощью IDE на хостовой машине, а работает на виртуальной без GUI. Следует учитывать, что такой ход будет комфортен новичкам, если IDE поддерживает функцию синхронизации по ssh или ssh-тунели.
Для установки серверной версии Ubuntu идём на https://ubuntu.com и качаем Ubuntu Server. Заранее отмечу, что для работы с данной машиной понадобятся базовые навыки работы в консоли. Desktop Environment на серверных сборках отсутствует.
Процесс установки похож на тот, что мы рассмотрели с Xubuntu, с той лишь разницей, что вместо графического установщика будет псевдографический — консольный, в котором манипуляции производятся не мышкой, а стрелочками клавиатуры, Tab, Enter и пробелом. Так же в процессе установки нам предложат поставить openSSH-server и некоторые другие популярные инструменты.
После установки виртуальной машины, так же устанавливаем tasksel и далее LAMP.
Размещать код проекта на такой сервер удобнее всего при помощи git. Достаточно просто перейти в папку, из которой сервер отдаёт файлы, и склонировать туда репозиторий.
Если проект ещё не создан, то пропускаем это шаг с git и приступаем к подключению IDE.
Для использования этой особенности на виртуальной машине должен быть установлен openSSH-server, а на хостовой машине openSSH-client.
Чтобы включить ssh-клиент на Windows хостовой машине, заходим в “Параметры” → “Приложения” → “Управление дополниетльными компонентами”. Выбираем “Добавить компонент”, ищем в представленном списке OpenSSH Client и жмём кнопку “Установить”. Что бы изменения вступили в силу, Windows стоит перезагрузить.
Для установки OpenSSH-server на Ubuntu пишем в консоли
sudo apt-get install openssh-server
и наслаждаемся процессом установки.
Подключение к виртуальному серверу рассмотрим на примере наиболее популярных среди моих разработчиков IDE.
Visual Studio Code
Позволяет создать ssh-тунель, и редактировать файлы, находящиеся на виртуальной машине.
Для самого Visual Studio Code необходимо установить Remote Development extension pack.
Запускаем VSCode, нажимаем Ctrl + P и в появившемся поле вводим
ext install ms-vscode-remote.vscode-remote-extensionpack
В side-bar появится иконка “Remote Explorer”. Переходим.
Устанавливаем соединение с виртуальной машиной: нажимаем F1, выбираем Remote-SSH: Connect to Host. В открывшемся поле вводим данные нашей виртуалки вида user@host, где user — имя пользователя (созданного при установке, или одного из дополнительных, обладающих нужными правами), а host — ip адрес виртуалки (ip адрес можно узнать, выполнив на Ubuntu команду ifconfig или ip a). Нажимаем Enter.
Откроется новое окно VSCode, где в командной строке нас попросят ввести пароль. Указываем пароль пользователя. Пару секунд, и, вуаля! VSCode подключен к файловой системе удалённой машины.
Теперь, нажав в данном окне Explorer в меню side-bar и выбрав Open Folder, мы увидим, что находимся в домашней дирректории подключённого пользователя виртуальной машины. Нам останется только найти папку с проектом, и можно работать. При этом все файлы и серверное окружение находятся на виртуальной машине. А редактор VSCode, из которго мы работаем — на хостовой.
Просматривать результат работы мы спокойно можем из браузера на хосте или любого другого девайса нашей дрмашней сети (при условии, что виртуальная машина в эту сеть заведена), просто указав в браузере http://198.168.1.110 (разумеется, ip надо подставить соответственно присвоенному вашей виртуалке).
Таким же способом можно подключатся не только к виртуальной машине, но и к удалённому серверу.
IntelliJ IDEA
Позволяет синхронизировать файлы на вашей локальной (хостовой) машине и файлы удалённого, в том числе виртуального, сервера.
При запуске создаём новый пустой проект. Далее, идём в Preferences → Deployment. Нажимаем знак + и выбираем SFTP. В появившемся окошке вводим название сервера. Далее:
Type — оставляем SFTP.
SSH configuration — при первой настройке синхронизации для конкретной машины, нужно создать. Нажимаем кнопочку с тремя точками, и в открывшемся окне заполняем данные виртуального сервера:
- Host — вводим IP виртуальной машины.
- Если порт для ssh не меняли принудительно, то оставяем как есть — 22.
- User name — указываем имя пользователя на виртуалке
Authentication type — для простоты примера оставляем Password. Если вы хорошо знакомы с работой по ssh, можно выбрать тот метод, который предпочитаете.
Password — указываем пароль пользователя.
Нажимаем Test Connection, чтобы проверить соединение с сервером.
Теперь в SSH configuration можем выбрать только что созданный профиль
Root path — указываем путь к папке на виртуальном сервере, где лежит (или будет лежать) проект.
Во вкладке Mapping указываем путь к папке на нашем компьютере, с которой будет проходить синхронизация.
Далее, идём в Tools → Deployment → Browse Remote Host. IDEA синхронизирует данные, и покажет файлы с виртуально машины.
Результат будет аналогичнен примеру с VSCode — наш проект “крутиться” на виртуальном сервере, а редактируем мы его с хоста.
****
Наш телеграм: https://t.me/zbrain
Мы в яндекс дзен: https://zen.yandex.ru/id/5e66aeb2576bb763c4ffd74a
Наш сайт: https://zbrain.org
Вебинары: https://webinars.zbrain.org