Монастырёв и Ко
Компания
32,81
рейтинг
22 октября 2013 в 04:19

Разное → Установка «Redmine» на «Linux Ubuntu» с прозрачной аутентификацией в домене (Apache, Passenger, RVM, MySQL) tutorial

Данным постом хотелось бы начать цикл статей о том, как мы адаптировали под свои нужды трекер задач «Redmine».

Около 2-х лет назад мне пришлось достаточно сильно изменить профиль своей деятельности, и от системного администрирования уйти в разработку на фреймворке «Ruby on Rails». Нужно было адаптировать «Redmine» под нужды достаточно большого IT-отдела, а потом и под нужды компании в целом. Тогда, я столкнулся, с относительной не простотой установки «Redmine». И комплексной статьи для новичков очень не хватало!

Есть несколько способов установки ROR-приложения, которым является «Redmine». В данной статье речь пойдет об установки на web-сервер «Apache», с использованием «Passenger» и «RVM». В качестве сервера баз данных, мы до сих пор используем «MySQL» (вернее MariaDB), хотя и подумываем о переезде на «PostgreSQL».


Apache


Устанавливаем web-сервер Apache:

#apt-get install apache2

Основная причина, по которой используется «Apache» — это наличие модуля для прозрачной аутентификации в домене «Windows». Мы изначально хотели упростить использование «Redmine». Отсутствие необходимости вводить пароль дважды было большим плюсом.

Сразу настроим виртуальные хосты «Apache». Сперва, настраиваем виртуальные хосты без поддержки «Ruby». Просто чтобы проверить, что «Apache» работает корректно и настроить модуль прозрачной аутентификации в домене «Windows».

Создаем папку где будет лежать дистрибутив «Redmine»:

#mkdir /usr/share/srv-redmine/redmine-2.3

Создаем ссылку из каталога «/var/www» (каталога, в котором обычно лежат сайты «Apache») на папку с нашим будущим дистрибутивом «Redmine»:

#ln -s /usr/share/srv-redmine/redmine-2.3 /var/www/srv-redmine

Создаем файл виртуального хоста:

#touch /etc/apache2/sites-available/redmine

Заполняем файл следующим содержимым (конфигурируем виртуальный хост):

    <VirtualHost *:80>
    ServerName redmine.local
    ServerAdmin support@redmine.local
    DocumentRoot /var/www/srv-redmine/public
    Options Indexes ExecCGI FollowSymLinks

    <Directory /var/www/srv-redmine/public>
        AllowOverride all
        Options -MultiViews
    </Directory>

   </VirtualHost>

Доменное имя «redmine.local» должно быть определено (разрешаться) в той сети, где вы будете использовать «Redmine».

Включаем наш сайт:

#a2ensite redmine

Пакет, который реализует команду «a2ensite» может быть не установлен в «Ubuntu». В таком случае, в консоли появиться подсказка, как его установить.

Перезапускаем apache:

#service apache2 restart

Чтобы проверить, что виртуальный хост настроен правильно. Создадим файл «index.html» c произвольным содержимым в директории виртуального хоста.

#touch /usr/share/srv-redmine/redmine-2.3/public/index.html

Открыв в браузере страницу «http://redmine.local», мы должны увидеть содержимое нашего файла.

Модуль прозрачной аутентификации в домене

Печально, но такого модуля под «ngix» мы так и не нашли. Наверное, по этой причине, до сих пор используем «Apache».

Качаем модуль, распаковываем куда-нибудь. Я обычно распаковываю в домашнюю директорию:

#cd ~
#wget http://modntlm.sourceforge.net/mod_ntlm2.tar.gz
#tar -zxvf ./mod_ntlm2.tar.gz

Устанавливаем пакет для компиляции модулей:

#apt-get install apache2-prefork-dev

С этим модулем есть тонкость. Он не аутентифицирует слишком длинные логины. Поэтому, если в компании есть сотрудники с логинами типа «rimsky-korsakov», то перед компиляций модуля нужно изменить максимальную длину логина в файле «ntlmssp.inc.c», отредактировав строку «define MAX_USERLEN 32»

Переходи в разархивированную директорию. Компилируем модуль:

#cd mod_ntlm2
#apxs2 -i -a -c mod_ntlm.c

В процессе компиляции могут возникнуть ошибки-предупреждения. Это нормально.

