Category: Linux

Redmine 컴파일 설치

Redmine 컴파일 설치에 대해서 다룬다. 최신의 OS 를 가지고 하면 좋겠지만, CentOS 7 에서 설치를 진행 했다.

Mariadb 설치

MySQL 도 가능하지만, MariaDB 를 선택했다. 컴파일 설치가 가능하지만 패키지 설치로 설치한다.

각종 의존성이 함께 설치가 된다. CentOS 7 에서 MariaDB 버전은 5.5 이다. 현재 최선 버전은 10.4 이며 이것을 설치하고자 한다면 MariaDB 홈페이지에 공식 리파지토리를 설정하고 yum 명령어로 간단하게 설치할 수 있다.

my.cnf 파일을 다음과 같이 설정해 준다.

캐릭터 셋을(character-set) 설정하는 부분과 함께 mysql 콘솔에 대한 설정이 전부다. 이제 서버를 시작해주고 보안 설정을 해준다.

mysql_secure_installation 명령어를 이용하면 root 관리자 비밀번호와 간단한 보안설정도 함께 할 수 있다. 이제 redmine 을위한 데이터베이스를 생성하고 접속 계정을 만들어 준다.

로컬에서만 접속되도록 하였다. 이로서 redmine 설치를 위한 Mariadb 설치 설정은 모두 끝났다.

Ruby 2.7 컴파일 설치

Redmine 4.2 를 사용하기 위해서는 Ruby 2.7 이 필요로 한다. 컴파일 설치를 해야 하는데, 먼저 다음과 같이 컴파일 환경을 만들어 준다.

한가지, Ruby 는 jemalloc 를 사용하도록 할 것이다. CentOS 7 공식 패키지 저장소에는 이를 제공하지 않는다. EPEL 서드파티 레드햇 저장소를 활요하면 설치가 가능하다.

설치를 다하고나면 epel 저장소를 비활성화 해준다.

이제 Ruby 2.7 버전을 다운로드하고 다음과 같이 컴파일 설치 해준다.

Ruby 설치가 정상적으로 되었다면 이제 계정에서 Ruby 를 사용할 수 있도록 쉘 설정을 해준다.

이렇게 root 계정에서 ruby 가 인식이 된다.

Redmine 설치

Redmine 을 설치하기 위해서는 먼저 gem 을 설치해줘야 한다. gem 은 Ruby 에서 사용하는 플랫폼을 작성해주는 프로그램이다. 그런데, 여기서 또 생각해봐야 하는것이 이것을 이제 일반계정으로 만들것인지 아니면 전역적인 시스템에 설치할 것인지하는 것을 고려해야 한다.

나는 이것을 redmine 이라는 일반 계정을 생성해서 설치하기로 했다. ruby 는 전역적으로 설치했지만 redmine 은 계정을 생성해 시스템과 분리되도록 하였다.

gem 설치

이제 gem 을 설치해 준다. gem 은 Ruby 설치 디렉토리에 함께 설치 됨으로 root 계정으로 실행을 해준다.

gem 을 이용해서 다음과 같이 bundler, chef ruby-shadow 설치를 진행해 준다.

또, mysql2 확장을 설치해준다. 일종의 드라이버라고 보면 된다.

계정 생성

다음과 같이 redmine 계정을 생성해 준다.

redmine 계정도 ruby 를 인식 시켜준다.

redmine 설치

이제 redmine 계정에 redmine 4.2 를 다운로드하고 설치해 준다.

이제 구동에 필요한 패키지들을 설치해 준다.

쿠키 암호화를 위한 시크릿 토큰을 생성해 준다.

데이터베이스를 생성해 준다.

기본 언어를 한국어로 설정해 준다.

이제 모든게 완료 됐다. Redmine 을 다음과 같이 구동할 수 있다.

이제 브라우져에서 3000 포트로 접속을 시도해 본다. 만일 안된다면 CentOS 7 의 firewalld 서비스를 중지 시키고 다시해본다.

nginx 연동

