레드마인설치 레드마인은루비온레일스프레임워크를사용 작업순서 Ignore RHEL/CentOS 6 에 redmine 설치 사전작업 DB 와개발도구설치 DBMS 설정개발도구설치레드마인설치 ruby 패키지설치환경설정스키마와데이타마이그레이션파일시스템권한메인환경설정레드마인구동 Apache httpd 와연동 SSL(HTTPS) 로연동 unicorn 으로디플로이 사전작업 DB 와개발도구설치 이제레드마인을설치하기위한환경을알아보자. 레드마인은루비온레일스프레임워크를사용하므로지원하는루비인터프리터의버전과레일스버전이중요하다. 아래의표처럼최소루비버전은 8.7 이며 RHEL/CentOS 에는이버전이탑재되어있지만출시된지오래되서제품수명이종료된상태이다. gitlab 설치에사용한 0 버전의루비를사용하도록하자.
레드마인버전지원루비버전레일스버전 현재 trunk ruby 8.7, 9.2, 9.3, 0.0, jruby-7.6 Rails 3.2 4, 5 ruby 8.7, 9.2, 9.3, 0.0, jruby-7.6 Rails 3.2 지원환경 패키지설치작업이므로아래의작업은모두 root 로실행해야한다. 먼저루비인터프리터를설치하자. gitlab 을설치한독자라면이미설치되어있을테니건너뛰고설치하지않은독자는미리컴파일한 0 버전의 rpm 을 github 에서다운로드받자. wget https://github.com/lesstif/ruby-rpm/releases/download/v0.1/ruby-0.0p451-el6.x86_6rpm 레드마인은모든설정파일이 yaml 형식을사용하고있다. 그러므로 yaml 형식을파싱할수있는 libyaml 라이브러리가필요하나기본패키지에포함되어있지않으므로 EPEL 저장소설치가필요하다. rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 3. yum 명령어로루비패키지를설치한다. 5. yum localinstall ruby* 이슈관리와버전관리연동은매우중요하고유용한기능이다. 연동을위해사용하는버전관리클라이언트패키지를설치해두자. 이책에서는서브버전과 git 만사용한다고가정하도록하겠다. 패키지설치는 "10.2 서브버전설치 " 와 "10.3.1 git 설치 " 를참고하자. 레드마인은 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 항목 " 을참고하자. DBMS MySQL 버전 5.0 이상
PostgreSQL Microsoft SQL Server 8.2 이상 2008 이상 SQLite 3 지원 DBMS 레드마인설치시 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'; 개발도구설치 설치과정중 MySQL 커넥터등루비네이티브확장 (ruby native extension) 을빌드해야하니 GCC 컴파일러설치가필요하다. yum install gcc -y 레드마인의간트차트 (Gantt Chart) 를 PNG 로내보내려면그래픽처리라이브러리인 ImageMagick 개발라이브러리가필요하다. yum install ImageMagick-devel -y 3. 루비패키지의의존성관리자인 Bundler 를설치한다. gem install bundler 다른웹어플리케이션처럼레드마인도루트로실행하지않는게보안상안전하다. 레드마인을구동할사용자계정을생성하고암호를설정하자. adduser redmine passwd redmine OpenID 를지원하려면 Ruby OpenID Library 를설치한다. gem install ruby-openid 정상설치여부확인 $ irb irb> require 'rubygems' => false irb> gem 'ruby-openid' => true 레드마인설치
레드마인설치 이제부터는레드마인계정으로실행하면된다. 레드마인을다운로드하고구동에필요한패키지를설치할순서이다. 홈페이지에서버전별로.tar.gz 이나 zip 으로된패키지를제공하지만레드마인을개발하는데사용하는버전관리시스템인서브버전으로직접소스를다운로드받아서설치해보자. 서브버전에서소스를체크아웃해서설치할경우마이너버전업그레이드가용이한장점이있다. 레드마인서브버전저장소에서소스를체크아웃한다. 업그레이드예제를위해 4-stable 브랜치의마지막버전대신 2 버전 ( 리비전 12449) 을체크아웃받아보자. svn co http://svn.redmine.org/redmine/branches/4-stable redmine-4 -r 12449 레드마인버전이변경되도관리가용이하도록 redmine 이라는심볼릭링크를하나만들고 redmine 디렉터리에서작업을진행하도록하자. ruby 패키지설치 ln -s redmine-4 redmine cd redmine 이제루비관련라이브러리를설치하고설정할순서이다. 사용하는데이타베이스종류및연결정보를설정하자. 이정보는 config/database.yml 에설정한다. 먼저기존설정파일을복사한다. cp config/database.yml.example config/database.yml 에디터로 config/database.yml 을연결정보를설정한다. production: adapter: mysql2 database: redmine host: localhost //FORMAT username: redmine //FORMAT password: "my_password" //FORMAT encoding: utf8 3. 패키지관리자인 bundle 로구동에필요한패키지를설치한다. bundle install --without development test --path vendor/bundle 다음과같은에러메시지가나왔다면 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/8/gems/rmagick-13.2 for inspection.results logged to /usr/lib /ruby/gems/8/gems/rmagick-13.2/ext/rmagick/gem_make.out An error occurred while installing rmagick (13.2), and Bundler cannot continue. Make sure that `gem install rmagick -v '13.2' ` succeeds before bundling. 환경설정 환경설정 스키마와데이타마이그레이션 이제부터는레드마인구동에필요한기본데이타를생성하고데이타베이스스키마를마이그레이션하는단계이다. HTTP 의 cookie data 를암호화하기위해사용하는 random key 를생성한다. bundle exec rake generate_secret_token 데이타베이스스키마오브젝트생성을위해 db:migrate 명령어를실행한다. RAILS_ENV=production bundle exec rake db:migrate 3. 이슈타입 (Issue type), 우선순위 (Priority), 상태등기본레드마인데이타를생성한다. RAILS_ENV=production bundle exec rake redmine:load_default_data 기본데이타생성중사용할언어를물어보면 ko 를입력한다. 질문없이진행하려면위의 load_default_data 명령어실행시 REDMINE_LANG=ko 옵션을추가하면한국어를기본언어로설정한다. 파일시스템권한 레드마인을구동하는계정은레드마인하위의다음디렉터리에대해쓰기권한이있어야한다. 3. files - 스토리지및첨부파일저장 log - 어플리케이션로그파일 tmp, tmp/pdf - PDF 생성등각종임시파일이생성되는디렉터리 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 redmine 에서이슈등록 / 변경 / 삭제등이벤트발생시 email 을전송할수있게사용하는 SMTP 서버정보를설정한다. 7.2 절에설명한로컬에설치한 Postfix 를사용할경우아래와같이간략하게설정이가능하다. default: # Outgoing emails configuration (see examples above) email_delivery: delivery_method: :smtp smtp_settings: address: localhost port: 25 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" gmail 을통해메일을전송하려면계정에대해이단계인증을해제하고보안수준을낮춰야한다. 자세한내용은 gmail 의설명서를참고하자. 어플리케이션데이타와어플리케이션은분리하는게좋으므로첨부파일의경로를변경한다. 단 root 사용자로 /var/redmine/files 를생성하고소유자를 redmine 사용자로변경해주어야한다. attachments_storage_path: /var/redmine/files 3. 사용하는버전관리설치경로가다르다면 SCM 명령어설정항목에서절대경로로설정해야한다. 패키지로설치했을경우 /usr/bin 에설치되므로특별한설정이필요하지않다. scm_subversion_command: scm_git_command: 간트차트를 PNG 로변환할때한글이제대로표시되려면이미지처리라이브러리인 ImageMagick 에한글폰트를지정해주어야한다. 무료폰트인나눔고딕폰트를사용해보자. 독자들의선호에맞게폰트설정은변경하면된다.
rmagick_font_path: /usr/share/fonts/nanum/nanumgothic.ttf 레드마인구동 제대로설치되었는지테스트하기위해 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.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> 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> 이제 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> 설정이완료되었다면 httpd 를재구동하여 HTTPS 로잘연결되며 HTTP 로연결할경우에 HTTPS 로전환되는지확인해보자. HTTPS 설정과관련된내용은 "8.5.4 mod_ssl" 항목을참고하자. unicorn 으로디플로이 루비로개발된간단한웹서버인 webrick 은주로개발이나테스트단계에서사용하는웹서버이며실제운영환경에서루비어플리케이션을디플로이하기에는성능문제가있다. 운영환경에서루비어플리케이션을디플로이하기위한방법으로는 Phusion Passenger 처럼웹서버에전용모듈로탑재되는디플로이프레임워크를사용하거나푸마나유니콘처럼루비로만든고성능웹서버로디플로이하는방법이있다. Phusion Passenger 가성능이제일뛰어나지만유니콘웹서버도 gitlab 에사용될정도로괜찮은제품이니우리는 gitlab 의디플로이서버인유니콘웹서버를통해레드마인을디플로이해보자. 사용자와데이타가많지않다면유니콘을설치하지않고 webrick 으로디플로이해도큰무리는없다. 유니콘웹서버로레드마인 (redmine) 등의 rails app deploy 하기 http://unicorn.bogomips.org/signals.html 현재 application 에추가할패키지가있다면 Gemfile 을수정하지말고 Gemfile.local 이라는파일을만들고이안에기술하면된다. 선호나는에디터로파일을열어서다음과같이유니콘웹서버관련패키지내용을추가한다. group :unicorn do gem "unicorn", '~> 6.3' gem 'unicorn-worker-killer' end bundle install 명령어로유니콘웹서버를 vendor/bundle 에설치한다. bundle install --without development test --path vendor/bundle
3. unicorn 설치디렉터리에서기본설정파일인 unicorn.conf.rb 를 config/unicorn.rb 로복사한다. cp./vendor/bundle/ruby/0.0/gems/unicorn-6.3/examples/unicorn.conf.rb config/unicorn.rb config/unicorn.rb 를에디터로열어서 app 경로및 port 를수정한다. worker_processes 2 working_directory "/home/redmine/redmine" # available in 0.90+ 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" 5. 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 : 유니콘웹서버로그가저장되는경로이다. 번들명령어로유니콘웹서버를실행한다. bundle exec unicorn_rails -D -c config/unicorn.rb -E production 6. 구동성공 / 실패여부를 log/unicorn-stderr.log 를통해확인한다. 7. tail -f log/unicorn.std* 이제정상적으로구동이되었는지브라우저를이용하여레드마인 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 이제위스크립트를사용하여길고복잡한시작명령어와종료절차를단순화할수있다. 먼저유니콘으로레드마인을시작해보자.
./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... 재구동 unicorn 은마스터프로세스가 HUP 시그널수신시설정파일을다시읽고모든워커프로세스를재시작한다. ps -eaf grep "unicorn_rails master" grep -v grep awk '{print "kill -HUP "$2}' sh -x QUIT - graceful shutdown, waits for workers to finish their current request before finishing. INT/TERM - quick shutdown, kills all workers immediately 이제레드마인의설치와설정이모두끝났다. 이제부터레드마인의사용법에대해서알아보자.