Итак, есть сервер. Надо на нём развернуть несколько девелоперских площадок для разработки веб-сайтов на PHP+MySQL, в качестве системы контроля версий — Mercurial, в качестве issue-трекера — Trac.
Для начала установим MySQL.
# apt-get install mysql-server
Это метапакет, в который сразу входит MySQL Server 5.1 и клиент MySQL. И сразу сделаем необходимые базы данных и заведём пользователей. У нас будет, скажем, два проекта — MyProject1 и MyProject2, и ещё базы для Trac.
# mysql -uroot -p
mysql> create database myproject1;
mysql> create database myproject2;
mysql> create database trac1;
mysql> create database trac2;
В общем виде команда выглядит как «create user USERNAME@HOST identified by PASSWORD»:
mysql> create user 'myproject1'@'localhost' identified by '123';
mysql> create user 'myproject2'@'localhost' identified by '123';
mysql> create user 'trac'@'localhost' identified by '123';
Если вы вносите какие-то изменения руками в таблицу mysql.user, то надо потом сделать flush privileges, чтоб они вступили в силу. При добавлении пользователей через create user этого не требуется. Выдача прав:
mysql> grant all privileges on myproject1.* to 'myproject1'@'localhost';
mysql> grant all privileges on myproject2.* to 'myproject2'@'localhost';
mysql> grant all privileges on trac1.* to 'trac'@'localhost';
mysql> grant all privileges on trac2.* to 'trac'@'localhost';
mysql> flush privileges;
mysql> exit
С MySQL всё. Теперь надо установить apache и PHP с необходимыми библиотеками.
# apt-get install apache2 php5 php5-gd php5-curl php5-mysql
Надо приучить PHP к работе с кириллицей в UTF-8.
# nano /etc/php5/apache2/php.ini
Найдите соответствующие строки, раскомментируйте их и впишите указанные значения:
mbstring.internal_encoding = UTF-8
mbstring.func_overload = 2
Вместо 2 можно вписать и 6 при желании, но 2 обычно достаточно для Битрикса.
Теперь займёмся собственно апачем. Хорошим тоном считается работа с каждым сайтом под отдельным пользователем. Обычно, чтоб не было проблем с правами, пользователя www-data добавляют в группу владельцев файлов сайта, но всё равно там постоянно могут возникать проблемы, когда файл создан из-под апача, а пользователь, соответствующий сайту, не может его отредактировать. Кроме того, я как-то раз наткнулся на проблему сосуществования Trac и веб-интерфейса Mercurial, поэтому предлагаю сделать следующее: заменить apache2-mpm-prefork на apache2-mpm-itk, который позволяет апачу реально запускать форки под разными пользователями без SuExec. Так как сервер рассматривается как девелоперская площадка, то высоких нагрузок не предвидится, и замена prefork на itk на производительности не скажется никак.
# apt-get install apache2-mpm-itk
Создадим пользователей для наших проектов, Trac и Mercurial:
# adduser myproject1
# adduser myproject2
# adduser trac
# adduser hg
Двум пользователям, для которых актуальна работа с репозиториями Mercurial, сделаем в домашних папках файлы .hgrc с указанными юзернеймами, чтоб не пришлось указывать каждый раз при коммите.
# cd /home/myproject1
# nano .hgrc
Содержимое может быть примерно таким:
[ui]
username = myproject1
И сделаем самого пользователя владельцем этого файла.
# chown myproject1:myproject1 .hgrc
Аналогично можно поступить со вторым.
И ещё добавим пользователя hg в группы myproject1 и myproject2, чтоб можно было делать push через http (или https). Я обычно добавляю в группы пользователей так:
# nano /etc/group
Нахожу в файле соответствующие строчки и добавляю в них пользователей:
myproject1::1001:myproject1,hg
myproject2::1002:myproject2,hg
Создадим папки для наших проектов, Trac и Mercurial:
# cd /var/www/
# mkdir myproject1
# mkdir myproject2
# mkdir hg
# mkdir trac
# chown myproject1:myproject1 myproject1/
# chown myproject2:myproject2 myproject2/
# chown trac:trac trac/
# chown hg:hg hg/
Создадим виртуальные хосты для двух наших проектов:
# nano /etc/apache2/sites-available/myproject1
Минимальное содержимое должно быть таким:
<VirtualHost *:80>
ServerAlias myproject1.local
AssingUserID myproject1 myproject1
DocumentRoot /var/www/myproject1
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
Аналогично для myproject2.
К настройке апача мы ещё вернёмся чуть позже, а сейчас — установим Mercurial и Trac. И полезный в дальнейшем модуль для апача.
# apt-get install mercurial trac trac-mercurial python-mysqldb libapache2-mod-wsgi
Небольшое лирическое отступление — создадим пару репозиториев Mercurial и проверим, как работает связка Apache+PHP+MySQL.
# su myproject1
$ cd myproject1
$ nano index.php
Содержимое файла вполне может быть таким:
<?php
$cid = mysql_connect('localhost', 'myproject1', '123');
if(!$cid) die(mysql_error());
if(!mysql_select_db('myproject1', $cid)) die(mysql_error($cid));
echo 'Ok';
mysql_close($cid);
?>
Создадим репозиторий, и в него для проверки можно добавить свежесозданный index.php.
$ hg init
$ hg add index.php
$ hg ci -m "Initial commit"
Отредактируем файл hgrc внутри служебной папки репозитория для работы через веб-интерфейс.
$ cd .hg
$ nano hgrc
Внутрь напишем следующее:
[web]
allow_push = *
push_ssl = false
contact = my 1 contact
description = My project 1 description
И запретим даже чтение этого файла другим пользователям, для всей же папки .hg разрешим запись группе, чтоб была возможность сделать push через http(s):
$ chmod o= hgrc
$ cd ..
$ chmod -R g+w .hg
Вернёмся в сессию суперпользователя, выйдя из su.
$ exit
Аналогичные манипуляции можно провернуть и для myproject2.
Теперь настало время настроить веб-интерфейс Mercurial. Напомню, мы в сессии суперпользователя в /var/www.
# nano /etc/apache2/sites-available/hg
Редактируем содержимое файла:
<VirtualHost *:80>
ServerAlias hg.local
AssignUserID hg hg
WSGIScriptAliasMatch ^(.*)$ /var/www/hg/hgweb.cgi$1
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
Делаем симлинк:
# ln -s /etc/apache2/sites-available/hg /etc/apache2/sites-enabled/hg
Создаём под пользователем hg необходимые файлы:
# su hg
$ cd hg
$ nano hgweb.cgi
Содержимое hgweb.cgi:
#!/usr/bin/env python
config = "/var/www/hg/hgweb.conf"
import cgitb; cgitb.enable()
import os
os.environ["HGENCODING"] = "UTF-8"
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
И ещё один файл:
$ nano hgweb.conf
С примерно таким содержимым:
[paths]
myproject1 = /var/www/myproject1
myproject2 = /var/www/myproject2
Выходим из su обратно в сессию суперпользователя и перезапускаем апач.
$ exit
# service apache2 restart
Теперь самое сложное — настройка Trac.
# su trac
$ cd trac
$ mkdir myproject1 _env
$ cd myproject1_env
$ trac-admin . initenv
Project Name> myproject1
Database connection string> mysql://trac:123@localhost:3306/trac1
В общем случае строка для соединения с MySQL представляет из себя следующее: mysql://USERNAME:PASSWORD@HOST:PORT/DATABASENAME
Path to repository> /var/www/myproject1
$ trac-admin . deploy dep
$ cd conf
$ nano trac.ini
Находим следующий параметр и пишем туда hg:
repository_type = hg
И в конец дописываем (секции [components] обычно нет поначалу):
[components]
tracext.hg.* = enabled
Это можно повторить и для второго проекта. Теперь добавим виртуальный хост апача:
$ exit
# nano /etc/apache2/sites-avaliable/trac
Сколько проектов у нас есть, столько WSGIScriptAlias и пишем.
<VirtualHost *:80>
ServerAlias trac.local
AssignUserID trac trac
DocumentRoot /var/www/trac
WSGIScriptAlias /myproject1 /var/www/trac/myproject1_env/dep/cgi-bin/trac.wsgi
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
И последний штрих.
# ln -s /etc/apache2/sites-available/trac /etc/apache2/sites/enabled/trac
# service apache2 restart
жуть какая :)
ОтветитьУдалитьА как в Вашей схеме коммитить базу мускула?
ОтветитьУдалитьНу это слабое место и больной вопрос :) Можно хранить скрипты, меняющие структуру таблиц, чтоб в любой момент можно было их все по порядку снова запустить и получить пустые таблицы (или содержащие немного данных) с нужной структурой с нуля. Но этот способ хранения требует некоторых дополнительных усилий от разработчиков.
ОтветитьУдалитьбазы можно бэкапить скриптом при затягивании или выдавливании
ОтветитьУдалить