redmine 의 자체 웹서버를 이용하는게 아니라 nginx 를 이용하는 방법이 있다. 이를 위해서 passenger 라는 프로그램이 필요한데, 이를 먼저 설치해 준다.

먼저 root 계정으로 gem 를 이용해서 passenger 를 설치해 준다.

이제 passenger 프로그램을 이용해서 passenger-nginx 모듈을 설치해주는데, 이게 passenger 가 알아서 nginx 를 다운로드 받아서 컴파일 설치까지 해준다.

명령어를 실행하면 이것저것 물어보는데, 설치 모듈에는 python 을 빼고 ruby 만 되도록 했고 설치는 커스텀이 아닌 그냥 1번으로 설치를 진행 했다. 디렉토리는 /opt/nginx 기본값을 사용했다.

컴파일이 모두 정상적으로 진행이 되면 위와같이 설정 안내가 간단하게 나온다.

nginx.conf 파일 설정

기본적인 설정만 되어 있어서 redmine 을 위한 설정을 다음과 같이 해준다.

systemd 등록

nginx 를 systemd 에 등록 해보자. 다음과 같이 파일을 작성 한다.

이제 systemd 유닛을 활성화 해주고 시작해준다.

Redmine 설치하기

Redmine 은 오픈소스 프로젝트 매니지먼트 프로그램이다. Ruby 로 제작되었기 때문에 설치 과정에서 Ruby 가 있어야 한다. 웹을 통해서 서비스를 하기 때문에 보통 웹서버와 연동을 하는 편이다.

환경

  • OS: CentOS 7
  • Arch: x86_64
  • Minimal Installation 상태

MariaDB 설치

MySQL 도 가능하지만, MariaDB 를 선택했다. 컴파일 설치가 가능하지만 패키지 설치로 설치한다.

각종 의존성이 함께 설치가 된다.

my.cnf 파일을 다음과 같이 설정해 준다.

다음과 같이 서버를 실행해 준다.

이제 기본적인 설정을 위해 mysql_secure_installation 을 실행해 준다.

root 패스워드를 설정하기 때문에 패스워드을 잃어서는 안된다.

이제 redmine 에서 사용할 계정을 생성해 준다.

이로서 redmine 설치를 위한 Mariadb 설치 설정은 모두 끝났다.

Redmine 설치

Redmine 4.2 버전을 설치하기 위해서는 다음과 같은 의존성이 필요하다.

  • Ruby – 4.2
  • Rails – 5.2

CentOS 7 에 Ruby 2.0 만을 패키지로 지원한다. 컴파일 설치를 해야한다.

컴파일을 위한 환경 구축

컴파일러와 라이브러리들을 함께 설치해 준다.

Passenger 와 Nginx 설치

Passenger 는 가벼운 웹 애플리케이션 서버로 Ruby 를 지원한다. 이것을 Nginx 와 통합시켜줄 것이다. 다음과 같이 epel 저장소를 활성화 해준다.

이제 Passenger 설치를 위한 저장소를 추가 준다.

redmine 시스템 계정 생성

다음과 같이 redmine 을 위한 시스템 계정을 생성해 준다.

RVM 을 이용한 Ruby 설치를 할 것이기 때문에 GPG 키를 먼저 임포트 해준다.

다음과 같이 RVM 을 설치 해준다.

마지막에 source 부분을 반드시 해준다. Ruby 2.7 을 설치해 준다.

mysql2 extension 을 다음과 같이 설치해 준다.

이제 Redmine 을 설치해 준다.

다음과 같이 데이베이스 접속 정보를 수정해 준다.

Redmine 의존성을 설치해 준다.

키를 생성하고 데이터베이스를 생성해 준다.

Nginx 설정

Yum 패키지 충돌 발생시 쓸 수 있는 명령어

최근에 CentOS 8 에서 Kubernetes 를 테스트하던 중에 패키지 업데이트가 되지 않는 일이 발생 했다. 아직 Kubernetes 는 CentOS 8 배포판을 정식으로 지원하지 않아 CentOS 7 배포판의 패키지를 사용해야 하는 상황이다.

