사전 작업 


이제 레드마인을 설치하기 위한 환경을 알아 보자. 레드마인은 루비 온 레일스 프레임워크를 사용하므로 지원하는 루비 인터프리터의 버전과 레일스 버전이 중요하다.

아래의 표처럼 최소 루비 버전은 1.8.7 이며 RHEL/CentOS 에는 이 버전이 탑재되어 있지만 출시된지 오래 되서 제품 수명이 종료된 상태이다.  gitlab 설치에 사용한 2.0  버전의 루비를 사용하도록 하자.

패키지 설치 작업이므로 아래의 작업은 모두 root 로 실행해야 한다.

  1. 먼저 루비 인터프리터를 설치하자. gitlab 을 설치한 독자라면 이미 설치되어 있을테니 건너뛰고 설치하지 않은 독자는 미리 컴파일 한 2.0 버전의 rpm 을 github 에서 다운로드 받자.

    wget https://github.com/lesstif/ruby-rpm/releases/download/v0.1/ruby-2.0.0p451-1.el6.x86_64.rpm 

  2. 레드마인은 모든 설정 파일이 yaml 형식을 사용하고 있다. 그러므로 yaml 형식을 파싱할 수 있는 libyaml 라이브러리가 필요하나 기본 패키지에 포함되어 있지 않으므로 EPEL 저장소 설치가 필요하다.

    rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 

  3. yum 명령어로 루비 패키지를 설치한다.

    yum localinstall ruby*

  4. 이슈 관리와 버전 관리 연동은 매우 중요하고 유용한 기능이다. 연동을 위해 사용하는 버전 관리 클라이언트 패키지를 설치해 두자. 이 책에서는 서브버전과 git 만 사용한다고 가정하도록 하겠다.
    패키지 설치는 "10.2.2 서브버전 설치" 와 "10.3.1 git 설치" 를 참고하자.

  5. 레드마인은 ImageMagick  이라는 그래픽 라이브러리를 필요로 한다. 이 라이브러리가 설치되어 있으면 첨부된 이미지 파일의 썸네일을 만들수 있고 간트 차트를 PNG 로 변환할 수 있다. PNG 변환시 한글이 정상적으로 출력되려면 미리 한글 폰트가 설치되어 있어야 한다.
    무료 폰트인 네이버 나눔 폰트를 시스템의 폰트 디렉터리인 /usr/share/fonts/ 밑에 nanum 디렉터리에 설치해 놓자.

    wget http://cdn.naver.com/naver/NanumFont/fontfiles/NanumFont_TTF_ALL.zip

    unzip NanumFont_TTF_ALL.zip -d /usr/share/fonts/nanum

DB 와 개발 도구 설치

 

DBMS 설정

레드마인은 다음 표와 같은 DBMS 를 지원하고 있다. 이중에 SQLite 는 가볍고 속도는 빠지만 여러 개의 쓰레드나 프로세스가 동시에 사용할 때 동시성 제어 문제가 있고 DBMS 를 별도의 시스템으로 분리하거나 확장할 때도 문제가 되므로 혼자 쓰는 레드마인이 아니라면 사용하지 않는게 좋다.
그 외에 DBMS 들은 위 문제가 없으므로 어느 것을 사용해도 되지만 gitlab 도 같이 사용하고 있는 MySQL 을 사용해 보자.

MySQL 의 경우 5.0 이상의 버전을 지원하므로 RHEL/CentOS 에 기본 탑재된 MySQL 을 사용해도 문제가 없다. MySQL 설치는 "7.1.1 항목"을 참고하자.

레드마인 설치시 ruby 용 MySQL 의 커넥터를 빌드하는 과정이 있으므로 MySQL 개발 패키지(mysql-devel)를 꼭 설치해야 한다.

최신 버전의 MySQL 을 설치하는 경우에도 devel 이 들어가는 패키지를 설치해야 한다. 패키지명은 저장소에 따라 다르나 보통 mysql55w-devel 처럼 앞에 MySQL 의 버전이 붙고 뒤에 용도를 기술하는 형식으로 되어 있다.

 

