Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: BASH Скрипт создания сайта (виртуального хоста) и новой базы(юзера) MySQL.  (Прочитано 8557 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Gurom

  • Автор темы
  • Любитель
  • *
  • Сообщений: 55
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Всем добрый день!

Хочу поделится с общественностью скриптом. Этот скрипт пригодится людям, которые держат свои сайты на своем сервере.  Скрипт создаст папку для размещения сайта, папку для логов апача. Также скрипт добавит файлик описания сайта для для апача в директорию site-available  и сделает символическую ссылку в директории site-enabled чтобы "включить" сайт. Затем перезапустит апач. Также (это важно) при необходимости скрипт создаст новую базу данных  в MySQL с именем создаваемого сайта, а также создаст нового локального пользователя (имя такое же + суффикс "_user") .

Исходные данные. Предполагается что у вас:
  - Операционная система Ubuntu server ( у меня в частности Ubuntu server 10.04 LTS)
  - Настроен и работает LAMP ( как минимум apache +MySQL )
  - Предполагается, что Вы храните Ваши сайты в папке /home/www/imyasaita

Ваша цель:
  - Вам нужно настроить и запустить на сервере  сайт. Этот скрипт пригодится для   joomla, Drupa, Wordpress  и другие
  - Скрипт нужно запускать при добавлению на сервер каждого последующего сайта (домена)

Решение:
  - Берете этот скрипт (смотри файл)
  - Запускаете его... Скрипт спросит имя проекта, введите ваш домен, ну например examplesite.com. Потом скрипт спросит имя базы данных для mysql, введите например examplesite . Скрипт создаст нового юзера базы данных examplesite_user, а вам остается указать только пароль для доступа к базе.
Во время исполнения скрипт будет подробно вас информировать о том что происходит. В конце он напомнит вам все что он сделал а также пароли.

Это все ....

Скрипт:
#!/bin/bash
#************************************************#
#                create_site_joomla.sh           #
#                автор: Gurom                    #
#                16 Jan, 2011                    #
#                                                #
# Скрипт создает новый сайт, вклюает его в       #
# apache.                                        #
#************************************************#
# Хочу поблагодарить пользователя korbax
# Этот скрипт основан на другом скрипте, который можно найти тут:
# http://ubuntu-favorite-os.blogspot.com/2010/10/apache-php-mysql-ubuntu1010.html
#

echo -e "33[1mВведите название проекта (Например example.com):33[0m";
read NAME_OF_PROJECT

# Перед запуском необходимо тут указать пароль root для базы MySQL. Не путайте это с паролем админа который вы вводите при команде sudo
PSWD_SQL="root_password_for_my_SQL"

#создаем папки проекта
sudo mkdir /home/www/$NAME_OF_PROJECT
sudo mkdir /home/www/$NAME_OF_PROJECT/public/
sudo mkdir /home/www/$NAME_OF_PROJECT/cgi-bin/
sudo mkdir /home/www/$NAME_OF_PROJECT/logs/

#указываем владельца и права на папку "public"
sudo chown -R www-data:www-data /home/www/$NAME_OF_PROJECT/
sudo chmod -R 755 /home/www/$NAME_OF_PROJECT/
sudo chown -R www-data:www-data /home/www/$NAME_OF_PROJECT/public/
sudo chmod -R 755 /home/www/$NAME_OF_PROJECT/public/

# Создаем страничку в public для того чтобы сайт хоть что-то отражал
touch /home/www/$NAME_OF_PROJECT/public/index.html
echo "Поздравляем Ваш сайт работает $NAME_OF_PROJECT" >> /home/www/$NAME_OF_PROJECT/public/index.html
sudo chown -R www-data:www-data /home/www/$NAME_OF_PROJECT/public/index.html

#добавляем правила в конфигурационый файл апача
add_to_apache_conf="
<VirtualHost *:80>
ServerName ${NAME_OF_PROJECT}
        ServerAlias www.${NAME_OF_PROJECT}
        ServerAdmin webmaster@${NAME_OF_PROJECT}
        DocumentRoot /home/www/${NAME_OF_PROJECT}/public
        <Directory /home/www/${NAME_OF_PROJECT}/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /home/www/${NAME_OF_PROJECT}/cgi-bin/
        <Directory "/home/www/${NAME_OF_PROJECT}/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /home/www/${NAME_OF_PROJECT}/logs/error.log
        LogLevel warn
        CustomLog /home/www/${NAME_OF_PROJECT}/logs/access.log combined
</VirtualHost>"

add_to_hosts_conf="127.0.0.2 ${NAME_OF_PROJECT}"

#добовляем новый хост
#echo "$add_to_hosts_conf" >> /etc/hosts
touch /etc/apache2/sites-available/${NAME_OF_PROJECT}
echo "$add_to_apache_conf" >> /etc/apache2/sites-available/${NAME_OF_PROJECT}

#включаем конфигурацию сайта
sudo a2ensite ${NAME_OF_PROJECT}
#sudo a2dissite
echo "***********************************"
echo "** Запомните следующеие данные : **"
echo "***********************************"
echo "** "
echo "** Ваш сайт нужно разместить в этот каталог: /home/www/${NAME_OF_PROJECT}/public "
echo "** "



#создаем новую базу
echo -e "33[1mДля работы многих сайтов (например Joomla) нужна отдельная база в MySQL. Создать такую базу? (yes/no)33[0m";
read CREATE_BAZA

if  [ "$CREATE_BAZA" = "yes" -o "$CREATE_BAZA" = "y" -o "&CREATE_BAZA" = "YES" ]; then
echo -e "33[1mВведите имя базы данных (Например example):33[0m";
read NAME_OF_PROJECT
echo -e "33[1mВВедите пароль для нового пользователя ${NAME_OF_PROJECT}_user который будет обладать всем правами на вновь созданную базу:33[0m";
read PASSWORD_OF_MYSQL


# Создаем базу данных имя которой мы ввели
mysql -uroot -p${PSWD_SQL} --execute="create database ${NAME_OF_PROJECT};"
# Создаем нового пользователя
mysql -uroot -p${PSWD_SQL} --execute="GRANT ALL PRIVILEGES ON ${NAME_OF_PROJECT}.* TO ${NAME_OF_PROJECT}_user@localhost IDENTIFIED by '${PASSWORD_OF_MYSQL}'  WITH GRANT OPTION;"


 echo -e "33[1mБаза данных ${NAME_OF_PROJECT} создана.33[0m";

else
     echo -e "33[1mБаза данных не была создана, поэтому позаботьтесь об этом самостоятельно.33[0m";
fi

echo "Перезапускаем apache..."
#перезапускаем апач
/etc/init.d/apache2 restart
echo -e "33[1mЛокальный сайт готов к работе.33[0m";

echo "***********************************"
echo "** Запомните следующеие данные : **"
echo "***********************************"
echo "** Создана новая база MySql с еменем: ${NAME_OF_PROJECT}"
echo "** К этой базе нужно конектится под юзером: ${NAME_OF_PROJECT}_user"
echo "** С паролем: ${PASSWORD_OF_MYSQL}"
echo "** Спасибо что воспользовались скриптом"
echo "***********************************"




Пользователь решил продолжить мысль 23 Январь 2011, 20:36:42:
Есть еще одна идея.

Допустим у Вас есть сайт
mysite.com

мы делаем еще несколько доменов, например
backup1.mysite.com
backup2.mysite.com
backup3.mysite.com
backup4.mysite.com

Цель будущего скрипта будет очень хитрый бекап сайта, а именно:

Содержание сайта включая базу данных MySQL еженедельно будет перемещаться по с хеме:

mysite.com    =>  backup1.mysite.com   =>   backup2.mysite.com   =>   backup3.mysite.com   =>   backup4.mysite.com
В результате у Вас будет 4 бекапов сайта с глубиной 1,2,3 и 4 недели назад.

Также у вас будет возможность экспериментировать не с оригинальным сайтом а с его копиями.
Все 4 сайта
backup1.mysite.com
backup2.mysite.com
backup3.mysite.com
backup4.mysite.com

будут доступны только админу с определенных IP  с помощью ограничения .htaccess

Как только напишу выложу, а пока принимаю идеи и пожелания.
« Последнее редактирование: 23 Январь 2011, 20:36:42 от Gurom »

Оффлайн horoshiy Babay

  • Новичок
  • *
  • Сообщений: 42
    • Просмотр профиля
Любопытно!!!

Продолжение точно будет?

Оффлайн arrecck

  • Старожил
  • *
  • Сообщений: 1726
    • Просмотр профиля
можно сделать несколько заготовок (папок с структурой проекта), а из основного скрипта потом копировать cp -p
для скрипта сделать три аргумента
project_name
project_type
distantion_dir
для каждого из project_type написать свой скрипт
Так я делал когда-то, самого скрипта теперь уже не найти  :-\, да и привык вручную прописывать

Оффлайн typus

  • Любитель
  • *
  • Сообщений: 78
    • Просмотр профиля
    • Virtual Reality Panoramafotografie für interaktive Darstellung auf Webseiten.
когда то в  журнале Хакер была инструкция по установке и настройке lamp в ubuntu - если кому то интересно, я вот тут нашел.
данный скрипт конечно очень интересен, тем что позволяет автоматизировать весь процесс создания виртуальных хостов - просто бывает, что то забыл, а потом вспоминаешь, что именно забыл, в конфиге что то прописать или в hosts  - так что автору спасибо, попробуем.

Пользователь решил продолжить мысль 25 Январь 2011, 14:23:56:
ну что, погонял, потестил -  в hosts  не пишет, там строка закомментирована - вот эта
#echo "$add_to_hosts_conf" >> /etc/hosts
 - надо раскомментировать, тогда все ок...Базу сам не создает, если только явно пароль рута в скрипт вписать - тогда создает и базу, и юзера...Надо бы конечно ввод пароля для рута ручками сделать...И еще, если виртуальных хостов много, то  в секции:
add_to_apache_conf=" <VirtualHost *:80>  -  приводит на другой хост. Хотя может это только у меня так.
я явно прописываю:
add_to_apache_conf="
<VirtualHost ${NAME_OF_PROJECT}>
- тогда все нормально
Да, и в самом верху, если тупо скопипастить, #!/bin/bash
что то не то, я так и не понял, почему при варианте копипаст он мне ругается что файл bin/bash не найден - переписал вручную- все нормально, я то знаю что там все есть, еще несколько скриптов обрабатывает..
И еще вот это убрать бы...�
В общем, подрихтовать, и супер будет, в остальном все красиво.
« Последнее редактирование: 25 Январь 2011, 14:23:56 от typus »

Оффлайн RandomNT

  • Любитель
  • *
  • Сообщений: 80
    • Просмотр профиля
И еще вот это убрать бы...�
У вас при копипасте/сохранении файла получаются переходы строк виндосовские CR+LF, линь считает переходом только символ LF, поэтому оболочку ищет /bin/bash<CR>, и ServerName в конфиге апача ${NAME_OF_PROJECT}<CR>

Оффлайн typus

  • Любитель
  • *
  • Сообщений: 78
    • Просмотр профиля
    • Virtual Reality Panoramafotografie für interaktive Darstellung auf Webseiten.
ну это � получилось не у меня, это у автора еще -
а по поводу копипаста - я не знаю, вот если я копипаст делаю  с работающего у меня в линуксе скрипта, то нет у меня проблем, хоть в винде я делаю этот копипаст, хоть в линуксе.
В данном же случае проблема у меня была, хотя я находился в Ubuntu и копипастил с этого форума в файл и потом сохранял как sh файл - и проблема ушла после ручной правки....почему - бог его знает..

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Посмотрите hex editor ом каким-нибудь. Наверняка, что-то есть лишнее. Только не понятно, что может испортить банг.

Оффлайн Bloodlettinger

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Автор, если не ошибаюсь, то пхп в вашем случае работает демоном с общими правами для всех сайтов. Не могли бы вы дополнить скрипт таким образом, что бы каталог запуска пхп для каждого сайта был отдельным процессом с разными владельцами:группами. Сам не осилю ) знаний маловато

