История о том, как обойти грабли в процессе разработки

Team zBrain
zBrain
Published in
10 min readJul 1, 2020

По мотивам вебинара “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

--

--

Team zBrain
zBrain
Editor for

zBrain— онлайн школа для специалистов по кибербезопасности