MySQL 설치와 설정이 완료 되었다면 레드마인이 사용할 데이타베이스와 계정을 생성해 보자.

CREATE DATABASE redmine CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
SQL

 

개발 도구 설치

  1. 설치 과정중 MySQL 커넥터등 루비 네이티브 확장(ruby native extension) 을 빌드해야 하니 GCC 컴파일러 설치가 필요하다.

    yum install gcc -y

  2. 레드마인의 간트 차트(Gantt Chart) 를  PNG 로 내보내려면 그래픽 처리 라이브러리인 ImageMagick 개발 라이브러리가 필요하다. 

    yum install ImageMagick-devel -y

  3. 루비 패키지의 의존성 관리자인 Bundler 를 설치한다.

    gem install bundler

  4. 다른 웹 어플리케이션처럼 레드마인도 루트로 실행하지 않는게 보안상 안전하다.  레드마인을 구동할 사용자 계정을 생성하고 암호를 설정하자. 

    adduser redmine

    passwd redmine

 

레드마인 설치

 

이제부터는 레드마인 계정으로 실행하면 된다.  레드마인을 다운로드하고 구동에 필요한 패키지를 설치할 순서이다. 

홈페이지에서 버전별로 .tar.gz 이나 zip 으로 된 패키지를 제공하지만 레드마인을 개발하는데 사용하는 버전 관리 시스템인 서브버전으로 직접 소스를 다운로드 받아서 설치해 보자.

서브버전에서 소스를 체크아웃 해서 설치할 경우 마이너 버전 업그레이드가 용이한 장점이 있다.

  1. 레드마인 서브버전 저장소에서 소스를 체크아웃 한다. 업그레이드 예제를 위해 2.4-stable 브랜치의 마지막 버전 대신 2.4.2 버전(리비전 12449)을 체크아웃 받아 보자.

    svn co http://svn.redmine.org/redmine/branches/2.4-stable redmine-2.4 -r 12449 

  2. 레드마인 버전이 변경되도 관리가 용이하도록 redmine 이라는 심볼릭 링크를 하나 만들고 redmine  디렉터리에서 작업을 진행하도록 하자.

    ln -s redmine-2.4 redmine
    cd redmine

ruby 패키지 설치

이제 루비 관련 라이브러리를 설치하고 설정할 순서이다. 

  1. 사용하는 데이타 베이스 종류 및 연결 정보를 설정하자. 이 정보는 config/database.yml 에 설정한다. 먼저 기존 설정 파일을 복사한다.

    cp config/database.yml.example config/database.yml 

  2. 에디터로 config/database.yml 을 연결 정보를 설정한다.

    production:
      adapter: mysql2
      database: redmine
      host: localhost //FORMAT
      username: redmine //FORMAT
      password: "my_password" //FORMAT
      encoding: utf8
    CODE
  3. 패키지 관리자인 bundle 로 구동에 필요한 패키지를 설치한다.

    bundle install --without development test --path vendor/bundle

  4. 다음과 같은 에러 메시지가 나왔다면 MySQL 개발 패키지(mysql-devel)가 설치되지 않은 것이다. 해당 패키지 설치 여부를 devel 이 설치되지 않으면 bundle install 이 실패한다.

    An error occurred while installing mysql2 (0.3.15), and Bundler cannot continue.

    Make sure that `gem install mysql2 -v '0.3.15'` succeeds before bundling.
  5. Ruby용 ImageMagick 을 설치한다.

    bundle install --without development test rmagick

    다음과 같은 메시지가 나오고 설치에 실패했다면 ImageMagick 개발 패키지가 설치되지 않아서이다. 사전 작업을 참고해서 설치한 후에 다시 bundle 명령어를 실행하자.

    Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/rmagick-2.13.2 for inspection.Results logged to /usr/lib/ruby/gems/1.8/gems/rmagick-2.13.2/ext/RMagick/gem_make.out An error occurred while installing rmagick (2.13.2), and Bundler cannot continue. Make sure that `gem install rmagick -v '2.13.2'` succeeds before bundling.