В настройках виртуального хоста добавляем директивы которые отвечают за аутентификацию. Файл виртуального хоста теперь должен выглядеть так:

    <VirtualHost *:80>
    ServerName redmine.local
    ServerAdmin support@redmine.local
    DocumentRoot /var/www/srv-redmine/public
    Options Indexes ExecCGI FollowSymLinks

    <Directory /var/www/srv-redmine/public>
        AllowOverride all
        Options -MultiViews
    </Directory>

    <LocationMatch "/login">
        AuthType NTLM
        NTLMAuth on
        NTLMAuthoritative on
        NTLMDomain OUR_DOMAIN.LOCAL
        NTLMServer dc1.our_domain.local
        NTLMBackup dc2.our_domain.local
        require valid-user
    </Location>

   </VirtualHost>

В процессе эксплуатации наблюдалось, что данный модуль может ощутимо притормаживать отдачу статических данных. Поэтому, мы настроили модуль так, чтобы он подключался только на странице аутентификации в «Redmine». Всю остальную работу по аутентификации реализует наш плагин прозрачной аутентификации.

MySQL (MariaDB)


Устанавливаем сервер баз данных «Mysql».

«MySQL» подустарел, поэтому лучше ставить его форк «MariaDB». На каком-то этапе мы переехали с первого на второе, не испытав проблем. С точки зрения установки и настройки для обоих серверов баз данных все примерно одинаково.

#apt-get install mysql-server

Соединяемся с сервером с паролем, введенным на этапе установки:

#mysql -uroot -pour_password

Создаем пустую базу данных для Redmine и назначаем привилегии:

create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'password_for_redmine_user';
grant all privileges on redmine.* to 'redmine'@'localhost';
exit;

RVM


В двух словах, «RVM» позволяет устанавливать разные версии Ruby на одном компьютере. Мы постоянно спорим с моим коллегой, а нужен ли нам «RVM» на рабочем сервере?

Прямой необходимости в нем нет, но я люблю его за то, что он позволяет сильно упростить установку «Ruby». В «Ubuntu» не всегда есть самые свежие пакеты с «Ruby», а в «RVM» есть! В общем, мы используем «RVM».

Для установки «RVM» нужно установить «Curl»:

#apt-get install curl

Затем выходим из пользователя «root» и далее под обычным пользователем запускаем:

$curl -L https://get.rvm.io | bash -s stable

После установки, «RVM» скажет нам, какие еще пакеты нужно доставить в «Ubuntu». На момент написания статьи это были следующие пакеты:

#apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

Устанавливаем «ruby-1.9.3», но сперва нужно поставить «ruby-1.8.7», иначе никак.
Если вылетело сообщение «RVM is not a function, selecting rubies with 'rvm use ...' will not work», то нужно выполнить команду «/bin/bash --login». И тогда можно работать с «RVM»:

$rvm install ruby-1.8.7-head
$rvm use ruby-1.8.7-head
$rvm install ruby-1.9.3-head

$rvm use ruby 1.9.3-head --default
$rvm gemset create rails3
$rvm use 1.9.3-head@rails3 --default

Когда я осваивал RVM мне очень помог вот этот пост: http://habrahabr.ru/post/120504/.

Passenger


«Passenger» — это модуль «Apache», который позволяет запускать Ruby-приложения. «RVM» позволяет скомпилировать «Passenger» для определенного джемсета. После компиляции, «RVM» посоветует как подключить «Passenger» к «Apache».

#apt-get install libapache2-mod-passenger
$gem install passenger
$rvmsudo /home/user/.rvm/gems/ruby-1.9.3-head@rails3/gems/passenger-4.0.8/bin/passenger-install-apache2-module
#apt-get install libcurl4-openssl-dev

Версия «Passenger» может меняться. Поэтому, нужно убедиться в правильности пути (в 3-ей команде).

В соответствующих директориях «Apache», создаем файлы конфигурации модуля и файлы загрузки модуля:

#touch /etc/apache2/mods-available/passenger.load

В файл записываем такое содержимое:

LoadModule passenger_module /home/user/.rvm/gems/ruby-1.9.3-head@rails3/gems/passenger-4.0.8/buildout/apache2/mod_passenger.so

Файл конфигурации:

#touch /etc/apache2/mods-available/passenger.conf

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

