<?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>Filebrowser on Chanyeol Dev</title>
    <link>https://chanyeols.com/tags/filebrowser/</link>
    <description>Recent content in Filebrowser on Chanyeol Dev</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Wed, 25 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://chanyeols.com/tags/filebrowser/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>노트북으로 홈서버 구축하기 - 외장 SSD 마운트 &#43; Filebrowser 원격 파일 관리 (3편)</title>
      <link>https://chanyeols.com/posts/part-03-ssd-filebrowser/</link>
      <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://chanyeols.com/posts/part-03-ssd-filebrowser/</guid>
      <description>NTFS 외장 SSD를 Ubuntu에 마운트하고, Docker로 Filebrowser를 설치해서 브라우저에서 파일을 관리하는 환경을 구성합니다. OCI Nginx 리버스 프록시와 SSL 설정까지 다룹니다.</description>
      <content:encoded><![CDATA[<h2 id="외장-ssd-마운트">외장 SSD 마운트</h2>
<p>집에 1TB SSD가 남아있어서 홈서버 스토리지로 활용하기로 했다. 기존에 Windows에서 쓰던 드라이브라 NTFS 포맷이다.</p>
<h3 id="디스크-확인">디스크 확인</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>lsblk
</span></span></code></pre></div><p>어떤 디바이스명으로 잡혔는지 확인한다.</p>
<p><img alt="lsblk 결과" loading="lazy" src="/images/homeserver-03-lsblk.png"></p>
<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 blkid /dev/nvme1n1p2
</span></span></code></pre></div><p>NTFS로 확인됐으니 마운트를 진행한다.</p>
<h3 id="마운트">마운트</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>sudo apt install ntfs-3g -y
</span></span><span style="display:flex;"><span>sudo mkdir /mnt/data
</span></span><span style="display:flex;"><span>sudo mount /dev/nvme1n1p2 /mnt/data
</span></span></code></pre></div><p><img alt="마운트 결과" loading="lazy" src="/images/homeserver-03-mount.png"></p>
<p>마운트 후 확인해보니 <code>Could not mount read-write, trying read-only</code> 메시지가 떴다. 읽기 전용으로 마운트된 것이다. Windows에서 쓰던 드라이브라 더티 플래그가 남아있어서 발생하는 문제다.</p>
<h3 id="읽기쓰기-가능하도록-재마운트">읽기/쓰기 가능하도록 재마운트</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>sudo umount /mnt/data
</span></span><span style="display:flex;"><span>sudo ntfsfix /dev/nvme1n1p2
</span></span><span style="display:flex;"><span>sudo mount /dev/nvme1n1p2 /mnt/data
</span></span></code></pre></div><p><code>ntfsfix</code>로 더티 플래그를 제거하고 다시 마운트하면 읽기/쓰기가 모두 가능해진다.</p>
<h3 id="심볼릭-링크-생성">심볼릭 링크 생성</h3>
<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>ln -s /mnt/data ~/data
</span></span></code></pre></div><hr>
<h2 id="samba-설정">Samba 설정</h2>
<p>파일 탐색기에서 네트워크 드라이브처럼 접근하고 싶다면 Samba를 설치하면 된다.</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 apt install samba -y
</span></span></code></pre></div><p>Samba 사용자 등록:</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 smbpasswd -a your-username
</span></span></code></pre></div><p><img alt="Samba 사용자 등록" loading="lazy" src="/images/homeserver-03-samba-user.png"></p>
<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 vi /etc/samba/smb.conf
</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-plain" data-lang="plain"><span style="display:flex;"><span>[data]
</span></span><span style="display:flex;"><span>   path = /mnt/data
</span></span><span style="display:flex;"><span>   browseable = yes
</span></span><span style="display:flex;"><span>   read only = no
</span></span><span style="display:flex;"><span>   valid users = your-username
</span></span></code></pre></div><p>Samba 서비스 재시작:</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 systemctl restart smbd
</span></span></code></pre></div><p>이제 Windows 파일 탐색기 주소창에 <code>\\100.109.108.36\data</code>를 입력하면 마운트된 SSD에 접근할 수 있다.</p>
<p><img alt="파일 탐색기에서 Samba 접근" loading="lazy" src="/images/homeserver-03-samba.png"></p>
<p>다만 이건 파일 탐색기 전용이라 브라우저에서 접근하려면 Filebrowser를 써야 한다.</p>
<hr>
<h2 id="docker--filebrowser-설치">Docker + Filebrowser 설치</h2>
<h3 id="docker-설치">Docker 설치</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><span style="color:#8b949e;font-style:italic"># Docker 공식 레포 추가</span>
</span></span><span style="display:flex;"><span>sudo apt install ca-certificates curl gnupg -y
</span></span><span style="display:flex;"><span>sudo install -m <span style="color:#a5d6ff">0755</span> -d /etc/apt/keyrings
</span></span><span style="display:flex;"><span>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
</span></span><span style="display:flex;"><span>echo <span style="color:#a5d6ff">&#34;deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stable&#34;</span> | sudo tee /etc/apt/sources.list.d/docker.list
</span></span><span style="display:flex;"><span>sudo apt update
</span></span><span style="display:flex;"><span>sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
</span></span></code></pre></div><p>root가 아닌 일반 계정으로 Docker를 사용하려면:</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 usermod -aG docker <span style="color:#79c0ff">$USER</span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># 재로그인 후 적용</span>
</span></span></code></pre></div><h3 id="filebrowser-실행">Filebrowser 실행</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>docker run -d <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --name filebrowser <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  --restart always <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  -v /mnt/data:/srv <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  -p 9090:80 <span style="color:#79c0ff">\
</span></span></span><span style="display:flex;"><span>  filebrowser/filebrowser
</span></span></code></pre></div><p><code>/mnt/data</code>를 컨테이너 안의 <code>/srv</code>로 마운트해서 Filebrowser가 SSD 전체를 서빙하도록 했다.</p>
<h3 id="초기-로그인">초기 로그인</h3>
<p>브라우저에서 <code>http://100.109.108.36:9090</code> 접속. 초기 계정은 <code>admin / admin</code>이라고 알려져 있는데 접속이 안 됐다.</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>docker logs filebrowser
</span></span></code></pre></div><p>로그를 확인해보니 랜덤으로 생성된 비밀번호가 출력돼 있었다. 그 비밀번호로 접속하면 된다.</p>
<p><img alt="Filebrowser 로그인 화면" loading="lazy" src="/images/homeserver-03-filebrowser-login.png"></p>
<p><img alt="Filebrowser 접속 성공" loading="lazy" src="/images/homeserver-03-filebrowser.png"></p>
<hr>
<h2 id="oci-nginx-리버스-프록시--ssl">OCI Nginx 리버스 프록시 + SSL</h2>
<p>VPN 없이도 외부에서 브라우저로 접근하려면 OCI Nginx에 리버스 프록시를 설정해야 한다.</p>
<h3 id="cloudflare-dns-추가">Cloudflare DNS 추가</h3>
<p>Cloudflare에서 <code>files.yourdomain.com</code> 서브도메인을 OCI 공인 IP로 추가한다.</p>
<p><img alt="Cloudflare DNS 설정" loading="lazy" src="/images/homeserver-03-cloudflare.png"></p>
<h3 id="nginx-설정">Nginx 설정</h3>
<p>OCI 서버에서 <code>/etc/nginx/sites-available/files.yourdomain.com</code> 파일을 생성한다.</p>
<p>처음엔 HTTP만 설정했는데, <code>files.yourdomain.com</code>으로 접속하면 계속 메인 도메인으로 리다이렉트되는 문제가 있었다. SSL 인증서를 안 걸어줘서 생기는 문제였다.</p>
<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-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">files.yourdomain.com</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span> <span style="color:#a5d6ff">301</span> <span style="color:#a5d6ff">https://</span><span style="color:#79c0ff">$host$request_uri</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">443</span> <span style="color:#a5d6ff">ssl</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">files.yourdomain.com</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate</span>     <span style="color:#a5d6ff">/ssl/live/yourdomain.com/fullchain.pem</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate_key</span> <span style="color:#a5d6ff">/ssl/live/yourdomain.com/privkey.pem</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_protocols</span> <span style="color:#a5d6ff">TLSv1.2</span> <span style="color:#a5d6ff">TLSv1.3</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_prefer_server_ciphers</span> <span style="color:#79c0ff;font-weight:bold">on</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">http://100.109.108.36:9090</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span> <span style="color:#a5d6ff">Host</span> <span style="color:#79c0ff">$host</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span> <span style="color:#a5d6ff">X-Real-IP</span> <span style="color:#79c0ff">$remote_addr</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span> <span style="color:#a5d6ff">X-Forwarded-For</span> <span style="color:#79c0ff">$proxy_add_x_forwarded_for</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span> <span style="color:#a5d6ff">X-Forwarded-Proto</span> <span style="color:#79c0ff">$scheme</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</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 ln -s /etc/nginx/sites-available/files.yourdomain.com /etc/nginx/sites-enabled/
</span></span><span style="display:flex;"><span>sudo nginx -t <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> sudo systemctl reload nginx
</span></span></code></pre></div><p><code>proxy_pass</code>에 Tailscale VPN IP를 쓰는 게 핵심이다. OCI와 홈서버가 같은 Tailscale 네트워크 안에 있기 때문에 가능한 구성이다.</p>
<p><img alt="Filebrowser 외부 접근 성공" loading="lazy" src="/images/homeserver-03-filebrowser-external.png"></p>
<p>이제 VPN 없이 <code>files.yourdomain.com</code>으로 접속해서 홈서버의 파일을 관리할 수 있다.</p>
<hr>
<h2 id="정리">정리</h2>
<ul>
<li>NTFS 드라이브는 <code>ntfsfix</code>로 더티 플래그 제거 후 마운트해야 읽기/쓰기가 된다</li>
<li>Samba는 파일 탐색기 접근용, Filebrowser는 브라우저 접근용</li>
<li>OCI Nginx 리버스 프록시 + Tailscale VPN 조합으로 홈서버를 외부에 안전하게 노출할 수 있다</li>
</ul>
<p>다음 편에서는 Immich를 설치해서 구글 포토를 대체하는 과정을 다룬다.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
