Долгое время в отделе компании, где я работаю, различные проекты вели и разрабатывали разные люди. Но время шло, проекты росли, и многие проекты начали требовать участия в разработке команды. Как у нас это происходило — был тестовый сервер и локальная версия проекта у каждого разработчика. Когда кто либо вносил изменения он выкатывал их на тестовый сервер, но, регулярно происходила ситуация, когда один разработчик, затирал изменения другого. Так мы сделали свой первый шаг к «цивилизации» — развернули свой git сервер. Ситуация значительно улучшилась, но осталась большая проблема — конфиги. Сначала решали ее добавлением оных в .gitignor, но удобства это не добавляло. Плюс, когда новый человек подключался к проекту, ему приходилось брать дефолтные конфиги и настраивать их под свою среду (при этом не каждый тестер или тот же верстальщик может это адекватно сделать). Опять таки — вопросы с установленными модулями у каждого участника команды.

И вот тут пришло понимание — среда должна быть максимально одинаковая у всех, при этом она должна быть и максимально приближенной к реальным условиям эксплуатации конечных продуктов. При этом нельзя лишать разработчиков их любимых IDE. Что бы там не говорили, но большинство разработчиков используют Windows, а конечные web хостинги с PHP — unix. Я в своей практике не раз натыкался на «грабли» — локально под Windows все работает — выкладываем на хостинг и все плохо.

Так я пришел к выводу — нужно организовать симбиоз Windows и Unix. Решение, в общем то, лежит на поверхности — виртуальная машина под windows, с любой unix-like системой внутри.

В качестве системы виртуализации был выбран VMware Workstation.
Добавляем к виртуальной машине две сетевых платы. Одна тип «NAT» (нужно же нашей виртуалке в инет ходить), другая тип «Только для узла». Через нее мы будем ходить с родительской машины.

image

В виртуалку был установлен Ubuntu Server (выбор исключительно основан на моих предпочтениях, плюс подкупает наличием, и своевременным обновлением, всех необходимых пакетов), плюс стандартный LAMP (инструкций по установке в интернете хватает). Пока ничего необычного.

А вот дальше немного «магии» по настройке этого хозяйства, так чтобы было всем удобно.

Обязательно устанавливаем VMware Tools в виртуалке. Создаем на любом локальном диске под Windows папку «web» (название может быть любым, но оно потом должно быть таковым у всех участников команды). Подключаем эту папку к виртуалке, как общую папку

image

Смотрим куда у нас она подключилась в системе

image

Видим, что точка монтирования "/mnt/hgfs".
Теперь нам нужно, чтобы папки из "/mnt/hgfs/web" автоматически подключались к apache.

В первую очередь добавляем в "/etc/apache2/sites-enabled" конфиг:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /mnt/hgfs/web
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Таким образом у нас получается, что любой из проект мы сможем открыть по адресу «httр://имя_сервера/имя_папки/». Но не всегда это удобно. А потому добавляем создание еще и локальных доменов.

Создаем файл "/root/web/elap.conf" следующего содержания:

<VirtualHost *:80>
        ServerName domen
        ServerAdmin webmaster@localhost
        DocumentRoot path

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        <Directory "path">
            Options Indexes FollowSymLinks MultiViews
            AllowOverride all
            Require all granted
        </Directory>
</VirtualHost>

Затем пишем скрипт следующего содержания:

#!/bin/sh

workdir="/mnt/hgfs/web/"
apconf="/etc/apache2/sites-enabled/local.conf"
apelconf="/root/web/elap.conf"

echo > ${workdir}/local.conf

LIST=`find $workdir -maxdepth 1 -type d`

for PATH_DOMEN in $LIST
do
domen=`echo $PATH_DOMEN | sed s~${workdir}~~`

if !( test -z ${domen} ) then
cat ${apelconf} | sed s~domen~${domen}.local~ | sed s~path~${PATH_DOMEN}~ >> ${workdir}/local.conf
fi

done

dc=`diff $apconf ${workdir}/local.conf`
if !( test -z "${dc}" ) then
cat ${workdir}/local.conf > $apconf
/etc/init.d/apache2 restart
fi

И добавляем его в крон (я поставил на раз в минуту) — только вы создали новую папку в папке «web», пока из гита тянете в нее данные — домен в виртуалке вида «httр://имя_папки.local» уже подключен.

