<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tailscale on Chanyeol Dev</title>
    <link>https://chanyeols.com/tags/tailscale/</link>
    <description>Recent content in Tailscale on Chanyeol Dev</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Sat, 04 Apr 2026 09:00:00 +0900</lastBuildDate>
    <atom:link href="https://chanyeols.com/tags/tailscale/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>노트북 한 대로 홈서버 구축하기 - 12편 완전 정복 총정리</title>
      <link>https://chanyeols.com/posts/part-00-summary/</link>
      <pubDate>Sat, 04 Apr 2026 09:00:00 +0900</pubDate>
      <guid>https://chanyeols.com/posts/part-00-summary/</guid>
      <description>ThinkPad 노트북 한 대로 NAS, 사진 관리, 비밀번호 관리, 모니터링, 보안, 자동 백업, 커스텀 대시보드까지 구축한 홈서버 구축기 12편을 한 페이지로 정리합니다.</description>
      <content:encoded><![CDATA[<h2 id="시작은-단순했다">시작은 단순했다</h2>
<p>클라우드 비용이 아깝고, NAS도 필요하고, 사이드 프로젝트 서버도 있으면 좋겠고. 마침 집에 안 쓰는 ThinkPad가 있었다.</p>
<p>그렇게 시작된 홈서버 구축기가 어느새 12편이 됐다.</p>
<hr>
<h2 id="최종-구성">최종 구성</h2>
<p><img alt="전체 아키텍처 구성도" loading="lazy" src="/images/homeserver-01-architecture.png"></p>
<ul>
<li><strong>기기</strong>: ThinkPad E15 Gen3 (Ryzen 5 5600U, RAM 16GB)</li>
<li><strong>OS</strong>: Ubuntu Server 24.04 LTS</li>
<li><strong>네트워크</strong>: Tailscale VPN + OCI Nginx 리버스 프록시</li>
<li><strong>도메인</strong>: yourdomain.com (Cloudflare)</li>
<li><strong>스토리지</strong>: 256GB SSD (OS/Docker) + 1TB SSD (/mnt/data, NTFS)</li>
</ul>
<hr>
<h2 id="운영-중인-서비스-전체-목록">운영 중인 서비스 전체 목록</h2>
<table>
  <thead>
      <tr>
          <th>포트</th>
          <th>서비스</th>
          <th>접근 방식</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>2283</td>
          <td>Immich (사진 관리)</td>
          <td>도메인 (OCI 프록시)</td>
      </tr>
      <tr>
          <td>9090</td>
          <td>Filebrowser (파일 관리)</td>
          <td>도메인 (OCI 프록시)</td>
      </tr>
      <tr>
          <td>11000</td>
          <td>Vaultwarden (비밀번호)</td>
          <td>도메인 (OCI 프록시)</td>
      </tr>
      <tr>
          <td>13000</td>
          <td>Grafana (모니터링)</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>19000</td>
          <td>Portainer (Docker GUI)</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>19090</td>
          <td>Prometheus</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>19100</td>
          <td>Node Exporter</td>
          <td>내부 수집용</td>
      </tr>
      <tr>
          <td>23000</td>
          <td>컨테이너 대시보드 (React)</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>28080</td>
          <td>컨테이너 대시보드 (Spring)</td>
          <td>Tailscale VPN</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="12편-한눈에-보기">12편 한눈에 보기</h2>
<h3 id="1편--왜-홈서버인가--전체-아키텍처">1편 — 왜 홈서버인가? + 전체 아키텍처</h3>
<p><a href="/posts/part-01-intro">→ 보러가기</a></p>
<p>클라우드 대신 홈서버를 선택한 이유와 Tailscale + OCI + Cloudflare로 구성한 전체 아키텍처를 소개한다.</p>
<hr>
<h3 id="2편--ubuntu-server-설치--tailscale-vpn">2편 — Ubuntu Server 설치 + Tailscale VPN</h3>
<p><a href="/posts/part-02-ubuntu-tailscale">→ 보러가기</a></p>
<p>Ventoy로 Ubuntu Server 24.04를 설치하고, Tailscale VPN으로 홈서버와 OCI 인스턴스를 하나의 사설 네트워크로 묶었다.</p>
<hr>
<h3 id="3편--외장-ssd-마운트--filebrowser-원격-파일-관리">3편 — 외장 SSD 마운트 + Filebrowser 원격 파일 관리</h3>
<p><a href="/posts/part-03-ssd-filebrowser">→ 보러가기</a></p>
<p>NTFS 외장 SSD를 마운트하고 ntfsfix로 읽기/쓰기 문제를 해결했다. Docker로 Filebrowser를 띄워서 브라우저에서 파일을 관리할 수 있게 됐다.</p>
<hr>
<h3 id="4편--immich로-구글-포토-대체하기">4편 — Immich로 구글 포토 대체하기</h3>
<p><a href="/posts/part-04-immich">→ 보러가기</a></p>
<p><img alt="Immich 접속 화면" loading="lazy" src="/images/homeserver-04-immich.png"></p>
<p>Docker Compose 설치 과정에서 구버전 docker, NTFS 권한 문제 등 4가지 트러블슈팅을 겪었다. DB는 반드시 ext4에 둬야 한다.</p>
<hr>
<h3 id="5편--vaultwarden으로-비밀번호-자체-호스팅">5편 — Vaultwarden으로 비밀번호 자체 호스팅</h3>
<p><a href="/posts/part-05-vaultwarden">→ 보러가기</a></p>
<p>구글 비밀번호를 CSV로 내보내서 Vaultwarden으로 이전했다. Bitwarden 브라우저 확장과 연동하면 기존과 사용감이 동일하다.</p>
<hr>
<h3 id="6편--portainer-ce로-docker-gui-관리">6편 — Portainer CE로 Docker GUI 관리</h3>
<p><a href="/posts/part-06-portainer">→ 보러가기</a></p>
<p><img alt="Portainer 대시보드" loading="lazy" src="/images/homeserver-06-portainer.png"></p>
<p>컨테이너가 8개를 넘어가면서 CLI 관리가 한계에 달했다. Portainer CE로 웹 UI에서 컨테이너를 관리한다. 보안상 VPN 안에서만 접근한다.</p>
<hr>
<h3 id="7편--grafana--prometheus로-홈서버-모니터링">7편 — Grafana + Prometheus로 홈서버 모니터링</h3>
<p><a href="/posts/part-07-monitoring">→ 보러가기</a></p>
<p><img alt="Grafana 모니터링 대시보드" loading="lazy" src="/images/homeserver-07-grafana.png"></p>
<p>Node Exporter를 홈서버 + OCI 두 곳에 설치하고, Prometheus가 Tailscale VPN을 통해 두 서버의 메트릭을 수집한다. ThinkPad 배터리 메트릭도 추가했다.</p>
<hr>
<h3 id="8편--fail2ban으로-ssh-브루트포스-차단">8편 — Fail2ban으로 SSH 브루트포스 차단</h3>
<p><a href="/posts/part-08-fail2ban">→ 보러가기</a></p>
<p>auth.log를 열어보니 수천 줄의 SSH 로그인 시도가 쌓여 있었다. Fail2ban으로 자동 차단하고, recidive jail로 반복 공격자는 7일 장기 차단한다.</p>
<hr>
<h3 id="9편--certbot-expand로-ssl-서브도메인-추가">9편 — certbot &ndash;expand로 SSL 서브도메인 추가</h3>
<p><a href="/posts/part-09-ssl">→ 보러가기</a></p>
<p>서비스가 늘어날 때마다 SSL 인증서에 서브도메인을 추가해야 한다. <code>--expand</code> 옵션과 셸 스크립트로 관리하면 <code>-d</code> 한 줄만 추가하면 된다.</p>
<p><img alt="브라우저 인증서 정보" loading="lazy" src="/images/homeserver-09-browser-cert.png"></p>
<hr>
<h3 id="10편--postgresql-자동-백업-pg_dump--cron">10편 — PostgreSQL 자동 백업 (pg_dump + cron)</h3>
<p><a href="/posts/part-10-postgresql-backup">→ 보러가기</a></p>
<p>Immich DB가 날아가면 앨범, 태그, 얼굴 인식 데이터가 전부 사라진다. <code>docker exec</code>으로 pg_dumpall을 실행하고 cron으로 매일 새벽 3시에 자동 백업한다.</p>
<hr>
<h3 id="11편--tlp--thinkfan--swap-튜닝으로-운영-최적화">11편 — TLP + thinkfan + Swap 튜닝으로 운영 최적화</h3>
<p><a href="/posts/part-11-tuning">→ 보러가기</a></p>
<p>CPU 온도 85°C → 55°C, Swap 사용률 26% → 7%. TLP 터보 부스트 비활성화와 swappiness 튜닝으로 24시간 운영에 최적화했다.</p>
<p><img alt="Grafana - Swap 튜닝 전후" loading="lazy" src="/images/homeserver-11-swap-after.png"></p>
<hr>
<h3 id="12편--직접-만든-컨테이너-대시보드-spring-boot--react--sse">12편 — 직접 만든 컨테이너 대시보드 (Spring Boot + React + SSE)</h3>
<p><a href="/posts/part-12-dashboard">→ 보러가기</a></p>
<p><img alt="커스텀 대시보드 UI" loading="lazy" src="/images/homeserver-12-dashboard-ui.png"></p>
<p>Portainer 대신 Spring Boot + React로 컨테이너 모니터링 대시보드를 직접 만들었다. SSE로 실시간 로그 스트리밍을 구현한 게 핵심이다.</p>
<hr>
<h2 id="돌아보며">돌아보며</h2>
<p>파일 서버 하나 만들려고 시작했는데 어쩌다 보니 이렇게 됐다.</p>
<p>홈서버의 가장 큰 장점은 공부할 게 계속 생긴다는 거다. 서비스 하나 올리면 모니터링이 필요하고, 모니터링 하다 보면 튜닝하고 싶어지고, 외부에 열면 보안이 신경 쓰이고. 그 과정에서 Linux, Docker, Nginx, Spring Boot, React를 실제로 써보게 된다.</p>
<p>클라우드가 편하긴 하지만, 직접 서버를 굴리는 재미는 또 다르다.</p>
]]></content:encoded>
    </item>
    <item>
      <title>노트북으로 홈서버 구축하기 - Ubuntu Server 설치 &#43; Tailscale VPN (2편)</title>
      <link>https://chanyeols.com/posts/part-02-ubuntu-tailscale/</link>
      <pubDate>Tue, 24 Mar 2026 16:00:00 +0900</pubDate>
      <guid>https://chanyeols.com/posts/part-02-ubuntu-tailscale/</guid>
      <description>Ventoy로 Ubuntu Server 24.04를 설치하고, Tailscale VPN으로 홈서버와 OCI 인스턴스를 하나의 사설 네트워크로 묶는 과정을 정리합니다.</description>
      <content:encoded><![CDATA[<h2 id="os-선택">OS 선택</h2>
<p>Windows를 그대로 쓸까, Linux native로 갈까 고민했다. Docker 운영이 메인이고 서버답게 쓰려면 Linux가 맞다. Ubuntu Server 24.04 LTS로 결정했다.</p>
<hr>
<h2 id="ubuntu-server-설치">Ubuntu Server 설치</h2>
<h3 id="준비물">준비물</h3>
<p><strong>Ventoy</strong> — USB를 부팅 드라이브로 만들어주는 도구다. 일반적인 방식은 ISO를 USB에 굽는 방식인데, Ventoy는 USB 하나에 여러 ISO를 넣고 부팅 시 선택할 수 있어서 훨씬 편하다.</p>
<ul>
<li>Ventoy 다운로드: <a href="https://github.com/ventoy/Ventoy/releases">https://github.com/ventoy/Ventoy/releases</a></li>
<li>Ubuntu Server 24.04 LTS ISO 다운로드: <a href="https://ubuntu.com/download/server">https://ubuntu.com/download/server</a></li>
</ul>
<h3 id="설치-순서">설치 순서</h3>
<p><strong>1. Ventoy2Disk.exe 실행</strong></p>
<p>USB를 꽂고 Ventoy2Disk.exe를 실행한다. 사용할 USB를 선택하고 Install을 누른다.</p>
<blockquote>
<p>⚠️ USB에 있는 데이터는 전부 지워지므로 먼저 백업할 것</p>
</blockquote>
<p><img alt="Ventoy2Disk 실행 화면" loading="lazy" src="/images/homeserver-02-ventoy.png"></p>
<p><strong>2. ISO 파일 복사</strong></p>
<p>Install 완료 후 다운로드한 Ubuntu ISO 파일을 USB에 그냥 복사하면 된다.</p>
<p><strong>3. 서버에 USB 꽂고 부팅</strong></p>
<p>Ubuntu를 설치할 노트북에 USB를 꽂고 전원을 켠다. F12를 연타해서 바이오스 부팅 메뉴 진입 후 Ventoy가 설치된 USB를 선택한다.</p>
<p>이후 Ubuntu Server 설치 과정은 안내에 따라 진행하면 된다. 특별히 복잡한 부분은 없다. 파티션은 기본값으로 잡고, SSH 서버 설치 옵션은 체크해두는 게 좋다.</p>
<hr>
<h2 id="tailscale-vpn-연결">Tailscale VPN 연결</h2>
<p>홈서버는 공인 IP가 없어서 외부에서 직접 접근이 안 된다. Tailscale을 사용하면 홈서버와 OCI 인스턴스를 같은 사설 네트워크로 묶을 수 있다.</p>
<h3 id="설치">설치</h3>
<p>Ubuntu 설치 후 터미널에서 아래 명령어를 실행한다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl -fsSL https://tailscale.com/install.sh | sh
</span></span></code></pre></div><p>설치 후 활성화:</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo tailscale up
</span></span></code></pre></div><p>실행하면 아래처럼 인증 URL이 출력된다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-plain" data-lang="plain"><span style="display:flex;"><span>To authenticate, visit:
</span></span><span style="display:flex;"><span>    https://login.tailscale.com/a/xxxxxxxxxxxxxxx
</span></span></code></pre></div><p>URL을 브라우저에서 열어서 Tailscale 계정으로 로그인하면 홈서버가 네트워크에 등록된다.</p>
<h3 id="홈서버-ip-확인">홈서버 IP 확인</h3>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>tailscale ip -4
</span></span></code></pre></div><p>이 IP(예: <code>100.109.108.36</code>)로 이제 어디서든 홈서버에 SSH 접속이 가능하다.</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ssh username@100.109.108.36
</span></span></code></pre></div><h3 id="oci-서버에도-동일하게-설치">OCI 서버에도 동일하게 설치</h3>
<p>OCI 인스턴스에도 위 과정을 그대로 반복해서 Tailscale을 설치하면 두 서버가 같은 사설 네트워크로 묶인다.</p>
<p><img alt="Tailscale 관리 콘솔 - 두 서버가 연결된 화면" loading="lazy" src="/images/homeserver-02-tailscale.png"></p>
<p>설정 완료 후 Tailscale 관리 콘솔에서 홈서버와 OCI 서버가 모두 연결된 것을 확인할 수 있다. 이제 OCI에서 홈서버로, 홈서버에서 OCI로 자유롭게 통신이 가능하다.</p>
<hr>
<h2 id="여기까지의-구성">여기까지의 구성</h2>
<pre tabindex="0"><code>[내 PC / 스마트폰]
       │  Tailscale VPN
       ▼
[홈서버 ThinkPad] ─── Tailscale VPN ─── [OCI 인스턴스]
  100.109.108.36                           100.x.x.x
</code></pre><p>Tailscale이 연결된 것만으로도 이미 꽤 쓸만한 환경이 됐다. 이제 어디서든 홈서버에 SSH로 접속해서 작업할 수 있다.</p>
<p>다음 편에서는 외장 SSD를 마운트하고 Filebrowser로 브라우저에서 파일을 관리하는 환경을 구성한다.</p>
]]></content:encoded>
    </item>
    <item>
      <title>노트북으로 홈서버 구축하기 - 왜 홈서버인가? (1편)</title>
      <link>https://chanyeols.com/posts/part-01-intro/</link>
      <pubDate>Tue, 24 Mar 2026 09:00:00 +0900</pubDate>
      <guid>https://chanyeols.com/posts/part-01-intro/</guid>
      <description>클라우드 대신 집에 남는 노트북으로 홈서버를 구축한 이유와 Tailscale &#43; OCI &#43; Docker로 구성한 전체 아키텍처를 소개합니다.</description>
      <content:encoded><![CDATA[<h2 id="왜-홈서버를-만들게-됐나">왜 홈서버를 만들게 됐나</h2>
<p>개인 블로그를 운영하면서 OCI(Oracle Cloud) 무료 인스턴스 하나를 쭉 써왔다. 1 vCPU, 1GB RAM짜리라 Hugo 정적 블로그 서빙에는 충분했는데, 문제는 점점 하고 싶은 게 늘어난다는 것이다.</p>
<ul>
<li>사진 파일이 쌓이면서 개인 NAS가 필요해졌다</li>
<li>사이드 프로젝트 돌릴 서버가 필요했다</li>
<li>비밀번호 관리도 외부 서비스 말고 직접 하고 싶었다</li>
</ul>
<p>클라우드로 커버하면 되지 않냐 싶지만, 스토리지가 좀 붙으면 요금이 눈에 띄게 올라간다. 마침 집에 안 쓰는 노트북이 하나 있었고, 거기서부터 홈서버 구축기가 시작됐다.</p>
<hr>
<h2 id="하드웨어-선택-데스크탑-대신-노트북">하드웨어 선택: 데스크탑 대신 노트북</h2>
<p>처음엔 집에 있는 데스크탑을 홈서버로 쓸까 생각했다. 그런데 데스크탑을 24시간 켜두면 전기세가 만만치 않다.</p>
<p>마침 Ryzen 5 5600U, RAM 16GB짜리 <strong>ThinkPad E15 Gen3</strong>가 있었다. 노트북이라 전력 소비가 훨씬 낮고, 배터리가 있어서 정전 시 UPS 역할도 된다. 성능도 홈서버 용도로는 충분하다.</p>
<table>
  <thead>
      <tr>
          <th>항목</th>
          <th>사양</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CPU</td>
          <td>Ryzen 5 5600U</td>
      </tr>
      <tr>
          <td>RAM</td>
          <td>16GB</td>
      </tr>
      <tr>
          <td>저장장치</td>
          <td>256GB SSD (OS/Docker) + 1TB SSD (/mnt/data)</td>
      </tr>
      <tr>
          <td>OS</td>
          <td>Ubuntu Server 24.04 LTS</td>
      </tr>
  </tbody>
</table>
<p>유선 랜 포트를 따로 뚫기가 애매해서 일단 와이파이로 연결해서 운영 중이다.</p>
<hr>
<h2 id="전체-아키텍처">전체 아키텍처</h2>
<p>핵심은 세 가지다.</p>
<p><strong>Tailscale VPN</strong> — 홈서버는 공인 IP가 없어서 외부에서 직접 접근이 안 된다. Tailscale로 홈서버와 OCI 인스턴스를 같은 사설 네트워크로 묶었다. 이렇게 하면 어디서든 VPN으로 홈서버에 접근할 수 있다.</p>
<p><strong>OCI Nginx 리버스 프록시</strong> — 기존에 Hugo 블로그를 서빙하던 OCI 인스턴스의 Nginx를 리버스 프록시로 활용한다. 외부에서 <code>photo.yourdomain.com</code>으로 접근하면 Nginx가 Tailscale VPN을 통해 홈서버의 Immich로 연결해주는 구조다.</p>
<p><strong>Cloudflare DNS</strong> — 도메인 관리는 Cloudflare에서 한다. 서브도메인 추가할 때마다 Cloudflare에서 레코드 하나 추가하고 Nginx 설정 추가하면 끝이다.</p>
<p><img alt="전체 아키텍처 구성도" loading="lazy" src="/images/homeserver-01-architecture.png"></p>
<hr>
<h2 id="운영-중인-서비스">운영 중인 서비스</h2>
<p>현재 홈서버에서 돌아가는 서비스 목록이다.</p>
<table>
  <thead>
      <tr>
          <th>포트</th>
          <th>서비스</th>
          <th>접근 방식</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>2283</td>
          <td>Immich (사진 관리)</td>
          <td>도메인 (OCI 프록시)</td>
      </tr>
      <tr>
          <td>9090</td>
          <td>Filebrowser (파일 관리)</td>
          <td>도메인 (OCI 프록시)</td>
      </tr>
      <tr>
          <td>11000</td>
          <td>Vaultwarden (비밀번호)</td>
          <td>도메인 (OCI 프록시)</td>
      </tr>
      <tr>
          <td>13000</td>
          <td>Grafana (모니터링)</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>19000</td>
          <td>Portainer (Docker GUI)</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>19090</td>
          <td>Prometheus</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>19100</td>
          <td>Node Exporter</td>
          <td>내부 수집용</td>
      </tr>
      <tr>
          <td>23000</td>
          <td>컨테이너 대시보드 (React)</td>
          <td>Tailscale VPN</td>
      </tr>
      <tr>
          <td>28080</td>
          <td>컨테이너 대시보드 (Spring)</td>
          <td>Tailscale VPN</td>
      </tr>
  </tbody>
</table>
<p>Grafana, Portainer처럼 민감한 도구는 VPN 안에서만 접근하고 외부에는 열지 않았다. Docker 소켓에 직접 접근하는 툴을 외부에 노출하면 보안상 위험하기 때문이다.</p>
<hr>
<h2 id="시리즈-구성">시리즈 구성</h2>
<p>이 구축기는 총 12편으로 구성된다.</p>
<ol>
<li><strong>왜 홈서버인가? + 전체 아키텍처</strong> ← 지금 여기</li>
<li><a href="/posts/part-02-ubuntu-tailscale">Ubuntu Server 설치 + Tailscale VPN</a></li>
<li><a href="/posts/part-03-ssd-filebrowser">외장 SSD 마운트 + Filebrowser 원격 파일 관리</a></li>
<li><a href="/posts/part-04-immich">Immich로 구글 포토 대체하기</a></li>
<li><a href="/posts/part-05-vaultwarden">Vaultwarden으로 비밀번호 자체 호스팅</a></li>
<li><a href="/posts/part-06-portainer">Portainer CE로 Docker GUI 관리</a></li>
<li><a href="/posts/part-07-monitoring">Grafana + Prometheus로 홈서버 모니터링</a></li>
<li><a href="/posts/part-08-fail2ban">Fail2ban으로 SSH 브루트포스 차단</a></li>
<li><a href="/posts/part-09-ssl">certbot &ndash;expand로 SSL 서브도메인 추가</a></li>
<li><a href="/posts/part-10-postgresql-backup">PostgreSQL 자동 백업 (pg_dump + cron)</a></li>
<li><a href="/posts/part-11-tuning">TLP + thinkfan + Swap 튜닝으로 운영 최적화</a></li>
<li><a href="/posts/part-12-dashboard">직접 만든 컨테이너 대시보드 (Spring Boot + React + SSE)</a></li>
</ol>
<p>다음 편에서는 Ubuntu Server 설치부터 Tailscale VPN 연결까지 다룬다.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