환경 설정

 

스키마와 데이타 마이그레이션

이제부터는 레드마인 구동에 필요한 기본 데이타를 생성하고 데이타베이스 스키마를 마이그레이션 하는 단계이다.

  1. HTTP 의 cookie data 를 암호화하기 위해 사용하는 random key를 생성한다.

    bundle exec rake generate_secret_token

  2. 데이타베이스 스키마 오브젝트 생성을 위해 db:migrate 명령어를 실행한다.

    RAILS_ENV=production bundle exec rake db:migrate

  3. 이슈 타입(Issue type), 우선순위(Priority), 상태등 기본 레드마인 데이타를 생성한다.

    RAILS_ENV=production bundle exec rake redmine:load_default_data

  4. 기본 데이타 생성중 사용할 언어를 물어보면 ko 를 입력한다. 질문없이 진행하려면 위의 load_default_data 명령어 실행시 REDMINE_LANG=ko 옵션을 추가하면 한국어를 기본 언어로 설정한다.
     

파일 시스템 권한

레드마인을 구동하는 계정은 레드마인 하위의 다음 디렉터리에 대해 쓰기 권한이 있어야 한다.

  1. files  - 스토리지 및 첨부 파일 저장
  2. log - 어플리케이션 로그 파일
  3. tmp, tmp/pdf - PDF 생성등 각종 임시 파일이 생성되는 디렉터리
  4. public/plugin_assets - css, javascript 등 플러그인에 필요한 자산(asset) 파일들

3번과 4번은 레드마인 패키지에 포함되어 있지 않은 디렉터리이므로 직접 생성해야 한다. 

mkdir -p tmp tmp/pdf public/plugin_assets

메인 환경 설정

redmine 의 설정은 config/configuration.yml 에 저장된다. 설정 파일이 없으면 configuration.yml.example 를 config/configuration.yml 로 복사한다.

cp config/configuration.yml.example config/configuration.yml


  1. redmine 에서 이슈 등록/변경/삭제등 이벤트 발생시 email 을 전송할 수 있게 사용하는 SMTP 서버 정보를 설정한다. 7.2절에 설명한 로컬에 설치한 Postfix 를 사용할 경우 아래와 같이 간략하게 설정이 가능하다.

    default:
      # Outgoing emails configuration (see examples above)
      email_delivery:
        delivery_method: :smtp
        smtp_settings:
          address: localhost
          port: 25
    CODE

    gmail 을 사용할 경우 주석으로 막혀 있는 다음 부분을 주석을 해제해 주고 사용하는 id 와 password 로 변경해 주면 된다. 

     production:
       email_delivery:
         delivery_method: :smtp
         smtp_settings:
           enable_starttls_auto: true
           address: "smtp.gmail.com"
           port: 587
           domain: "smtp.gmail.com" # 'your.domain.com' for GoogleApps
           authentication: :plain
           user_name: "mygmailid@gmail.com"
           password: "my_gmail_passwd"
    CODE

    gmail 을 통해 메일을 전송하려면 계정에 대해 이단계 인증을 해제하고 보안 수준을 낮춰야 한다. 자세한 내용은 gmail 의 설명서를 참고하자.

  2. 어플리케이션 데이타와 어플리케이션은 분리하는게 좋으므로 첨부 파일의 경로를 변경한다. 단 root 사용자로 /var/redmine/files 를 생성하고 소유자를 redmine 사용자로 변경해 주어야 한다.

    attachments_storage_path: /var/redmine/files
    CODE
  3. 사용하는 버전 관리 설치 경로가 다르다면 SCM 명령어 설정 항목에서 절대 경로로 설정해야 한다. 패키지로 설치했을 경우 /usr/bin 에 설치되므로 특별한 설정이 필요하지 않다.

    scm_subversion_command:
    scm_git_command:
    CODE
  4. 간트 차트를 PNG 로 변환할때 한글이 제대로 표시되려면 이미지 처리 라이브러리인 ImageMagick 에 한글 폰트를 지정해 주어야 한다. 무료 폰트인 나눔고딕 폰트를 사용해 보자. 독자들의 선호에 맞게 폰트 설정은 변경하면 된다.

    rmagick_font_path: /usr/share/fonts/nanum/NanumGothic.ttf
    CODE

