Gentoo redmine nginix git

Gentoo Korea Wiki
둘러보기로 가기 검색하러 가기
Gentoo Linux에서 nginix, redmint, git 같이 사용하기-작성자_지구상의누군가


적용범위 및 목적

본 문서는 일반적으로 프로젝트의 진행 및 관리를 위해 Gentoo linux에서 DVCS프로그램인 git를 설치 하고 nginx웹서버 및 redmine을 설치하여 gitolite를 이용해 연동하는 법을 간단하게 기술하고 이를 이용해서 프로젝트를 진행하는 법을 간략하게 설명함을 목적으로 한다.


용어정의

  • git :: Distributed version control system(DVCS) Program
  • redmine :: flexible project management system
  • nginx :: web server daemon
  • Gentoo linux :: linux distribution


기준내용

시스템을 구성하기 위한 준비

  1. Gentoo Linux를 대상으로 하는 문서인 만큼 Gentoo Linux가 설치된 서버시스템


git

git란 개발중인 source code에 대한 버전 관리 시스템(VCS) 중 한 종류로서 서버 상의 저장소에 저장하며 관리할 수 있는 CVCS(Centralized VCS)의 기능에서 서버가 문제가 생기거나 네트워크가 연결되지 않았을 때 사용 할 수 없다는 단점을 보완한 DVCS(Distributed VCS) 프로그램이다.

git는 하나의 snapshot단위로 버전 관리를 하게 되며 하나의 snapshot이 만들어 지기까지 Working Directory, Staging Area, Git Directory 의 3가지 단계를 거치게 된다.

  • Git Directory :: Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. Git Directory가 Git의 핵심이다. 다른 컴퓨터에 있는 저장소를 Clone 할 때 Git Directory가 만들어진다.
  • Working Directory :: 프로젝트의 특정 버전을 Checkout 한 것이다. Git Directory는 지금 작업하는 디스크에 있고 그 Directory에 압축된 데이터베이스에서 파일을 가져와서 Working Directory를 만든다.
  • Staging Area :: Git Directory에 있다. 단순한 파일이고 곧 Commit 할 파일에 대한 정보를 저장한다. 종종 인덱스라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다.


snapshot을 만들어 Commit 하기 위해서는 아래의 순서를 따른다.

  1. Working Directory에서 파일을 수정한다.
  2. Staging Area에 파일을 Stage 해서 Commit 할 Snapshot을 만든다.
  3. Staging Area에 있는 파일들을 Commit 해서 Git Directory에 영구적인 Snapshot으로 저장한다.


git설치

Gentoo linux에서는 emerge git로 설치할 수 있다. 설치 시 git인증을 서포트 하는 gitolite를 같이 설치 하도록 한다.

# emerge -q git gitolite-gentoo

Redmine

웹기반의 프로젝트 관리와 버그 추적 기능을 제공하는 도구이다. 프로젝트 관리에 도움이 되도록 달력과 Gantt chart를 제공하고 일정관리 기능을 제공한다. Redmine은 통합된 프로젝트관리 기능과 이슈추적, 여러가지 형상 관리 기능을 제공한다.

Redmine의 디자인은 비슷한 기능을 가지는 오픈소스 프로그램인 Trac에 영향을 많이 받았으며 Ruby on Rails에 기반하여 작성되었고 멀티 플랫폼을 지원하며 여러가지 종류의 데이터베이스를 지원한다. 이중에서 우리는 SQLite를 사용 할 것이다.


Redmine설치

Redmine을 사용하기 위해서 필요한 일부 package들이 Gentoo linux 에선 기본적으로 mask 되어 있어 바로 설치가 되지 않기 때문에 필요한 package들의 mask를 풀어주는 설정이 필요 하다.


아래에서 thin이라는 패키지는 nginx와 redmine을 연동시켜 사용할수 있는 ruby용 범용 컨테이너 이다. ruby용 web application을 사용하려면 java의 tomcat처럼 중간에 broker를 필요로 하게되는데 thin은 그런 역할을 해준다.

http daemon으로 apache를 사용한다면 mod passenger를 사용하는 방법[1]도 있지만 여기서 언급할 사항은 아니기때문에 이상의 설명은 하지 않는다 않는다.

thin은 기본적으로 ruby를 위한 proxy라고 생각해도 좋으며 그 자체로 http daemon없이 스스로 동작이 가능하다. 다만 여러가지 기술 및 효율의 문제로인해 독립적으로 사용하는것은 피하는것이 좋다.

# vi /etc/portage/package.keywords
www-apps/redmine ~amd64
dev-ruby/ruby-net-ldap ~amd64
www-servers/thin ~amd64


또한 설치에 필요한 USE flag도 미리 정의 해 놓자.

# vi /etc/portage/package.use
www-apps/redmine imagemagick ldap


