Автоматизация разработки web проектов в среде UNIX

    С какого боку не посмотри, а процесс автоматизации всегда важен. Компаниям он помогает экономить уйму времени-денег, администраторов избавляет от рутины, а людей не посвящённых в детали чужой работы от головной боли.
    Я хочу поделиться своим решением по задаче частичной оптимизации и снижения производственных издержек. Мне пришлось написать данный bash скрипт по причинам, которые были озвучены выше. Есть ещё причина,
    Хочу сразу предупредить непосвящённых о том, что конфигурация Apache, MySQL может отличаться от приведённой ниже( а так скорее всего и будет). Будьте внимательнее в корректировке путей, когда решите адаптировать этот скрипт под свои цели.



    Вот некоторые комментарии по данному скрипту:

    6,7 отвечают за создание папки под проект
    8,9 выставляют права для группы (у меня работают над проектом несколько людей)
    13 строка связывает эти папки с записями в конфигах Apache
    15 создаём базу данных под новый проект
    16 собственно рестарт Apache

    1. #!/bin/bash
    2. if [ $UID -eq 0 ]
    3. then
    4. echo "Enter project name:"
    5. read NAME_OF_PROJECT
    6. mkdir /usr/www/$NAME_OF_PROJECT
    7. mkdir /usr/www/$NAME_OF_PROJECT/htdocs/
    8. chown -R :www_anygroup /usr/www/$NAME_OF_PROJECT/htdocs/
    9. chmod -R g+wrx /usr/www/$NAME_OF_PROJECT/htdocs/
    10.  
    11. add_to_apache_conf=" <VirtualHost 111.111.111.111:80>   ServerAdmin admin@somedomain.com   DocumentRoot \"/usr/www/${NAME_OF_PROJECT}/htdocs\"   ServerName ${NAME_OF_PROJECT}.somedomain.com</VirtualHost>"
    12.  
    13. echo "$add_to_apache_conf" >> /usr/apache/conf/extra/httpd-vhosts.conf
    14.  
    15. /usr/local/mysql/bin/mysql -uroot -p --execute="create database db_${NAME_OF_PROJECT}; GRANT ALL PRIVILEGES ON db_${NAME_OF_PROJECT}.* TO ${NAME_OF_PROJECT}_user@localhost IDENTIFIED by 'anypassword'"
    16. /usr/apache/bin/apachectl restart
    17.  
    18. else
    19. echo "You should be logged by root"
    20. fi
    * This source code was highlighted with Source Code Highlighter.
    Поделиться публикацией

    Комментарии 17

      0
      можно еще добавить чтоб записи на NSах добавлял.
        0
        это делается навсегда один раз добавлением звездочки в ДНС:

        domain.ru 123.465.789.123
        *.domain.ru domain.ru
        –1
        Я такой скрипт написал сразу как пересел на убунту. Вот только не додумался к нему еще базу данных добавить.
        У меня создает SVN, Trac, делает запись в /etc/hosts и создает файлы для апача.
        Проверок он не делает никаких, так что это сырое решение и он не создает директорию для сайта, т. к. мне потом удобней сделать это в Eclipse

        <font size="2" face="Courier New" color="black">#!/bin/sh # simple module <font color="#0000ff">for</font> create <font color="#0000ff">new</font> Virtual Host <font color="#0000ff">for</font> Apache2 path_to_apache=<font color="#A31515">"/etc/apache2/sites-available"</font>; path_to_apache_link=<font color="#A31515">"/etc/apache2/sites-enabled"</font>; echo -n <font color="#A31515">"Введите имя сайта: "</font>; read site_name; <font color="#0000ff">if</font> [ <font color="#A31515">"$site_name"</font> != <font color="#A31515">""</font> ] then  <font color="#0000ff">if</font> [ ! -e <font color="#A31515">"$path_to_apache/$site_name"</font> ]  then   echo -n <font color="#A31515">"Создаю сайт $site_name: "</font>;   echo <font color="#A31515">"   NameVirtualHost *:80   <VirtualHost *:80>    ServerAdmin webmaster@localhost    DocumentRoot /www/$site_name/    ServerName $site_name    ErrorLog /var/log/apache2/hosts/$site_name-error.log    CustomLog /var/log/apache2/hosts/$site_name-access.log combined    ServerSignature Off    <Directory /www/$site_name/>    Order Deny,Allow    Deny from all    Allow from 127.0.0.0/24    </Directory>   </VirtualHost>   "</font> > $path_to_apache/$site_name;  echo <font color="#A31515">" готово"</font>;   <font color="#0000ff">else</font> echo <font color="#A31515">"VHost уже существует"</font>;  fi;  <font color="#0000ff">if</font> [ ! -h <font color="#A31515">"$path_to_apache_link/$site_name"</font> ]   then   echo -n <font color="#A31515">"Разрешаем загрузку: "</font>;   a2ensite $site_name;   echo <font color="#A31515">" готово"</font>;   <font color="#0000ff">else</font>   echo <font color="#A31515">"Сайт уже доступен"</font>  fi; isset_site=`grep <font color="#A31515">"$site_name"</font> /etc/hosts`; <font color="#0000ff">if</font> [ <font color="#A31515">"$isset_site"</font> = <font color="#A31515">""</font> ]  then   old_str=`grep <font color="#A31515">"127.0.0.1"</font> /etc/hosts`;   new_str=<font color="#A31515">"$old_str $site_name"</font>;   sed -e <font color="#A31515">"s/$old_str/$new_str/"</font> /etc/hosts > /etc/hosts.temp;   cp /etc/hosts.temp /etc/hosts;   rm /etc/hosts.temp; fi; echo <font color="#A31515">"Сайт $site_name успешно создан"</font>; mkdir /<font color="#0000ff">var</font>/svn/$site_name; svnadmin create /<font color="#0000ff">var</font>/svn/$site_name; chown -R www-data:svn /<font color="#0000ff">var</font>/svn/$site_name; chmod -R g+ws /<font color="#0000ff">var</font>/svn/$site_name; mkdir /<font color="#0000ff">var</font>/trac/$site_name; trac-admin /<font color="#0000ff">var</font>/trac/$site_name initenv $site_name sqlite:db/trac.db svn /<font color="#0000ff">var</font>/svn/$site_name; chown -R www-data:svn /<font color="#0000ff">var</font>/trac/$site_name; chmod -R g+ws /<font color="#0000ff">var</font>/trac/$site_name; echo <font color="#A31515">"  <LocationMatch \"/trac/$site_name/login\">     AuthType Basic     AuthName \"Projects\"     AuthUserFile /etc/apache2/trac.htpasswd     Require valid-user  </LocationMatch>    <Location /trac/$site_name>     SetHandler mod_python     PythonInterpreter main_interpreter     PythonHandler trac.web.modpython_frontend     PythonOption TracEnv /var/trac/$site_name     PythonOption TracUriRoot /trac/$site_name                       </Location> "</font> > /etc/apache2/conf.d/trac_$site_name; trac-admin /<font color="#0000ff">var</font>/trac/$site_name permission add user TRAC_ADMIN /etc/init.d/apache2 restart; <font color="#0000ff">else</font> echo <font color="#A31515">"Вы не ввели имя сайта"</font>; fi exit 0;</font><font size="1" color="gray"> * This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><font size="1" color="gray">Source Code Highlighter</font></a>.</font>
          +3
          Извиняюсь, подсветка не отобразилась, добавляю так
          #!/bin/sh
          # simple module for create new Virtual Host for Apache2

          path_to_apache="/etc/apache2/sites-available";
          path_to_apache_link="/etc/apache2/sites-enabled";
          echo -n «Введите имя сайта: »;
          read site_name;
          if [ "$site_name" != "" ]
          then
          if [! -e "$path_to_apache/$site_name" ]
          then
          echo -n «Создаю сайт $site_name: »;
          echo "
          NameVirtualHost *:80
          <VirtualHost *:80>
          ServerAdmin webmaster@localhost
          DocumentRoot /www/$site_name/
          ServerName $site_name
          ErrorLog /var/log/apache2/hosts/$site_name-error.log
          CustomLog /var/log/apache2/hosts/$site_name-access.log combined
          ServerSignature Off
          <Directory /www/$site_name/>
          Order Deny,Allow
          Deny from all
          Allow from 127.0.0.0/24
          " > $path_to_apache/$site_name;
          echo " готово";
          else echo «VHost уже существует»;
          fi;
          if [! -h "$path_to_apache_link/$site_name" ]
          then
          echo -n «Разрешаем загрузку: »;
          a2ensite $site_name;
          echo " готово";
          else
          echo «Сайт уже доступен»
          fi;
          isset_site=`grep "$site_name" /etc/hosts`;
          if [ "$isset_site" = "" ]
          then
          old_str=`grep «127.0.0.1» /etc/hosts`;
          new_str="$old_str $site_name";
          sed -e «s/$old_str/$new_str/» /etc/hosts > /etc/hosts.temp;
          cp /etc/hosts.temp /etc/hosts;
          rm /etc/hosts.temp;
          fi;
          echo «Сайт $site_name успешно создан»;
          mkdir /var/svn/$site_name;
          svnadmin create /var/svn/$site_name;
          chown -R www-data:svn /var/svn/$site_name;
          chmod -R g+ws /var/svn/$site_name;
          mkdir /var/trac/$site_name;
          trac-admin /var/trac/$site_name initenv $site_name sqlite:db/trac.db svn /var/svn/$site_name;
          chown -R www-data:svn /var/trac/$site_name;
          chmod -R g+ws /var/trac/$site_name;
          echo "
          <LocationMatch \"/trac/$site_name/login\">
          AuthType Basic
          AuthName \«Projects\»
          AuthUserFile /etc/apache2/trac.htpasswd
          Require valid-user
          <Location /trac/$site_name>
          SetHandler mod_python
          PythonInterpreter main_interpreter
          PythonHandler trac.web.modpython_frontend
          PythonOption TracEnv /var/trac/$site_name
          PythonOption TracUriRoot /trac/$site_name
          " > /etc/apache2/conf.d/trac_$site_name;
          trac-admin /var/trac/$site_name permission add user TRAC_ADMIN
          /etc/init.d/apache2 restart;

          else
          echo «Вы не ввели имя сайта»;
          fi
          exit 0;
            0
            Чёрт проще дать ссылку =(
            Второй очищает все что натворил первый, ifolder.ru/8306235
              +2
              Какой-то треш: жестко закодированые пути, имена групп, ip адресс, путь к mysql бинарнику.
              Нигде нет проверки на возврат значения.
              Жутко коряво.
                0
                есть вариант лучше? просим предоставить решение
                  0
                  Варианты лучше, очевидно, есть, например openpanel.com — она позволяет создавать хостинг акаунты как с консоли, так и с веб-интерфейса. Выше я указал на ОЧЕВИДНЫЕ недостатки Вашего скрита и они достаточно серьезные.
                    +1
                    Сделайте, хотя-бы прием параметров через командную строку. На то он и скрипт, чтобы динамически меняться.

                    «IDENTIFIED by 'anypassword'» — это же ппц!

                    Для вызова программ используйте /usr/bin/env,
                    и т. д. и т. п.

                    Не учите плохому.
                  0
                  Посмотрите в сторону mod_vhost_alias в апаче. Такие костыли актуальны только для обслуживание хостинга, когда пути, названия баз и все остальное максимально стандартизированны.
                    0
                    Я понял вас.
                    Прошу прощения за то, что не прояснил в какой сфере и для каких целей этот скрипт.
                    Наша студия занимается тем, что разрабатывает проекты качественно в срок. Таким образом для того, чтобы нам держать марку, мы постоянно пересматриваем некоторые участки процессов разработки.

                    В данном случае у меня была существенная проблема: при входе нового проекта в стадию разработки не было стандартизирован процесс автоматической настройки окружения для этого проекта, т. е. на каждый такой новый проект создавалась своя директория, прописывались соответствующие настройки в конфиг веб сервера, создавалась БД и доступ к ней — все это было жестко привязано к чловеку, хорошо знакомому с этим процессом. Т. е. когда этот специалист был занят другой более важной задачей, приходилось либо самому проделывать все эти дейсвия, либо поручать другим менее квалифицированным в этом вопросе людям, в последнем случае это могло затягиваться на несколько часов. Таких неудобств было много.

                    Данное решение мне помогло в:
                    1. том, что сейчас такой процесс стандартизирован, как следствие исчезла ненужная коммуникация между участниками проекта, все читают кодинг стандарт и знают теперь где какой логин, пароль, папка и прочее ( планирую прописать настройки по SVN )
                    2. в том, что данный скрипт могут запускать разработчики с низкими знаниями в UNIX( и настройках его), таким образом, процесс менее зависим от квалификации сотрудника
                    3. в том, что не нужно устанавливать полный комплекс серьёзных программных продуктов (я про ISP панели) ради запуска проектов на своем сервере разработки

                    0
                    /usr/apache/bin/apachectl restart

                    идеологически неверно :)

                    если апач двойка (а судя по параметру restart, именно двойка), то правильнее делать
                    apachectl configtest
                    apachectl graceful
                      +2
                      Небольшое дополнение к вашему скрипту — строки 6 и 7 можно заменить одной, используя опцию -p (--parents):
                      mkdir -p /usr/www/$NAME_OF_PROJECT/htdocs/
                        –2
                        вот именно ето я и искал!
                        некий аналог денвера)))
                          –1
                          точнее реализация его наибольшего плюса
                          0
                          Вы меня простите, конечно, но это ппц. Автоматизация. Автоматизация разработки.

                          Я ожидаю в ближайшее время цикл статей в продолжение этой темы:
                          Параметры apachectl — Путь сетевого самурая.
                          избранные места man man — Познай себя.
                          И т. п.
                            0
                            Господа, вы, конечно, извините. Но такие решения — это ппц. Вот почему:
                            1. Врядли среди аудитории найдется компания, которая «шлепает» хотябы по 2 web-проекта в день.
                            2. Если найдется — сисадмины давно придумали вещи веселее текущей.
                            3. Отсутствие «конфигурируемости» подобного решения — явный косяк. А что, если проект на перле (в добавляемой конфигурации не увидел ничего про cgi-bin/cgi)? А что, если не нужна БД? Где интерактивность? :)

                            Эти операции делаются ручками за 2 минуты. Не разбираешься в конфигах — не лезь. (разобраться-то, 2 минуты).

                            Еслиб написали проект реализации всех этих вещей через web-интерфейс (а-ля ISP) — думаю, люди были бы более благодарны. Скрипт не поможет, если не влезть в него руками :)

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

                            Самое читаемое