Оффлайн typus

  • Любитель
  • *
  • Сообщений: 78
    • Просмотр профиля
    • Virtual Reality Panoramafotografie für interaktive Darstellung auf Webseiten.
Хочу поделиться одним очень неприятным моментом.
Несмотря на все преимущества данного скрипта, очень ускоряющего рутинную работу по созданию виртуальных хостов, и ни в коем случае не предъявляя никаких претензий авторам скрипта, расскажу о проблеме, которая стала для меня решающей.
Описал ее по мере становления проблемы в этой теме
В общем то, никакой уверенности в правильности своих выводов не было.
А вчера точно такое же случилось на одной из виртуальных машин, точно так же - весь корень оказался под властью www-data ...
возможно, во время исполнения скрипта происходила задержка на этапе
sudo chown -R www-data:www-data /home/www/$NAME...не знаю, как это произошло, но факт есть факт - на двух системах такая шняга...
Конечно, это не происходит при каждом запуске скрипта, поскольку до этого я создал этим скриптом довольно много хостов, видимо, какая то роковая случайность, но от этого не легче...
Возможно, что это только мне так повезло,  могу только сказать, что вот такое случилось, так что будьте внимательны...
Не знаю, есть ли какой то способ видоизменить скрипт, чтобы исключить любую возможность данной ошибки - например, ввести переменную пути, или, как то вывести,чтобы данная команда не исполнялась автоматом, а требовала от юзера ввода  энтер или еще какую то клавишу - тогда, если юзер видит данную команду полностью, принимает решение и нажимает что то, если видит что то не то - отменяет..
Я пока не отказался полностью от скрипта, но простановку прав вывел в ручной режим...