그런데, yum 명령어로 업데이트를 할려고 보니 오류가 발생 했다. 이럴 경우에 다음과 같은 명령어를 사용해서 의존성을 체크해 볼 수 있다.

위와같은 명령어를 이용하면 패키지 의존성에 대한 내용을 풀어서 볼 수 있다.

참고: kubeadm and kubelet 1.15 fail to install on centos 7 after patches released today#92242

Generic WebHook Trigger 설정

Jenkins 에서 Github 나 GitLab 와 연동하기 위해서 Generic WebHook Trigger 플러그인을 많이 사용한다. 검색을 해보면 사용법이 아주 많이 나오는데, 특정 브랜치(Branch) 에만 작동되게 하기 위해서 Execute Shell 를 활용하는 사례를 볼 수 있다.

하지만 Generic WebHook Trigger 플러그인 설정에서 그냥 특정 브랜치만 반응하도록 할 수 있다.

Post content parameters in Generic WebHook Trigger
Post content parameters in Generic WebHook Trigger

제일 먼저 Post content parameters 에서 Variable 에 “ref”, Expression 에는 “$.ref” 를 적어주고 JSONPath 를 선택해 준다.

이것은 Github나 GitLab 가 jenkins 를 호출할때에 JSON 포맷으로 관련 데이터를 넘겨주게 된다. JSON 포맷이기 때문에 이 포맷에서 특정 값을 가지고 오기 위해 정규표현식을 사용할 수 있는데, “$.ref” 는 “refs/heads/master” 식의 값을 가지고 오게 된다. 그리고 이러한 값은 이 플러그인에서 $ref 라는 변수에 할당되게 된다.

대부분 이렇게 설정을 한 후에 Execute Shell 를 사용하는데, 그럴 필요가 없이 추가적인 설정을 다음과 같이 하면 된다.

Optional filter in Generic WebHook Trigger
Optional filter in Generic WebHook Trigger

Generic WebHook Trigger 플러그인 설정에서 좀 더 아래로 내려보면 “Optional filter” 이 있는데 여기에 Expression 에 브랜치를 “refs/heads/master” 라고 적어준다. 그리고 Text 에는 앞에서 설정한 변수명인 $ref 를 적어준다.

이렇게 하면 master 브랜치만을 체크해 이 플러그인이 작동되게 된다. 다른 브랜치에만 반응하도록 하기 위해서는 “refs/heads/[브랜치 이름]” 으로 적어 놓으면 된다.

굳이 Execute Shell 을 이용하지 않아도 된다.

letsencrypt 인증서 발급/갱신

letencrypt 는 무료로 발급 받을 수 있는 도메인 인증서이다. 도메인 인증서는 서버와 클라이언트간에 HTTP 통신을 암호화하는데 필요한 것이다. 원래는 돈을 주고 구매해야 하지만 letsencrypt 는 무료로 사용할 수 있게 해준다.

대부분의 발급 절차를 서버의 CLI 를 통해서 이루어진다. 따라서 서버가 있어야 하며 터미널 접속이 가능해야 한다. 또, Python 을 필요로 한다. 인증서를 발급 받기위해서 프로그램을 사용하는데 이것이 Python 을 필요로 한다.

certbot 설치

certbot 은 letsencrypt 인증서를 발급받기 위한 CLI 명령어 세트다. 다음과 같이 다운로드 할 수 있다.

복제된 디렉토리에는 letsencrypt 인증서를 위한 모든 내용이 포함되어 있다.

주도메인, 멀티도메인

발급 받기전에 한가지 생각해봐야 할게 있다. 인증서는 주도메인 인증서와 멀티도메인 인증서로 크게 나뉜다. 예를들면 다음과 같다.

  • systemv.pe.kr – 주도메인 인증서
  • *.systemv.pe.kr – 멀티도메인 인증서

많은 사람들이 실수하는 것이 멀티도메인 인증서를 발급받고 systemv.pe.kr 도메인으로 접속할려고 한다는 것이다. 멀티도메인 인증서의 *. 이것이 주도메인을 포함하지 않는다. 따라서 반드시 따로 도메인 인증서를 발급 받아야 한다.

