Caddy,Filebrower,Metube로 웹 파일서버 구축하기
WebDAV용으로 OCI의 free trial에 설치한 NextCloud가 너무 무거워서 가벼운 솔류션을 찾았습니다. 바로 Filebrowser입니다. 35K이상의 별을 받은 Github 프로젝트로 지속적으로 릴리즈되고 있는 활발한 프로젝트입니다. 아래 절차대로 설치하시면 Caddy, Filebrowser, Metube 이미지를 사용해서 가볍고 강력한 웹 파일서버 인프라를 구축할 수 있습니다.
- 아래에서 사용할 Caddy 컨테이너가 Let’s Encrypt로부터 자동으로 TLS 인증서를 발급/갱신받을 수 있도록, 사용할 DNS 레코드 정보를 네임서버에 등록합니다. 저는 호스팅케이알을 사용하고 있습니다.

nslookup 명령어를 사용해서 등록한 DNS 레코드 정보를 확인합니다. “yourdomain.com”는 본인의 도메인으로 변경합니다.C:\>nslookup filebrowser.yourdomain.com 서버: magicdns.localhost-tailscale-daemon Address: fd7a:115c:a1e0::53 권한 없는 응답: 이름: filebrowser.yourdomain.com Address: 168.107.13.218 C:\>nslookup metube.yourdomain.com 서버: magicdns.localhost-tailscale-daemon Address: fd7a:115c:a1e0::53 권한 없는 응답: 이름: metube.yourdomain.com Address: 168.107.13.218
- Bind Mount: 컨테이너 내부 디렉토리와 바인딩할 호스트 서버의 디렉토리를 생성합니다.
# 1. Caddy, Filebrowser 및 Metube 컨테이너 전용 격리 폴더 일괄 생성 sudo mkdir -p /webdav/caddy/data sudo mkdir -p /webdav/caddy/config sudo mkdir -p /webdav/filebrowser/config sudo mkdir -p /webdav/filebrowser/database sudo mkdir -p /webdav/filebrowser/srv sudo mkdir -p /webdav/filebrowser/srv/youtube_downloads
- 도커 컨테이너 내부의 프로세스의 사용자 확인 및 권한 부여
# 2. 도커가 안전하게 입출력(I/O)할 수 있도록 root 이외의 사용자 권한 부여 id uid=1001(ubuntu) gid=1001(ubuntu) groups=1001(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),101(lxd),989(docker) sudo chown -R 1001:1001 /webdav sudo chmod -R 755 /webdav ls -ld /webdav/ drwxr-xr-x 4 ubuntu ubuntu 4096 Jun 13 07:58 /webdav/
- Caddy 및 Filebrowser 환경 설정
# 3. 외부 통신을 안전하게 받아줄 ① 도메인 이름, ② reverse_proxy(목적지) 지정, 그리고 ③ HTTPS 인증서 자동 발급 vi /webdav/caddy/Caddyfile filebrowser.yourdomain.com { reverse_proxy filebrowser:80 } metube.yourdomain.com { reverse_proxy metube:8081 } vi /webdav/filebrowser/config/settings.json { "port": 80, "baseURL": "", "address": "", "log": "stdout", "database": "/database/filebrowser.db", "root": "/srv" } - 작업 디렉토리로 이동 및 최종 통합 docker-compose.yml 작성
# 4. Caddy, Filebrowser, Metube 컨테이너 설치를 위한 Compose 파일 작성 cd /webdav vi docker-compose.yml services: # [Caddy] Let's Encrypt 공인 SSL 인증서 무중단 자동 갱신 및 HTTPS 역방향 프록시 caddy: image: caddy:2-alpine container_name: caddy ports: - "80:80" # HTTP 검증 및 자동 HTTPS 전환용 - "443:443" # 정식 보안 HTTPS 접속용 volumes: - /webdav/caddy/Caddyfile:/etc/caddy/Caddyfile - /webdav/caddy/data:/data # 공인 인증서 영구 보존 공간 - /webdav/caddy/config:/config # 런타임 상태 보존 공간 depends_on: - filebrowser restart: always # [Filebrowser] 완전 격리된 순수 개인용 웹하드 본체 filebrowser: image: filebrowser/filebrowser:latest container_name: filebrowser user: "1001:1001" # 외부 포트는 노출하지 않습니다. 무조건 앞단의 Caddy 보안망(443)을 거쳐서 들어옵니다. volumes: - /webdav/filebrowser/srv:/srv # 격리된 웹하드 공간 - /webdav/filebrowser/database/filebrowser.db:/database/filebrowser.db # 계정 및 링크 정보 DB - /webdav/filebrowser/config:/config # 시스템 설정 데이터 environment: - PUID=1001 - PGID=1001 restart: always # [Metube] 유튜브 다운로더 머신 metube: image: alexta69/metube:latest container_name: metube volumes: - /webdav/filebrowser/srv/youtube_downloads:/downloads environment: - UID=1001 - GID=1001 - DOWNLOAD_DIR=/downloads restart: always - 스택 사양에 맞춰 컨테이너들을 자동으로 생성
sudo docker compose up -d [+] up 37/37 ✔ Image caddy:2-alpine Pulled 27.8ss ✔ Image filebrowser/filebrowser:latest Pulled 32.0ss ✔ Image alexta69/metube:latest Pulled 107.4s ✔ Network webdav_default Created 0.3s ✔ Container metube Created 1.5s ✔ Container filebrowser Created 1.5s ✔ Container caddy Created 0.4s
- 다운로드된 이미지 및 설치된 컨테이너 확인
- 컨테이너가 Restarting를 반복하는 등 설치가 정상적으로 되지 않는다면
docker compose logs <컨테이너이름> 명령어로 로그를 확인해야 합니다. - sudo docker compose down 명령어로 컨테이너를 정지/삭제합니다.
- docker-compose.yml 파일을 수정한 후 오류가 있는 컨테이너만
sudo docker compose up -d --force-recreate <컨테이너이름> 명령어으로 리빌드 기동합니다. - Caddyfile 파일을 수정하면
sudo docker compose exec -w /etc/caddy caddy caddy reload 명령어를 실행하여 서비스가 멈추는 일 없이 수정된 Caddyfile 내용을 즉시 반영할 수 있습니다. 도메인 정보가 변경되는 경우에는sudo docker compose up -d --force-recreate caddy 명령어로 컨테이너를 리빌드 기동해야 합니다.
docker images IMAGE ID DISK USAGE CONTENT SIZE EXTRA alexta69/metube:latest 891ccbb5f025 1.17GB 314MB U caddy:2-alpine 77c07d5ebfa5 89MB 24.3MB U filebrowser/filebrowser:latest 9805b21cf910 55.6MB 16.7MB U docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" NAMES STATUS PORTS caddy Up About a minute 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 443/udp, 2019/tcp metube Up About a minute (healthy) 8081/tcp filebrowser Up About a minute (healthy) 80/tcp - 컨테이너가 Restarting를 반복하는 등 설치가 정상적으로 되지 않는다면
- filebrowser의 로그를 확인하여 admin 사용자의 초기 비밀번호를 확인
docker compose logs filebrowser filebrowser | 2026/06/13 12:40:52 Using config file: /config/settings.json filebrowser | 2026/06/13 12:40:52 WARNING: filebrowser.db can't be found. Initialing in /database/ filebrowser | 2026/06/13 12:40:52 Using database: /database/filebrowser.db filebrowser | 2026/06/13 12:40:53 Performing quick setup filebrowser | 2026/06/13 12:40:53 User 'admin' initialized with randomly generated password: vNh8JdLrjdm-aqi4 filebrowser | 2026/06/13 12:40:54 Listening on [::]:80
- curl 명령어를 사용해서 filebrowser 사이트에 정상 접속되는지 확인
curl -I https://filebrowser.yesxyz.kr curl -I https://metube.yesxyz.kr
- https://filebrowser.yourdomain.com/ 접속 및 설정
- admin 사용자와 초기 비밀번호로 로그인합니다.