Оффлайн shumtest

  • Активист
  • *
  • Сообщений: 731
  • Это вам просто кажется...
    • Просмотр профиля
    • Блог Шумомера
Цитировать
/etc/init.d/apache2 restart

Зачем-же так зверствовать, особенно на хосте "где много сайтов"? Достаточно apache2ctl garceful. Ну в крайнем случае /etc/init.d/apache2 reload

Оффлайн gururuby

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Изменил скрипт по созданию хоста. Исправил некоторые неточности. Чуть отрефакторил
Изменения такие:
1) Установка каталога где будут храниться проекты
2) Отражать будет index.php с phpinfo(). Заодно проверяем как работает php.
3) Правильно добавление хоста.
4) При создании БД указываем пароль для рута ручками
5) Релоадим апач
6) Не запоминаем данные конфига, а сохраняем в файл в корне проекта.
README
1) В консольке добавить www-data в группу домашнего пользователя
sudo usermod -a -G имя_пользователя www-data, проверим наличие пользователя groups www-data
2) Запуск скрипта. Заходим в папку со скриптом, делаем его исполняемым chmod +x add_site.sh, запускаем ./add_site.sh.
#!/bin/bash
# Основан на скрипте 
# create_site_joomla.sh
# автор: Gurom 
# 16 Jan, 2011                   
#************************************************#
#              Создание виртуального домена  #
#                автор: WebCreate                #
#                9 May, 2011                     #
#************************************************#

