Pull to refresh

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

Reading time 5 min
Views 10K

Введение


Встречаются предприятия, на которых доступ к интернету сильно ограничен или не постоянен, не завидую этим ребятам. Иногда, как в моём случае, политика безопасности предприятия не позволяет хранить исходный код разрабатываемых продуктов на чужом оборудовании. Кроме того, смею предположить, что не каждой группе разработчиков хватает возможностей, предоставляемых например 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
Tags:
Hubs:
+13
Comments 11
Comments Comments 11

Articles