수동 도메인 인증서 발급

도메인 인증서를 발급 받를때에 해줘야 하는 거이 Validation 이다. 이것이 실제로 인증서를 사용 가능한 발급요청인지를 체크한다. 이 체크를 위한 방법은 두가지가 있다.

  1. DNS TXT 레코드를 이용.
  2. HTTP 를 이용한 특정 디렉토리에 파일 접근.

멀티 도메인 인증서를 발급 받을때는 DNS TXT 레코드를 이용하는 방법이 좋다. 주도메인(단일도메인) 을 발급 받을때는 HTTP 를 이용한 파일 접근으로 유요한 요청인지를 인증하면 된다.

발급을 위해서 시스템의 슈퍼유저 계정으로 실행 한다.

위와같이 특정 디렉토리에 외부에서 접근 가능한 파일을 작성해 위에서 출력한 데이터를 작성하고 저장한다. 이렇게 한 후에 진행을 하면 Letsencrypt 에서 파일에 접근해 유요한 요청인지를 확인하고 인증서를 발급해 준다.

멀티도메인처럼 하나의 인증서로 여러 도메인을 인증하기 위해선 DNS TXT 레코드 인증을 이용하는 것이 편하다.

위와같이 하면 화면에 TXT 레코드를 입력하라는 메시지가 나온다. 그것을 다음과 같이 DNS 에 입력해 준다.

_acme-challenge.systemv.pe.kr 도메인으로 하는 TXT 를 입력해 주는 것이다. 그리고 반드시 DNS 서버를 재시작해 적용해 준다.

정상적으로 발급이 되었다면 /etc/letsencrypt/live 디렉토리에 도메인으로 디렉토리가 생성되고 인증서가 발급된다.

2022-02 내용추가

Lets Encrypt 관련해 내용이 변경되었다. 인증서를 적용하기 위한 절차는 다음과 같다.

letsencrypt 업데이트

git 로 소스를 복제했다면 시간이 지남에 따라 최신 소스가 달라진다. 다음과 같이 최신판으로 업데이트를 해준다.

한번에 멀티 도메인 인증서 발급

나는 DNS 서버를 별도로 운영하고 있다. 따라서 DNS TXT 필드를 이용해서 인증서 설정이 가능하다. 다음과 같이 하면 된다.

대상 도메인에 대해서, 위 경우에는 두개(systemv.pe.kr, *.systemv.pe.kr), DNS TXT 를 발급해 준다. 그러면 그것을 zone 파일에서 DNS TXT 에 적용해주고 DNS 서버를 재시작 해준다.

그리고 letsencrypt 의 Verify 를 해주면 적용 된다.

2023.01 변경사항

이제는 letencrypt-auto 스크립트도 더 이상 이용할 수 없다.

위와같이 메시지를 내면서 실행되지 않는다. 검색을 해보면 snapd 를 설치해서 실행하는 방법을 소개하고 있지만, snapd 를 설치한다고 하더라도 letencrypt-auto 스크립트를 사용하는 것은 아니다.

letencrypt-auto 대신에 certbot 명령어를 이용하면 된다. 이 명령어를 이용하기 위해서는 Python 을 이용해서 설치를 해줘야 하는데 letencrypt 를 git 클론하면 들어있다. 설치하고 실행을 하면 의존성 패키지가 없다는 메시지가 나오는데 함께 설치해주면 된다. 20.04 LTS, Python 3.8 에서 정상적으로 동작했다.

자동갱신 스크립트를 이용해서 3개월에 한번 자동으로 갱신되도록 할 수 있지만, 개인적으로 갱신 알람 메일이 오고 그것을 확인하고 수동으로 하는 방법을 선호하는데, 자동갱신을 하게 되면 이래저래 관련 명령어를 까먹게 되어서 자동갱신을 하진 않았다.

VIM, Yaml 문법 적용

이 문서는 VIM, Yaml 문법 적용에 관한 것이다.