# Устанавливаем название каталога где будут храниться проекты
echo -e "\033[1mУкажите имя для папки в которой будут располагаться проекты:\033[0m"; read WORK_DIR
echo -e "\033[1mВведите название проекта:\033[0m"; read NAME_OF_PROJECT

# Cоздаем папки проекта
mkdir -p ~/$WORK_DIR/$NAME_OF_PROJECT/public
cd ~/$WORK_DIR/$NAME_OF_PROJECT/
mkdir cgi-bin logs

#указываем владельца и права на папку "public"
chmod -R 755 ~/$WORK_DIR/$NAME_OF_PROJECT/

# Создаем страничку в public для того чтобы сайт хоть что-то отражал
touch ~/$WORK_DIR/$NAME_OF_PROJECT/public/index.php
echo "<h2>It Works! $NAME_OF_PROJECT</h2><?php phpinfo(); ?>" >> ~/$WORK_DIR/$NAME_OF_PROJECT/public/index.php

#добавляем правила в конфигурационый файл апача
add_to_apache_conf="
<VirtualHost *:80>
ServerName $NAME_OF_PROJECT
        ServerAlias www.$NAME_OF_PROJECT
        ServerAdmin admin@$NAME_OF_PROJECT
        DocumentRoot $HOME/$WORK_DIR/$NAME_OF_PROJECT/public
        <Directory $HOME/$WORK_DIR/$NAME_OF_PROJECT/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ $HOME/$WORK_DIR/$NAME_OF_PROJECT/cgi-bin/
        <Directory "$HOME/$WORK_DIR/$NAME_OF_PROJECT/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog $HOME/$WORK_DIR/$NAME_OF_PROJECT/logs/error.log
        LogLevel warn
        CustomLog $HOME/$WORK_DIR/$NAME_OF_PROJECT/logs/access.log combined
