Rhodecode + Redmine — недорогая и функциональная замена хостингу программных проектов на стороне

Введение


Встречаются предприятия, на которых доступ к интернету сильно ограничен или не постоянен, не завидую этим ребятам. Иногда, как в моём случае, политика безопасности предприятия не позволяет хранить исходный код разрабатываемых продуктов на чужом оборудовании. Кроме того, смею предположить, что не каждой группе разработчиков хватает возможностей, предоставляемых например bitbucket. Эти проблемы можно решить, к примеру, связкой RhodeCode и Redmine.

Цели


  • Создание, изменение, удаление репозиториев Mercurial, используя web интерфейс.
  • Добавление и удаление пользователей, разграничение доступа, смена паролей, используя web интерфейс.
  • Отслеживание ошибок и распределение задач, используя web интерфейс.
  • https повсеместно.

Используемые продукты


После недолгих размышлений и на основании некоторого опыта был определен набор средств для достижения поставленных целей:

  1. Контроль версий — Mercurial
  2. Управление проектами — Redmine
  3. Управления репозиториями системы контроля версий — RhodeCode
  4. Ну а заведется все это на Debian

Шаг 0: установим debian(или ubuntu)


Все нижеописанное проделывалось на debian squezee в базовой установке.
На ubuntu (10.04 LTS) должно быть без изменений, так как пакетная база у них схожа.

Шаг 1: установим RhodeCode


Установим необходимые пакеты для работы easy_install и virtualenv:

aptitude install python-setuptools python-dev python-virtualenv

Используя virtualenv, создадим новую виртуальную среду:

virtualenv --no-site-packages /var/www/rhodecode-venv

В каталоге /var/www/rhodecode-venv будет создано новое виртуальное окружение.
Активируем виртуальное окружение командой:

source /var/www/rhodecode-venv/bin/activate

Создадим каталог для rhodecode, например:

mkdir /var/www/rhodecode; cd /var/www/rhodecode

Чтобы установить RhodeCode, выполним следующую команду:

easy_install rhodecode

На этом этапе скрипт easy_install установит все необходимые зависимости для RhodeCode в виртуальное окружение, в их числе последняя стабильная версия mercurial.

Шаг 2: настройка RhodeCode


Создадим файл конфигурации RhodeCode:

paster make-config RhodeCode production.ini

Этот файл конфигурации содержит различные настройки для RhodeCode, например, порт прокси-сервера, электронную почту, использование статических файлов, кэша, настройки celery и логгирования. По умолчанию используется SQLite в качестве базы данных.

Создадим базу данных, выполнив следующую команду:

paster setup-app production.ini

На запрос скрипта введем путь до каталога, где RhodeCode разместит базу данных:

/var/www/rhodecode/

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

Для нашей конфигурации необходимо добавить следующие строки в production.ini:

1) в секцию [app:main]:

filter-with = proxy-prefix
force_https = true

2) в конец файла:

[filter:proxy-prefix]
use = egg:PasteDeploy#prefix
prefix = /hg

Покинем виртуальное окружение:

deactivate

Создадим скрипт запуска /etc/init.d/rhodecode-daemon:

#!/bin/sh -e
########################################
#### THIS IS A DEBIAN INIT.D SCRIPT ####
########################################
### BEGIN INIT INFO
# Provides:          rhodecode          
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts instance of rhodecode
# Description:       starts instance of rhodecode using start-stop-daemon
### END INIT INFO
APP_NAME="rhodecode"
APP_HOMEDIR="/var/www"
APP_PATH="$APP_HOMEDIR/$APP_NAME"
CONF_NAME="production.ini"
PID_PATH="$APP_PATH/$APP_NAME.pid"
LOG_PATH="$APP_PATH/$APP_NAME.log"
PYTHON_PATH="/var/www/rhodecode-venv"
RUN_AS="www-data"
DAEMON="$PYTHON_PATH/bin/paster"
DAEMON_OPTS="serve --daemon \
  --user=$RUN_AS \
  --group=$RUN_AS \
  --pid-file=$PID_PATH \
  --log-file=$LOG_PATH  $APP_PATH/$CONF_NAME"
start() {
  echo "Starting $APP_NAME"
  PYTHON_EGG_CACHE="/tmp" start-stop-daemon -d $APP_PATH \
      --start --quiet \
      --pidfile $PID_PATH \
      --user $RUN_AS \
      --exec $DAEMON -- $DAEMON_OPTS
}
stop() {
  echo "Stopping $APP_NAME"
  start-stop-daemon -d $APP_PATH \
      --stop --quiet \
      --pidfile $PID_PATH || echo "$APP_NAME - Not running!"
  if [ -f $PID_PATH ]; then
    rm $PID_PATH
  fi
}
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    echo "Restarting $APP_NAME"
    ### stop ###
    stop
    wait
    ### start ###
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

Назначим необходимые права доступа:

chmod a+x /etc/init.d/rhodecode-daemon 
chown www-data:www-data -R /var/www/rhodecode

Для автоматического запуска скрипта выполним:

insserv rhodecode-daemon

Шаг 3: установка redmine


В squeeze-backports версия redmine поновее, установим её.

Включим в /etc/apt/sources.list:

deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free

Выполним в консоли:

aptitude update
aptitude -t squeeze-backports install redmine mercurial

В процессе установки отобразится диалог выбора базы данных. Я предпочел sqlite, сделайте свой выбор.