YAML 은 각종 설정파일에서 자주 쓰인다. Kubernetes 에서는 manifest 파일로 쓰이고 있는데, VIM 을 이용해 Yaml 을 편집할때에 간단하게 사용할 수 있는 방법을 소개한다.

간단하게 .vimrc 파일에 다음과 같이 입력해주면 된다.

내용을 보면 금방 이해가 될 것이다.

GitLab 설치와 설정

GitLab 설치 하기. GitLab 은 무료로 사용가능한 git 저장소, ticket 시스템이다. github 의 오픈소스 버전으로 생각할 수 있지만 그것보다 많은 기능을 제공한다. 이 글에서는 gitlab 을 Ubuntu 20.04 LTS 에 설치와 설정에 대해서 알아보도록 하겠다.

준비

Gitlab 을 설치하기 전에 필요한 의존성 패키지들을 먼저 설치해 준다.

메일을 사용할 경우에는 메일 서버를 설치해줘야 하지만 여기서는 제외한다.

Gitlab 설치를 위한 저장소 추가

gitlab 홈페이지에서는 각 리눅스 배포판에 맞춰 스크립트를 제공한다. Ubuntu 20.04 를 위해 제공해주는 스크립트를 실행해 준다.

Gitlab 설치

접속을 위한 도메인을 결정해야 한다. 그리고 gitlab 은 SSL 접속을 권장하지만, 꼭 필요한 것은 아니다. 설치를 할 시점에서 도메인을 정할 수 있다.

별문제가 없다면 설치가 정상적으로 진행이 된다.

Gitlab 설정

Gitlab 설정은 ‘/etc/gitlab/gitlab.rb’ 파일을 이용 한다. 여기서 뭔가 변경을 하면 다음과 같이 재설정을 해야 한다.

접속 URL 바꾸기

접속 URL 은 설치시에 지정해 줬지만 나중에 바꿀 수 있다. gitlab.rb 파일을 열어 다음의 내용을 확인하고 바꾸면 된다.

Grafana 비활성화

Gitlab 서버를 모니터링을 하기 위해서 Grafana 를 내장하고 있다. 이것을 비활성화를 하고 싶다면 다음과 같이 비활성화를 해준다.

Prometheus 모니터링 비활성화

Prometheus 는 서비스에 대한 모니터링을 수집해주는 프로그램이며 Time Series 데이터베이스다. Grafana 는 이 데이터베이스를 읽어서 그래프를 그려주는 것이다.

Prometheus 뿐만 아니라 서비스의 각 메트릭을 수집해주는 Exporter 들이 있는데, Gitlab 에서는 prometheus_monitoring 을 비활성화하면 모든 Exporter 들도 비활성화가 된다.

이렇게 한 후에 gitlab 을 reconfigure, restart 를 한 후에 gitlab 상태를 보면 다음과 같다.

모니터링을 위한 export, prometheus 등의 프로세스가 없다.

업로드 용량 변경

Gitlab 은 nginx 를 웹서버로 사용한다. nginx 에서는 client_max_body_size 값으로 파일 업로드 용량을 결정하는데, 이것을 설정에서 바꾸면 된다.

데이터 저장 디렉토리 변경

만일 데이터 저장 디렉토리를 변경하고 싶다면 다음의 설정을 바꾸면 된다.

저장소를 “/opt/gitlab-data” 로 변경된다.

하지만, 만일 이미 저장소를 사용하고 있다면 다음과 같이 해줘야 한다.

자세한 것은 다음 링크를 참고한다.

virsh 를 통해 Ubuntu 20.04 에 console 로 접속하는 방법

KVM 가상화 시스템에서 virsh 를 통해 Ubuntu Guest OS에 Console 로 접속하는 방법은 다양한데 대부분 grub 부팅 옵션을 손보는 것이 였다. 하지만 Ubuntu 20.04 로 넘어오면서 이 방법이 훨씬 간단해 졌다.

먼저 Ubuntu 20.04 Guest 에 접속한 후에 다음과 같이 입력 하면 끝난다.

이렇게 한 후에 KVM 시스템에서 console 접속을 하면 접속이 잘된다.

이 방법은 18.04 에서도 가능하다.