</VirtualHost>"

add_to_hosts_conf="127.0.0.2 $NAME_OF_PROJECT"

#Добавляем новый хост
sudo sh -c "echo '$add_to_hosts_conf' >> /etc/hosts"
sudo sh -c "touch /etc/apache2/sites-available/$NAME_OF_PROJECT"
sudo sh -c "echo '$add_to_apache_conf' >> /etc/apache2/sites-available/$NAME_OF_PROJECT"

#Включаем конфигурацию сайта
sudo a2ensite $NAME_OF_PROJECT
#sudo a2dissite

#Создаем БД
echo -e "\033[1mСоздать БД для проекта?(yes/no)\033[0m"
read CREATE_DB

if  [ "$CREATE_DB" = "yes" -o "$CREATE_DB" = "y" -o "$CREATE_BAZA" = "YES" ]; then
echo -e "\033[1mВведите имя базы данных:\033[0m";
read DB_NAME
echo -e "\033[1mВВедите пароль для нового пользователя ${NAME_OF_PROJECT}_user который будет обладать всем правами на вновь созданную базу:\033[0m";
read -s DB_PASS
# Создаем базу данных имя которой мы ввели
echo -e "\033[1mТеперь будет необходимо ввести 2 раза пароль root MySQL, если пароля нет, просто нажмите Enter\033[0m";
mysql -uroot -p --execute="CREATE DATABASE $DB_NAME;"
# Создаем нового пользователя
mysql -uroot -p --execute="GRANT ALL PRIVILEGES ON $NAME_OF_PROJECT.* TO ${NAME_OF_PROJECT}_user@localhost IDENTIFIED by '$DB_PASS'  WITH GRANT OPTION;"

 echo -e "\033[1mБаза данных $NAME_OF_PROJECT создана.\033[0m";

else
     echo -e "\033[1mБаза данных не была создана\033[0m";
fi
echo "Перезапускаем apache..."
sudo /etc/init.d/apache2 reload

echo -e "\033[1mСоздаем конфигурационный файл проекта\033[0m";

touch ~/$WORK_DIR/$NAME_OF_PROJECT/config.txt
echo -e "Name Project: $NAME_OF_PROJECT\nDB_NAME:$DB_NAME\nDB_USER:${NAME_OF_PROJECT}_user\nDB_PASS:$DB_PASS\nDirectory Project:$HOME/$WORK_DIR/$NAME_OF_PROJECT/" >> ~/$WORK_DIR/$NAME_OF_PROJECT/config.txt
echo "*************************************"
echo -e "\033[1mЛокальный сайт готов к работе.Файл конфигурации находится в $HOME/$WORK_DIR/$NAME_OF_PROJECT/\033[0m"

Оффлайн collider

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
как может быть mysql -uroot -p --execute="GRANT ALL PRIVILEGES ON $NAME_OF_PROJECT.* TO ${NAME_OF_PROJECT}_user@localhost IDENTIFIED by '$DB_PASS'  WITH GRANT OPTION;"

если база это $DB_NAME и привилегии нужно дать на этой базе ?
« Последнее редактирование: 01 Июнь 2012, 13:19:44 от collider »

 

Страница сгенерирована за 0.128 секунд. Запросов: 24.