그리고 rails-2.3에서는 rack-1.2 이상은 사용 할 수 없으니 mask 설정을 추가 한다. 또한 redmine-2.x 이하 버전으로 설치 할 것이므로 같이 추가 한다.

# vi /etc/portage/package.mask
>=dev-ruby/rack-1.2
>=www-apps/redmine-2.0


문서 작성시점에서 ruby-1.9를 사용하는 rails-3.x에 대해 Gentoo linux에서는 mask가 되어 있으므로 ruby-1.8 버전만을 사용 하도록 make.conf 를 수정 추가 해 준다.

# vi /etc/portage/make.conf
RUBY_TARGETS="ruby18"


이제 필요한 package를 설치해보자. 프로젝트에서 사용할 DB는 SQLite이며 웹서버는 nginx이므로 같이 설치한다. thin은 nginx와 redmine의 다리역할을 해줄 컨테이너 이며 bundler는 ruby용 package간 의존성 관리 툴이다.

# emerge -q redmine thin bundler nginx dev-ruby/sqlite3


설치가 완료 되면 redmine의 DB 접속 설정파일을 작성한다.

# vi /var/lib/redmine/config/database.yml
production:
  adapter: sqlite3
  database: db/redmine.db

development:
  adapter: sqlite3
  database: db/redmine_dev.dbutf8


다음은 redmine의 기본 환경설정 작업을 실행한다. 이번에 사용된 버전은 1.4.5 이며 버전은 변경 될 수 있다.

# emerge --config "=www-apps/redmine-1.4.5"


redmint에 gitolite 연동 플러그인 설치

다음은 redmine에서 gitolite와 연동하기 위한 플러그인을 설치 한다.

현재 설치된 remine은 1.4.5 이므로 해당되는 버전을 받아와 설치를 진행 한다.

# cd /var/lib/redmine/vendor/plugins
# git clone -n git://github.com/ivyl/redmine-gitolite.git redmine_gitolite
Cloning into 'redmine_gitolite'...
remote: Counting objects: 1109, done.
remote: Compressing objects: 100% (468/468), done.
remote: Total 1109 (delta 612), reused 1090 (delta 603)
Receiving objects: 100% (1109/1109), 122.46 KiB | 6 KiB/s, done.
Resolving deltas: 100% (612/612), done.

# cd redmine_gitolite
# git checkout -b redmine14 6491be010f7893b292468808a85b5fb190c767db
# echo "source 'http://rubygems.org'" >> Gemfile
# bundle install


플러그인이 설치 된 이후 환경설정 작업을 한번 더 실행한다.

# emerge --config "=www-apps/redmine-1.4.5"


redmine에서 gitolite를 사용 하기 위해 redmine계정의 쉘을 /sbin/nologin 에서 /bin/bash 로 변경한다. 그리고 redmine계정 홈 디렉토리의 소유자를 변경한다.

# sed -i 's/\/redmine\:\/sbin\/nologin$/\/redmine\:\/bin\/bash/g' /etc/passwd
# chown -Rf redmine:redmine /var/lib/redmine


이후 작업은 redmine 계정에서 계속 진행해야 함으로 계정을 변경 한다. 그리고 redmine계정에서 ssh 접속 키를 만든다. 몇 가지 질문을 물어 보지만 모두 엔터를 입력하여 기본값으로 설정한다.

# su - redmine
$ ssh-keygen -t rsa


gitolite에 redmine계정 연동 설정을 진행 한다

$ cp .ssh/id_rsa.pub .ssh/redmine.pub
$ git config --global user.name redmine
$ git config --global user.email redmine@localhost
$ gl-setup .ssh/redmine.pub

위의 마지막 명령을 실행하고 엔터로 진행하면 편집기가 열리면서 환경설정이 나타나는데 저장하지 말고 종료를 한다. (vi일때 esc키->:q!엔터)


다음은 ssh의 know_host를 저장 하기 위해 ssh접속을 시도 한다. 질문에 모두 yes로 답한다.

$ ssh redmine@localhost
$ ssh redmine@127.0.0.1
$ ssh redmine@<<SERVER_HOSTNAME>>


설정이 정상인지 확인 하기 위해 테스트용으로 daemon을 실행 한다.

$ ruby script/server thin -e production
=> Booting Thin
=> Rails 2.3.15 application starting on http://0.0.0.0:3000
………
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop


웹브라우저로 http://<<SERVER_HOSTNAME 또는 IP>>:3000 에 접속하였을 때 다음과 같은 화면이 보인다면 정상이다.

redmine을 설치한후의 초기화면

redmine과 gitolite연동 설정

http://<<SERVER_HOSTNAME 또는 IP>>:3000/settings/plugin/redmine_gitolite 로 접속한다.

로그인 계정을 물어 보는데 기본 값은 admin // admin 이다.(설정을 진행하며 반드시 바꾸기 바란다)