Теперь нам нужно, чтобы и Windows узнала об этих локальных доменах. Можно было пойти двумя путями — поднять в виртуалке днс сервер или воспользоваться файлом «hosts» в windows. Я решил пойти вторым путем.

Смотрим адрес который выдан на сетевую карту тип «Только для узла». К сожалению, для каждой инсталяции VMware он индивидуален (либо я не нашел как его зафиксировать), а потому, в последующем, при настройке этой связки на компьютерах членов команды, нужно его изменять. Одно радует — в последующем он не меняется уже локально.

image

Видим, что нужная нам сетевая карта «eth0» с адресом «192.168.81.128». Добавляем в «C:\Windows\System32\drivers\etc\hosts» следующую строку:

192.168.81.128 web
И пишем скрипт следующего содержания:

@echo off
set workdir=d:\webdir %workdir% /A:D /B > %workdir%list_project.txt
find /V ".local" C:\Windows\System32\Drivers\etc\hosts > %workdir%hosts_new

for /F %%i in (%workdir%list_project.txt) do (
  echo 192.168.81.128 %%i.local >> %workdir%hosts_new
) 

copy %workdir%hosts_new C:\Windows\System32\Drivers\etc\hosts

Теперь после добавления нового проекта в папку «web» нам необходимо один раз запустить этот скрипт от имени администратора (!!!) и локальный домен станет вам доступен.

Затем просто клонируем виртуалку всем сотрудникам.

Собственно такая система обкатана, и плодотворно работает. Осталась не решенной пока одна проблема — БД. Сейчас мы во всех проектах сохраняем БД в папке «sql» и при установке локальной копии проекта приходится вручную заливать базу. Возникают вопросы как отслеживать изменения в базе. Как оповещать о них. Если у вас есть решение — прошу в комментарии.