<IfModule mod_passenger.c>
PassengerRoot /home/user/.rvm/gems/ruby-1.9.3-head@rails3/gems/passenger-4.0.8
PassengerDefaultRuby /home/user/.rvm/wrappers/ruby-1.9.3-head@rails3/ruby
</IfModule>

После компиляции «Passenger», «RVM» сгенерирует правильное содержимое данных файлов. Нужно только создать файлы и скопировать содержимое.

Подключаем наш модуль:

#a2enmod passenger

Сразу меняем конфигурационный файл «Apache». Теперь у нас есть «Passenger»:

   <VirtualHost *:80>
    ServerName redmine.local
    ServerAdmin support@redmine.local
    DocumentRoot /var/www/srv-redmine/public
    Options Indexes ExecCGI FollowSymLinks
    PassengerResolveSymlinksInDocumentRoot on
    RailsEnv production
    RailsBaseURI /

    <Directory /var/www/srv-redmine/public>
        AllowOverride all
        Options -MultiViews
    </Directory>

    <LocationMatch "/login">
        AuthType NTLM
        NTLMAuth on
        NTLMAuthoritative on
        NTLMDomain OUR_DOMAIN.LOCAL
        NTLMServer dc1.our_domain.local
        NTLMBackup dc2.our_domain.local
        require valid-user
    </Location>

   </VirtualHost>

Перезапускаем «Apache»:

#service apache2 restart


Redmine


Берем свежую версию «Redmine» из SVN-репозитория. SVN-клиетнт может быть не установлен в «Ubuntu». Тогда нужно его установить.

#cd /usr/share/srv-redmine
#svn co http://redmine.rubyforge.org/svn/branches/2.3-stable redmine-2.3
#chmod 775 -R /usr/share/srv-redmine/redmine-2.3
#chown -R www-data:user /usr/share/srv-redmine/redmine-2.3

user — это тот пользователь под которым мы устанавливали «RVM».

Устанавливаем «Rmagic» и пакет без которого не поставится gem.

#sudo apt-get install librmagick-ruby1.8
#sudo apt-get install libmagick9-dev
#sudo apt-get install libmagickcore-dev libmagickwand-dev

или вот так (зависит от версии «Ubuntu»):

#sudo apt-get install graphicsmagick-libmagick-dev-compat
#sudo apt-get install libmagickwand-dev

Меняем настройки подключения «Redmine» к базе данных. В нашем случае это «MySQL»:
$cd /usr/share/srv-redmine/redmine-2.3/config

Меняем файл «database.yml»:

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: password_for_redmine_user
  encoding: utf8

Заодно конфигурируем отправку почтовых сообщений из «Redmine». Файл «configuration.yml»:

production:
   email_delivery:
     delivery_method: :smtp
     smtp_settings:
       address: "smtp_server"
       port: 25
       domain: "mail_domain_name"
       authentication: none

У нас настроен почтовый сервер, не требующий аутентификации внутри сети. Поэтому файл такой. У вас файл может быть другим. Подробнее можно прочесть тут: http://www.redmine.org/projects/redmine/wiki/EmailConfiguration

Устанавливаем все джемы, которые необходимы «Redmine»:

$cd /usr/share/srv-redmine/redmine-2.3
$bundle install --without development test

«Redmine» из коробки позволяет не прозрачно аутентифицироваться в домене. Для этого используется джем «net-ldap». Этот джем содержит одну очень серьезную ошибку.

Нужно отыскать этот джем в джемсете и ручками исправить файл согласно вот этому коммиту.

Иначе, когда из «LDAP» запрашиваются определенные данные в кириллице, могут возникать непредвиденные ошибки.

Дальше все по инструкции установки «Redmine»:

Генерируем секретный ключ:

rake generate_secret_token

Создаем таблички в нашей базе данных:

RAILS_ENV=production rake db:migrate

Заполняем базу данных базовыми данными:

RAILS_ENV=production REDMINE_LANG=ru rake redmine:load_default_data


Собственно это все. Перезапускаем «Apache». Все должно работать.

#service apache restart

Какие еще есть способы установить «Redmine»


Можно просто скачать «Bitnami Stack».

Можно установить «Redmine» из репозитариев: «apt-get install redmine». В «Ubuntu» он есть, но не всегда свежий.

Я предпочитаю пройти более сложный путь установки, но зато, иметь более глубокое представление о своем сервере.

Надеюсь, статья будет полезна.
Автор: @tdvsdv
Монастырёв и Ко
рейтинг 32,81
Компания прекратила активность на сайте

