<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jira | bitneer.dev</title>
	<atom:link href="https://www.bitneer.dev/blog/tag/jira/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bitneer.dev</link>
	<description>AI 시대에 취미로 하는 코딩</description>
	<lastBuildDate>Sun, 28 Dec 2025 16:20:32 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://www.bitneer.dev/wp/wp-content/uploads/2023/11/cropped-bitneer_Logo_for_Google_200-32x32.png</url>
	<title>jira | bitneer.dev</title>
	<link>https://www.bitneer.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Jira 서버의 MySQL을 PostgreSQL로 마이그레이션 하기</title>
		<link>https://www.bitneer.dev/blog/jira-%ec%84%9c%eb%b2%84%ec%9d%98-mysql%ec%9d%84-postgresql%eb%a1%9c-%eb%a7%88%ec%9d%b4%ea%b7%b8%eb%a0%88%ec%9d%b4%ec%85%98-%ed%95%98%ea%b8%b0/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Fri, 29 May 2020 17:07:14 +0000</pubDate>
				<category><![CDATA[데이터베이스 시스템]]></category>
		<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[postgresql]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=570</guid>

					<description><![CDATA[<div data-nosnippet>Jira 서버의 MySQL을 PostgreSQL로 마이그레이션 한 작업 과정을 정리해 본다. 내가 사용하는 데비안 9(stretch)의 PostgreSQL 버전은 9.6이다. Jira 서버는 버전 7.13.0을 설치하고 있다. 먼저 이 버전의 Jira에서 지원하는 데이터베이스를 봐야 한다. Supported platforms &#8211; Jira Server 7.13을 보면 PostgreSQL 9.4, 9.5, 9.6을 지원하므로 마이그레이션을 진행할 수 있다. 아래에서 내가 사용하는 Jira 홈 디렉토리인 /var/local/lib/jira로 예를 들 것이다. 단계 1. XML ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/jira-%ec%84%9c%eb%b2%84%ec%9d%98-mysql%ec%9d%84-postgresql%eb%a1%9c-%eb%a7%88%ec%9d%b4%ea%b7%b8%eb%a0%88%ec%9d%b4%ec%85%98-%ed%95%98%ea%b8%b0/">Jira 서버의 MySQL을 PostgreSQL로 마이그레이션 하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  Jira 서버의 MySQL을 PostgreSQL로 마이그레이션 한 작업 과정을 정리해 본다. 내가
  사용하는 데비안 9(stretch)의 PostgreSQL 버전은 9.6이다. Jira 서버는 버전
  7.13.0을 설치하고 있다. 먼저 이 버전의 Jira에서 지원하는 데이터베이스를 봐야
  한다.
  <a href="https://confluence.atlassian.com/adminjiraserver0713/supported-platforms-964983071.html" target="_blank" rel="noopener noreferrer">Supported platforms &#8211; Jira Server 7.13</a
  >을 보면 PostgreSQL 9.4, 9.5, 9.6을 지원하므로 마이그레이션을 진행할 수 있다.
  아래에서 내가 사용하는 Jira 홈 디렉토리인 <kbd>/var/local/lib/jira</kbd>로
  예를 들 것이다.
</p>
<h5>단계 1. XML 포맷으로 Data를 백업하기</h5>
<p>
  Jira 서버에서 제공하는 백업 도구를 사용하여 XML 포맷의 파일로 Data를 백업한다.
  백업한 파일은 단계 4에서 PostgreSQL로 마이그레이션 하기 위해 사용할 것이다.
</p>
<ol>
  <li>Jira의 환경 설정인 <strong>System</strong>으로 들어한다.</li>
  <li>
    <strong>IMPORT AND EXPORT</strong>의 <strong>Backup System</strong>을
    클릭한다.
  </li>
  <li>
    <strong>Backup Jira data</strong> 화면에 &#8216;데이터베이스의 내용을 XML 포맷으로
    백업할 것이고 Jira 홈 디렉토리 안의 export 디렉토리에 저장할 것&#8217;이라고
    나온다. <strong>File name</strong>에 백업할 파일의 이름을 입력하고
    <strong>Backup</strong> 버튼을 클릭한다. 나는 <kbd>jira_backup</kbd>으로
    입력하였다.
  </li>
  <li>
    실행을 완료하면 자신이 입력한 파일명에 .zip 확장자를 붙여 내보냈음을
    알려준다. 나의 경우
    <kbd>/var/local/lib/jira/export/jira_backup.zip</kbd> 파일로 저장되었다.
  </li>
</ol>
<h5>단계 2. PostgreSQL의 데이터베이스 만들기</h5>
<p>
  Jira 서버에서 사용할 PostgreSQL 데이터베이스를 만든다. 다음은 psql
  클라이언트를 사용한 진행 과정이다.
</p>
<pre class="language-none" data-line="6,8,10,14">
<code># psql -h localhost -U postgres -d postgres
psql (9.6.17)
SSL 연결정보 (프로토콜: TLSv1.2, 암호화기법: ECDHE-RSA-AES256-GCM-SHA384, 비트: 256, 압축: off)
도움말을 보려면 &quot;help&quot;를 입력하십시오.

postgres=# CREATE ROLE jira WITH LOGIN PASSWORD &#039;암호 입력&#039;;
CREATE ROLE
postgres=# CREATE DATABASE jira WITH OWNER=jira ENCODING &#039;UTF8&#039; LC_COLLATE &#039;C&#039; LC_CTYPE &#039;C&#039; TEMPLATE template0;
CREATE DATABASE
postgres=# \l
                                 데이터베이스 목록
   이름    |  소유주  | 인코딩 |   Collate   |    Ctype    |      액세스 권한
-----------+----------+--------+-------------+-------------+-----------------------
 jira      | jira     | UTF8   | C           | C           |
 postgres  | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |        |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |        |             |             | postgres=CTc/postgres
(4개 행)</code>
</pre>
<p>
  라인 6에서 <strong>CREATE ROLE</strong>로 <kbd>jira</kbd> 사용자를 생성했다.
  라인 8에서 <strong>CREATE DATABASE</strong>로 <kbd>jira</kbd> 데이터베이스를
  만들었다. 주의해야 할 것은 Jira 서버는 LC_COLLATE와 LC_CTYPE을
  <strong>&#8216;C&#8217;</strong>로 설정해야 한다. 새 로케일로 데이터베이스를 만들려면
  <strong>template0</strong>을 사용해야 한다. 라인 10에서
  <strong>\l</strong> 명령어로 새로 만든 jira 데이터베이스를 확인한다.
  PostgreSQL의 기본적인 사용은
  <a href="https://www.bitneer.dev/wp/postgresql%ec%9d%98-%eb%8d%b0%ec%9d%b4%ed%84%b0%eb%b2%a0%ec%9d%b4%ec%8a%a4%ec%99%80-%ec%82%ac%ec%9a%a9%ec%9e%90-%ec%83%9d%ec%84%b1-%eb%b0%b1%ec%97%85-%eb%b0%8f-%eb%b3%b5%ea%b5%ac/" target="_blank" rel="noopener noreferrer">PostgreSQL의 데이터베이스와 사용자 생성, 백업 및 복구</a
  >를 참고할 수 있다.
</p>
<h5>단계 3. JIRA setup을 실행하기 위한 준비</h5>
<p>Jira 서버의 설치 화면(JIRA setup)으로 진입하기 위한 작업을 한다.</p>
<ol>
  <li>Jira 서버를 종료한다.</li>
  <li>
    서버 종료 뒤가 백업의 적기이다. 현재 사용하고 있는 MySQL의 Jira
    데이터베이스와 Jira 홈 디렉토리를 백업해 둔다.
  </li>
  <li>
    Jira 홈 디렉토리(/var/local/lib/jira) 안의
    <strong>dbconfig.xml</strong> 파일을 삭제한다. 이 파일의 삭제로 JIRA
    setup으로 진입하는 것이다.
  </li>
</ol>
<h5>단계 4. JIRA setup을 사용하여 PostgreSQL로 마이그레이션 하기</h5>
<p>
  Jira 서버를 다시 시작하고 웹 브라우저로 접속하면 JIRA setup 화면이 나올
  것이다. PostgreSQL로 마이그레이션 하기 위해 다음과 같이 작업한다.
</p>
<ol>
  <li>
    Jira 설치 화면이 나오면 &#8216;<strong>직접 설정하겠습니다.</strong>&#8216;를 선택하고
    <strong>다음</strong> 버튼을 클릭한다.
  </li>
  <li>
    <strong>데이터베이스 설정</strong> 화면이 나오면
    <strong>내 데이터베이스(운영 환경에 권장)</strong>을 선택하고 다음의 내용을
    입력한다.
    <ul>
      <li>데이터베이스 유형: PostgreSQL</li>
      <li>
        호스트 이름: PostgreSQL을 설치한 시스템의 로컬 IP 주소를 입력한다. (예:
        192.168.1.20)
      </li>
      <li>포트: 디폴트 값인 5432를 그대로 둔다.</li>
      <li>
        데이터베이스: 위에서 생성한 데이터베이스의 이름인 <kbd>jira</kbd>를
        입력한다.
      </li>
      <li>
        사용자 아이디: 위에서 생성한 데이터베이스의 사용자 이름인
        <kbd>jira</kbd>를 입력한다.
      </li>
      <li>비밀번호: 위에서 생성한 데이터베이스의 &#8216;암호&#8217;를 입력한다.</li>
      <li>스키마: 디폴트 값인 public을 그대로 둔다.</li>
    </ul>
  </li>
  <li><strong>다음</strong> 버튼을 클릭한다.</li>
  <li>
    <strong>응용프로그램 속성을 설정하십시오.</strong> 화면에서 &#8216;<strong
      >&#8230; 데이터를 가져올 수 있습니다.</strong
    >&#8216;를 클릭한다.
  </li>
  <li>
    <strong>기존 데이터 가져오기</strong> 화면의 <strong>파일 이름</strong>에
    단계 1에서 생성한 <kbd>/var/local/lib/jira/export/jira_backup.zip</kbd>을
    입력하고 <strong>가져오기</strong> 버튼을 클릭한다.
  </li>
</ol>
<p>가져오기 작업이 끝나면 Jira의 Dashboards 화면이 나온다.</p>
<h5>데이터베이스의 마이그레이션 확인하기</h5>
<p>
  Jira 홈 디렉토리 안에 dbconfig.xml 파일이 새로 생성되고, PostgreSQL의 JDBC
  설정을 볼 수 있다.
</p>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://confluence.atlassian.com/adminjiraserver0713/administering-jira-server-7-13-applications-964983042.html" target="_blank" rel="noopener noreferrer">Administering Jira Server 7.13 applications</a
    >
    <ul>
      <li>
        <a href="https://confluence.atlassian.com/adminjiraserver0713/supported-platforms-964983071.html" target="_blank" rel="noopener noreferrer">Supported platforms &#8211; Jira Server 7.13</a
        >
      </li>
      <li>
        <a href="https://confluence.atlassian.com/adminjiraserver0713/switching-databases-964983111.html" target="_blank" rel="noopener noreferrer">Switching databases</a
        >
      </li>
      <li>
        <a href="https://confluence.atlassian.com/adminjiraserver0713/backing-up-data-964983964.html" target="_blank" rel="noopener noreferrer">Backing up data</a
        >
      </li>
      <li>
        <a href="https://confluence.atlassian.com/adminjiraserver0713/connecting-jira-applications-to-postgresql-964983092.html" target="_blank" rel="noopener noreferrer">Connecting Jira applications to PostgreSQL</a
        >
      </li>
    </ul>
  </li>
  <li>
    <a href="https://postgresql.kr/docs/9.6/manage-ag-templatedbs.html" target="_blank" rel="noopener noreferrer">템플릿 데이터베이스 &#8211; PostgreSQL 9.6.2 문서 22장 데이터베이스 관리</a
    >
  </li>
</ul><p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/jira-%ec%84%9c%eb%b2%84%ec%9d%98-mysql%ec%9d%84-postgresql%eb%a1%9c-%eb%a7%88%ec%9d%b4%ea%b7%b8%eb%a0%88%ec%9d%b4%ec%85%98-%ed%95%98%ea%b8%b0/">Jira 서버의 MySQL을 PostgreSQL로 마이그레이션 하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Confluence, Jira, Bitbucket의 systemd unit 설정</title>
		<link>https://www.bitneer.dev/blog/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Wed, 27 May 2020 20:20:22 +0000</pubDate>
				<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[bitbucket]]></category>
		<category><![CDATA[confluence]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[systemd]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=532</guid>

					<description><![CDATA[<div data-nosnippet>2012년 즈음에 Confluence, Jira, Stash(Bitbucket의 이전 이름)를 데비안 시스템에 TAR.GZ Archive 파일을 사용하여 처음 설치하였다. 시작 스크립트는 공식적인 지원 대상이 아니고 그에 대한 문서의 내용도 부실해서 직접 만들어야 했다. Confluence, Jira, Stash가 Tomcat을 사용했기 때문에 데비안 6.0(Squeeze)의 Tomcat 6을 참고하여 init.d 스크립트를 작성했었다. Tomcat과 같이실제 제작자(upstream)의 소프트웨어는 데비안 개발자가 데비안의 정책에 맞게 패키지를 만든다. init.d 스크립트를 작성할 때 그것에 맞게 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/">Confluence, Jira, Bitbucket의 systemd unit 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  2012년 즈음에 Confluence, Jira, Stash(Bitbucket의 이전 이름)를 데비안 시스템에
  TAR.GZ Archive 파일을 사용하여 처음 설치하였다. 시작 스크립트는 공식적인 지원
  대상이 아니고 그에 대한 문서의 내용도 부실해서 직접 만들어야 했다. Confluence,
  Jira, Stash가 Tomcat을 사용했기 때문에 데비안 6.0(Squeeze)의 Tomcat 6을
  참고하여 init.d 스크립트를 작성했었다. Tomcat과 같이<em
    >실제 제작자(upstream)</em
  >의 소프트웨어는 데비안 개발자가 데비안의 정책에 맞게 패키지를 만든다. init.d
  스크립트를 작성할 때 그것에 맞게 하려고 했고 아래에 나올 내용인 사용자와 그룹
  생성, 설치 디렉토리와 홈 디렉토리가 그를 반영한 것이다.
</p>
<p>
  데비안 8(Jessie)에서 systemd가 디폴트 시작 시스템으로 완전히 들어왔다. 한동안
  데비안 7(Wheezy)에서 업그레이드를 해야 할지 주저했던 기억이 난다. 그러나
  systemd는 SysV 스크립트 파일을 분석하고 변환하는 방식으로 하위 호환성을
  제공하였다. 내가 작성한 구식의 스크립트는 살아남을 수 있었다.
</p>
<p>
  최근에 MySQL에서 PostgreSQL로 옮기는 작업을 진행하면서 init.d 스크립트도
  버리기로 하였다. 관리의 측면에서 Confluence, Jira, Bitbucket의 서비스 설정은
  init.d 스크립트보다는 systemd unit 설정 파일이 더 낫다. 업그레이드되면서 환경
  변수 등이 변한다면 init.d 스크립트도 이를 반영해야 할 경우가 생기기 때문이다.
</p>
<h5>사용자와 그룹 생성</h5>
<p>
  보안상의 이유로 데몬(서비스)은 root 관리자 계정으로 실행하지 말아야 한다. 보안
  취약점을 이용하여 악의적인 사용자가 root 권한이 있는 데몬을 사용한다면
  시스템에 재앙을 가져온다. 따라서 서비스는 일반 사용자로 실행하여야 한다.
</p>
<p>
  Confluence 서비스에서 사용할 confluence 그룹과 confluence 사용자를 생성하기
  위해 다음과 같이 한다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># groupadd confluence
# useradd confluence -M -g confluence -d /opt/share/confluence -s /bin/false</code>
</pre>
<p>
  위의 useradd 명령어에서 <strong>-d</strong> 옵션으로 홈 디렉토리는 지정하지만
  <strong>-M</strong> 옵션으로 홈 디렉토리를 생성하지 않는다. confluence
  사용자는 서비스 실행만을 위해 존재하기 때문에 홈 디렉토리를 생성할 필요는
  없다. 마찬가지로 로그인 시 사용할 쉘을 지정하는 <strong>-s</strong> 옵션에서
  <kbd>/bin/false</kbd>로 하여 로그인을 허용하지 않는다. jira와 bitbucket도 위의
  confluence가 나온 부분을 대체하여 사용자와 그룹을 만들어 줄 수 있다.
</p>
<p>데비안의 tomcat6 패키지와 비교해 보자.</p>
<pre class="language-none line-numbers" data-line="2,4">
<code># cat /etc/passwd | grep tomcat6
tomcat6:x:109:115::/usr/share/tomcat6:/bin/false
# cat /etc/passwd | grep confluence
confluence:x:1002:1002::/opt/share/confluence:/bin/false</code>
</pre>
<p>
  사용자와 그룹을 한꺼번에 삭제하고 싶다면 &#8216;deluser&#8217; 명령어를 사용한다. 다음의
  명령어는 stash 사용자와 그룹을 한 번에 제거한다.
</p>
<pre class="language-none">
<code># deluser stash</code>
</pre>

<h5>설치 디렉토리와 홈 디렉토리</h5>
<p>
  Confluence, Jira, Bitbucket을 어느 디렉토리에 설치하는 것이 좋을까? 데비안
  개발자가 패키지를 만들면서 신경 쓰지 않는 /opt, /srv, /usr/local, /home
  디렉토리가 적당해 보인다. 나는 위의 사용자 생성에서 보듯이 /opt/share 디렉토리
  안에 confluence, jira, bitbucket으로 선택했다. 데비안에서 운영체제에
  종속적이지 않은 Tomcat 같은 패키지는 /usr/share 디렉토리에 들어간다. 그래서
  /opt/share로 하였다. 이것은 취향의 문제로 여러분은 다른 곳에 설치할 수 있다.
</p>
<p>
  보안 측면을 짚어 보기 위해 좀 더 살펴본다.
  <a href="https://www.atlassian.com/software/confluence/download" target="_blank" rel="noopener noreferrer">Download Confluence Server</a
  >,
  <a href="https://www.atlassian.com/software/jira/download" target="_blank" rel="noopener noreferrer">Download Jira Software Server</a
  >,
  <a href="https://www.atlassian.com/software/bitbucket/download" target="_blank" rel="noopener noreferrer">Download Bitbucket Server</a
  >에서 TAR.GZ Archive 파일을 다운로드 할 수 있다. 다운로드한 파일을
  /opt/share로 복사한 후 다음의 작업을 한다. 여기서는 Confluence만 예제로
  보인다. Jira와 Bitbucket도 confluence가 나온 부분을 jira와 bitbucket으로
  변경하여 같은 작업을 할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="4-7">
<code># cd /opt/share
# tar zxvf atlassian-confluence-&lt;version&gt;.tar.gz
# mv atlassian-confluence-&lt;version&gt; confluence
# chown -R root:root confluence
# chown -R confluence:confluence confluence/logs
# chown -R confluence:confluence confluence/temp
# chown -R confluence:confluence confluence/work</code>
</pre>
<p>
  보안을 강화하기 위해 라인 4에서 7까지 파일의 소유자와 그룹을 설정하였다.
  confluence 사용자로 실행하는 Confluence 데몬은 logs, temp, work 디렉토리에만
  쓰기 권한을 가진다. 다른 곳은 사용자와 그룹을 root 소유로 설정하였기 때문에
  confluence 사용자로 실행하는 서비스는 파일을 저장할 수 없다.
</p>
<p>
  데비안의 Tomcat 패키지 방식으로 하려면 몇 가지 작업을 더 해야 한다. logs, work
  디렉토리는 /var/lib/confluence 안에 들어가야 하고 temp 디렉토리는 /tmp 안에
  위치해야 한다. 그러나 이 디렉토리들은 중요도가 떨어지고 업그레이드할 때마다
  해주기 번거롭기 때문에 그렇게까지는 하지 않았다.
</p>
<p>
  Confluence, Jira, Bitbucket은 데이터를 사용자가 설정하는 홈 디렉토리에
  저장한다. 어디로 설정하는 것이 좋을까? /var 디렉토리는 변하는 데이터를
  저장하는 곳이기에 적당하다. 데비안의 패키지는 /var/lib 디렉토리를 사용한다.
  나는 /var/local/lib 디렉토리 안의 confluence, jira, bitbucket으로 설정했다.
  /var/local은 데비안 개발자가 관심을 두지 않는 곳이기 때문에 선택했다. 이 역시
  취향 문제다.
</p>
<p>
  Confluence의 홈 디렉토리를 생성하기 위해 다음과 같이 한다. Jira와 Bitbucket도
  confluence가 나온 부분을 변경하여 같은 작업을 할 수 있다.
</p>
<pre class="language-none line-numbers" data-line="4">
<code># mkdir -p /var/local/lib/confluence
# cd /var/local/lib
# chown confluence:confluence confluence
# chmod g-s confluence</code>
</pre>
<p>
  mkdir 명령어의 <strong>-p</strong> 옵션은 상위 디렉토리인 lib가 존재하지 않을
  때 생성하라는 의미이다. 라인 3에서 confluence 사용자로 실행하는 Confluence
  데몬이 쓸 수 있도록 사용자와 그룹의 소유주를 confluence로 설정한다. 라인 4는
  /var/local/lib/confluence 디렉토리의 스티키 비트(sticky bit)를 사용하지
  않으므로 제거한 것이다. 데비안에서 /var/local 디렉토리는 그룹에 스티키 비트가
  설정되어 있어서 디렉토리나 파일을 생성하면 스티키 비트가 붙는다.
</p>
<p>
  추가로 데이터베이스를 만들고 홈 디렉토리 설정 등을 한다면 Confluence, Jira,
  Bitbucket을 설치할 준비를 마친 것이다. 이제 이 글의 주제인 systemd unit
  설정으로 넘어가자.
</p>
<h5>systemd unit 설정</h5>
<p>
  시스템의 전원을 켜면 복잡한 여러 부트 단계를 거쳐 PID=1을 가지는 init
  프로그램이 실행된다. init 프로그램은 모든 프로세스의 최상위 조상이고 시작 시
  필요한 프로그램을 실행한다. 데비안 jessie 이후로 init 프로그램인 /sbin/init은
  /lib/systemd/systemd에 대한 심볼릭 링크이다. systemd init 프로세스는 다음의
  디렉토리에서 unit 설정 파일을 읽어 들여 <em>병렬적(parallel)</em>으로
  프로세스들을 생산한다. 병렬적이기 때문에 기존의 <em>순차적</em>인 SysV
  init보다 빠르다.
</p>
<ul>
  <li>/lib/systemd/system : 운영체제의 디폴트 설정 파일</li>
  <li>/etc/systemd/system : 시스템 관리자의 설정 파일</li>
  <li>/run/systemd/system : 실행 시간에 만들어지는 설정 파일</li>
</ul>
<p>
  unit 설정 파일의 접미사에 따라 서비스(.service), 장치(.device),
  마운트(.mount), unit 설정 파일의 그룹(.target) 등 다양한 타입이 있다.
  Confluence, Jira, Bitbucket의 서비스를 위해 /etc/systemd/system 디렉토리 안에
  .service로 끝나는 unit 설정 파일을 만들 것이다.
</p>
<p>
  Confluence의 unit 설정 파일인 /etc/systemd/system/confluence.service의 내용은
  다음과 같다.
</p>
<pre
  class="language-none line-numbers"
  data-line="7-10"
  data-label="/etc/systemd/system/confluence.service"
>
<code>[Unit]
Description=Atlassian Confluence
After=network.target

[Service]
Type=forking
User=confluence
PIDFile=/opt/share/confluence/work/catalina.pid
ExecStart=/opt/share/confluence/bin/start-confluence.sh
ExecStop=/opt/share/confluence/bin/stop-confluence.sh

[Install]
WantedBy=multi-user.target</code>
</pre>
<p>
  프로그램의 흐름을 따라가는 <em>절차적</em>인 SysV init 스크립트와 비교하면
  unit 설정 파일은 <em>선언적</em>으로 이해하기 쉽다. unit 설정 파일은 윈도우
  운영체제의 .ini 확장자를 지닌 설정 파일에서 사용하는 문법을 사용한다. 대괄호의
  절(section)로 시작하여 한 줄마다 &#8216;변수=값&#8217;으로 이루어진다. 변수는
  지시자(directive)라 부른다. unit 설정 파일은 [Unit], [Install] 절을 기본적으로
  가져야 한다. 서비스 unit 설정 파일은 추가로 [Service] 절을 반드시 포함해야
  한다.
</p>
<p>
  [Unit] 절은 unit의 일반적인 정보를 지닌다. 라인 2의 Description 지시자에는
  unit의 원하는 이름을 넣어준다. 종속성 지시자인 After는 먼저 실행돼야 하는
  unit을 지정한다. Confluence는 웹 서버이므로 시스템의 네트워크 설정이 먼저
  이루어지는 것이 필요하다. 따라서 라인 3에서 네트워크 관련 unit들은 모아 놓은
  network.target을 설정한다.
</p>
<p>
  [Install] 절은 unit을 설치하기 위한 정보로 systemd가 사용하지 않는다. 아래에서
  볼 systemctl의 enable과 disable에서 이 절을 사용하여 심볼릭 링크를 만들거나
  삭제한다. SysV의 런레벨과 비슷한 것으로 multi-user.target은 런레벨 2에서 4에
  해당한다. &#8216;<kbd>ls -al /lib/systemd/system/runlevel*</kbd>&#8216; 명령어로 확인해 볼
  수 있다.
</p>
<p>
  [Service] 절은 서비스 unit을 위한 것이다. 라인 6의 Type=forking은 라인 9의
  ExecStart에서 설정한 start-confluence.sh가 fork()를 호출할 것임을 의미한다.
  전통적인 UNIX 서비스가 행동하는 방식으로 Tomcat도 이처럼 한다. Type을
  forking으로 한다면 PIDFile의 설정을 권고하고 있다. 라인 8에서 Confluence가
  사용하는 Tomcat의 PID 파일의 위치를 설정한다. 라인 10의 ExecStop에서 서비스
  종료에 사용할 파일을 지정한다. 라인 7에서 서비스를 실행할 사용자로
  confluence를 설정한다.
</p>
<p>Jira의 unit 설정 파일은 다음과 같다.</p>
<pre
  class="language-none line-numbers"
  data-line="7-10"
  data-label="/etc/systemd/system/jira.service"
>
<code>[Unit]
Description=Atlassian Jira
After=network.target

[Service]
Type=forking
User=jira
PIDFile=/opt/share/jira/work/catalina.pid
ExecStart=/opt/share/jira/bin/start-jira.sh
ExecStop=/opt/share/jira/bin/stop-jira.sh

[Install]
WantedBy=multi-user.target</code>
</pre>
<p>Bitbucket의 unit 설정 파일은 다음과 같다.</p>
<pre
  class="language-none line-numbers"
  data-line="7-10"
  data-label="/etc/systemd/system/bitbucket.service"
>
<code>[Unit]
Description=Atlassian Bitbucket
After=network.target

[Service]
Type=forking
User=bitbucket
PIDFile=/opt/share/bitbucket/work/catalina.pid
ExecStart=/opt/share/bitbucket/bin/start-bitbucket.sh
ExecStop=/opt/share/bitbucket/bin/stop-bitbucket.sh

[Install]
WantedBy=multi-user.target</code>
</pre>

<h5>systemctl 사용한 unit 설정의 활성화, 시작, 종료 등</h5>
<p>
  다음에서 Confluence에 대한 명령문의 실행 예만 든다. Jira와 Bitbucket도
  confluence가 나온 부분을 jira와 bitbucket으로 변경하여 실행할 수 있다. 명령문
  실행에서 서비스를 나타내는 .service 접미사는 생략할 수 있다. 예를 들면
  confluence.service 대신 confluence를 사용하여 타이핑을 줄일 수 있다. bash에서
  &lt;TAB&gt; 키로 자동 완성 기능을 사용한다면 큰 의미는 없다.
</p>
<p>
  unit 설정 파일을 새로 만들었거나 변경했다면 systemd가 그것을 알 수 있게 다음의
  명령어를 실행한다.
</p>
<pre class="language-none">
<code># systemctl daemon-reload</code>
</pre>
<p>
  시스템 부팅 시에 서비스를 실행하려면 다음의 명령어를 실행한다. [Install] 절의
  WantedBy 지시자 값으로 설정한 multi-user.target의 디렉토리에서 심볼릭 링크로
  연결된다.
</p>
<pre class="language-none line-numbers" data-line="2">
<code># systemctl enable confluence.service
Created symlink /etc/systemd/system/multi-user.target.wants/confluence.service → /etc/systemd/system/confluence.service.</code>
</pre>
<p>
  다음의 명령어로 서비스를 시작(start), 종료(stop)하고 서비스의 상태(status)를
  본다.
</p>
<pre class="language-none">
<code># systemctl start confluence.service
# systemctl stop confluence.service
# systemctl status confluence.service</code>
</pre>
<p>
  서비스에 문제가 발생하면 다음의 명령어를 실행하여 무엇이 문제인지 확인해 본다.
</p>
<pre class="language-none">
<code># journalctl -xe</code>
</pre>

<h5>관련 소스 코드</h5>
Confluence, Jira, Bitbucket의 init.d 스크립트
<ul>
  <li>
    <a href="https://github.com/bitneer/bitneer.dev/blob/master/scripts/confluence" target="_blank" rel="noopener noreferrer">https://github.com/bitneer/bitneer.dev/blob/master/scripts/confluence</a
    >
  </li>
  <li>
    <a href="https://github.com/bitneer/bitneer.dev/blob/master/scripts/jira" target="_blank" rel="noopener noreferrer">https://github.com/bitneer/bitneer.dev/blob/master/scripts/jira</a
    >
  </li>
  <li>
    <a href="https://github.com/bitneer/bitneer.dev/blob/master/scripts/bitbucket" target="_blank" rel="noopener noreferrer">https://github.com/bitneer/bitneer.dev/blob/master/scripts/bitbucket</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://confluence.atlassian.com/confkb/run-confluence-as-a-systemd-service-on-linux-937177781.html" target="_blank" rel="noopener noreferrer">Run Confluence as a systemd service on linux</a
    >
  </li>
  <li>
    <a href="https://confluence.atlassian.com/jirakb/run-jira-as-a-systemd-service-on-linux-979411854.html" target="_blank" rel="noopener noreferrer">Run Jira as a systemd service on linux</a
    >
  </li>
  <li>
    <a href="https://confluence.atlassian.com/bitbucketserver/running-bitbucket-server-as-a-linux-service-776640157.html" target="_blank" rel="noopener noreferrer">Running Bitbucket Server as a Linux service</a
    >
  </li>
  <li>
    <a href="https://wiki.debian.org/systemd" target="_blank" rel="noopener noreferrer">systemd &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://wiki.debian.org/systemd/Services" target="_blank" rel="noopener noreferrer">systemd/Services &#8211; Debian Wiki</a
    >
  </li>
  <li>
    <a href="https://manpages.debian.org/buster/systemd/systemd.service.5.en.html" target="_blank" rel="noopener noreferrer">systemd.service(5) — systemd — Debian buster — Debian Manpages</a
    >
  </li>
  <li>
    <a href="https://manpages.debian.org/buster/systemd/systemd.exec.5.en.html" target="_blank" rel="noopener noreferrer">systemd.exec(5) — systemd — Debian buster — Debian Manpages</a
    >
  </li>
  <li>
    <a href="https://manpages.debian.org/buster/systemd/systemd.unit.5.en.html" target="_blank" rel="noopener noreferrer">systemd.unit(5) — systemd — Debian buster — Debian Manpages</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/">Confluence, Jira, Bitbucket의 systemd unit 설정</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
