Caddy,Filebrower,Metube로 웹 파일서버 구축하기

WebDAV용으로 OCI의 free trial에 설치한 NextCloud가 너무 무거워서 가벼운 솔류션을 찾았습니다. 바로 Filebrowser입니다. 35K이상의 별을 받은 Github 프로젝트로 지속적으로 릴리즈되고 있는 활발한 프로젝트입니다. 아래 절차대로 설치하시면 Caddy, Filebrowser, Metube 이미지를 사용해서 가볍고 강력한 웹 파일서버 인프라를 구축할 수 있습니다.

  1. 아래에서 사용할 Caddy 컨테이너가 Let’s Encrypt로부터 자동으로 TLS 인증서를 발급/갱신받을 수 있도록, 사용할 DNS 레코드 정보를 네임서버에 등록합니다. 저는 호스팅케이알을 사용하고 있습니다.
    DNS 레코드 정보
  2. 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
    
  3. 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
    
  4. 도커 컨테이너 내부의 프로세스의 사용자 확인 및 권한 부여
    # 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/
    
  5. 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"
    }
    
  6. 작업 디렉토리로 이동 및 최종 통합 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
    
  7. 스택 사양에 맞춰 컨테이너들을 자동으로 생성
    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
    
  8. 다운로드된 이미지 및 설치된 컨테이너 확인
    • 컨테이너가 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
    
  9. 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
    
  10. curl 명령어를 사용해서 filebrowser 사이트에 정상 접속되는지 확인
    curl -I https://filebrowser.yesxyz.kr
    curl -I https://metube.yesxyz.kr
    
  11. https://filebrowser.yourdomain.com/ 접속 및 설정
    1. admin 사용자와 초기 비밀번호로 로그인합니다.
    2. admin > User Management 메뉴로 이동하여 초기 비밀번호, 사용 언어를 변경하고 저장합니다.
      filebrowser user management
  12. https://metube.yourdomain.com/ 접속 및 설정
    기본적으로 MeTube는 인증없이 웹 사이트에 접속할 수 있기 때문에 익명의 사용자가 서버 자원을 제한없이 사용할 수 있으며, 유튜브 시스템에 의해 ‘봇/매크로’로 차단당해 다운로드 되지 않을 수도 있습니다. 인증기능 추가 및 쿠키등록을 통해 이런 상황을 우회해 보겠습니다.
    • [인증기능] 추가
      1. 사용할 비밀번호를 해시로 추출합니다.
        sudo docker compose exec caddy caddy hash-password --plaintext "원하는비밀번호"
        $2a$14$해시된비밀번호LCgVYGC
        
      2. 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
        }
        
      3. Caddy를 리빌드 기동합니다.
        sudo docker compose down caddy
        sudo docker compose up -d --force-recreate caddy
        
      4. https://metube.yourdomain.com/ 재접속하면 인증창이 표시됩니다.
        metube basic_auth
    • [쿠키] 주입: 저는 아래 단계를 모두 진행하였으나 Youtube 동영상 다운로드에 실패하였습니다. 혹시 성공하신 분이 계시면 방법 공유를 부탁드립니다.ㅠㅠ
      1. PC 브라우저에서 유튜브(https://www.youtube.com)에 로그인합니다.
      2. 브라우저 확장프로그램 스토어에서 Get cookies.txt LOCALLY와 같은 쿠키 추출 확장 프로그램을 설치합니다.
      3. Get cookies.txt LOCALLY 확장프로그램을 사용해서 쿠키를 추출합니다.(파일명 : cookies.txt)
        Youtube Cookies
      4. https://filebrowser.yourdomain.com/에 접속하여 youtube_downloads 디렉토리에 추출한 cookies.txt 파일을 업로드합니다.
      5. 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
        
      6. Metube 컨테이너를 리빌드 기동합니다.
        sudo docker compose down metube
        sudo docker compose up -d --force-recreate metube
        
      7. 앞서 말씀드린 것처럼 동영상 다운로드는 실패했습니다. 성공하신 분은 댓글 좀 남겨주세요.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다