<?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>Raspberry Pi &#8211; My Pi</title>
	<atom:link href="https://korduck.duckdns.org/category/raspberry-pi/feed/" rel="self" type="application/rss+xml" />
	<link>https://korduck.duckdns.org</link>
	<description>Raspberry Pi, Knowledge, Journey</description>
	<lastBuildDate>Sun, 22 Jun 2025 22:52:03 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
	<item>
		<title>DokuWiki Hotfix &#038; Upgrade Installation</title>
		<link>https://korduck.duckdns.org/327/</link>
					<comments>https://korduck.duckdns.org/327/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 22:52:03 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=327</guid>

					<description><![CDATA[Hotfix release available: 2025-05-14a &#8220;Librarian&#8221;. upgrade now! [56.1] (what&#8217;s this?) 📌 1. 먼저 백업하기 (필수) 업그레이드 전 전체 백업을 꼭 하세요: sudo cp -a /var/www/html/dokuwiki /home/pi/dokuwiki_backup_$(date +%Y%m%d) 📌 2. 최신 버전 다운로드 공식 사이트 또는 명령어로 다운로드합니다: cd /tmp wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz 📌 3. 압축 해제 tar -xvzf dokuwiki-stable.tgz cd dokuwiki-* 📌 4. 기존 설치 디렉토리에 ... <a title="DokuWiki Hotfix &#038; Upgrade Installation" class="read-more" href="https://korduck.duckdns.org/327/" aria-label="DokuWiki Hotfix &#038; Upgrade Installation에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<p><strong>Hotfix release available: 2025-05-14a &#8220;Librarian&#8221;. upgrade now! [56.1] (what&#8217;s this?)</strong></p>
<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="210" data-end="229">1. 먼저 백업하기 (필수)</strong><br />
업그레이드 전 <strong data-start="238" data-end="247">전체 백업</strong>을 꼭 하세요:<br />
sudo cp -a /var/www/html/dokuwiki /home/pi/dokuwiki_backup_$(date +%Y%m%d)</p>
<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="511" data-end="528">2. 최신 버전 다운로드</strong></p>
<pre>공식 사이트 또는 명령어로 다운로드합니다:
cd /tmp
wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz

&#x1f4cc; <strong data-start="735" data-end="747">3. 압축 해제</strong>
tar -xvzf dokuwiki-stable.tgz
cd dokuwiki-*

&#x1f4cc; <strong data-start="817" data-end="840">4. 기존 설치 디렉토리에 덮어쓰기</strong>
sudo cp -r * /var/www/html/dokuwiki/

</pre>
<p data-start="891" data-end="921"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 단, 아래 디렉토리는 <strong data-start="906" data-end="920">덮어쓰면 안 됩니다</strong>:</p>
<ul data-start="922" data-end="1006">
<li data-start="922" data-end="931">
<p data-start="924" data-end="931"><code data-start="924" data-end="931">conf/</code></p>
</li>
<li data-start="932" data-end="941">
<p data-start="934" data-end="941"><code data-start="934" data-end="941">data/</code></p>
</li>
<li data-start="942" data-end="979">
<p data-start="944" data-end="979"><code data-start="944" data-end="958">lib/plugins/</code> (특히 외부 플러그인 사용 중이라면)</p>
</li>
<li data-start="980" data-end="1006">
<p data-start="982" data-end="1006"><code data-start="982" data-end="992">lib/tpl/</code> (사용자 정의 테마라면)</p>
</li>
</ul>
<p data-start="1008" data-end="1029"><strong data-start="1008" data-end="1029">따라서 rsync를 추천합니다:</strong></p>
<pre data-start="1008" data-end="1029">sudo rsync -av --exclude=data --exclude=conf --exclude=lib/plugins --exclude=lib/tpl ./ /var/www/html/dokuwiki/</pre>
<pre>&#x1f4cc; <strong data-start="1167" data-end="1180">5. 권한 재설정</strong>
sudo chown -R www-data:www-data /var/www/html/dokuwiki

</pre>
<h3 data-start="1254" data-end="1275"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1261" data-end="1275">6. 설치 후 확인</strong></h3>
<p data-start="1276" data-end="1357">웹브라우저에서 DokuWiki 메인 페이지 접속 → 버전 확인<br data-start="1310" data-end="1313" />하단에 <code data-start="1317" data-end="1344">"2025-05-14a 'Librarian'"</code>이 표시되면 성공입니다.</p>
<pre>

</pre>
<pre>




</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/327/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AdGuard + PiVPN(wireguard) 설치</title>
		<link>https://korduck.duckdns.org/288/</link>
					<comments>https://korduck.duckdns.org/288/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Tue, 22 Apr 2025 08:02:06 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=288</guid>

					<description><![CDATA[✅ 1. 시스템 준비 sudo apt update &#38;&#38; sudo apt upgrade -y sudo apt install curl wget git -y ✅ 2. AdGuard Home 설치 cd /opt sudo wget https://static.adguard.com/adguardhome/release/AdGuardHome_linux_armv7.tar.gz sudo tar -xvf AdGuardHome_linux_armv7.tar.gz cd AdGuardHome sudo ./AdGuardHome -s install 설치 후, 웹 GUI 주소는: http://&#60;라즈베리파이 IP&#62;:3000 초기 설정 마법사를 통해 관리자 계정과 포트 등을 설정하세요. ... <a title="AdGuard + PiVPN(wireguard) 설치" class="read-more" href="https://korduck.duckdns.org/288/" aria-label="AdGuard + PiVPN(wireguard) 설치에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h2 class="" data-start="151" data-end="165"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. 시스템 준비</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt update &amp;&amp; sudo apt upgrade -y<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt install curl wget git -y<br />
</code></div>
</div>
<hr class="" data-start="253" data-end="256" />
<h2 class="" data-start="258" data-end="281"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. AdGuard Home 설치</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-built_in">cd</span> /opt<br />
sudo wget https://static.adguard.com/adguardhome/release/AdGuardHome_linux_armv7.tar.gz<br />
sudo tar -xvf AdGuardHome_linux_armv7.tar.gz<br />
<span class="hljs-built_in">cd</span> AdGuardHome<br />
sudo ./AdGuardHome -s install<br />
</code></div>
</div>
<p class="" data-start="482" data-end="498">설치 후, 웹 GUI 주소는:</p>
<ul data-start="499" data-end="524">
<li class="" data-start="499" data-end="524">
<p class="" data-start="501" data-end="524">http://&lt;라즈베리파이 IP&gt;:3000</p>
</li>
</ul>
<blockquote data-start="526" data-end="566">
<p class="" data-start="528" data-end="566"><strong data-start="528" data-end="541">초기 설정 마법사</strong>를 통해 관리자 계정과 포트 등을 설정하세요.</p>
</blockquote>
<p data-start="528" data-end="566">
<h2 class="" data-start="222" data-end="234"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f9f1.png" alt="🧱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 전체 구성도</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-text">[스마트폰/노트북]<br />
      │ WireGuard VPN<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-text">             ▼<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-text">[Raspberry Pi (PiVPN + AdGuard Home)]<br />
      │<br />
  AdGuard DNS 필터링<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-text">             ▼<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-text">[인터넷 (업스트림 DNS)]<br />
</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h2 class="" data-start="758" data-end="787"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f510.png" alt="🔐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. PiVPN (WireGuard) 설치</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">curl -L https://install.pivpn.io | bash<br />
</code></div>
</div>
<p class="" data-start="842" data-end="853">설치 중 주의할 점:</p>
<ul data-start="855" data-end="983">
<li class="" data-start="855" data-end="881">
<p class="" data-start="857" data-end="881">VPN 타입: <strong data-start="865" data-end="878">WireGuard</strong> 선택</p>
</li>
<li class="" data-start="882" data-end="905">
<p class="" data-start="884" data-end="905">Local user: <code data-start="896" data-end="900">pi</code> (기본)</p>
</li>
<li class="" data-start="906" data-end="929">
<p class="" data-start="908" data-end="929">포트: 기본값 <strong data-start="916" data-end="929">51820 UDP</strong></p>
</li>
<li class="" data-start="930" data-end="983">
<p class="" data-start="932" data-end="983">DNS 서버로 <strong data-start="940" data-end="974">AdGuard Home의 IP (예: 10.6.0.1)</strong> 선택 (중요!)</p>
</li>
</ul>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-comment"># 클라이언트 생성</span><br />
pivpn add<br />
</code></div>
</div>
<p class="" data-start="1019" data-end="1066">생성된 <code data-start="1023" data-end="1030">.conf</code> 파일은 스마트폰이나 노트북 WireGuard 앱에서 사용 가능.</p>
</div>
<p data-start="1019" data-end="1066">
<p data-start="1019" data-end="1066">
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/288/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Pi + zram</title>
		<link>https://korduck.duckdns.org/272/</link>
					<comments>https://korduck.duckdns.org/272/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Wed, 09 Apr 2025 00:00:31 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=272</guid>

					<description><![CDATA[✅ 1. zram-tools 설치 sudo apt update sudo apt install zram-tools ✅ 2. 기본 설정 확인 및 편집 (선택 사항) zram-tools는 /etc/default/zramswap 파일을 설정파일로 사용합니다. sudo nano /etc/default/zramswap 기본 설정은 다음과 비슷할 수 있습니다: # /etc/default/zramswap # 압축 알고리즘 (zstd, lz4, lzo 중 선택) ALGO=zstd # zram으로 사용할 총 메모리 크기 비율 (예: 50% → ... <a title="Raspberry Pi + zram" class="read-more" href="https://korduck.duckdns.org/272/" aria-label="Raspberry Pi + zram에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h3 class="" data-start="138" data-end="162"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. <code data-start="147" data-end="159">zram-tools</code> 설치</h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt update<br />
sudo apt install zram-tools<br />
</code></div>
</div>
<hr class="" data-start="220" data-end="223" />
<h3 class="" data-start="225" data-end="255"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. 기본 설정 확인 및 편집 (선택 사항)</h3>
<p class="" data-start="257" data-end="311"><code data-start="257" data-end="269">zram-tools</code>는 <code data-start="271" data-end="294">/etc/default/zramswap</code> 파일을 설정파일로 사용합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="sticky top-9">
<div class="absolute right-0 bottom-0 flex h-9 items-center pe-2">
<div class="bg-token-sidebar-surface-primary text-token-text-secondary dark:bg-token-main-surface-secondary flex items-center rounded-sm px-2 font-sans text-xs"></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo nano /etc/default/zramswap<br />
</code></div>
</div>
<p class="" data-start="358" data-end="380">기본 설정은 다음과 비슷할 수 있습니다:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr">
<p><code class="whitespace-pre! language-bash"><span class="hljs-comment"># /etc/default/zramswap</span></code></p>
<p><span class="hljs-comment"># 압축 알고리즘 (zstd, lz4, lzo 중 선택)</span><br />
ALGO=zstd</p>
<p><span class="hljs-comment"># zram으로 사용할 총 메모리 크기 비율 (예: 50% → 0.5)</span><br />
PERCENT=50</p>
<p><span class="hljs-comment"># 코어 수 자동 설정 (기본값 0이면 자동)</span><br />
PRIORITY=100</p>
</div>
</div>
<p class="" data-start="554" data-end="564"><strong data-start="554" data-end="564">권장 설정:</strong></p>
<ul data-start="565" data-end="673">
<li class="" data-start="565" data-end="595">
<p class="" data-start="567" data-end="595"><code data-start="567" data-end="578">ALGO=zstd</code>: 속도와 압축률의 균형이 좋음</p>
</li>
<li class="" data-start="596" data-end="642">
<p class="" data-start="598" data-end="642"><code data-start="598" data-end="610">PERCENT=50</code> 또는 <code data-start="614" data-end="618">75</code>: 램의 절반 또는 3/4만큼 zram 생성</p>
</li>
<li class="" data-start="643" data-end="673">
<p class="" data-start="645" data-end="673"><code data-start="645" data-end="659">PRIORITY=100</code>: swap 우선순위 설정</p>
</li>
</ul>
<hr class="" data-start="675" data-end="678" />
<h3 class="" data-start="680" data-end="708"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. 서비스 시작 및 부팅 시 자동 실행</h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo systemctl <span class="hljs-built_in">enable</span> zramswap.service<br />
sudo systemctl start zramswap.service<br />
</code></div>
</div>
<hr class="" data-start="800" data-end="803" />
<h3 class="" data-start="805" data-end="819"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4. 동작 확인</h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">swapon --show<br />
</code></div>
</div>
<p class="" data-start="848" data-end="854">예시 출력:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre!"><span class="hljs-type">NAME</span>       <span class="hljs-keyword">TYPE</span>      SIZE   USED PRIO<br />
/dev/zram0 <span class="hljs-keyword">partition</span>  <span class="hljs-number">512</span>M     <span class="hljs-number">0</span>B  <span class="hljs-number">100</span><br />
</code></div>
</div>
<p class="" data-start="941" data-end="978">또는 <code data-start="944" data-end="953">free -h</code> 명령으로 swap이 활성화된 것 확인 가능.</p>
<hr class="" data-start="980" data-end="983" />
<h3 class="" data-start="985" data-end="996"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 참고 팁</h3>
<ul data-start="998" data-end="1107">
<li class="" data-start="998" data-end="1048">
<p class="" data-start="1000" data-end="1048"><code data-start="1000" data-end="1006">zram</code>은 <strong data-start="1008" data-end="1044">기존 SD카드 기반 swap보다 훨씬 빠르며 수명에도 유리</strong>합니다.</p>
</li>
<li class="" data-start="1049" data-end="1107">
<p class="" data-start="1051" data-end="1107"><code data-start="1051" data-end="1067">dphys-swapfile</code> 같은 기존 swap 관리 시스템은 <strong data-start="1087" data-end="1095">비활성화</strong>하는 것을 추천합니다:</p>
</li>
</ul>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo systemctl <span class="hljs-built_in">disable</span> --now dphys-swapfile</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr"></div>
<div dir="ltr">
<h2 class="" data-start="585" data-end="618"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 실전 예: 라즈베리파이 4 (4GB RAM 기준)</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo nano /etc/default/zramswap<br />
</code></div>
</div>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div dir="ltr"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-ini"><span class="hljs-attr">ALGO</span>=zstd<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-ini"><span class="hljs-attr">PERCENT</span>=<span class="hljs-number">50</span></code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-ini"><span class="hljs-attr">PRIORITY</span>=<span class="hljs-number">100</span></code></div>
</div>
<p class="" data-start="711" data-end="751">→ 약 2GB 정도의 압축된 zram 스왑 생성됨. 충분히 효율적입니다.</p>
</div>
<p data-start="711" data-end="751">
<h2 class="" data-start="157" data-end="182"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. 기존 zram 정리 및 비활성화</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-comment"># 모든 zram swap 비활성화</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo swapoff /dev/zram*<br />
</code></div>
<div dir="ltr"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-comment"># zramswap 서비스 중지 및 비활성화</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo systemctl stop zramswap<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo systemctl <span class="hljs-built_in">disable</span> zramswap<br />
</code></div>
</div>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div dir="ltr"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-comment"># zram 블록 디바이스 해제</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-built_in">echo</span> 1 | sudo <span class="hljs-built_in">tee</span> /sys/block/zram0/reset<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"><span class="hljs-built_in">echo</span> 1 | sudo <span class="hljs-built_in">tee</span> /sys/block/zram1/reset<br />
</code></div>
</div>
<blockquote data-start="441" data-end="490">
<p class="" data-start="443" data-end="490">디바이스 번호는 사용 중인 수만큼 반복해주세요 (<code data-start="470" data-end="477">zram0</code>, <code data-start="479" data-end="486">zram1</code>, …)</p>
</blockquote>
<hr class="" data-start="492" data-end="495" />
<h2 class="" data-start="497" data-end="513"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. 설정 파일 제거</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo <span class="hljs-built_in">rm</span> -f /etc/default/zramswap<br />
</code></div>
</div>
<hr class="" data-start="561" data-end="564" />
<h2 class="" data-start="566" data-end="591"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. zram-tools 패키지 제거</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt purge zram-tools<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt autoremove<br />
</code></div>
</div>
<hr class="" data-start="652" data-end="655" />
<h2 class="" data-start="657" data-end="685"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4. 재부팅 (깨끗한 상태로 만들기 위해)</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo reboot<br />
</code></div>
</div>
<hr class="" data-start="712" data-end="715" />
<h2 class="" data-start="717" data-end="733"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 5. zram 재설치</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt update<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo apt install zram-tools<br />
</code></div>
</div>
<hr class="" data-start="792" data-end="795" />
<h2 class="" data-start="797" data-end="813"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 6. 설정 파일 작성</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo nano /etc/default/zramswap<br />
</code></div>
</div>
<p class="" data-start="860" data-end="879">예시 설정 (4GB RAM 기준):</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-ini"><span class="hljs-attr">ALGO</span>=zstd<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-ini"><span class="hljs-attr">PERCENT</span>=<span class="hljs-number">50</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-ini"><span class="hljs-attr">PRIORITY</span>=<span class="hljs-number">100</span><br />
</code></div>
</div>
<hr class="" data-start="927" data-end="930" />
<h2 class="" data-start="932" data-end="952"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 7. 서비스 시작 및 활성화</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo systemctl <span class="hljs-built_in">enable</span> zramswap<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">sudo systemctl start zramswap<br />
</code></div>
</div>
<hr class="" data-start="1028" data-end="1031" />
<h2 class="" data-start="1033" data-end="1049"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8. 정상 동작 확인</h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">swapon --show<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash">zramctl</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="whitespace-pre! language-bash"></code></div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/272/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>wireguard + dnsmasq 속도저하, 끊김 해결하는 최적의 방법은? (Raspberry pi)</title>
		<link>https://korduck.duckdns.org/253/</link>
					<comments>https://korduck.duckdns.org/253/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Mon, 31 Mar 2025 04:30:57 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=253</guid>

					<description><![CDATA[설정 파일 열기: sudo nano /etc/dnsmasq.conf 다음 설정 추가 또는 수정: cache-size=5000 # 캐시 크기 증가 (기본값: 150) no-negcache # NXDOMAIN(없는 도메인) 캐시 방지 &#160; /etc/dnsmasq.conf에 추가: filterwin2k no-resolv server=8.8.8.8 server=8.8.4.4 server=1.1.1.1 server=9.9.9.9 ✅ WireGuard CPU 최적화 (라즈베리파이 성능 최적화) AES 암호화 가속 활성화 (Raspberry Pi 4 이상) sudo modprobe aes-neon-bs CPU 가속을 WireGuard에서 사용하도록 ... <a title="wireguard + dnsmasq 속도저하, 끊김 해결하는 최적의 방법은? (Raspberry pi)" class="read-more" href="https://korduck.duckdns.org/253/" aria-label="wireguard + dnsmasq 속도저하, 끊김 해결하는 최적의 방법은? (Raspberry pi)에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<ul>
<li class="" data-start="232" data-end="295">
<p class="" data-start="235" data-end="246">설정 파일 열기:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash"><strong>sudo nano /etc/dnsmasq.conf</strong><br />
</code></div>
</div>
</li>
<li class="" data-start="296" data-end="511">
<p class="" data-start="299" data-end="316">다음 설정 추가 또는 수정:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini"><span class="hljs-attr">cache-size</span>=<span class="hljs-number">5000</span>      <span class="hljs-comment"># 캐시 크기 증가 (기본값: 150)</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini">no-negcache          <span class="hljs-comment"># NXDOMAIN(없는 도메인) 캐시 방지</span></code></div>
</div>
<div dir="ltr"></div>
</li>
</ul>
<p>&nbsp;</p>
<p class="" data-start="914" data-end="940"><strong><code data-start="914" data-end="933">/etc/dnsmasq.conf</code>에 추가:</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]"></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini">filterwin2k<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini">no-resolv<br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini"><span class="hljs-attr">server</span>=<span class="hljs-number">8.8</span>.<span class="hljs-number">8.8</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini"><span class="hljs-attr">server</span>=<span class="hljs-number">8.8</span>.<span class="hljs-number">4.4</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini"><span class="hljs-attr">server</span>=<span class="hljs-number">1.1</span>.<span class="hljs-number">1.1</span><br />
</code></div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini"><span class="hljs-attr">server</span>=<span class="hljs-number">9.9</span>.<span class="hljs-number">9.9</span></code></div>
</div>
<div dir="ltr"></div>
<h1 dir="ltr"></h1>
<div dir="ltr"></div>
<div dir="ltr"></div>
<div dir="ltr">
<h3 class="" data-start="2046" data-end="2089"><strong data-start="2050" data-end="2089"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> WireGuard CPU 최적화 (라즈베리파이 성능 최적화)</strong></h3>
<ol data-start="2090" data-end="2308">
<li class="" data-start="2090" data-end="2180">
<p class="" data-start="2093" data-end="2133"><strong data-start="2093" data-end="2131">AES 암호화 가속 활성화 (Raspberry Pi 4 이상)</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo modprobe aes-neon-bs<br />
</code></div>
<div dir="ltr"></div>
</div>
</li>
<li class="" data-start="2182" data-end="2308">
<p class="" data-start="2185" data-end="2273"><strong data-start="2185" data-end="2217">CPU 가속을 WireGuard에서 사용하도록 설정</strong><br data-start="2217" data-end="2220" /><code data-start="2223" data-end="2248">/etc/wireguard/wg0.conf</code>의 <code data-start="2250" data-end="2263">[Interface]</code> 섹션에 추가:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-ini"><span class="hljs-attr">fwmark</span> = <span class="hljs-number">51820</span></code></div>
</div>
</li>
</ol>
<p class="" data-start="2310" data-end="2353"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="2312" data-end="2319">효과:</strong> WireGuard 암호화 속도 향상 → CPU 부담 감소</p>
</div>
<p data-start="2310" data-end="2353">
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/253/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>✅ Apache Reverse Proxy로 HTTP → HTTPS 변환하는 방법</title>
		<link>https://korduck.duckdns.org/248/</link>
					<comments>https://korduck.duckdns.org/248/#comments</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Thu, 27 Mar 2025 03:13:33 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=248</guid>

					<description><![CDATA[🔹 1. Apache Reverse Proxy 개념 Apache의 mod_proxy 모듈을 이용하면, HTTP 사이트를 HTTPS로 변환하여 Nextcloud에서 안전하게 iframe으로 표시할 수 있습니다. 외부 HTTP 사이트 → Apache Reverse Proxy → HTTPS 변환 후 Nextcloud에 제공 이 방식은 브라우저의 Mixed Content Policy 문제를 해결하고, HTTPS 환경에서 안전하게 iframe을 사용할 수 있도록 도와줍니다. 🔹 2. Apache Reverse Proxy 설정 ... <a title="✅ Apache Reverse Proxy로 HTTP → HTTPS 변환하는 방법" class="read-more" href="https://korduck.duckdns.org/248/" aria-label="✅ Apache Reverse Proxy로 HTTP → HTTPS 변환하는 방법에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h2 class="" data-start="185" data-end="221"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="191" data-end="221">1. Apache Reverse Proxy 개념</strong></h2>
<p class="" data-start="222" data-end="317">Apache의 <strong data-start="230" data-end="243">mod_proxy</strong> 모듈을 이용하면, <strong data-start="254" data-end="308">HTTP 사이트를 HTTPS로 변환하여 Nextcloud에서 안전하게 iframe으로 표시</strong>할 수 있습니다.</p>
<ul data-start="319" data-end="480">
<li class="" data-start="319" data-end="390">
<p class="" data-start="321" data-end="390"><strong data-start="321" data-end="336">외부 HTTP 사이트</strong> → Apache Reverse Proxy → <strong data-start="362" data-end="390">HTTPS 변환 후 Nextcloud에 제공</strong></p>
</li>
<li class="" data-start="391" data-end="480">
<p class="" data-start="393" data-end="480">이 방식은 <strong data-start="399" data-end="436">브라우저의 Mixed Content Policy 문제를 해결</strong>하고, HTTPS 환경에서 안전하게 iframe을 사용할 수 있도록 도와줍니다.</p>
</li>
</ul>
<hr class="" data-start="482" data-end="485" />
<h2 class="" data-start="487" data-end="526"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="493" data-end="526">2. Apache Reverse Proxy 설정 방법</strong></h2>
<h3 class="" data-start="527" data-end="569"><strong data-start="531" data-end="569"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1) Apache에 Reverse Proxy 모듈 활성화</strong></h3>
<p class="" data-start="570" data-end="626">Ubuntu/Debian 기준으로 아래 명령어를 실행하여 <strong data-start="602" data-end="622">Proxy 관련 모듈을 활성화</strong>합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo a2enmod proxy<br />
sudo a2enmod proxy_http<br />
sudo a2enmod ssl<br />
sudo a2enmod headers<br />
sudo a2enmod proxy_html<br />
</code></div>
</div>
<p class="" data-start="746" data-end="776">모듈을 활성화한 후 <strong data-start="757" data-end="772">Apache를 재시작</strong>합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo systemctl restart apache2<br />
</code></div>
</div>
<hr class="" data-start="822" data-end="825" />
<h3 class="" data-start="827" data-end="878"><strong data-start="831" data-end="878"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2) Virtual Host 파일 설정 (Reverse Proxy 구성)</strong></h3>
<p class="" data-start="879" data-end="927">이제 Reverse Proxy를 설정할 <strong data-start="901" data-end="923">가상 호스트 파일을 생성 및 수정</strong>합니다.</p>
<ol data-start="929" data-end="991">
<li class="" data-start="929" data-end="991">
<p class="" data-start="932" data-end="991"><code data-start="932" data-end="981">/etc/apache2/sites-available/reverse-proxy.conf</code> 파일을 만듭니다.</p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo nano /etc/apache2/sites-available/reverse-proxy.conf<br />
</code></div>
</div>
<ol start="2" data-start="1064" data-end="1249">
<li class="" data-start="1064" data-end="1249">
<p class="" data-start="1067" data-end="1082">다음 내용을 추가합니다.</p>
<ul data-start="1086" data-end="1249">
<li class="" data-start="1086" data-end="1127">
<p class="" data-start="1088" data-end="1127"><code data-start="1088" data-end="1108">your-nextcloud.com</code> → Nextcloud의 도메인</p>
</li>
<li class="" data-start="1131" data-end="1188">
<p class="" data-start="1133" data-end="1188"><code data-start="1133" data-end="1159">proxy.your-nextcloud.com</code> → Reverse Proxy로 사용할 서브도메인</p>
</li>
<li class="" data-start="1192" data-end="1249">
<p class="" data-start="1194" data-end="1249"><code data-start="1194" data-end="1225">http://your-external-site.com</code> → iframe으로 표시할 HTTP 사이트</p>
</li>
</ul>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-apache"><code class="!whitespace-pre language-apache">&lt;VirtualHost *:443&gt;<br />
ServerName proxy.your-nextcloud.com</code></code># SSL 설정 (Let&#8217;s Encrypt 사용 가능)<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/your-nextcloud.com/fullchain.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/your-nextcloud.com/privkey.pem</p>
<p><code class="!whitespace-pre language-apache"><code class="!whitespace-pre language-apache"></code></code># Reverse Proxy 설정<br />
ProxyPreserveHost On<br />
ProxyPass / http://your-external-site.com/<br />
ProxyPassReverse / http://your-external-site.com/</p>
<p><code class="!whitespace-pre language-apache"><code class="!whitespace-pre language-apache"></code></code># Header 설정 (보안 관련)<br />
&lt;IfModule mod_headers.c&gt;<br />
Header always set X-Frame-Options &#8220;SAMEORIGIN&#8221;<br />
Header always set Content-Security-Policy &#8220;frame-ancestors &#8216;self&#8217; https://your-nextcloud.com;&#8221;<br />
&lt;/IfModule&gt;</p>
<p><code class="!whitespace-pre language-apache"><code class="!whitespace-pre language-apache"></code></code># 로그 설정<br />
ErrorLog ${APACHE_LOG_DIR}/reverse-proxy_error.log<br />
CustomLog ${APACHE_LOG_DIR}/reverse-proxy_access.log combined<br />
&lt;/VirtualHost&gt;</p>
</div>
</div>
<p class="" data-start="2063" data-end="2074"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="2065" data-end="2074">설정 설명</strong></p>
<ul data-start="2075" data-end="2260">
<li class="" data-start="2075" data-end="2139">
<p class="" data-start="2077" data-end="2139"><code data-start="2077" data-end="2088">ProxyPass</code>와 <code data-start="2090" data-end="2108">ProxyPassReverse</code>를 이용해 <strong data-start="2114" data-end="2137">HTTP 사이트를 HTTPS로 변환</strong></p>
</li>
<li class="" data-start="2140" data-end="2208">
<p class="" data-start="2142" data-end="2208"><code data-start="2142" data-end="2172">X-Frame-Options "SAMEORIGIN"</code> → Nextcloud에서 iframe으로 로드 가능하게 설정</p>
</li>
<li class="" data-start="2209" data-end="2260">
<p class="" data-start="2211" data-end="2260"><code data-start="2211" data-end="2236">Content-Security-Policy</code> → iframe에서 표시할 도메인 제한</p>
</li>
</ul>
<hr class="" data-start="2262" data-end="2265" />
<h3 class="" data-start="2267" data-end="2300"><strong data-start="2271" data-end="2300"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3) Reverse Proxy 설정 적용</strong></h3>
<ol data-start="2301" data-end="2318">
<li class="" data-start="2301" data-end="2318">
<p class="" data-start="2304" data-end="2318"><strong data-start="2304" data-end="2318">가상 호스트 활성화</strong></p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo a2ensite reverse-proxy<br />
</code></div>
</div>
<ol start="2" data-start="2360" data-end="2382">
<li class="" data-start="2360" data-end="2382">
<p class="" data-start="2363" data-end="2382"><strong data-start="2363" data-end="2382">Apache 설정 오류 확인</strong></p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo apachectl configtest<br />
</code></div>
</div>
<p class="" data-start="2421" data-end="2456"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="2423" data-end="2436">"Syntax OK"</code> 메시지가 나오면 설정이 정상입니다.</p>
<ol start="3" data-start="2458" data-end="2475">
<li class="" data-start="2458" data-end="2475">
<p class="" data-start="2461" data-end="2475"><strong data-start="2461" data-end="2475">Apache 재시작</strong></p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo systemctl restart apache2<br />
</code></div>
</div>
<hr class="" data-start="2520" data-end="2523" />
<h3 class="" data-start="2525" data-end="2568"><strong data-start="2529" data-end="2568"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4) Nextcloud의 External Sites에 추가</strong></h3>
<p class="" data-start="2569" data-end="2693">이제 Nextcloud에서 <strong data-start="2584" data-end="2602">External Sites</strong> 앱을 이용하여 iframe을 추가할 때,<br data-start="2625" data-end="2628" /><strong data-start="2628" data-end="2686">기존 HTTP 사이트 대신 <code data-start="2645" data-end="2680">https://proxy.your-nextcloud.com/</code>을 입력</strong>하면 됩니다.</p>
<p class="" data-start="2695" data-end="2703"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="2697" data-end="2703">예제</strong></p>
<ul data-start="2704" data-end="2792">
<li class="" data-start="2704" data-end="2745">
<p class="" data-start="2706" data-end="2745"><strong data-start="2706" data-end="2713">기존:</strong> <code data-start="2714" data-end="2745">http://your-external-site.com</code></p>
</li>
<li class="" data-start="2746" data-end="2792">
<p class="" data-start="2748" data-end="2792"><strong data-start="2748" data-end="2757">변경 후:</strong> <code data-start="2758" data-end="2792">https://proxy.your-nextcloud.com</code></p>
</li>
</ul>
<p class="" data-start="2794" data-end="2835">이제 Nextcloud에서 iframe으로 안전하게 표시될 것입니다. <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<hr class="" data-start="2837" data-end="2840" />
<h2 class="" data-start="2842" data-end="2865"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="2848" data-end="2865">추가 설정 (선택 사항)</strong></h2>
<h4 class="" data-start="2866" data-end="2901"><strong data-start="2871" data-end="2901">1&#x20e3; 만약 HTTP로 접근이 가능해야 한다면?</strong></h4>
<p class="" data-start="2902" data-end="3000">HTTPS가 아닌 HTTP에서도 프록시가 동작하도록 하려면, 다음 설정을 <code data-start="2943" data-end="2992">/etc/apache2/sites-available/reverse-proxy.conf</code>에 추가하세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-apache">&lt;VirtualHost *:80&gt;<br />
ServerName proxy.your-nextcloud.com<br />
Redirect permanent / https://proxy.your-nextcloud.com/<br />
&lt;/VirtualHost&gt;<br />
</code></div>
</div>
<p class="" data-start="3150" data-end="3192">이렇게 하면 HTTP로 접근해도 자동으로 <strong data-start="3173" data-end="3188">HTTPS로 리디렉트</strong>됩니다.</p>
<h2 class="" data-start="243" data-end="269"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="248" data-end="269">1&#x20e3; 현재 SSL 인증서 확인</strong></h2>
<p class="" data-start="270" data-end="293">먼저 현재 설정된 인증서를 확인합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">openssl s_client -connect proxy.korduck.duckdns.org:443 -servername proxy.korduck.duckdns.org &lt;/dev/null 2&gt;/dev/null | openssl x509 -noout -text | grep <span class="hljs-string">"Subject:"</span><br />
</code></div>
</div>
<p class="" data-start="470" data-end="494"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="473" data-end="492">출력 예시 (정상적인 경우)</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-section">Subject: CN=proxy.korduck.duckdns.org</span><br />
</code></div>
</div>
<p class="" data-start="541" data-end="574"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="543" data-end="572">출력 예시 (잘못된 경우, 다른 도메인일 때)</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-section">Subject: CN=example.com</span><br />
</code></div>
</div>
<p class="" data-start="607" data-end="681">이 경우, SSL 인증서가 <code data-start="622" data-end="649">proxy.korduck.duckdns.org</code>에 대해 발급되지 않았기 때문에 새로 발급해야 합니다.</p>
<hr class="" data-start="683" data-end="686" />
<h2 class="" data-start="688" data-end="727"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="693" data-end="727">2&#x20e3; Let&#8217;s Encrypt 인증서 갱신 (재발급)</strong></h2>
<ol data-start="728" data-end="742">
<li class="" data-start="728" data-end="742">
<p class="" data-start="731" data-end="742">기존 인증서 삭제</p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo <span class="hljs-built_in">rm</span> -rf /etc/letsencrypt/live/proxy.korduck.duckdns.org<br />
sudo <span class="hljs-built_in">rm</span> -rf /etc/letsencrypt/archive/proxy.korduck.duckdns.org<br />
sudo <span class="hljs-built_in">rm</span> -rf /etc/letsencrypt/renewal/proxy.korduck.duckdns.org.conf<br />
</code></div>
</div>
<ol start="2" data-start="947" data-end="962">
<li class="" data-start="947" data-end="962">
<p class="" data-start="950" data-end="962">새로운 인증서 발급</p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo certbot certonly --standalone -d proxy.korduck.duckdns.org<br />
</code></div>
</div>
<p class="" data-start="1039" data-end="1074"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1042" data-end="1072">발급이 성공하면 다음과 같은 메시지가 나와야 함</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-type">Successfully</span> received certificate.<br />
<span class="hljs-type">Certificate</span> <span class="hljs-keyword">is</span> saved at: <span class="hljs-regexp">/etc/</span>letsencrypt<span class="hljs-regexp">/live/</span>proxy.korduck.duckdns.org<span class="hljs-operator">/</span>fullchain.pem<br />
</code></div>
</div>
<ol start="3" data-start="1206" data-end="1225">
<li class="" data-start="1206" data-end="1225">
<p class="" data-start="1209" data-end="1225">Apache 설정 업데이트</p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo nano /etc/apache2/sites-available/reverse-proxy.conf<br />
</code></div>
</div>
<p class="" data-start="1296" data-end="1309"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1298" data-end="1307">설정 확인</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-apache">SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/fullchain.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/privkey.pem<br />
</code></div>
</div>
<ol start="4" data-start="1501" data-end="1516">
<li class="" data-start="1501" data-end="1516">
<p class="" data-start="1504" data-end="1516">Apache 재시작</p>
</li>
</ol>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo systemctl restart apache2<br />
</code></div>
</div>
<hr class="" data-start="1561" data-end="1564" />
<h2 class="" data-start="1566" data-end="1602"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1571" data-end="1600">3&#x20e3; 올바른 인증서가 적용되었는지 다시 확인</strong></h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">openssl s_client -connect proxy.korduck.duckdns.org:443 -servername proxy.korduck.duckdns.org &lt;/dev/null 2&gt;/dev/null | openssl x509 -noout -text | grep <span class="hljs-string">"Subject:"</span><br />
</code></div>
</div>
<p class="" data-start="1778" data-end="1803"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1780" data-end="1801">출력이 다음과 같으면 정상 작동</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-section">Subject: CN=proxy.korduck.duckdns.org</span><br />
</code></div>
</div>
<p class="" data-start="1850" data-end="1915">이제 다시 <strong data-start="1856" data-end="1909">브라우저에서 <code data-start="1865" data-end="1900">https://proxy.korduck.duckdns.org</code> 접속 테스트</strong>하거나,</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">curl -I https://proxy.korduck.duckdns.org<br />
</code></div>
</div>
<p class="" data-start="1970" data-end="2002">실행하여 <strong data-start="1975" data-end="1998">HTTP 200 응답이 오는지 확인</strong>하세요.</p>
<h2 class="" data-start="482" data-end="542"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="487" data-end="542">2&#x20e3; 새로운 도메인(proxy.korduck.duckdns.org)으로 SSL 인증서 갱신</strong></h2>
<h3 class="" data-start="543" data-end="582"><strong data-start="547" data-end="582"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 방법 1: 기존 도메인 + 새로운 도메인 함께 인증</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo certbot certonly --standalone -d korduck.duckdns.org -d proxy.korduck.duckdns.org<br />
</code></div>
</div>
<p class="" data-start="682" data-end="721"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="685" data-end="719">이렇게 하면 하나의 인증서에 두 개의 도메인이 포함됨.</strong></p>
<p class="" data-start="723" data-end="728">또는,</p>
<h3 class="" data-start="730" data-end="770"><strong data-start="734" data-end="770"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 방법 2: 기존 인증서 삭제 후 새로운 도메인만 인증</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo certbot delete --cert-name korduck.duckdns.org<br />
sudo certbot certonly --standalone -d proxy.korduck.duckdns.org<br />
</code></div>
</div>
<hr class="" data-start="899" data-end="902" />
<h2 class="" data-start="904" data-end="939"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="909" data-end="939">3&#x20e3; Apache/Nginx SSL 설정 수정</strong></h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo nano /etc/apache2/sites-available/nextcloud.conf<br />
</code></div>
</div>
<p class="" data-start="1006" data-end="1021"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1008" data-end="1021">변경해야 할 부분</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-apache">SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/fullchain.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/proxy.korduck.duckdns.org/privkey.pem<br />
</code></div>
</div>
<p class="" data-start="1212" data-end="1231">저장 후 <strong data-start="1217" data-end="1231">Apache 재시작</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo systemctl restart apache2</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr"></div>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/248/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>라즈베리파이에 DokuWiki를 설치하는 방법</title>
		<link>https://korduck.duckdns.org/246/</link>
					<comments>https://korduck.duckdns.org/246/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Wed, 26 Mar 2025 08:05:16 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=246</guid>

					<description><![CDATA[1. 시스템 업데이트 먼저, 라즈베리파이의 패키지를 최신 상태로 유지하는 것이 중요해. sudo apt update &#38;&#38; sudo apt upgrade -y 2. 필요한 패키지 설치 DokuWiki는 PHP 기반이므로, 웹 서버(Apache 또는 Nginx)와 PHP가 필요해. (1) Apache + PHP 설치 sudo apt install apache2 php php-cli php-xml php-mbstring php-gd php-curl php-zip -y 설치 후, Apache를 시작하고 자동 실행되도록 ... <a title="라즈베리파이에 DokuWiki를 설치하는 방법" class="read-more" href="https://korduck.duckdns.org/246/" aria-label="라즈베리파이에 DokuWiki를 설치하는 방법에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h3 class="" data-start="45" data-end="64"><strong data-start="49" data-end="64">1. 시스템 업데이트</strong></h3>
<p class="" data-start="65" data-end="101">먼저, 라즈베리파이의 패키지를 최신 상태로 유지하는 것이 중요해.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo apt update &amp;&amp; sudo apt upgrade -y<br />
</code></div>
</div>
<hr class="" data-start="155" data-end="158" />
<h3 class="" data-start="160" data-end="181"><strong data-start="164" data-end="181">2. 필요한 패키지 설치</strong></h3>
<p class="" data-start="182" data-end="235">DokuWiki는 PHP 기반이므로, 웹 서버(Apache 또는 Nginx)와 PHP가 필요해.</p>
<h4 class="" data-start="237" data-end="265"><strong data-start="242" data-end="265">(1) Apache + PHP 설치</strong></h4>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo apt install apache2 php php-cli php-xml php-mbstring php-gd php-curl php-zip -y<br />
</code></div>
</div>
<p class="" data-start="364" data-end="395">설치 후, Apache를 시작하고 자동 실행되도록 설정:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo systemctl <span class="hljs-built_in">enable</span> --now apache2</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h3 class="" data-start="697" data-end="726"><strong data-start="701" data-end="726">3. DokuWiki 다운로드 및 설치</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash"><span class="hljs-built_in">cd</span> /var/www/html<br />
sudo wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz<br />
sudo tar xvf dokuwiki-stable.tgz<br />
sudo <span class="hljs-built_in">mv</span> dokuwiki-* dokuwiki<br />
sudo <span class="hljs-built_in">chown</span> -R www-data:www-data /var/www/html/dokuwiki<br />
</code></div>
</div>
<hr class="" data-start="946" data-end="949" />
<h3 class="" data-start="951" data-end="969"><strong data-start="955" data-end="969">4. 웹 서버 설정</strong></h3>
<h4 class="" data-start="970" data-end="999"><strong data-start="975" data-end="999">(1) Apache 가상 호스트 설정</strong></h4>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo nano /etc/apache2/sites-available/dokuwiki.conf<br />
</code></div>
</div>
<p class="" data-start="1065" data-end="1075">아래 내용을 추가:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre">&lt;VirtualHost *:<span class="hljs-number">80</span>&gt;<br />
ServerAdmin <span class="hljs-keyword">admin</span>@example.com<br />
DocumentRoot /var/www/html/dokuwiki<br />
DirectoryIndex <span class="hljs-keyword">index</span>.php <span class="hljs-keyword">index</span>.html<br />
&lt;Directory /var/www/html/dokuwiki&gt;<br />
<span class="hljs-keyword">Options</span> FollowSymLinks<br />
AllowOverride <span class="hljs-keyword">All</span><br />
Require <span class="hljs-keyword">all</span> granted<br />
&lt;/Directory&gt;<br />
ErrorLog ${APACHE_LOG_DIR}/dokuwiki_error.<span class="hljs-keyword">log</span><br />
CustomLog ${APACHE_LOG_DIR}/dokuwiki_access.<span class="hljs-keyword">log</span> combined<br />
&lt;/VirtualHost&gt;<br />
</code></div>
</div>
<p class="" data-start="1485" data-end="1491">설정 적용:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo a2ensite dokuwiki<br />
sudo a2enmod rewrite<br />
sudo systemctl restart apache2</code></div>
</div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h3 class="" data-start="2499" data-end="2524"><strong data-start="2503" data-end="2524">5. DokuWiki 설정 완료</strong></h3>
<p class="" data-start="2525" data-end="2596">이제 웹 브라우저에서 <code data-start="2537" data-end="2576">http://라즈베리파이_IP/dokuwiki/install.php</code> 로 접속해서 설치를 마무리하면 돼.</p>
</div>
<h3 class="" data-start="72" data-end="114"><strong data-start="76" data-end="112"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1&#x20e3; Apache에서 PHP 모듈이 활성화되지 않음</strong></h3>
<p class="" data-start="115" data-end="159">먼저, PHP가 제대로 설치되고 Apache에서 활성화되었는지 확인해 보자.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">php -v<br />
</code></div>
</div>
<p class="" data-start="180" data-end="251">위 명령어를 실행했을 때 PHP 버전이 출력되지 않으면 PHP가 설치되지 않은 것이야.<br data-start="228" data-end="231" />설치하려면 다음 명령을 실행하면 돼.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo apt install php libapache2-mod-php -y<br />
</code></div>
</div>
<p class="" data-start="309" data-end="342">설치 후 PHP 모듈을 활성화하고 Apache를 다시 시작:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo a2enmod php<br />
sudo systemctl restart apache2</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h3 class="" data-start="841" data-end="882"><strong data-start="845" data-end="880"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3&#x20e3; Apache가 PHP 파일을 처리하도록 설정</strong></h3>
<p class="" data-start="883" data-end="940"><code data-start="883" data-end="930">/etc/apache2/sites-available/000-default.conf</code> 파일을 열어보자.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo nano /etc/apache2/sites-available/000-default.conf<br />
</code></div>
</div>
<p class="" data-start="1011" data-end="1047">파일 안에 아래 내용이 포함되어 있는지 확인하고, 없으면 추가해.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre">&lt;FilesMatch <span class="hljs-string">"\.php$"</span>&gt;<br />
SetHandler application/x-httpd-php<br />
&lt;/FilesMatch&gt;<br />
</code></div>
</div>
<p class="" data-start="1133" data-end="1152">저장 후 Apache를 다시 시작.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo systemctl restart apache2</code></div>
</div>
</div>
<div dir="ltr"></div>
<div dir="ltr"></div>
<div dir="ltr"><span style="color: #ff0000;"><strong>경고: 데이터 디렉터리가 제대로 보호되지 않은 것 같습니다.</strong></span></div>
<div dir="ltr">apache2.conf 수정 (추가)</div>
<div dir="ltr"></div>
<div dir="ltr">
<pre class="code">&lt;LocationMatch "/(data|conf|bin|inc|vendor)/"&gt;
    Order allow,deny
    Deny from all
    Satisfy All
&lt;/LocationMatch&gt;</pre>
<p>&nbsp;</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/246/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Grafana + Prometheus + Node Exporter (Monitoring)</title>
		<link>https://korduck.duckdns.org/240/</link>
					<comments>https://korduck.duckdns.org/240/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Fri, 21 Mar 2025 06:11:18 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=240</guid>

					<description><![CDATA[🚀 1. 개요: Grafana + Prometheus + Node Exporter 구조 📌 Prometheus → 데이터를 수집하고 저장📌 Node Exporter → 라즈베리파이의 CPU, 메모리, 네트워크, 디스크 상태를 Prometheus로 전송📌 Grafana → Prometheus에서 데이터를 가져와 웹 대시보드로 시각화 ✅ 2. 설치 및 설정 📌 (1) Prometheus 설치 (라즈베리파이에서 실행) sudo apt update &#38;&#38; sudo apt install -y prometheus ... <a title="Grafana + Prometheus + Node Exporter (Monitoring)" class="read-more" href="https://korduck.duckdns.org/240/" aria-label="Grafana + Prometheus + Node Exporter (Monitoring)에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h2 data-start="143" data-end="201"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="149" data-end="199">1. 개요: Grafana + Prometheus + Node Exporter 구조</strong></h2>
<p data-start="202" data-end="361"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="205" data-end="219">Prometheus</strong> → 데이터를 수집하고 저장<br data-start="234" data-end="237" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="240" data-end="257">Node Exporter</strong> → 라즈베리파이의 CPU, 메모리, 네트워크, 디스크 상태를 Prometheus로 전송<br data-start="306" data-end="309" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="312" data-end="323">Grafana</strong> → Prometheus에서 데이터를 가져와 웹 대시보드로 시각화</p>
<hr data-start="363" data-end="366" />
<h2 data-start="368" data-end="389"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="373" data-end="387">2. 설치 및 설정</strong></h2>
<h3 data-start="391" data-end="435"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="398" data-end="433">(1) Prometheus 설치 (라즈베리파이에서 실행)</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo apt update &amp;&amp; sudo apt install -y prometheus<br />
</code></div>
</div>
<p data-start="496" data-end="504">설치 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">prometheus --version<br />
</code></div>
</div>
<p data-start="536" data-end="579"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="538" data-end="565">prometheus, version 2.x.x</code> 확인되면 정상 설치됨</p>
<hr data-start="581" data-end="584" />
<h3 data-start="586" data-end="634"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="593" data-end="632">(2) Node Exporter 설치 (라즈베리파이 모니터링용)</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo apt install -y prometheus-node-exporter<br />
</code></div>
</div>
<p data-start="690" data-end="732"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CPU, 메모리, 디스크, 네트워크 데이터를 수집하는 Exporter</p>
<h3 data-start="734" data-end="771"><strong data-start="738" data-end="769">Node Exporter 실행 및 자동 시작 설정</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo systemctl <span class="hljs-built_in">enable</span> prometheus-node-exporter --now<br />
</code></div>
</div>
<p data-start="835" data-end="845"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 실행 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">systemctl status prometheus-node-exporter<br />
</code></div>
</div>
<hr data-start="899" data-end="902" />
<h3 data-start="904" data-end="956"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="911" data-end="954">(3) Prometheus 설정 변경 (Node Exporter 연결)</strong></h3>
<p data-start="957" data-end="1001">설정 파일 <code data-start="963" data-end="995">/etc/prometheus/prometheus.yml</code> 수정:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo nano /etc/prometheus/prometheus.yml<br />
</code></div>
</div>
<p data-start="1053" data-end="1092">기본 설정에서 <code data-start="1061" data-end="1077">scrape_configs</code> 섹션을 아래처럼 수정:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-yaml"><span class="hljs-attr">scrape_configs:</span><br />
<span class="hljs-bullet">-</span> <span class="hljs-attr">job_name:</span> <span class="hljs-string">'node_exporter'</span><br />
<span class="hljs-attr">static_configs:</span><br />
<span class="hljs-bullet">-</span> <span class="hljs-attr">targets:</span> [<span class="hljs-string">'localhost:9100'</span>]<br />
</code></div>
</div>
<p data-start="1207" data-end="1253"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="1209" data-end="1225">localhost:9100</code> → Node Exporter가 실행 중인 포트</p>
<p data-start="1255" data-end="1282">설정 적용을 위해 Prometheus 재시작:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo systemctl restart prometheus<br />
</code></div>
</div>
<p data-start="1327" data-end="1381"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="1329" data-end="1351">http://라즈베리파이IP:9090</code>에 접속하여 Prometheus 웹 UI 확인 가능</p>
<hr data-start="1383" data-end="1386" />
<h3 data-start="1388" data-end="1420"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1395" data-end="1418">(4) Grafana 설치 및 설정</strong></h3>
<h4 data-start="1422" data-end="1443"><strong data-start="1427" data-end="1441">Grafana 설치</strong></h4>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo apt install -y grafana<br />
</code></div>
</div>
<p data-start="1482" data-end="1492"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 설치 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">grafana-server --version<br />
</code></div>
</div>
<h4 data-start="1529" data-end="1561"><strong data-start="1534" data-end="1559">Grafana 실행 및 자동 시작 설정</strong></h4>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo systemctl <span class="hljs-built_in">enable</span> grafana-server --now<br />
</code></div>
</div>
<p data-start="1615" data-end="1680"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="1617" data-end="1639">http://라즈베리파이IP:3000</code>으로 접속하면 Grafana 로그인 화면 확인 가능<br data-start="1667" data-end="1670" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 기본 계정:</p>
<ul data-start="1683" data-end="1744">
<li data-start="1683" data-end="1703"><strong data-start="1685" data-end="1693">아이디:</strong> <code data-start="1694" data-end="1701">admin</code></li>
<li data-start="1706" data-end="1744"><strong data-start="1708" data-end="1717">비밀번호:</strong> <code data-start="1718" data-end="1725">admin</code> (첫 로그인 시 변경해야 함)</li>
</ul>
<hr data-start="1746" data-end="1749" />
<h2 data-start="1751" data-end="1792"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1756" data-end="1790">3. Grafana에서 Prometheus 데이터 연동</strong></h2>
<p data-start="1794" data-end="1950">1&#x20e3; <strong data-start="1798" data-end="1837">Grafana에 로그인 후 &#8220;Add Data Source&#8221; 클릭</strong><br data-start="1837" data-end="1840" />2&#x20e3; &#8220;Prometheus&#8221; 선택<br data-start="1859" data-end="1862" />3&#x20e3; URL에 <code data-start="1871" data-end="1894">http://localhost:9090</code> 입력 후 &#8220;Save &amp; Test&#8221; 클릭<br data-start="1916" data-end="1919" />4&#x20e3; 데이터가 정상적으로 수집되면 성공 메시지 확인</p>
<hr data-start="1952" data-end="1955" />
<h2 data-start="1957" data-end="1986"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1962" data-end="1984">4. Grafana 대시보드 추가</strong></h2>
<h3 data-start="1988" data-end="2031"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1995" data-end="2029">(1) 기본 Node Exporter 대시보드 가져오기</strong></h3>
<p data-start="2032" data-end="2217">1&#x20e3; Grafana → &#8220;Create&#8221; → &#8220;Import&#8221; 클릭<br data-start="2068" data-end="2071" />2&#x20e3; &#8220;Dashboard ID&#8221;에 <code data-start="2091" data-end="2097">1860</code> 입력 후 &#8220;Load&#8221; 클릭<br data-start="2112" data-end="2115" />3&#x20e3; &#8220;Prometheus Data Source&#8221;를 선택한 후 &#8220;Import&#8221; 클릭<br data-start="2162" data-end="2165" />4&#x20e3; <strong data-start="2169" data-end="2215">CPU, 메모리, 디스크, 네트워크 사용량을 실시간 대시보드에서 확인 가능!</strong></p>
<p data-start="2219" data-end="2258"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="2221" data-end="2243">http://라즈베리파이IP:3000</code>에서 대시보드 확인 가능</p>
<p data-start="0" data-end="97">라즈베리파이에서 <code data-start="9" data-end="18">grafana</code> 패키지를 찾을 수 없는 경우, 공식 Grafana 저장소를 추가해야 합니다.<br data-start="61" data-end="64" />아래 단계에 따라 Grafana를 올바르게 설치해보세요.</p>
<hr data-start="99" data-end="102" />
<h2 data-start="104" data-end="128"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="109" data-end="128">1. APT 저장소 업데이트</strong></h2>
<p data-start="129" data-end="151">먼저 시스템 패키지를 업데이트하세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo apt update &amp;&amp; sudo apt upgrade -y<br />
</code></div>
</div>
<hr data-start="202" data-end="205" />
<h2 data-start="207" data-end="236"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="212" data-end="236">2. Grafana 공식 저장소 추가</strong></h2>
<p data-start="237" data-end="300">Debian 계열(라즈비안 포함)에서 Grafana를 설치하려면 <strong data-start="273" data-end="287">공식 패키지 저장소</strong>를 추가해야 합니다.</p>
<h3 data-start="302" data-end="325"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="309" data-end="325">(1) GPG 키 추가</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo <span class="hljs-built_in">mkdir</span> -p /etc/apt/keyrings<br />
curl -fsSL https://packages.grafana.com/gpg.key | sudo <span class="hljs-built_in">tee</span> /etc/apt/keyrings/grafana.asc<br />
</code></div>
</div>
<h3 data-start="458" data-end="491"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="465" data-end="491">(2) 저장소 추가 (Stable 버전)</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh"><span class="hljs-built_in">echo</span> <span class="hljs-string">"deb [signed-by=/etc/apt/keyrings/grafana.asc] https://packages.grafana.com/oss/deb stable main"</span> | sudo <span class="hljs-built_in">tee</span> /etc/apt/sources.list.d/grafana.list<br />
</code></div>
</div>
<hr data-start="653" data-end="656" />
<h2 data-start="658" data-end="694"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="663" data-end="694">3. 패키지 목록 업데이트 및 Grafana 설치</strong></h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo apt update<br />
sudo apt install -y grafana<br />
</code></div>
</div>
<p data-start="749" data-end="793"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="751" data-end="777">grafana-server --version</code> 실행하여 버전 확인 가능</p>
<hr data-start="795" data-end="798" />
<h2 data-start="800" data-end="838"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="805" data-end="838">4. Grafana 실행 및 부팅 시 자동 실행 설정</strong></h2>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo systemctl <span class="hljs-built_in">enable</span> grafana-server --now<br />
</code></div>
</div>
<p data-start="892" data-end="941"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="894" data-end="916">http://라즈베리파이IP:3000</code>으로 접속하여 정상 작동하는지 확인하세요.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/240/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OpenProject_Installation, Error debugging</title>
		<link>https://korduck.duckdns.org/236/</link>
					<comments>https://korduck.duckdns.org/236/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Wed, 19 Mar 2025 23:00:17 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=236</guid>

					<description><![CDATA[1. 컨테이너가 정상적으로 실행되고 있는지 확인 먼저 docker ps 명령어로 OpenProject 컨테이너가 실행 중인지 확인하세요. sh 복사편집 docker ps 출력 예시: bash 복사편집 CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES abcd1234 openproject/community:12 "docker-entrypoint.s…" Up 5 minutes 0.0.0.0:8080-&#62;80/tcp openproject &#160; 2. 포트가 제대로 열려 있는지 확인 호스트에서 OpenProject 컨테이너의 포트가 정상적으로 열려 있는지 확인합니다. sh 복사편집 ... <a title="OpenProject_Installation, Error debugging" class="read-more" href="https://korduck.duckdns.org/236/" aria-label="OpenProject_Installation, Error debugging에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h2 data-start="59" data-end="94"><strong data-start="62" data-end="92">1. 컨테이너가 정상적으로 실행되고 있는지 확인</strong></h2>
<p data-start="95" data-end="148">먼저 <code data-start="98" data-end="109">docker ps</code> 명령어로 OpenProject 컨테이너가 실행 중인지 확인하세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker ps<br />
</code></div>
</div>
<p data-start="170" data-end="176">출력 예시:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre">CONTAINER ID   IMAGE                         COMMAND                  STATUS          PORTS                  NAMES<br />
abcd1234       openproject/community:12      <span class="hljs-string">"docker-entrypoint.s…"</span>   Up 5 minutes    0.0.0.0:8080-&gt;80/tcp   openproject<br />
</code></div>
</div>
<p>&nbsp;</p>
<h2 data-start="567" data-end="596"><strong data-start="570" data-end="594">2. 포트가 제대로 열려 있는지 확인</strong></h2>
<p data-start="597" data-end="644">호스트에서 OpenProject 컨테이너의 포트가 정상적으로 열려 있는지 확인합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo netstat -tulnp | grep 8080<br />
</code></div>
</div>
<p data-start="688" data-end="690">또는</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">ss -tulnp | grep 8080<br />
</code></div>
</div>
<p data-start="723" data-end="729">출력 예시:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">nginx</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-attribute">tcp</span>   LISTEN   <span class="hljs-number">0</span>   <span class="hljs-number">128</span>   <span class="hljs-number">0.0.0.0:8080</span>   <span class="hljs-number">0.0.0.0</span>:*   -</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h2 data-start="1210" data-end="1239"><strong data-start="1213" data-end="1237">4. Docker 네트워크 설정 확인</strong></h2>
<p data-start="1240" data-end="1272">Docker의 네트워크 설정에 문제가 있을 수도 있습니다.</p>
<p data-start="1274" data-end="1286">현재 네트워크를 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker network <span class="hljs-built_in">ls</span></code></div>
</div>
<p data-start="1315" data-end="1342">OpenProject 컨테이너의 IP 주소 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker inspect openproject | grep <span class="hljs-string">"IPAddress"</span></code></div>
</div>
<p data-start="1399" data-end="1456">이후 해당 IP 주소로 직접 접속을 시도해 보세요. 예를 들어, <code data-start="1435" data-end="1447">172.18.0.2</code>가 출력되었다면:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">cpp</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre">http:<span class="hljs-comment">//172.18.0.2:80</span></code></div>
</div>
<p data-start="1486" data-end="1496">에 접속해 봅니다.</p>
<p data-start="1498" data-end="1601">만약 <code data-start="1501" data-end="1523">0.0.0.0:8080-&gt;80/tcp</code>가 아니라 <code data-start="1529" data-end="1553">127.0.0.1:8080-&gt;80/tcp</code>로 매핑되어 있다면, 호스트 머신에서만 접속이 가능하므로 다음과 같이 수정해야 합니다.</p>
<p data-start="1603" data-end="1647"><code data-start="1603" data-end="1623">docker-compose.yml</code>의 <code data-start="1625" data-end="1632">ports</code> 부분을 다음과 같이 변경:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">yaml</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-yaml"><span class="hljs-attr">ports:</span><br />
      <span class="hljs-bullet">-</span> <span class="hljs-string">"0.0.0.0:8080:80"</span></code></div>
</div>
<p data-start="1697" data-end="1714">변경 후 컨테이너를 다시 시작:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker-compose down<br />
docker-compose up -d</code></div>
</div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h2 data-start="832" data-end="867"><strong data-start="835" data-end="867">3. 데이터베이스 (PostgreSQL) 문제 확인</strong></h2>
<p data-start="868" data-end="962">OpenProject는 PostgreSQL을 사용합니다. PostgreSQL이 제대로 실행되지 않으면 <code data-start="925" data-end="946">Service Unavailable</code> 오류가 발생할 수 있습니다.</p>
<p data-start="964" data-end="1006">컨테이너 내부에서 PostgreSQL 서비스가 정상적으로 실행 중인지 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker <span class="hljs-built_in">exec</span> -it openproject bash<br />
ps aux | grep postgres<br />
</code></div>
</div>
<p data-start="1073" data-end="1088"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1076" data-end="1087">정상적인 경우</strong>:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">yaml</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-string">postgres</span>   <span class="hljs-number">123</span>  <span class="hljs-number">0.0</span>  <span class="hljs-number">0.1</span> <span class="hljs-number">123456</span> <span class="hljs-number">7890</span> <span class="hljs-string">?</span>  <span class="hljs-string">Ss</span>   <span class="hljs-number">10</span><span class="hljs-string">:00</span>   <span class="hljs-number">0</span><span class="hljs-string">:00</span> <span class="hljs-string">postgres</span></code></div>
</div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h2 data-start="158" data-end="182"><strong data-start="161" data-end="182"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. HTTP로 접속해 보기</strong></h2>
<p data-start="183" data-end="304">기본적으로 OpenProject는 **HTTP(포트 80)**를 사용합니다. 만약 <code data-start="229" data-end="253">https://localhost:8080</code>으로 접속하고 있다면, <code data-start="266" data-end="289">http://localhost:8080</code>으로 접속을 시도하세요.</p>
<p data-start="306" data-end="353"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="309" data-end="319">확인 방법:</strong><br data-start="319" data-end="322" />웹 브라우저 주소창에 다음을 입력하고 접속해 보세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">arduino</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre">http:<span class="hljs-comment">//localhost:8080</span></code></div>
</div>
<p data-start="384" data-end="402"><strong data-start="384" data-end="400"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 정상 접속된다면:</strong></p>
<ul data-start="403" data-end="521">
<li data-start="403" data-end="447">OpenProject가 HTTPS를 사용하도록 설정되지 않은 상태입니다.</li>
<li data-start="448" data-end="521">HTTPS를 사용하려면 **Reverse Proxy(Nginx)**를 설정해야 합니다. (아래 <strong data-start="503" data-end="515">6번 해결 방법</strong> 참고)</li>
</ul>
<hr data-start="523" data-end="526" />
<h2 data-start="528" data-end="566"><strong data-start="531" data-end="564"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. OpenProject 컨테이너의 포트 확인</strong></h2>
<p data-start="567" data-end="614">먼저, OpenProject 컨테이너가 올바른 포트로 실행되고 있는지 확인하세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker ps | grep openproject<br />
</code></div>
</div>
<p data-start="655" data-end="661">출력 예시:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre">CONTAINER ID   IMAGE                      COMMAND                  CREATED       STATUS       PORTS                            NAMES<br />
cd8524993568   openproject/community:12   <span class="hljs-string">"./docker/prod/entry…"</span>   3 hours ago   Up 3 hours   0.0.0.0:8080-&gt;80/tcp             openproject<br />
</code></div>
</div>
<p data-start="942" data-end="958"><strong data-start="942" data-end="956"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 올바른 상태:</strong></p>
<ul data-start="959" data-end="1035">
<li data-start="959" data-end="1035"><code data-start="961" data-end="983">0.0.0.0:8080-&gt;80/tcp</code> <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br data-start="985" data-end="988" />→ 이 경우, <code data-start="998" data-end="1021">http://라즈베리파이-IP:8080</code>으로 접속해야 합니다.</li>
</ul>
<p data-start="1037" data-end="1071"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1040" data-end="1069">잘못된 상태 (예: 포트 443만 열려 있음)</strong></p>
<ul data-start="1072" data-end="1165">
<li data-start="1072" data-end="1165"><code data-start="1074" data-end="1096">0.0.0.0:443-&gt;443/tcp</code> <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br data-start="1098" data-end="1101" />→ HTTPS만 활성화된 상태일 수 있음. 이 경우, <code data-start="1133" data-end="1152">https://라즈베리파이-IP</code>로 접속해야 합니다.</li>
</ul>
<hr data-start="1167" data-end="1170" />
<h2 data-start="1172" data-end="1207"><strong data-start="1175" data-end="1205"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. OpenProject 컨테이너 재시작</strong></h2>
<p data-start="1208" data-end="1236">설정이 꼬여 있다면 컨테이너를 재시작해 보세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker-compose restart<br />
</code></div>
</div>
<p data-start="1270" data-end="1286">또는 개별 컨테이너를 재시작:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker restart openproject<br />
</code></div>
</div>
<p data-start="1324" data-end="1345">이후, 다시 접속을 시도해 보세요.</p>
<hr data-start="1347" data-end="1350" />
<h2 data-start="1352" data-end="1389"><strong data-start="1355" data-end="1387"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4. 브라우저 캐시 및 SSL 설정 문제 해결</strong></h2>
<p data-start="1390" data-end="1424">브라우저 캐시 또는 SSL 설정이 영향을 줄 수 있습니다.</p>
<p data-start="1426" data-end="1441"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1429" data-end="1439">해결 방법:</strong></p>
<ul data-start="1442" data-end="1579">
<li data-start="1442" data-end="1501"><code data-start="1444" data-end="1462">Ctrl + Shift + R</code> 또는 <code data-start="1466" data-end="1483">Cmd + Shift + R</code> (Mac)으로 강제 새로고침</li>
<li data-start="1502" data-end="1522">다른 브라우저에서 접속 테스트</li>
<li data-start="1523" data-end="1579">브라우저에서 <strong data-start="1532" data-end="1559">고급 옵션 → 예외적으로 사이트 방문 허용</strong> (HTTPS 인증서 경고 무시)</li>
</ul>
</div>
<h2 data-start="381" data-end="414"><strong data-start="384" data-end="414"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. OpenProject 환경 변수 확인</strong></h2>
<p data-start="415" data-end="450">먼저, OpenProject 컨테이너의 환경 변수를 확인하세요.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker <span class="hljs-built_in">exec</span> -it openproject <span class="hljs-built_in">env</span> | grep OPENPROJECT_HTTPS<br />
</code></div>
</div>
<p data-start="519" data-end="528">출력 결과 예시:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">ini</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre"><span class="hljs-attr">OPENPROJECT_HTTPS</span>=<span class="hljs-literal">true</span><br />
</code></div>
</div>
<p data-start="560" data-end="631"><strong data-start="560" data-end="573"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 해결 방법:</strong><br data-start="573" data-end="576" />만약 <code data-start="579" data-end="603">OPENPROJECT_HTTPS=true</code>로 설정되어 있다면, 이를 비활성화해야 합니다.</p>
<p data-start="633" data-end="684"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="636" data-end="682">환경 변수 수정 방법 (<code data-start="651" data-end="671">docker-compose.yml</code> 확인 &amp; 수정)</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">nano docker-compose.yml<br />
</code></div>
</div>
<p data-start="719" data-end="736">아래 항목을 찾아서 수정하세요.</p>
<p data-start="738" data-end="760"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6a8.png" alt="🚨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="741" data-end="758">수정 전 (문제의 원인)</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">yaml</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-yaml"><span class="hljs-attr">environment:</span><br />
  <span class="hljs-attr">OPENPROJECT_HTTPS:</span> <span class="hljs-string">"true"</span>  <span class="hljs-comment"># 이 설정이 있으면 HTTP -&gt; HTTPS로 강제 리디렉션됨</span><br />
</code></div>
</div>
<p data-start="851" data-end="882"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="853" data-end="880">수정 후 (HTTPS 강제 리디렉션 해제)</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">yaml</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-yaml"><span class="hljs-attr">environment:</span><br />
  <span class="hljs-attr">OPENPROJECT_HTTPS:</span> <span class="hljs-string">"false"</span><br />
</code></div>
</div>
<p data-start="938" data-end="960"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="941" data-end="958">수정 후 컨테이너 재시작</strong></p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker-compose down<br />
docker-compose up -d<br />
</code></div>
</div>
<p data-start="1012" data-end="1057">이제 다시 <strong data-start="1018" data-end="1051">HTTP로 접속(<code data-start="1029" data-end="1048">http://172.18.0.2</code>)</strong> 해보세요.</p>
<hr data-start="1059" data-end="1062" />
<h2 data-start="1064" data-end="1097"><strong data-start="1067" data-end="1097"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. 브라우저 캐시 및 HSTS 문제 해결</strong></h2>
<p data-start="1098" data-end="1169">한 번이라도 <strong data-start="1105" data-end="1120">HTTPS로 리디렉션</strong>되었을 경우, 브라우저가 이를 기억(HSTS)하여 계속 HTTPS로 접근할 수 있습니다.</p>
<p data-start="1171" data-end="1186"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1174" data-end="1184">해결 방법:</strong></p>
<ol data-start="1187" data-end="1466">
<li data-start="1187" data-end="1262"><strong data-start="1190" data-end="1206">브라우저 강제 새로고침</strong>:
<ul data-start="1213" data-end="1262">
<li data-start="1213" data-end="1262"><code data-start="1215" data-end="1233">Ctrl + Shift + R</code> 또는 <code data-start="1237" data-end="1254">Cmd + Shift + R</code> (Mac)</li>
</ul>
</li>
<li data-start="1263" data-end="1328"><strong data-start="1266" data-end="1280">브라우저 캐시 삭제</strong>
<ul data-start="1286" data-end="1328">
<li data-start="1286" data-end="1328"><code data-start="1288" data-end="1308">Ctrl + Shift + Del</code>을 눌러 캐시 삭제 후 다시 시도</li>
</ul>
</li>
<li data-start="1329" data-end="1466"><strong data-start="1332" data-end="1359">HSTS 설정 초기화 (Chrome 기준)</strong>
<ul data-start="1365" data-end="1466">
<li data-start="1365" data-end="1402"><code data-start="1367" data-end="1397">chrome://net-internals/#hsts</code> 접속</li>
<li data-start="1406" data-end="1466"><code data-start="1408" data-end="1441">Delete domain security policies</code>에서 <code data-start="1444" data-end="1456">172.18.0.2</code> 입력 후 삭제</li>
</ul>
</li>
</ol>
<p data-start="1468" data-end="1505">이후 <code data-start="1471" data-end="1490">http://172.18.0.2</code>로 다시 접속을 시도하세요.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/236/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OpenProject 설치 (w. Raspberry Pi, feat. docker)</title>
		<link>https://korduck.duckdns.org/234/</link>
					<comments>https://korduck.duckdns.org/234/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Wed, 19 Mar 2025 22:54:57 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=234</guid>

					<description><![CDATA[1. 사전 준비 1-1. 라즈베리파이 환경 확인 sh 복사편집 uname -m 출력 결과가 aarch64라면 64비트 OS를 사용 중이며, armv7l이면 32비트 OS입니다. OpenProject는 64비트 ARM 환경에서만 동작하므로, 32비트 OS를 사용 중이라면 64비트 OS(Raspberry Pi OS 64-bit)로 교체하세요. 1-2. Docker 및 Docker Compose 설치 Docker 설치 sh 복사편집 curl -fsSL https://get.docker.com &#124; sudo sh sudo usermod -aG ... <a title="OpenProject 설치 (w. Raspberry Pi, feat. docker)" class="read-more" href="https://korduck.duckdns.org/234/" aria-label="OpenProject 설치 (w. Raspberry Pi, feat. docker)에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[<h2 data-start="148" data-end="163"><strong data-start="151" data-end="163">1. 사전 준비</strong></h2>
<h3 data-start="164" data-end="189"><strong data-start="168" data-end="189">1-1. 라즈베리파이 환경 확인</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh"><span class="hljs-built_in">uname</span> -m<br />
</code></div>
</div>
<p data-start="209" data-end="359">출력 결과가 <code data-start="216" data-end="225">aarch64</code>라면 64비트 OS를 사용 중이며, <code data-start="245" data-end="253">armv7l</code>이면 32비트 OS입니다. OpenProject는 64비트 ARM 환경에서만 동작하므로, 32비트 OS를 사용 중이라면 64비트 OS(Raspberry Pi OS 64-bit)로 교체하세요.</p>
<h3 data-start="361" data-end="400"><strong data-start="365" data-end="400">1-2. Docker 및 Docker Compose 설치</strong></h3>
<h4 data-start="401" data-end="419"><strong data-start="406" data-end="419">Docker 설치</strong></h4>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">curl -fsSL https://get.docker.com | sudo sh<br />
sudo usermod -aG docker <span class="hljs-variable">$USER</span><br />
newgrp docker<br />
</code></div>
</div>
<p data-start="518" data-end="524">설치 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker --version<br />
</code></div>
</div>
<h4 data-start="553" data-end="579"><strong data-start="558" data-end="579">Docker Compose 설치</strong></h4>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo apt install -y docker-compose<br />
docker-compose --version<br />
</code></div>
</div>
<hr data-start="651" data-end="654" />
<h2 data-start="656" data-end="680"><strong data-start="659" data-end="680">2. OpenProject 설치</strong></h2>
<h3 data-start="681" data-end="714"><strong data-start="685" data-end="714">2-1. Docker Compose 파일 생성</strong></h3>
<p data-start="715" data-end="760">설치할 폴더로 이동하고, <code data-start="729" data-end="749">docker-compose.yml</code> 파일을 생성합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh"><span class="hljs-built_in">mkdir</span> ~/openproject &amp;&amp; <span class="hljs-built_in">cd</span> ~/openproject<br />
nano docker-compose.yml<br />
</code></div>
</div>
<p data-start="836" data-end="855">다음 내용을 복사하여 붙여넣습니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">yaml</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr">
<p><code class="!whitespace-pre language-yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">'3'</span></code></p>
<p><span class="hljs-attr">services:</span><br />
<span class="hljs-attr">openproject:</span><br />
<span class="hljs-attr">image:</span> <span class="hljs-string">openproject/community:12</span><br />
<span class="hljs-attr">container_name:</span> <span class="hljs-string">openproject</span><br />
<span class="hljs-attr">restart:</span> <span class="hljs-string">always</span><br />
<span class="hljs-attr">ports:</span><br />
<span class="hljs-bullet">&#8211;</span> <span class="hljs-string">&#8220;8080:80&#8221;</span><br />
<span class="hljs-attr">environment:</span><br />
<span class="hljs-attr">OPENPROJECT_HTTPS:</span> <span class="hljs-string">&#8220;true&#8221;</span><br />
<span class="hljs-attr">SECRET_KEY_BASE:</span> <span class="hljs-string">&#8220;your_secret_key&#8221;</span><br />
<span class="hljs-attr">volumes:</span><br />
<span class="hljs-bullet">&#8211;</span> <span class="hljs-string">openproject_data:/var/openproject/assets</span><br />
<span class="hljs-bullet">&#8211;</span> <span class="hljs-string">openproject_db:/var/openproject/pgdata</span></p>
<p><span class="hljs-attr">volumes:</span><br />
<span class="hljs-attr">openproject_data:</span><br />
<span class="hljs-attr">openproject_db:</span></p>
</div>
</div>
<blockquote data-start="1273" data-end="1419">
<p data-start="1275" data-end="1419"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="1278" data-end="1285">주의:</strong> <code data-start="1286" data-end="1312">openproject/community:12</code>는 <code data-start="1314" data-end="1321">arm64</code>에서 실행이 가능한 최신 버전입니다.<br data-start="1341" data-end="1344" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code data-start="1349" data-end="1366">SECRET_KEY_BASE</code>는 임의의 문자열을 넣어주세요. (<code data-start="1385" data-end="1407">openssl rand -hex 32</code> 명령어로 생성 가능)</p>
</blockquote>
<hr data-start="1421" data-end="1424" />
<h3 data-start="1426" data-end="1446"><strong data-start="1430" data-end="1446">2-2. 컨테이너 실행</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker-compose up -d<br />
</code></div>
</div>
<p data-start="1479" data-end="1485">실행 확인:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker ps<br />
</code></div>
</div>
<div dir="ltr"></div>
<div dir="ltr">
<h2 data-start="1764" data-end="1787"><strong data-start="1767" data-end="1787">4. 추가 설정 (선택 사항)</strong></h2>
<h3 data-start="1788" data-end="1827"><strong data-start="1792" data-end="1827">4-1. OpenProject를 자동으로 시작하도록 설정</strong></h3>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">sudo systemctl <span class="hljs-built_in">enable</span> docker<br />
</code></div>
</div>
<h3 data-start="1868" data-end="1887"><strong data-start="1872" data-end="1887">4-2. 데이터 백업</strong></h3>
<p data-start="1888" data-end="1926">OpenProject의 데이터를 정기적으로 백업하는 것이 중요합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">docker-compose down<br />
tar -czvf openproject_backup.tar.gz ~/openproject<br />
</code></div>
</div>
<p data-start="2007" data-end="2013">복원할 때:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">sh</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-sh">tar -xzvf openproject_backup.tar.gz -C ~/<br />
<span class="hljs-built_in">cd</span> ~/openproject<br />
docker-compose up -d<br />
</code></div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/234/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nextcloud appstore 정상적으로 로딩되지 않을 때 + log파일 관리</title>
		<link>https://korduck.duckdns.org/218/</link>
					<comments>https://korduck.duckdns.org/218/#respond</comments>
		
		<dc:creator><![CDATA[Joinsoo]]></dc:creator>
		<pubDate>Thu, 13 Mar 2025 01:41:49 +0000</pubDate>
				<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">https://korduck.duckdns.org/?p=218</guid>

					<description><![CDATA[sudo -u www-data php /var/www/nextcloud/occ config:system:set appstoreurl &#8211;value=&#8221;https://apps.nextcloud.com/api/v1&#8243; &#160; 🔄 4️⃣ 자동 로그 관리 자동으로 로그를 관리하려면 logrotate 외에도, cron을 활용하여 주기적으로 오래된 로그 파일을 삭제하는 스크립트를 만들 수 있습니다. 1. 크론 잡(Cron Job) 설정 /etc/cron.daily/ 폴더에 자동으로 로그를 정리하는 스크립트를 추가할 수 있습니다. 예를 들어, /etc/cron.daily/clean_old_logs라는 이름으로 로그 정리 스크립트를 작성합니다. bash 복사편집 #!/bin/bash ... <a title="Nextcloud appstore 정상적으로 로딩되지 않을 때 + log파일 관리" class="read-more" href="https://korduck.duckdns.org/218/" aria-label="Nextcloud appstore 정상적으로 로딩되지 않을 때 + log파일 관리에 대해 더 자세히 알아보세요">더 읽기</a>]]></description>
										<content:encoded><![CDATA[
<p>sudo -u www-data php /var/www/nextcloud/occ config:system:set appstoreurl &#8211;value=&#8221;https://apps.nextcloud.com/api/v1&#8243;</p>
<p>&nbsp;</p>
<h2 data-start="2315" data-end="2337"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="2321" data-end="2337">4&#x20e3; 자동 로그 관리</strong></h2>
<p data-start="2339" data-end="2426">자동으로 로그를 관리하려면 <code data-start="2354" data-end="2365">logrotate</code> 외에도, <code data-start="2371" data-end="2377">cron</code>을 활용하여 주기적으로 오래된 로그 파일을 삭제하는 <strong data-start="2406" data-end="2414">스크립트</strong>를 만들 수 있습니다.</p>
<h3 data-start="2428" data-end="2456">1. <strong data-start="2435" data-end="2456">크론 잡(Cron Job) 설정</strong></h3>
<p data-start="2457" data-end="2511"><code data-start="2457" data-end="2475">/etc/cron.daily/</code> 폴더에 자동으로 로그를 정리하는 스크립트를 추가할 수 있습니다.</p>
<p data-start="2513" data-end="2578">예를 들어, <code data-start="2520" data-end="2552">/etc/cron.daily/clean_old_logs</code>라는 이름으로 로그 정리 스크립트를 작성합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash"><span class="hljs-meta">#!/bin/bash</span>

<span class="hljs-comment"># 30일 이상된 로그 파일 삭제</span>
find /var/log -<span class="hljs-built_in">type</span> f -name <span class="hljs-string">"*.log"</span> -mtime +30 -<span class="hljs-built_in">exec</span> <span class="hljs-built_in">rm</span> -f {} \;
</code></div>
</div>
<p data-start="2690" data-end="2709">스크립트에 실행 권한을 추가합니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">sudo <span class="hljs-built_in">chmod</span> +x /etc/cron.daily/clean_old_logs
</code></div>
</div>
<p data-start="2769" data-end="2807">이렇게 설정하면 <strong data-start="2778" data-end="2784">매일</strong> 오래된 로그 파일을 자동으로 삭제합니다.</p>
<p data-start="2769" data-end="2807"> </p>
<p data-start="2769" data-end="2807"> </p>
<h2 data-start="793" data-end="829"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong data-start="799" data-end="829">2&#x20e3; 로그 회전(Log Rotation) 설정</strong></h2>
<p data-start="831" data-end="938">로그 파일이 커지지 않도록 <strong data-start="846" data-end="855">로그 회전</strong>(log rotation)을 설정하는 것이 중요합니다. <code data-start="886" data-end="897">logrotate</code>는 로그 파일을 자동으로 회전시키고 오래된 로그를 압축하거나 삭제해줍니다.</p>
<h3 data-start="940" data-end="964">1. <code data-start="947" data-end="958">logrotate</code> 기본 설정</h3>
<p data-start="965" data-end="1086"><code data-start="965" data-end="976">logrotate</code>는 일반적으로 <code data-start="984" data-end="1005">/etc/logrotate.conf</code> 파일을 사용하여 시스템 로그 회전 설정을 관리합니다. 개별 로그 파일에 대한 설정은 <code data-start="1053" data-end="1072">/etc/logrotate.d/</code> 폴더 내에서 관리됩니다.</p>
<p data-start="1088" data-end="1091">예시:</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">/var/log/*.<span class="hljs-built_in">log</span> {
    daily             <span class="hljs-comment"># 매일 로그 회전</span>
    rotate 7          <span class="hljs-comment"># 7일치 로그를 보관</span>
    compress          <span class="hljs-comment"># 오래된 로그 파일 압축</span>
    missingok         <span class="hljs-comment"># 로그 파일이 없어도 에러를 발생시키지 않음</span>
    notifempty        <span class="hljs-comment"># 비어있는 로그 파일은 회전하지 않음</span>
    create 0640 root root  <span class="hljs-comment"># 새로 생성된 로그 파일의 권한 설정</span>
}
</code></div>
</div>
<p data-start="1370" data-end="1475">이 설정은 <code data-start="1376" data-end="1392">/var/log/*.log</code> 패턴에 맞는 로그 파일을 <strong data-start="1407" data-end="1419">매일 회전시키고</strong> 7일간 보관한 후 압축합니다. 이와 같은 설정은 기본적으로 대부분의 시스템 로그 파일에 적용됩니다.</p>
<h3 data-start="1477" data-end="1517">2. <code data-start="1484" data-end="1503">/etc/logrotate.d/</code>에서 특정 로그 회전 설정</h3>
<p data-start="1518" data-end="1584">웹 서버, 데이터베이스, 애플리케이션 로그 등 각 서비스 별로도 <strong data-start="1554" data-end="1571">세부적인 로그 회전 설정</strong>을 관리할 수 있습니다.</p>
<p data-start="1586" data-end="1655">예를 들어, Apache 서버의 로그 회전 설정은 <code data-start="1614" data-end="1640">/etc/logrotate.d/apache2</code> 파일에 있을 수 있습니다.</p>
<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary">
<div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div>
<div class="sticky top-9">
<div class="absolute bottom-0 right-0 flex h-9 items-center pr-2">
<div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button class="flex gap-1 items-center select-none px-4 py-1" aria-label="복사">복사</button></span><span class="" data-state="closed"><button class="flex select-none items-center gap-1 px-4 py-1">편집</button></span></div>
</div>
</div>
<div class="overflow-y-auto p-4" dir="ltr"><code class="!whitespace-pre language-bash">/var/log/apache2/*.<span class="hljs-built_in">log</span> {
    daily
    rotate 14
    compress
    missingok
    notifempty
    create 640 www-data adm
    sharedscripts
    postrotate
        <span class="hljs-keyword">if</span> [ -f /var/run/apache2.pid ]; <span class="hljs-keyword">then</span>
            systemctl reload apache2 &gt; /dev/null
        <span class="hljs-keyword">fi</span>
    endscript
}
</code></div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://korduck.duckdns.org/218/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