레드마인 구동

제대로 설치되었는지 테스트하기 위해 rails 에 내장된 간단한 웹서버인 webrick 을 구동해 보자. webrick 은 -p 옵션뒤에는 사용할 포트 번호를 지정하며 옵션을 생략하면 기본적으로 3000 번 포트를 사용한다.

ruby script/rails server webrick -e production -p 3000

정상적으로 구동이 되었어도 3000 번 포트이므로 외부에서 연결하려면 iptables 로 방화벽을 열고 웹 브라우저에서는 포트 번호를 명시해서 접속해야 한다.

이는 번거로운 작업이고 사용시에도 URL에 포트를 적어야 하므로 불편하니 아파치가 레드마인의 3000번 포트에 대해 리버스 프록시로 동작하도록 설정하여 3000번 포트를 열지 않아도 외부에서 접속할 수 있게 해보자.

 

Apache httpd 와 연동

다음은 레드마인용 아파치 웹서버의 가상 호스트 설정이다. 가상 호스트 설정 파일을 분리했다면 /etc/httpd/conf/httpd-vhost.conf  파일을 만들었다면 여기에 설정하고 아니라면 /etc/httpd/conf/httpd.conf 에 설정하도록 하자. 자세한 내용은 "8.1.3.3 이름 기반 가상호스트" 항목을 참고하자.

<VirtualHost *:80>
    ServerName redmine.example.com
    ErrorLog logs/redmine-error_log
    CustomLog logs/redmine-access_log common
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
</VirtualHost>
CODE

3000 번 포트는 ntop_port_t 라는 SElinux 보안 컨텍스트에 할당이 되어 있으므로 아파치 웹서버가 연결할 수 없다.

semanage 명령어로 보안 컨텍스트를 수정하여 아파치 웹서버가 레드마인에 연결할 수 있도록 설정해 보자. ntop_port_t 가 3000에 할당되었으므로 -a(add) 가 아닌 -m(modify) 옵션으로 처리해야 한다.

semanage port -m -p tcp -t http_port_t 3000 

이제 웹 브라우저로 redmine.example.com 에 연결하면 다음과 같은 초기 화면이 표시되며 우측의 "로그인" 버튼을 누르고 admin/admin 계정으로 로그인 할 수 있다.

SSL(HTTPS) 로 연동

이슈 관리 시스템이 회사 내부에 있고 외부에서 연결해야 한다고 생각해 보자. HTTP 보다는 HTTPS 를 사용하는게 보안 측면에서 더 적합할 것이다. 이는 mod_ssl 을 사용하면 손 쉽게 해결할 수 있으며  mod_rewrite 의 URL 포워딩 기능까지 결합하면 실수로 HTTP 로 들어와도 HTTPS 로 전환시킬 수 있다.

먼저 다음과 같이 conf/httpd-vhost.conf 에 mod_rewrite 와 정책을 추가하자.

<VirtualHost *:80>
    ServerName redmine.example.com
    ErrorLog logs/redmine-error_log
    CustomLog logs/redmine-access_log common
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
 
	RewriteEngine on
	RewriteCond %{HTTPS} !=on
	RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [NE,R,L]
</VirtualHost>
CODE

이제 ssl 설정 파일인 conf.d/ssl.conf 에 다음과 같은 가상 호스트를 추가하면 된다.  SSLCertificateFile, SSLCertificateKeyFile, SSLCACertificateFile 설정은 갖고 있는 SSL 인증서와 개인키, 그리고 SSL 인증서를 발급해 준 기관의 인증서 경로를 넣어 주면 된다.