Комментарии (28)


  1. berezuev
    24.07.2015 12:33
    +8

    поставил линукс @ напиши пост…

    А так, вы с этим постом опоздали лет эдак на 5..) Возвращайтесь, когда узнаете про Vagrant


    1. BAV_Lug Автор
      24.07.2015 12:45
      -2

      Видимо вы дочитали статью только до установки системы в виртуалку — это ваше право.


      1. berezuev
        24.07.2015 13:03
        +1

        Я таки прочитал ее полностью. У меня на работе тоже есть доступ к некоторым сайтам в виртуалках коллег. Однако, по прежнему, ничего нового и интересного.
        Более того, о чем вообще можно говорить, если вы только недавно начали использовать системы контроля версий?


        1. BAV_Lug Автор
          24.07.2015 13:04

          Кто вам сказал, что это произошло недавно?


          1. SerafimArts
            24.07.2015 13:20

            Иначе подобных проблем бы не возникало. Для развёртывания БД достаточно было бы слить миграции и сидеры и одной кнопкой поднять нужное.

            Да, безусловно статья интересна начинающим, но, увы (или наоборот к счастью) в реальной жизни таким уже очень давно не приходилось заниматься, всё делается проще и удобнее, благо жизнь не стоит на месте и появляются более удобные инструменты.


            1. BAV_Lug Автор
              24.07.2015 14:10
              -4

              Для развёртывания БД достаточно было бы слить миграции и сидеры и одной кнопкой поднять нужное
              Ну так распишите подробнее. Просьба из концовки статьи в силе.
              Очень не люблю теоретиков, которые нахватались «умных слов» (как они сами думают), а на деле 2+2 сложить не могут.


              1. SerafimArts
                24.07.2015 15:00
                +1

                Я не думаю что тут вообще есть о чём-то рассказывать, т.к. данный функционал есть как в виде отдельных либ, так и в виде куска ядра любого популярного (и не очень) фрейма.

                Я думаю этого будет достаточно, чтоб понять весь смысл оных: laravel.com/docs/5.1/migrations#migration-structure Т.к. описание выглядит как «миграции нужны для версионирования структуры любой реляционной БД».


      1. webportal
        24.07.2015 21:40

        Кстати а зачем всё таки вам 2 сетевых интерфейса в виртуалке? Когда можно обойтись одним в режиме моста.


  1. kozzztik
    24.07.2015 13:16
    +1

    Все это похоже на какой то невероятный костыль. Если есть проблемы с развертыванием проекта на локальных машинах, то нужно не засахаривать среду, в которой он разварачивается, а сделать нормальное развертывание? Если конфиг слишком сложный, что его верстальщик не может осилить, то может следует его упротить(задача сильно не оригинальная)?

    Под заголовком «Организация среды для совместной веб-разработки» ожидаешь увидешь историю успеха CI. Слабо себе представляю как будет удобнее отлаживать проект, запущенный в виртуалке, когда сам ты на хостовой системе.

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


    1. BAV_Lug Автор
      24.07.2015 13:53

      Что плохого в «засахаривании среды»? Если потом развертывание любого проекта заключается в одной команде «git fetch».

      Слабо себе представляю как будет удобнее отлаживать проект, запущенный в виртуалке, когда сам ты на хостовой системе.
      В этом и прелесть этого подхода — вы все делаете в своей любимой IDE под Windows. И сразу видите результат под Linux. Без каких либо дополнительных телодвижений. Опять таки — никто не мешает настроить дополнительные инструменты — тот же xdebug например.


      1. kozzztik
        24.07.2015 18:13
        -1

        Отлаживать в моей любимой IDE под Ubuntu мне лично гораздо проще, чем наварачивать виртуальную машину с волшебными скриптами и пытатся потом там что то удаленно отладить, для каждого запуска синхронизируя все это.

        И вообще говоря, также просто делать все это в той же любимой IDE под Windows или Mac, написав скрипт развертывания и инструкцию по настройке сайта. Если процесс элементарной отладки простого веб приложения требует таких усилий, то ваш проект стал невероятно громоздким уже независимо от того, что же он на самом деле из себя представляет.


        1. webportal
          24.07.2015 21:32
          +1

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


          1. kozzztik
            25.07.2015 05:03

            Дабы не засирать свой любимый или не очень интернет советую внимательнее читать оригинальные комментарии. Кстати говоря вам советуем посмотреть, а лучше поработать с python-env.


            1. webportal
              25.07.2015 18:12

              Я ответил не к изначальному комменту а именно к тому к которому нужно… Из него прекрасно видно что вы не работали с Вагрантом и ему подобными инструментами.


              1. kozzztik
                26.07.2015 19:15
                -1

                Даже если бы это было так, это никак не отменяет того факта, что для решения проблем, обозначенных в сабже, виртуализация в любом ее виде не нужна.


        1. rhamdeew
          26.07.2015 22:54

          Вообще в настройке удаленной отладки в случае с xdebug нет ничего сложного. Можно отлаживать хоть в виртуалке, хоть на выделенном сервере и все это с локальной машины.
          В случае если у вас Linux, то гораздо проще насоздавать отдельные машины с необходимым вам стеком. Сегодня это может быть LAMP, завтра может быть ROR с Mongo.

          Правда Vagrant я заменил бы на Docker. Как то не очень логично имея на борту ядро линукс эмулировать целый виртуальный компьютер чтобы там крутилось еще одно Linux ядро с вашим технологическим стеком. Тут лучше запускать контейнеры.


  1. Ekstazi
    24.07.2015 14:27

    Puphpet вам в помощь. И не будет нужды делать свои костыли. Плюс вам верно написали вверху, что надо использовать vagrant для подобных вещей.


  1. bskton
    24.07.2015 14:36

    В нашей команде у разработчиков на компах сначала стояла винда, но постепенно все заменили ее на Ubuntu, это оказался самый простой и удобный вариант для нас.
    Для решения проблемы с БД, посмотрите как устроены миграции в Laravel и в Symfony, также есть Liquibase


  1. zenn
    24.07.2015 14:46
    +1

    Вы не поверите, но вы изобрели невероятный костыль, когда можно ровно в 1 команду поднять аналогичную виртуальную среду при помощи vagrant и готового «бокса», к примеру — scotchbox.


    1. BAV_Lug Автор
      24.07.2015 17:27
      -3

      Забавно — приложение на 300 метров не костыль, а два скрипта на 20 строк — костыль. Хабр, такой хабр.
      Знаете — я еще из той эпохи динозавров, которые помнят, что чем меньше инструмент, тем лучше. И программы я стараюсь писать с оглядкой на используемую память.

      А так да — обвесим комп некостыльными программами, че тормозит? не проблема докинем памяти, опять тормозит? не вопрос купим новую железку и так до бесконечности.


      1. Ekstazi
        24.07.2015 17:53
        +4

        Смысл в том, что для вагранта есть кучу готовых образов под любые нужды и поддерживаются они большим сообществом. Кроме всего прочего вагрант позволяет предоставить доступ к своей виртуальной системе (и даже по ssh), даже если вы сидите за nat. Кроме всего прочего под вагрант написано немало плагинов, например, я пользуюсь vagrant-hostmanager и vagrant-vbguest, которые позволяют мне автоматически установить дополнения гостевой ос и прописать доменное имя сайта в моем hosts файле. Перечислять плюсы я могу слишком долго, а о минусах вам уже пытались рассказать выше. Вы предлагаете пилить под каждый случай отдельную систему с конфигурацией, мы же — использовать уже готовые инструменты, которые берут все проблемы на себя. Если вас не устраивает vagrant — используйте docker, хотя это и немного разного рода программы.


      1. rhamdeew
        26.07.2015 22:55

        А VMware Workstation у вас ничео не весит чтоли? )


        1. BAV_Lug Автор
          26.07.2015 23:13

          Ну так в случае с vagrant тоже придется иметь локальную систему виртуализации (виртуал бокс или вмваре — не суть). Это просто надстройка, причем чем-то это мне напоминает ситуацию с Word — 90 процентов юзеров пользуется им как блокнотом. Так же и с вагрантом этим — модная штука, но вот я не смог придумать ситуацию, зачем она мне могла бы понадобится. В 99% случаев, при разработке под веб с устоявшимся используемым стеком технологий, достаточно одной виртуалки. А если так, то это не более чем игрушка.

          Радует, что не у всех мозги уже закостенели — и есть почти 4 десятка людей, добавивших статью в избранное. А значит не зря я это сюда выложил, хоть статью и заминусили.


          1. rhamdeew
            26.07.2015 23:22

            То есть если вам оно ни к чему то и другим не нужно? )
            Vagrant по сути удобная надстройка над имеющимися системами виртуализации, по сути также как Docker в роли удобной надстройки над LXC.

            С тем же вагрантом вы можете запилить единожды полностью настроенный образ с вашим стеком и для его поднятия новому разработчику нужно будет только пару команд в терминале ввести и поправить пути в конфиге. Это на самом деле удобно.

            Помнится однажды я тоже экспериментировал с виртуализацией и запускал Virtualbox в headless-режиме из bash-скрипта. Этакий самопальный аналог вагранта. Все работает, но плюсов нет и сохраняется стойкое ощущение конструирования велосипеда при наличии популярной известной штуки решающей эти же самые проблемы.

            Ваш реверанс в сторону комментаторов про закостенение мозгов честно говоря не понятен. Не думаю что будет хорошо если 4 десятка людей вместо того чтобы пользоваться нормальным софтом будут допиливать напильником ваш велосипед.

            P.S. Надо бы еще Ansible и ему подобные штуки в этом посте упомянуть.


            1. BAV_Lug Автор
              26.07.2015 23:48

              Хм, так вопрос в том, что это мне начали доказывать тут, что мол я не правильно живу — изобретаю мол велосипед. Я никому не пытался навязать мое решение, как единственно правильное. Лично для меня, и команды с которой я работаю — оно отличное. Вот и все. Этим я и поделился. Повторюсь — ставить монстрообразный вагрант ради поднятия одной виртуалки — как по мне, полный бред. Тем, кому нужно больше виртуалок — выбирайте решения сами.


              1. rhamdeew
                27.07.2015 00:03

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

                Насчет Vagrant — вы ругаете продукт который даже не пробовали использовать.


                1. Ekstazi
                  27.07.2015 12:31

                  BAV_Lug, на счет вагранта поясню — локально у меня хранится только конфиг для него. Дальше сам вагрант следит за тем, чтоб скачать актуальный образ с интернета (например с ubuntu), развернуть в нем веб стек и выполнить какие-то дополнительные операции. Плюс он сам следит за апдейтами образа и автоматически обновит его у всех в команде. Это еще один огромный плюс, благодаря которому я и использую его. А благодаря средствам типа puphpet и phansible, я могу за минуту сгенерировать конфиг (для системы развертывания типа puppet или ansible) под нужную мне конфигурацию, не растрачивая время на тестирование и отладку. Поиграться — интересно, я два месяца сам игрался так, а потом мне это надоело, я плюнул на все и стал использовать готовое. Вам я советую хотя бы ознакомиться с ним, авось понравится.


  1. kabal375
    24.07.2015 16:53
    +3

    Всем читателям хаба «Виртуализация» несомненно очень интересно было наконец узнать, как пользоваться VMware Workstation.