Похожие публикации

Комментарии (14)

  • +2
    С «кавычками» вокруг «имён собственных», пожалуй, перебор.
  • +1
    А теперь сюда ещё нужно прикрутить плагин CRM для полного счастья, ибо это тоже магия.
    • 0
      Redmine из коробки мало для чего подходит, по моему мнению. Но у него большой плюс в наличие большого количества плагинов и в хорошей расширяемости. Мы достаточно удачно используем его в корпоративных целях, как единую информационную среду.
      • 0
        Мы тоже его используем, но с совместимостью версий, плагинами и обновлениями бывает не просто.
        • 0
          Почти все плагины пишем самостоятельно. Тяжелые переезды были когда Redmine c Rails 2 на Rails 3 переехал. Тогда пришлось много кода перенести с Prototype на Jquery. Дальше переезды были менее трудо-затратными.
  • 0
    раньше я тоже использовал пассенжер. тк было удобно, потому что всего одна команда и почти любое ror приложение работало сразу.

    а потом когда я научился использовать rvm и узнал о unicorn (или puma), то сразу понял, что оно лучше:
    быстрее загрузка, гибче настройка и уверенность в том, что ror приложение работает именно от того пользователя, под которым запущен unicorn.

    а апач (хотя в моем случае nginx), используется исключительно как прокси.

    при такой схеме удобно и быстро можно держать несколько версий редмайна (а иногда и такое бывает)
    или любые другие веб приложения.
  • 0
    Сейчас на работе занимаюсь тем, что настраиваю прозрачную аутентификацию на Redmine. Но никак не получается настроить ntlm.

    Я пока создал просто маленькую тестовую страничку на PHP, где дампится $_SERVER. При заходе на эту страницу появляется окно авторизации. Ввожу логин/пароль, оно появляется снова, ввожу еще раз — снова появляется. Пробовал логин вводить в разных форматах: domain\login, login, domain\\login, ничего не работает. Все данные (хост, домен) должны быть верные, так как во встроенном LDAP Redmine все работает. Вот логи апача:

    [info] [client 192.168.9.75] 3064054256 23800 / — NTLMXX-Creating new ntlm_connection: 1
    [debug] mod_ntlm.c(78): [client 192.168.9.75] 3064054256 23800 / — got auth_line «ЗДЕСЬ ДЛИННАЯ СТРОКА»
    [debug] mod_ntlm.c(78): [client 192.168.9.75] 3064054256 23800 / — got header with host "", domain "", unicode flag 7
    [info] [client 192.168.9.75] 3064054256 23800 / — received msg1 keep-alive: 0, keepalives: 0
    [info] [client 192.168.9.75] 3064054256 23800 / — send WWW-Authenticate «ЗДЕСЬ ДЛИННАЯ СТРОКА»
    [debug] mod_deflate.c(615): [client 192.168.9.75] Zlib: Compressed 475 to 320: URL /
    [debug] mod_ntlm.c(78): [client 192.168.9.75] 3064054256 23800 / — got auth_line «ЗДЕСЬ ДЛИННАЯ СТРОКА»
    [Thu Dec 26 12:56:53 2013] [debug] mod_ntlm.c(78): [client 192.168.9.75] 3064054256 23800 / — got header with host «HW008», domain «НАЗВАНИЕ НАШЕГО ДОМЕНА», unicode flag 7
    [Thu Dec 26 12:56:53 2013] [info] [client 192.168.9.75] 3064054256 23800 / — received msg3
    [Thu Dec 26 12:56:53 2013] [info] [client 192.168.9.75] 3064054256 23800 / — authenticating user against DC
    [Thu Dec 26 12:56:53 2013] [error] [client 192.168.9.75] 3064054256 23800 / — NTLM/SMB user "(null)": authentication failure for "/"
    [Thu Dec 26 12:56:53 2013] [debug] mod_deflate.c(615): [client 192.168.9.75] Zlib: Compressed 475 to 320: URL /

    Вот конфиг апача:

    <VirtualHost *:80>
    	ServerAdmin webmaster@localhost
    
    	DocumentRoot /var/www/ntlm
    	ServerName ntlm.dev
    
    	<Location />
    		AuthName NTAuth
    		AuthType NTLM
    		NTLMAuth on
    		NTLMAuthoritative on
    		NTLMDomain SUB.DOMAIN.COM
    		NTLMServer dc2.sub.domain.com
    		NTLMBackup dc2.sub.domain.com
    		NTLMLockfile /tmp/_my.lck
    		require valid-user
    	</Location>
    </VirtualHost>
    


    Наш домен Active Directory выглядит как домен второго уровня, поэтому SUB.DOMAIN.COM.

    Что может работать неправильно?
    • 0
      В самом Redmine во встроенном LDAP я ввожу такие параметры и все работает:

      Name = ActiveDirectory
      Host = dc2.sub.domain.com
      Port = 389
      LDAPS = no
      Account = Domain\Login
      Password = password
      Base DN = DC=sub,DC=domain,DC=com

      On-the-fly user creation = no
      Attributes
      Login = sAMAccountName

      Я правильно понимаю, что LDAP Redmine и NTLM должны пытаться подключиться к одному и тому же серверу? Если да, то почему в LDAP Redmine мы указываем еще логин/пароль пользователя с правами на чтение в домене, а в NTLM нет?
  • 0
    Что может работать неправильно?


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

    Вот например для Firefox sivel.net/2007/05/firefox-ntlm-sso/

    Если окно аутентификации вылетает, значит это уже не сквозная аутентификация. Скорее всего браузер не настроен, вообще.

    Я правильно понимаю, что LDAP Redmine и NTLM должны пытаться подключиться к одному и тому же серверу? Если да, то почему в LDAP Redmine мы указываем еще логин/пароль пользователя с правами на чтение в домене, а в NTLM нет?


    Думаю, потому что данные отправляет сам браузер. Он знает на какой домен слать эти данные. Компьютер же в домене. Шлет скорее всего хеш пароля.
  • 0
    Спасибо, разобрался. Дело в том, что на новых осях уже используется NTLMv2. Данный модуль mod_ntlm писался во времена Win XP, когда был еще NTLM версии 1. Чтобы переключиться на NTLM первой версии надо:
    1) Панель управления -> Администрирование -> Локальная политика безопасности
    2) Далее выбираем папку Локальные политики -> параметры безопасности
    3) Находим в списке «Сетевая безопасность: уровень проверки подлинности LAN-Manager», кликаем на него и в списке выбираем «Отправлять LM- и NTLM- ответы»

    Но это я считаю, какой-то грязный хак. Прозрачная аутентификация заработала в ИЕ, у меня 9. В Хром все так же выскакивает окошко ввода пароля, но после ввода пускает. Firefox по-прежнему никак не заводится.
    • 0
      1) Для Firefox сработало добавление хоста сервера в опцию network.automatic-ntlm-auth.trusted-uris на странице about:config
      2) Для ИЕ кроме того нужно сделать следующее:
      Настройки ИЕ -> Свойства обозревателя -> Безопасность -> Местная интрасеть, щелкаем «Узлы», потом «Дополнительно» и добавляем хост сервера. После этого заработал и хром.
  • 0
    Доменное имя «redmine.local» должно быть определено (разрешаться) в той сети, где вы будете использовать «Redmine».

    Где и как можно определить?
    Я ставил по этой ссылке help.ubuntu.ru/wiki/redmine и в той статье написано
    не забудьте настроить псевдоним redmine.domen в DNS

    А как это сделать — не могу разобраться.
    • 0
      Если локально настраиваете, то в файлике hosts компьютера с которого заходите на redmine. Он есть как в linux, так и в windows.

      Если для всей сети подымаете, то тогда на DNS-сервере сети.
      • 0
        Спасибо.
        Делаю для всей сети.

        Дописал в конец файла /etc/bind/db.domain.ru

        redmine IN     A     192.168.1.13
        


        Вышло следующее:
        ;
        ; BIND data file for local loopback interface
        ;
        $TTL    604800
        @       IN      SOA     domain.ru. root.domain.ru. (
                                      6         ; Serial
                                 604800         ; Refresh
                                  86400         ; Retry
                                2419200         ; Expire
                                 604800 )       ; Negative Cache TTL
                IN      A       192.168.1.13
        ;
        @       IN      NS      ns.domain.ru.
        @       IN      A       192.168.1.13
        @       IN      AAAA    ::1
        ns      IN      A       192.168.1.13
        redmine IN      A       192.168.1.13
        

        Вот только ничего не понятно — для чего ns.domain.ru.? Но все работает теперь.

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

Самое читаемое Разное