로그인을 하게 되면 아래와 같은 화면에 뜨는데 정해진 값으로 정보를 입력하고 적용(Apply)한다.

redmine에서 gitorite를 설정하는 화면
Gitolite URL : redmine@localhost:gitolite-admin.git
Base path : /var/lib/redmine/repositories/
Developer base URL : git@<<SERVER_HOSTNAME 또는 IP>>:%{name}.git
Read-Only base URL : git@<<SERVER_HOSTNAME 또는 IP>>:%{name}.git


설정이 완료되었으면 로그아웃(Sign out)을 하고 서버에서는 CTRL+C 로 테스트 daemon을 종료한 후 logout 명령어로 root 계정으로 돌아 간다.

^C>> Stopping ...
Exiting
$ logout

thin에 redmine구동 설정

thin을 daemon 형태로 구동 하기 위한 설정을 진행 한다.

먼저 /etc/thin/redmine.yml 파일을 만든다.

# vi /etc/thin/redmine.yml
---
chdir: /var/lib/redmine
log: /var/log/thin/redmine.log
pid: /var/run/thin/redmine.pid
socket: /var/run/thin/redmine.sock
environment: production
daemonize: true
user: redmine
group: redmine
servers: 4


다음은 /etc/init.d/thin 스크립트를 patch하는 파일을 만든다.

# vi /tmp/thin_patch
--- /etc/init.d/thin
+++ /etc/init.d/thin
@@ -40,8 +40,10 @@
         checkconfig || return 1

         if [ ${SERVER} = thin ]; then
+                mkdir -p /var/run/thin
+                chown redmine:redmine /var/run/thin
                 ebegin "$2 all thin servers in ${CONFIG}"
-                ${RUBY} /usr/bin/thin $1 $(buildargs) --all ${CONFIG}
+                sudo -i -u redmine ${RUBY} /usr/bin/thin $1 $(buildargs) --all ${CONFIG}
                 eend $?
         else
                 ebegin "$2 thin server ${SERVER}"


patch를 적용하고 thin이 사용할 log폴더를 만든다.

# patch -p0 < /tmp/thin_patch
patching file /etc/init.d/thin
# rm -f /tmp/thin_patch
# mkdir -p /var/log/thin
# chown -Rf redmine:redmine /var/log/thin


thin이 daemon 형태로 실행 되는지 확인 한다.

# /etc/init.d/thin start
 * Starting all thin servers in /etc/thin/ ...
[start] /etc/thin//redmine.yml ...
Starting server on /var/run/thin/redmine.0.sock ... 
Starting server on /var/run/thin/redmine.1.sock ... 
Starting server on /var/run/thin/redmine.2.sock ... 
Starting server on /var/run/thin/redmine.3.sock ...   [ ok ]

nginx에 thin구동 설정

nginx에서는 Ruby on Rails를 처리 하지 못하기 때문에 thin이 redmine을 서비스 하고 nginx는 그것을 중계 하도록 설정 해야 한다.


먼저 /etc/nginx/proxy.include 파일을 작성 한다.

# vi /etc/nginx/proxy.include
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;

    client_max_body_size       10m;
    client_body_buffer_size    128k;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;


다음은 /etc/nginx/nginx.conf 의 http section의 server section앞에 아래 항목을 추가 한다.

	upstream redmine_cluster {
	 server unix:/var/run/thin/redmine.0.sock;
        server unix:/var/run/thin/redmine.1.sock;
        server unix:/var/run/thin/redmine.2.sock;
        server unix:/var/run/thin/redmine.3.sock;
    }


마지막으로 /etc/nginx/nginx.conf 의 server section을 추가 한다. 예제에서는 3000번 port를 사용 하고 있으나 이것 외 다른 port를 설정해도 상관없다.

server {
	listen 3000;
	server_name redmine;

	root /var/lib/redmine/public;

	include /etc/nginx/proxy.include;
	proxy_redirect off;

	location / {
	try_files $uri/index.html $uri.html $uri @cluster;
	}

	location @cluster {
	proxy_pass http://redmine_cluster;
	}
}


nginx daemon을 시작 한다.

# /etc/init.d/nginx start
 * Checking nginx' configuration ...           [ ok ]
 * Starting nginx ...                                    [ ok ]


nginx.conf에 설정 하였던 port로 웹브라우저를 통하여 접속을 하였을 때 redmine의 정상적인 화면이 나타난다면 모두 완료이다.


참고사항

  1. redmine에서는 식별자를 소문자밖에 사용하지 못한다. 대문자를 사용하고 싶다면 DB를 직접 편집할것 :: Projects.identifier 필드 참고
  2. redmine의 식별자대로 디렉토리를 생성해버린다. 고로 redmine에서 프로젝트의 식별자를 잘 정하는것은 대단히 중요. 참고로 redmine의 식별자규칙덕에 생성되는 repository이름은 모두 소문자



관련문서


별첨

Notes