- admin > User Management 메뉴로 이동하여 초기 비밀번호, 사용 언어를 변경하고 저장합니다.

- admin 사용자와 초기 비밀번호로 로그인합니다.
- https://metube.yourdomain.com/ 접속 및 설정
기본적으로 MeTube는 인증없이 웹 사이트에 접속할 수 있기 때문에 익명의 사용자가 서버 자원을 제한없이 사용할 수 있으며, 유튜브 시스템에 의해 ‘봇/매크로’로 차단당해 다운로드 되지 않을 수도 있습니다. 인증기능 추가 및 쿠키등록을 통해 이런 상황을 우회해 보겠습니다.- [인증기능] 추가
- 사용할 비밀번호를 해시로 추출합니다.
sudo docker compose exec caddy caddy hash-password --plaintext "원하는비밀번호" $2a$14$해시된비밀번호LCgVYGC
- Caddyfile 파일에 사용할 ID(admin)와 해시로 추출한 비밀번호를 basic_auth 옵션에 주입합니다.
vi /webdav/caddy/Caddyfile filebrowser.yesxyz.kr { reverse_proxy filebrowser:80 } metube.yesxyz.kr { basic_auth { admin $2a$14$해시된비밀번호LCgVYGC } reverse_proxy metube:8081 } - Caddy를 리빌드 기동합니다.
sudo docker compose down caddy sudo docker compose up -d --force-recreate caddy
- https://metube.yourdomain.com/ 재접속하면 인증창이 표시됩니다.

- 사용할 비밀번호를 해시로 추출합니다.
- [쿠키] 주입: 저는 아래 단계를 모두 진행하였으나 Youtube 동영상 다운로드에 실패하였습니다. 혹시 성공하신 분이 계시면 방법 공유를 부탁드립니다.ㅠㅠ
- PC 브라우저에서 유튜브(https://www.youtube.com)에 로그인합니다.
- 브라우저 확장프로그램 스토어에서 Get cookies.txt LOCALLY와 같은 쿠키 추출 확장 프로그램을 설치합니다.
- Get cookies.txt LOCALLY 확장프로그램을 사용해서 쿠키를 추출합니다.(파일명 : cookies.txt)

- https://filebrowser.yourdomain.com/에 접속하여 youtube_downloads 디렉토리에 추출한 cookies.txt 파일을 업로드합니다.

- docker-compose.yml 파일에 MeTube 컨테이너가 이 쿠키 파일을 바라보고 통신할 수 있도록 환경변수를 추가해 줍니다.
metube: image: alexta69/metube:latest container_name: metube volumes: - /webdav/filebrowser/srv/youtube_downloads:/downloads environment: UID: 1001 GID: 1001 DOWNLOAD_DIR: "/downloads" COOKIES_FILE: "/downloads/cookies.txt" YTDL_OPTIONS: | { "check_formats": "num_workers", "retries": 10, "fragment_retries": 10, "extractor_args": { "youtube": { "player_client": ["youtube_music", "android", "web_embedded"] } } } restart: always - Metube 컨테이너를 리빌드 기동합니다.
sudo docker compose down metube sudo docker compose up -d --force-recreate metube
- 앞서 말씀드린 것처럼 동영상 다운로드는 실패했습니다. 성공하신 분은 댓글 좀 남겨주세요.

- [인증기능] 추가