<VirtualHost *:443>
        ServerName redmine.example.com
 
		SSLEngine on
        SSLCipherSuite SSLv3:TLSv1:+HIGH:!SSLv2:!MD5:!MEDIUM:!LOW:!EXP:!ADH:!eNULL:!aNULL
        SSLCertificateFile    /etc/pki/tls/certs/example.com.crt
        SSLCertificateKeyFile /etc/pki/tls/private/example.com.key
#        SSLCACertificateFile  /etc/pki/tls/certs/example.com-rootca.crt

        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
		ProxyPass / http://localhost:3000/
		ProxyPassReverse / http://localhost:3000/
		LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common_forwarded
		ErrorLog logs/redmine-ssl-error.log
		CustomLog logs/redmine-ssl-access.log combined
</VirtualHost>
CODE

설정이 완료되었다면 httpd 를 재구동하여 HTTPS 로 잘 연결되며 HTTP 로 연결할 경우에 HTTPS 로 전환되는지 확인해 보자. HTTPS 설정과 관련된 내용은 "8.2.5.4 mod_ssl" 항목을 참고하자.

unicorn 으로 디플로이

루비로 개발된 간단한 웹서버인 webrick 은 주로 개발이나 테스트 단계에서 사용하는 웹 서버이며 실제 운영 환경에서 루비 어플리케이션을 디플로이 하기에는 성능 문제가 있다.

운영 환경에서 루비 어플리케이션을 디플로이 하기 위한 방법으로는 Phusion Passenger 처럼 웹 서버에 전용 모듈로 탑재되는 디플로이 프레임워크를 사용하거나 푸마나 유니콘처럼 루비로 만든 고성능 웹서버로 디플로이 하는 방법이 있다.

Phusion Passenger 가 성능이 제일 뛰어나지만 유니콘 웹서버도 gitlab 에 사용될 정도로 괜찮은 제품이니 우리는 gitlab 의 디플로이 서버인 유니콘 웹서버를 통해 레드마인을 디플로이 해 보자.

사용자와 데이타가 많지 않다면 유니콘을 설치하지 않고 webrick 으로 디플로이해도 큰 무리는 없다.

  1. 현재 application 에 추가할 패키지가 있다면 Gemfile 을 수정하지 말고 Gemfile.local 이라는 파일을 만들고 이 안에 기술하면 된다. 선호나는 에디터로 파일을 열어서 다음과 같이 유니콘 웹서버 관련 패키지  내용을 추가한다.

    group :unicorn do  gem "unicorn", '~> 4.6.3'
      gem 'unicorn-worker-killer'
    end
    CODE
  2. bundle install 명령어로 유니콘 웹 서버를 vendor/bundle 에 설치한다.

    bundle install --without development test --path vendor/bundle

  3. unicorn 설치 디렉터리에서 기본 설정 파일인 unicorn.conf.rb 를 config/unicorn.rb 로 복사한다.

    cp ./vendor/bundle/ruby/2.0.0/gems/unicorn-4.6.3/examples/unicorn.conf.rb config/unicorn.rb

  4. config/unicorn.rb 를 에디터로 열어서 app 경로 및 port 를 수정한다.

    worker_processes 2
    working_directory "/home/redmine/redmine" # available in 0.94.0+
     
    listen "/home/redmine/redmine/tmp/sockets/.unicorn.sock", :backlog => 64
    listen 3000, :tcp_nopush => true
     
    timeout 30
     
    pid "/home/redmine/redmine/tmp/pids/unicorn.pid"
     
    stderr_path "/home/redmine/redmine/log/unicorn.stderr.log"
    stdout_path "/home/redmine/redmine/log/unicorn.stdout.log"
    CODE

    worker_processes : 서비스를 처리할 유니콘 워커의 갯수를 지정한다. 기본 워커는 4 지만 사용자가 많지 않다면 2 정도로 설정해도 된다. 많은 부하가 걸리는 서버라면 3 또는 4로 지정한다. worker 를 3으로 지정시 최소  2GB 이상의 RAM 이 있어야 하며 4GB 이상일 경우 worker 를 4로 지정한다.
    working_directory : 레드마인 어플리케이션이 있는 경로를 지정한다.
    listen  : 유닉스 도메인 소켓의 경로를 지정하는 listen 과 포트를 지정한 listen 설정 두 개가 있다. 사용하는 포트를 8080 에서 3000 번으로 변경한다.
    pid  : 유니콘 pid 가 저장되는 디렉터리 경로를 설정한다. 해당 디렉터리가 존재해야 에러가 발생하지 않는다.
    stderr_path, stdout_path  : 유니콘 웹서버 로그가 저장되는 경로이다.

  5. 번들 명령어로 유니콘 웹 서버를 실행한다.

    bundle exec unicorn_rails -D -c config/unicorn.rb -E production

  6. 구동 성공/실패 여부를 log/unicorn-stderr.log 를 통해 확인한다.

    tail -f  log/unicorn.std*

  7. 이제 정상적으로 구동이 되었는지 브라우저를 이용하여 레드마인 URL 로 접근해 보자. 좀전과 동일한 화면이 보이면 정상 설정된 것이다.