VSCode 폰트 변경하기

VSCode 폰트(font) 변경하기에 대해서 알아본다. 환경도 윈도우즈가 아닌 리눅스(Linux) 에서 VSCode 폰트 변경이다. 리눅스 환경에서 폰트변경은 뭐든 쉬운 일이 아니다.

폰트(font) 알기 – fc-list

리눅스에서 폰트는 fc-list 명령어를 통해서 알 수 있다.

결과를 보면 다음과 같은 정보를 보여준다.

  1. 설치된 폰트 파일(전체 경로 포함)
  2. 폰트 이름.
  3. 스타일. 스타일은 Regular, Bold, Italic 등이다.

옵션없이 실행하자 설치된 모든 폰트들을 보여준다. 이 명령어에는 필터 기능을 제공한다.

‘:’ 를 기준으로 필터를 줄 수 있다. 필터는 ‘:’ 를 기준으로 연달아 적어주면 되는데 위의 예제는 언어가 ko 인 것만을 보여주도록 옵션을 줬다. 하지만 결과를 보면 중국어, 홍콩, 일본등도 함께 출련된다. 이것은 CJK 폰트의 특성이다. CJK 는 중국어,일본어,한국어만을 따로 모아 놓은 폰트를 말한다.

다음과 같은 필터를 사용할 수 있다.

  1. fc-list : family
  2. fc-list : lang=ko family
  3. fc-list : family style
  4. fc-list –format=”%{family[0]}\n” | sort | uniq

위 보기에서 2번째 명령어를 통해서 한글을 지원하는 폰트를 알아낸다. 나는 “Noto Sans Mono CJK KR” 를 선택했다.

VSCode 폰트 변경

리눅스용 VSCode 는 설정을 열기위한 단축키를 제공하는데, Shift + Ctl + P 를 누르면 된다. 여기서 ‘설정열기(JSON)’ 선택해 자신만의 설정을 커스터마이징 할 수 있다. 폰트 변경은 다음과 같이 했다.

폰트 이름에 공백(Space) 가 들어간 경우에 홑따옴표(‘) 로 감싸준다. 새로운 폰트 이름을 적자마자 바로 적용된다.

Oracle Linux 8 UEK 커널 설치

Oracle Linux 는 UEK(Unbreakable Enterprise Kernel) 라고 해서 커널을 제공 한다. Oracle 은 이를통해 최신의 커널을 제공하고 자신들만의 퍼포먼스 패치를 더해서 고성능을 낼수 있도록 했다. Oracle Linux 8 에서 UEK 커널을 설치해 보자.

Yum Repository 확인

Oracle Linux 8 에는 uek 를 위한 yum repository 가 추가되어 있다. 다음과 같이 확인이 가능하다.

‘ol8_UEKR6’ 가 uek 를 위한 저장소(repository) 이다. 이제 다음과 같이 어떤 버전의 uek 커널이 있는지 다음과 같이 체크해보자.

현재 시점에서 5.4 버전의 uek 커널이 있음을 알 수 있다.

시스템 커널 유지 개수

yum 은 자동으로 패키지를 설치해주고 더 이상 필요없는 패키지는 삭제해주며, 의존성도 함께 해결해준다. 커널의 경우에는 버전마다 설치가 되는데 이렇게 되면 아주 많은 커널이 설치가되어서 부팅시 많은 커널들이 보이게 된다.

이런문제를 해소하기 위해서 yum 은 같은 패키지의 경우에 다양한 버전에 한해서 몇개까지 유지할지 개수를 제한하는데 이것이 ‘installonly_limit’ 이다. 이는 다음과 같이 /etc/yum.conf 파일에 저장된다.

초기값은 3 인데, uek 를 설치하게되면 기본 커널도 삭제될 가능성도 있기 때문에 이것을 5로 교체해준다.

설치

설치는 yum 명령어를 이용해 간단히 다음과 같이 설치 할 수 있다.

자동으로 uek 의 최신 버전을 다운로드 받아 설치해 준다. 재부팅을하면 uek 커널로 올라올 것이다.