<?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>confluence | bitneer.dev</title>
	<atom:link href="https://www.bitneer.dev/blog/tag/confluence/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bitneer.dev</link>
	<description>AI 시대에 취미로 하는 코딩</description>
	<lastBuildDate>Sun, 28 Dec 2025 16:37:27 +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>confluence | bitneer.dev</title>
	<link>https://www.bitneer.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Confluence 서버의 MySQL을 PostgreSQL로 마이그레이션 하기</title>
		<link>https://www.bitneer.dev/blog/confluence-%ec%84%9c%eb%b2%84%ec%9d%98-mysql%ec%9d%84-posgresql%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 22:50:49 +0000</pubDate>
				<category><![CDATA[네트워크와 시스템 관리]]></category>
		<category><![CDATA[데이터베이스 시스템]]></category>
		<category><![CDATA[confluence]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[postgresql]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=494</guid>

					<description><![CDATA[<div data-nosnippet>데비안 시스템의 Confluence 서버에서 MySQL을 PostgreSQL로 마이그레이션 한 과정을 보여주려고 한다. 내가 사용하는 데비안 9(stretch)의 PostgreSQL 버전은 9.6이다. Confluence는 버전 6.13.8을 설치하고 있다. 먼저 이 버전의 Confluence에서 지원하는 데이터베이스를 볼 필요가 있다. Supported Platforms &#8211; Confluence 6.13을 보면 PostgreSQL 9.4, 9.5, 9.6을 지원하므로 마이그레이션을 진행할 수 있다. 작업을 진행하기 전에 MySQL의 데이터베이스와 Confluence 홈 디렉토리를 백업한다. 뒤에서 서술할 내용에서 Confluence의 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/confluence-%ec%84%9c%eb%b2%84%ec%9d%98-mysql%ec%9d%84-posgresql%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/">Confluence 서버의 MySQL을 PostgreSQL로 마이그레이션 하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
  데비안 시스템의 Confluence 서버에서 MySQL을 PostgreSQL로 마이그레이션 한
  과정을 보여주려고 한다. 내가 사용하는 데비안 9(stretch)의 PostgreSQL 버전은
  9.6이다. Confluence는 버전 6.13.8을 설치하고 있다. 먼저 이 버전의
  Confluence에서 지원하는 데이터베이스를 볼 필요가 있다.
  <a href="https://confluence.atlassian.com/conf613/supported-platforms-964961686.html" target="_blank" rel="noopener noreferrer">Supported Platforms &#8211; Confluence 6.13</a
  >을 보면 PostgreSQL 9.4, 9.5, 9.6을 지원하므로 마이그레이션을 진행할 수 있다.
  작업을 진행하기 전에 MySQL의 데이터베이스와 Confluence 홈 디렉토리를 백업한다.
  뒤에서 서술할 내용에서 Confluence의 설치 위치는
  <kbd>/opt/share/confluence</kbd>, 홈 디렉토리는
  <kbd>/var/local/lib/confluence</kbd>이다. 여러분이 이와 다르다면 참작해서 보기
  바란다.
</p>
<h5>단계 1. Confluence에 설치한 Atlassian Marketplace 앱의 정보를 확인하기</h5>
<p>
  단계 4에서 보겠지만 기존 버전과 같은 Confluence를 새로 설치하고 앞으로 그것을
  사용해야 한다. 이전의 Confluence에 있던 앱들은 다시 설치해야 한다. 단계 2에서
  생성하는 XML 포맷의 백업 파일에는 앱의 환경 설정 정보들을 가지고 있다. 이 안의
  동일한 버전으로 앱을 설치해야 문제가 발생하지 않을 것이다. 같은 버전으로 쉽게
  설치하기 위해 앱을 미리 <em>업데이트</em>해 주는 것이 좋을 것이다. 업데이트 후
  앱 이름, 버전, 제작자, 활성화 여부를 기록해 둔다. 나의 경우는 다음과 같다.
</p>
<ul>
  <li>
    Atlassian Troubleshooting and Support Tools / 1.25.0 / Atlassian / enabled
  </li>
  <li>
    Atlassian Universal Plugin Manager Plugin / 3.0.6 / Atlassian / enabled
  </li>
  <li>Confluence Cloud Migration Assistant / 2.6.0 / Atlassian / enabled</li>
  <li>Confluence Mobile Plugin / 2.2.4 / Atlassian / enabled</li>
  <li>Refined for Confluence / 6.1.15 / Refined / enabled</li>
  <li>RefinedMobile for Confluence / 3.3.2 / RefinedWiki / enabled</li>
  <li>Gliffy Diagrams for Confluence / 8.6.5 / Gliffy, Inc. / enabled</li>
  <li>LaTex Math / 3.9.13 / Bolo Software / enabled</li>
</ul>
<h5>단계 2. XML 포맷으로 데이터를 백업하기</h5>
<p>
  이 단계를 진행할 때
  <kbd
    >http://<strong>192.168.1.10:8090</strong>/confluence/admin/backup.action</kbd
  >
  주소처럼 Confluence 서버에 직접 연결한다. IP 주소는 Confluence를 설치한
  시스템의 주소로 여러분에게 맞는 것을 입력한다. Proxy 등과 같이 Confluence
  전단의 Apache로 접속하여 작업하면 에러가 날 가능성이 크다. IP 주소로 직접
  접속할 때 Confluence의 base URL을 변경하라는 메시지가 나오면 무시하고 진행해도
  괜찮다. 다음과 같이 작업한다.
</p>
<ol>
  <li>
    Confluence 설정으로 들어가서
    <strong>ADMINISTRATION &gt; Backup &amp; Restore</strong>를 클릭한다.
  </li>
  <li>
    Export this site에서 디폴트 선택인
    <strong>Include attachments</strong> 체크를 그대로 둔 채
    <strong>Export</strong> 버튼을 클릭한다. 백업할 데이터가 크다면 시간이 오래
    걸린다. 인내심을 가지고 기다린다.
  </li>
  <li>
    작업이 완료되면 새로운 창에서 다음과 같이 백업 성공 메시지와 백업 파일의
    저장 위치가 나온다. 그리고 24시간 안에 이 파일이 지워질 것을 알려준다. 나는
    Proxy Error가 한 번 발생해서
    <strong>xmlexport-20200524-215026-2.zip</strong>처럼 끝에
    <strong>-2</strong>가 붙었다. 이후에 이 파일을 복원에 사용할 것이다.
    <pre class="language-none">
<code>The backup was successfully created at /var/local/lib/confluence/temp/xmlexport-20200524-215026-2.zip. This file will be deleted in 24 hours.</code>
</pre>
  </li>
</ol>
<p>
  attachments가 너무 크다면 <strong>Include attachments</strong>를 체크하지 않는
  것이 좋을 수도 있다. 이 경우 단계 5의 다음 단계에서 이전 Confluence의
  attachments를 새 Confluence로 복사해야 할 것이다. 다음의 명령어 실행으로
  attachments의 크기를 알아볼 수 있다.
</p>
<pre class="language-none line-numbers" data-line="1">
<code># du -h /var/local/lib/confluence/attachments
...
4.6G	/var/local/lib/confluence/attachments</code>
</pre>
<p>
  du의 <strong>-h</strong> 옵션은 크기를 읽기 쉽게 K, M, G로 표시해 준다. 나의
  경우 4.6 기가바이트가 나왔는데 attachments 디렉토리를 포함하여 XML 포맷으로
  백업할 수 있었다.
</p>
<h5>단계 3. PostgreSQL의 데이터베이스 만들기</h5>
<p>
  Confluence에서 사용할 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 confluence WITH LOGIN PASSWORD &#039;원하는 암호 입력&#039;;
CREATE ROLE
postgres=# CREATE DATABASE confluence WITH ENCODING=&#039;UTF8&#039; OWNER=confluence;
CREATE DATABASE
postgres=# \l
                                  데이터베이스 목록
    이름    |   소유주   | 인코딩 |   Collate   |    Ctype    |      액세스 권한
------------+------------+--------+-------------+-------------+-----------------------
 confluence | confluence | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 |
 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
(5개 행)</code>
</pre>
<p>
  라인 6에서 <strong>CREATE ROLE</strong>로 <kbd>confluence</kbd> 사용자를
  만든다. 라인 8에서 <strong>CREATE DATABASE</strong>로
  <kbd>confluence</kbd> 데이터베이스를 생성한다. Confluence의 데이터베이스는
  인코딩과 Collation은 utf8로 설정해야 한다. 라인 10에서
  <strong>\l</strong> 명령어로 새로 생성한 confluence 데이터베이스를 확인한다.
  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>
  단계 4. 현재 사용하는 Confluence와 같은 버전의 Confluence를 새로 설치하기
</h5>
<p>
  새로 설치하는 Confluence는 <em>현재 사용하는 Confluence와 같은 버전</em>이어야
  한다. 그러나 설치 위치와 홈 디렉토리는 달라져야 한다. 다음과 같이 작업한다.
</p>
<p>1. 현재 사용하는 Confluence를 종료한다.</p>
<p>
  2. 마이그레이션에 실패할 시 빠르게 원래대로 복구하기 위해 기존 Confluence의
  설치 파일과 홈 디렉토리의 이름을 변경해 둔다.
</p>
<pre class="language-none">
<code># mv /opt/share/confluence /opt/share/confluence-old
# mv /var/local/lib/confluence /var/local/lib/confluence-old</code>
</pre>
<p>3. 새 Confluence를 위한 홈 디렉토리를 생성한다.</p>
<pre class="language-none line-numbers" data-line="4">
<code># mkdir /var/local/lib/confluence
# cd /var/local/lib
# chown confluence:confluence confluence
# chmod g-s confluence</code>
</pre>
<p>
  라인 4는 스티키 비트(sticky bit)를 사용하지 않으므로 제거한 것이다. 데비안에서
  /var/local 디렉토리의 그룹에 스티키 비트가 있어 /var/local/lib/confluence
  디렉토리에 스티키 비트가 붙는다. 여러분이 다른 Confluence 홈 디렉토리를
  사용한다면 무시하고 넘어간다.
</p>
<p>
  4. 기존 Confluece와 같은 버전의 TAR.GZ 압축 파일을 /opt/share에 복사한 후
  다음의 절차로 /opt/share/confluece에 위치하도록 압축을 푼다.
</p>
<pre class="language-none line-numbers" data-line="4-7">
<code># cd /opt/share
# tar zxvf atlassian-confluence-6.13.8.tar.gz
# mv atlassian-confluence-6.13.8 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 데몬이 쓰기 권한을 가져야만 하는 logs, temp, work 디렉토리 이외에는
  파일을 저장할 수 없도록 한다. 데몬(서비스)의 보안에 관해서는
  <a href="https://www.bitneer.dev/wp/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/" target="_blank" rel="noopener noreferrer">Confluence, Jira, Bitbucket의 systemd unit 설정</a
  >에서 볼 수 있다.
</p>
<p>
  5. /opt/share/confluence/confluence/WEB-INF/classes/confluence-init.properties
  파일에서 다음과 같이 Confluence Home Directory를 지정한다.
</p>
<pre class="language-none">
<code>confluence.home=/var/local/lib/confluence</code>
</pre>
<p>
  6. (선택적) Confluence에 접속할 때 웹 브라우저에 따라 언어를 설정하지 않도록
  /opt/share/confluence/bin/setenv.sh 파일에 다음의 내용을 추가한다.
  Confluence에서 언어를 영어로 선택하여 항상 영문 메뉴가 나오도록 하기 위한
  것이다.
</p>
<pre class="language-none">
<code>CATALINA_OPTS="-Dconfluence.browser.language.enabled=false ${CATALINA_OPTS}"</code>
</pre>

<h5>
  단계 5. Confluence Setup Wizard를 진행하여 PostgreSQL로 마이그레이션 하기
</h5>
<p>
  1. 새로 설치한 Confluence 서버를 시작한 후 웹 브라우저로
  <kbd>http://192.168.1.10:8090/</kbd>에 접속하여 Confluence setup wizard를
  진행한다. IP 주소는 여러분에게 맞는 것으로 변경한다.
</p>
<p>
  2.
  <strong>Get apps</strong>에서 <strong>Production Installation</strong>을
  선택하고 <strong>Next</strong> 버튼을 클릭한다.
  <strong>Apps extend what Confluence can do. &#8230;</strong>에서
  <strong>Confluece Questions, Confluece Team Calendars</strong>를 디폴트인
  선택하지 않은 상태를 그대로 둔 채 <strong>Next</strong> 버튼을 클릭한다.
</p>
<p>
  3.
  <strong>License key</strong>에서 Confluence의 라이센스를 입력하고
  <strong>Next</strong> 버튼을 클릭한다. (<a href="https://my.atlassian.com/" target="_blank" rel="noopener noreferrer">https://my.atlassian.com/</a
  >에 접속하여 라이센스 키를 복사할 수 있다.)
</p>
<p>
  4.
  <strong>Set up your database</strong>에서 디폴트 선택인
  <strong>My own database</strong> 선택을 그대로 둔 채
  <strong>Next</strong> 버튼을 클릭한다. 다음의 설정을 한 후
  <strong>Test connection</strong> 버튼을 클릭한다. 데이터베이스 연결에 성공한
  메시지가 나오면 <strong>Next</strong> 버튼을 클릭한다.
</p>
<ul>
  <li>Database type: 디폴트 선택인 PostgreSQL을 그대로 둔다.</li>
  <li>Setup type: 디폴트 선택인 Simple을 그대로 둔다.</li>
  <li>
    Hostname: PostgreSQL이 설치된 시스템의 로컬 IP 주소를 입력한다. (예:
    192.168.1.10)
  </li>
  <li>Post: <kbd>5432</kbd>를 입력한다.</li>
  <li>
    Database name: 위에서 생성한 데이터베이스의 이름인 <kbd>confluecne</kbd>를
    입력한다.
  </li>
  <li>
    Username: 위에서 생성한 데이터베이스의 사용자 이름인 <kbd>confluence</kbd>를
    입력한다.
  </li>
  <li>Password: 위에서 생성한 데이터베이스의 &#8216;암호&#8217;를 입력한다.</li>
</ul>
<p>
  5. <strong>Load Content</strong>에서
  <strong>Restore From Backup</strong> 버튼을 클릭한다.
</p>
<p>
  6. <strong>Restore Data</strong> 화면에서
  <strong>Import form the home directory</strong>로 작업한다. 복원할
  xmlexport-20200524-215026-2.zip 파일의 크기가 25MB보다 크기 때문이다.
</p>
<p>
  6.1. 새로 설치한 Confluence 홈 디렉토리의 restore 디렉토리로 단계 2에서 생성한
  xmlexport-20200524-215026-2.zip 파일을 복사하기 위해 다음의 명령어를 실행한다.
</p>
<pre class="language-none">
<code># cp -a /var/local/lib/confluence-old/temp/xmlexport-20200524-215026-2.zip /var/local/lib/confluence/restore/</code>
</pre>
<p>
  cp의 <strong>-a</strong> 옵션은 파일의 속성인 소유자, 생성 날짜 등을 유지한 채
  복사하기 위한 것이다.
</p>
<p>
  6.2. 복사를 완료하였으면
  <strong>Import from the home directory</strong>의
  <strong>Import</strong> 버튼을 클릭한다. 에러 메시지와 함께
  xmlexport-20200524-215026-2.zip 파일이 보이면 선택하고 다시 한번
  <strong>Import</strong> 버튼을 클릭한다.
</p>
<p>
  6.3.
  <strong>Restore</strong> 과정이 진행된다. Restore 과정이 끝난 후
  <strong>Next</strong> 버튼을 클릭한다.
</p>
<p>
  7.
  <strong>Setup Successful</strong> 화면에서 <strong>Start</strong> 버튼을
  클릭한다.
</p>
<h5>단계 6. Atlassian Marketplace 앱을 다시 설치하기</h5>
<p>
  단계 1에서 메모해 두었던 앱들을 같은 버전으로 다시 설치한다. Confluence
  설정으로 들어가서
  <strong>ATLASSIAN MARKETPLACE &gt; Find new apps</strong>에서 앱을 검색할 수
  있다. Atlassian이 제공하는 앱은 이미 설치되어 있으므로 간단하게 Update만 한다.
</p>
<h5>단계 7. 새로 설치한 Confluence를 위한 설정을 한다.</h5>
<p>
  도메인의 URL 주소로 접속하기 위해 /opt/share/confluence/conf/server.xml 파일을
  수정한다. 나의 경우 Apache의 Proxy를 사용하기 때문에 다음과 같이 한다.
</p>
<p>
  &lt;Context&gt; 지시자의 <strong>path</strong>를 <kbd>/confluence</kbd>로
  설정한다.
</p>
<pre class="language-none">
<code>&lt;Context path="/confluence" docBase="../confluence" debug="0" reloadable="false" useHttpOnly="true"&gt</code>
</pre>
<p>
  디폴트 &lt;Connector&gt; 지시자는 주석 처리한다. HTTS 상의 Proxying인
  &lt;Connector&gt; 지시자의 주석을 제거하고 <strong>proxyName</strong>을
  <kbd>www.bitneer.dev</kbd>로 변경한다.
</p>
<pre class="language-markup line-numbers" data-line="5">
<code>&lt;Connector port=&quot;8090&quot; connectionTimeout=&quot;20000&quot; redirectPort=&quot;8443&quot;
           maxThreads=&quot;48&quot; minSpareThreads=&quot;10&quot;
           enableLookups=&quot;false&quot; acceptCount=&quot;10&quot; debug=&quot;0&quot; URIEncoding=&quot;UTF-8&quot;
           protocol=&quot;org.apache.coyote.http11.Http11NioProtocol&quot;
           scheme=&quot;https&quot; secure=&quot;true&quot; proxyName=&quot;www.bitneer.dev&quot; proxyPort=&quot;443&quot;/&gt;
</code></pre>
<p>
  Confluence를 다시 시작하고 웹 브라우저로 Confluence에 접속한다. Confluence
  설정에 들어가서 <strong>CONFIGURATION &gt; General Configuration</strong>의
  <strong>Server Base URL</strong>을 도메인 주소에 맞게 설정한다.
</p>
<h5>단계 8. 문제 점검 및 기존 파일 삭제하기</h5>
<p>
  다음의 명령어를 실행한 후 다른 ssh 연결 세션에서 Confluence를 시작, 종료하면서
  발생하는 로그를 검사한다.
</p>

<pre class="language-none">
<code># tail -100f /var/local/lib/confluence/logs/atlassian-confluence.log</code>
</pre>
<p>
  위의 atlassian-confluence.log에 Error 로그가 보인다면 Confluence 설정의
  <strong>ADMINISTRATION &gt; Troubleshooting and support tools</strong>의
  <strong>Log analyzer</strong>에서 문제를 해결할 수 있는지 확인한다. 해당 Error
  로그를 클릭하면 해결책을 제시하는 페이지에 접속할 수 있다.
</p>
<p>
  Confluence 설정의
  <strong>ADMINISTRATION &gt; Troubleshooting and support tools</strong>의
  <strong>Instance heath</strong>에 문제가 있는지 확인한다.
  atlassian-confluence.log에 Error 로그가 나오더라도
  <strong>Instance heath</strong>에서 모든 항목이 초록색으로 표시되어 있고
  <strong>Log analyzer</strong>에 해당 Error 로그가 나오지 않는다면 Confluence
  사용에 크게 문제를 일으키지는 않는 것으로 보인다.
</p>
<p>
  MySQL에서 PostgreSQL로 마이그레이션에 성공하였다면 기존의 Confluence 관련
  파일을 삭제한다.
</p>
<pre class="language-none">
<code># cd /opt/share/
# rm -rf confluence-old
# rm atlassian-confluence-6.13.8.tar.gz
# cd /var/local/lib/
# rm -rf confluence-old</code>
</pre>

<h5>관련 글</h5>
<ul>
  <li>
    <a href="https://www.bitneer.dev/wp/confluence-jira-bitbucket%ec%9d%98-systemd-unit-%ec%84%a4%ec%a0%95/" target="_blank" rel="noopener noreferrer">Confluence, Jira, Bitbucket의 systemd unit 설정</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a href="https://confluence.atlassian.com/conf613/supported-platforms-964961686.html" target="_blank" rel="noopener noreferrer">Supported Platforms &#8211; Confluence 6.13</a
    >
  </li>
  <li>
    <a href="https://confluence.atlassian.com/conf613/migrating-to-another-database-964961318.html" target="_blank" rel="noopener noreferrer">Migrating to Another Database &#8211; Confluence 6.13</a
    >
  </li>
  <li>
    <a href="https://confluence.atlassian.com/conf613/database-setup-for-postgresql-964961302.html" target="_blank" rel="noopener noreferrer">Database Setup for PostgreSQL &#8211; Confluence 6.13</a
    >
  </li>
</ul><p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/confluence-%ec%84%9c%eb%b2%84%ec%9d%98-mysql%ec%9d%84-posgresql%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/">Confluence 서버의 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>