Создадим ссылку в директории /var/www:

ln -s /usr/share/redmine/public /var/www/redmine
chown -R www-data:www-data /var/www/redmine

Шаг 4: настройка apache


Установим apache mod passenger для запуска redmine:

aptitude install libapache2-mod-passenger

Создадим закрытый ключ и сертификат:

openssl req -new -x509 -days 355 -keyout your.domain.ru.key -out your.domain.ru.pem

Common Name следует указать в точности такой, как и доменное имя Вашего сервера.

Удалим пароль:

cp your.domain.ru.key your.domain.ru.key.orig
openssl rsa -in your.domain.ru.key.orig -out your.domain.ru.key
rm your.domain.ru.key.orig

Скопируем в /etc/ssl:

cp your.domain.ru.pem /etc/ssl/certs/; cp your.domain.ru.key /etc/ssl/private/

Включим необходимые модули:

a2enmod ssl
a2enmod proxy
a2enmod proxy_http

В файле /etc/apache2/sites-available/default-ssl заменим:

SSLCertificateFile    /etc/ssl/certs/your.domain.ru.pem
SSLCertificateKeyFile /etc/ssl/private/your.domain.ru.key

Впишем в основную секцию(VirtualHost) этого же файла строки:

1) для redmine:

RailsBaseURI /redmine

2) для rhodecode:
 <Location /hg >
  ProxyPass http://127.0.0.1:5000/hg
  ProxyPassReverse http://127.0.0.1:5000/hg
  SetEnvIf X-Url-Scheme https HTTPS=1
</Location>

Заменим содержимое файла /etc/apache2/sites-available/default на:

<VirtualHost *:80>
    ServerName your.domain.ru
    Redirect permanent / https://your.domain.ru/ 
</VirtualHost>

Подключим конфигурацию default-ssl:

a2ensite default-ssl

Запустим rhodecode:

service rhodecode-daemon start

Перезапустим apache:

service apache2 restart

Результат


RhodeCode доступен по адресу:
https://your.domain.ru/hg пароль установлен на 2 шаге

Redmine доступен по адресу:
https://your.domain.ru/redmine администратор admin, пароль admin

Принудительный https везде.

Список используемой литературы


  1. HowTo Install Redmine using Debian package.
  2. RhodeCode 1.3.3 documentation. Installation.
  3. RhodeCode 1.3.3 documentation. Setup.
  4. Простой способ настроить Apache для работы по HTTPS в Debian.


UPD: Для исправления ошибки интеграции Redmine с созданным в Rhodecode репозиторием установите версию mercurial(2.0.1) из squezee-backports:
aptitude -t squeeze-backports install mercurial
Share post

Comments 11

    0
    Если Вы рассматривали несколько систем контроля версий, можете сказать что подтолкнуло выбрать Mercurial?

    Не флейма ради, а с практической точки зрения. Я работаю над проектом с поддержкой Mercurial и с перспективой добавления поддержки Git'а — интересно какие возможности того и другого ценятся в разных ситуациях.
      +2
      Рассматривал не столько сами системы, сколько их поддержку в используемых средах разработки, качество плагинов. Инфраструктура поддержки mercurial победила (прошел год).

      После пробовал переход на git, для своих проектов не увидел разницы, а если нет разницы, зачем платить больше? (переобучение пользователей).

      К тому же, по моему мнению, синтаксис команд mercurial более человеко-ориентированный.
        0
        а вы пробывали git для windows настроить так, чтобы он везде понимал русский язык (именя файлов, имена коммитеров, содержимое файлов) как в консоли, так, например и в tortiseGit? Вот что-то, а с этим у меркуриал куда как меньше проблем имхо.
          0
          Содержимое файлов — использование utf8 снимает проблемы.
          Имена файлов и имена коммитеров так повелось — всегда на английском. Не могу представить ситуацию когда понадобится файл исходного кода именовать на русском.
        +1
        Не флейма ради: самая главная ценность меркуриала — его простота. Уровень вхождения в меркуриал на порядок ниже, чем в гит.

        Говорю это как человек, который работает с ними обоими почти ежедневно и который пересадил и на тот и на другой пару десятков человек.
        +2
        Меркуриал удобнее, понятнее и проще в использовании, если нет надобности держать несколько релиз веток веток одного продукта и протаскивать коммиты между ними. К сожалению, у меня сейчас вся работа на git+github и о меркуриале только с грустью вздыхаю.
          +1
          Есть hg-git.
            0
            После того как гит раскуришь — разницы никакой :-)
              0
              если нет надобности держать несколько релиз веток веток одного продукта и протаскивать коммиты между ними

              Расскажите, пожалуйста, подробнее какие тут есть проблемы? У меня как раз такая ситуация и как-то мне не понравилось, как коммиты перелились… не пойму как, но часть изменений не была перенесена. Я все отнес не свои кривые руки, но осадочек, как говориться, остался.
              0
              Спасибо, с первого наскока с rhodecode у меня не срослось. Теперь по вашему мануалу попробую запилить.
              Главное, что так вовремя!
                0
                Пожалуйста. Здесь — рабочий вариант. Даже если в процессе каких-либо экспериментов что-то не срастется, сносите виртуальное окружение и повторяете установку, система при этом не «превращается в слаку».

              Only users with full accounts can post comments. Log in, please.