유니콘과 웹서버 설정이 정상적으로 끝났다. gitlab은 별도의 구동 스크립트를 제공하지만 레드마인은 없으므로 유니콘으로 레드마인을 구동하는 방법을 스크립트를 이용하여 간편하게 해보자. 

다음은 시스템 서비스를 관리할 때 사용하는 service 명령어와 비슷하게 작성한 구동 스크립트로 redmine_unicorn.sh 이름으로 레드마인 설치 디렉터리에 저장하고 chmod +x  redmine_unicorn.sh  로 실행 권한을 부여하자.

#!/bin/sh
 
export RAILS_ENV=production
USER=`whoami`

PIDS=""
getpids() {
    local procname=$1
    if [ "$#" = 0 ] ; then
        echo $"Usage: getpids {procname} "
        return
    fi

    PIDS=`ps -eaf|grep unicorn|grep ${procname}|grep -v grep|grep ${USER}|awk '{print $2}'|paste -d" " -s`
}

start() {
        bundle exec unicorn_rails -D -c config/unicorn.rb
        RETVAL=$?
        if [ $RETVAL != 0 ];then
                tail log/unicorn.stderr.log
        fi
}
stop() {
        getpids "master"
        if [ ! -z ${PIDS} ];then
                echo "sending TERM signal to unicorn master ${PIDS}"
                kill -TERM ${PIDS}
        fi
}

status() {
        getpids "master"
        MASTER=${PIDS}
        getpids "worker"
        WORKER=${PIDS}
        echo "Unicorn master $MASTER and worker ($WORKER) is running..."
}

case "$1" in
  start)
        start
        status
        ;;
  stop)
        stop
        ;;
  about)
        ruby script/about
        ;;
  status)
        status
        ;;
  restart)
        stop
        start
		status
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|about|status|restart}"
        RETVAL=2
esac
CODE

이제 위 스크립트를 사용하여 길고 복잡한 시작 명령어와 종료 절차를 단순화 할 수 있다. 먼저 유니콘으로 레드마인을 시작해 보자.

./redmine_unicorn.sh start

레드마인 구동 여부는 status 명령어로 확인할 수 있다. 유니콘은 마스터 프로세스가 있고 unicorn.rb 에 설정한 워커 프로세스 갯수만큼 프로세스가 생성된다. 다음은 워커가 2개일 경우 결과이다.

./redmine_unicorn.sh status

Unicorn master 3916 and worker (3922) is running...

유니콘 웹 서버를 종료 하려면 stop 옵션을 주면 유니콘 마스터 프로세스에 종료 시그널인 TERM 시그널을 전송한다.

./redmine_unicorn.sh stop
sending TERM signal to unicorn master 3916

재시작을 하려면 restart 옵션을 주면 된다.

./redmine_unicorn.sh restart
sending TERM signal to unicorn master 3916

Unicorn master 2643 and worker (2649) is running...

이제 레드마인의 설치와 설정이 모두 끝났다. 이제부터 레드마인의 사용법에 대해서 알아 보자.