シンプルなのに多機能で公開もしやすい「Copyparty」

Filebrowser」や「FileBrowser Quantum」、「OxiCloud」、「nextExplorer」、「Filestash」と紹介してきましたが、UIが少しクセはあるものの、軽快動作ながら多機能なのが「Copyparty」で、GitHubで公開されています。デモサイトで動作を確認出来ます。ちなみにテーマ機能もあり、下記はWindows95のようなテーマです。

1. Copypartyとは

Copypartyは、Pythonで書かれた軽量・ゼロ依存のセルフホスト型ファイルサーバーです。1つのPythonファイルを実行するだけで、ブラウザからファイルのアップロード・ダウンロード・プレビューが行えます。

機能概要
マルチプラットフォームWindows / macOS / Linux / Android / iOS から利用可能
WebUIブラウザだけで操作完結。インストール不要
WebDAV / SFTP / FTPOSのネイティブフォルダとしてマウント可能
メディアプレビュー画像・音楽・動画のサムネイル・インライン再生
再開アップロード大容量ファイルの中断・再開対応
重複排除(Dedup)同じ内容のファイルを自動的に重複保存しない

LXDコンテナでセットアップ

このあとで紹介するスクリプトのほうがおすすめです。

#!/bin/bash
# ==============================================================
# Copyparty セルフホスト セットアップスクリプト
# 対象: Ubuntu 26.04 LXDコンテナ (Tailscale認証済み)
# 外部公開ポート: 3321
# ==============================================================
set -euo pipefail

PORT=3321
DATA_DIR="/opt/copyparty/data"
SFX_PATH="/opt/copyparty/copyparty-sfx.py"
SERVICE_NAME="copyparty"

echo "========================================="
echo " Copyparty セットアップ開始"
echo "========================================="

# ---------- 1. 依存パッケージのインストール ----------
echo "[1/5] パッケージのインストール..."
apt-get update -qq
apt-get install -y --no-install-recommends \
    python3 \
    python3-pil \
    ffmpeg \
    curl \
    ca-certificates

# ---------- 2. copyparty-sfx.py のダウンロード ----------
echo "[2/5] copyparty-sfx.py をダウンロード中..."
mkdir -p /opt/copyparty
curl -fsSL \
    "https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py" \
    -o "$SFX_PATH"
chmod +x "$SFX_PATH"

# ---------- 3. データディレクトリの作成 ----------
echo "[3/5] データディレクトリを作成中..."
mkdir -p "$DATA_DIR"

# ---------- 4. systemd サービスの登録 ----------
echo "[4/5] systemd サービスを登録中..."
cat > "/etc/systemd/system/${SERVICE_NAME}.service" <<EOF
[Unit]
Description=Copyparty File Server
After=network.target

[Service]
Type=simple
ExecStart=python3 ${SFX_PATH} \\
    -p ${PORT} \\
    -e2dsa \\
    -v ${DATA_DIR}::A
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now "$SERVICE_NAME"

# ---------- 5. 起動確認 ----------
echo "[5/5] 起動確認中..."
sleep 3

if systemctl is-active --quiet "$SERVICE_NAME"; then
    # Tailscale ホスト名の取得
    TS_HOSTNAME=$(tailscale status --json 2>/dev/null \
        | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['Self']['DNSName'].rstrip('.'))" \
        2>/dev/null || hostname)

    echo ""
    echo "========================================="
    echo " セットアップ完了!"
    echo "========================================="
    echo ""
    echo "  アクセスURL: http://${TS_HOSTNAME}:${PORT}"
    echo ""
    echo "  データフォルダ : ${DATA_DIR}"
    echo "  ログ確認       : journalctl -u ${SERVICE_NAME} -f"
    echo "  サービス停止   : systemctl stop ${SERVICE_NAME}"
    echo ""
    echo "  ※ デフォルト設定: 全ユーザーに読み書き権限あり"
    echo "     本番利用時は -a/-v オプションでアカウント管理を推奨"
    echo "========================================="
else
    echo ""
    echo "[ERROR] サービスの起動に失敗しました。ログを確認してください:"
    journalctl -u "$SERVICE_NAME" --no-pager -n 30
    exit 1
fi

ローカルPCからのマウントも簡単

インストール後にアクセスするとこのような表示になります。ごちゃごちゃしていますが、日本語化して色々試していれば操作は分かるでしょう。

ブラウザでアクセスする以外にも、WindowsやLinux、macOSからマウントして利用することも出来ます。マウント用のコマンドなども表示されるので簡単にマウント出来る点も特徴。

ディレクトリの移動なども軽快、ファイルのアップロードも速いですね。

パスワードを設定する

デフォルトではパスワードなしです。現在の設定 -v /opt/copyparty/data::A は全ユーザーに全権限を与えているため、誰でもアクセス・アップロード・削除できます。Tailnet内限定なら許容範囲ですが、設定することを推奨します。

パスワードの設定は、/etc/systemd/system/copyparty.serviceExecStart を編集します。

nano /etc/systemd/system/copyparty.service
ExecStart=python3 /opt/copyparty/copyparty-sfx.py \
    -p 3321 \
    -e2dsa \
    -a admin:mypassword \
    -v /opt/copyparty/data::A,admin
  • -a admin:mypassword : ユーザー名・パスワードを定義
  • ::A,admin : admin ユーザーのみに全権限

匿名ユーザーにも読み取りだけ許可したい場合は ::r:A,admin にします。


ルートフォルダを変更する

同じく -v の引数を変えるだけです。

# 例: /mnt/share を公開したい場合
-v /mnt/share::A,admin

# 例: 複数フォルダを別々のURLで公開
-v /mnt/share:share:A,admin \
-v /mnt/media:media:r,admin

書式は -v ローカルパス:URLパス:パーミッション です。URLパスを空にすると /(ルート)になります。

変更後の反映

systemctl daemon-reload
systemctl restart copyparty

パスワードやルートフォルダをインストール時に設定する

#!/bin/bash
# ==============================================================
# Copyparty セルフホスト セットアップスクリプト
# 対象: Ubuntu 26.04 LXDコンテナ (Tailscale認証済み)
# 外部公開ポート: 3321
# ==============================================================
set -euo pipefail

PORT=3321
SFX_PATH="/opt/copyparty/copyparty-sfx.py"
SERVICE_NAME="copyparty"

# デフォルト値
DEFAULT_DATA_DIR="/opt/lxd-data"
DEFAULT_USER="admin"

echo "========================================="
echo " Copyparty セットアップ"
echo "========================================="
echo ""

# ---------- インタラクティブ設定 ----------
read -rp "マウントディレクトリ [${DEFAULT_DATA_DIR}]: " INPUT_DATA_DIR
DATA_DIR="${INPUT_DATA_DIR:-$DEFAULT_DATA_DIR}"

echo ""
read -rp "ユーザー名 [${DEFAULT_USER}] (Enterでパスワードなし・認証なし): " INPUT_USER
USERNAME="${INPUT_USER:-}"

PASSWORD=""
if [[ -n "$USERNAME" ]]; then
    while true; do
        read -rsp "パスワード: " INPUT_PASS
        echo ""
        if [[ -z "$INPUT_PASS" ]]; then
            echo "  ※ パスワードが空です。もう一度入力してください。"
            continue
        fi
        read -rsp "パスワード(確認): " INPUT_PASS2
        echo ""
        if [[ "$INPUT_PASS" == "$INPUT_PASS2" ]]; then
            PASSWORD="$INPUT_PASS"
            break
        else
            echo "  ※ パスワードが一致しません。もう一度入力してください。"
        fi
    done
fi

# 設定内容の確認
echo ""
echo "-----------------------------------------"
echo " 設定内容の確認"
echo "-----------------------------------------"
echo "  マウントディレクトリ : ${DATA_DIR}"
if [[ -n "$USERNAME" ]]; then
    echo "  ユーザー名           : ${USERNAME}"
    echo "  パスワード           : ********"
else
    echo "  認証                 : なし(全ユーザーに全権限)"
fi
echo "-----------------------------------------"
read -rp "この設定でインストールしますか? [Y/n]: " CONFIRM
CONFIRM="${CONFIRM:-Y}"
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
    echo "インストールを中止しました。"
    exit 0
fi

echo ""

# ---------- 1. 依存パッケージのインストール ----------
echo "[1/5] パッケージのインストール..."
apt-get update -qq
apt-get install -y --no-install-recommends \
    python3 \
    python3-pil \
    ffmpeg \
    curl \
    ca-certificates

# ---------- 2. copyparty-sfx.py のダウンロード ----------
echo "[2/5] copyparty-sfx.py をダウンロード中..."
mkdir -p /opt/copyparty
curl -fsSL \
    "https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py" \
    -o "$SFX_PATH"
chmod +x "$SFX_PATH"

# ---------- 3. データディレクトリの作成 ----------
echo "[3/5] データディレクトリを作成中..."
mkdir -p "$DATA_DIR"

# ---------- 4. systemd サービスの登録 ----------
echo "[4/5] systemd サービスを登録中..."

SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"

# ヘッダー部分
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Copyparty File Server
After=network.target

[Service]
Type=simple
EOF

# ExecStart を認証有無で分岐して1行で書き出す
if [[ -n "$USERNAME" ]]; then
    echo "ExecStart=python3 ${SFX_PATH} -p ${PORT} -e2dsa -a ${USERNAME}:${PASSWORD} -v ${DATA_DIR}::A,${USERNAME}" >> "$SERVICE_FILE"
else
    echo "ExecStart=python3 ${SFX_PATH} -p ${PORT} -e2dsa -v ${DATA_DIR}::A" >> "$SERVICE_FILE"
fi

# フッター部分
cat >> "$SERVICE_FILE" << 'EOF'
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now "$SERVICE_NAME"

# ---------- 5. 起動確認 ----------
echo "[5/5] 起動確認中..."
sleep 3

if systemctl is-active --quiet "$SERVICE_NAME"; then
    TS_HOSTNAME=$(tailscale status --json 2>/dev/null \
        | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['Self']['DNSName'].rstrip('.'))" \
        2>/dev/null || hostname)

    echo ""
    echo "========================================="
    echo " セットアップ完了!"
    echo "========================================="
    echo ""
    echo "  アクセスURL          : http://${TS_HOSTNAME}:${PORT}"
    echo "  マウントディレクトリ : ${DATA_DIR}"
    if [[ -n "$USERNAME" ]]; then
        echo "  ユーザー名           : ${USERNAME}"
    else
        echo "  認証                 : なし"
    fi
    echo ""
    echo "  ログ確認       : journalctl -u ${SERVICE_NAME} -f"
    echo "  サービス停止   : systemctl stop ${SERVICE_NAME}"
    echo "  設定変更       : nano /etc/systemd/system/${SERVICE_NAME}.service"
    echo "========================================="
else
    echo ""
    echo "[ERROR] サービスの起動に失敗しました。ログを確認してください:"
    journalctl -u "$SERVICE_NAME" --no-pager -n 30
    exit 1
fi

2. ブラウザUI画面の構成

ブラウザで http://[サーバーアドレス]:3321 にアクセスすると以下の画面が表示されます。

2-1. 画面全体のレイアウト

エリア説明
上部ナビゲーションバー現在のフォルダパス(パンくずリスト)が表示されます。クリックで上位フォルダへ移動できます
ファイル一覧エリア(中央)フォルダ・ファイルの一覧。アイコン表示とリスト表示を切り替え可能
右パネル(アップロードエリア)ファイルのドラッグ&ドロップ、またはクリックでアップロード
上部ツールバー各種操作ボタンが集まっているエリア

2-2. ツールバーのボタン一覧

ボタン名表示機能
📁 新規フォルダmkdir新しいフォルダを作成します。名前を入力するダイアログが表示されます
⬆️ アップロードupファイル選択ダイアログを開きます。複数ファイルの同時選択も可能です
📋 クリップボードから貼り付けpasteスクリーンショットなどクリップボードの内容を直接アップロードします
🔍 検索searchファイル名・タグ・メタデータで検索できます
🗂️ 表示切替grid/listファイル一覧の表示形式をグリッド(アイコン)とリストで切り替えます
✅ 選択モードsel複数ファイルを選択してまとめて操作(削除・移動・ダウンロード)できます
⬇️ ZIPダウンロードdl zip現在のフォルダの内容を丸ごとZIPでダウンロードします
🔗 URL共有share選択したファイルの直接リンクをコピーします
⚙️ 設定cfg表示件数・ソート順・UIテーマなどの設定を変更します
📊 ソートsort名前・日付・サイズ・種類でファイルを並べ替えます
🖼️ ギャラリー表示gallery画像・動画を一覧サムネイル表示するモードに切り替えます

2-3. ファイルの操作メニュー

ファイル名の右にある「…」ボタンや右クリックで、各ファイルの操作メニューが開きます。

操作内容
ダウンロードファイルをブラウザでダウンロードします
リネームファイル名を変更します(書き込み権限が必要)
移動 / コピー別フォルダへの移動またはコピーができます
削除ファイルを削除します。確認ダイアログが表示されます
プロパティファイルサイズ・更新日時・チェックサムなどの詳細情報を表示します
タグ編集メタデータタグを追加・編集できます(メディア検索に利用)

3. ファイルのアップロード方法

3-1. ドラッグ&ドロップ

ブラウザ画面上の任意の場所にファイルをドラッグして放すだけでアップロードできます。複数ファイルやフォルダごとドロップすることも可能です。

3-2. ボタンからアップロード

  1. ツールバーの「⬆️ アップロード」ボタンをクリックします
  2. ファイル選択ダイアログが表示されます
  3. アップロードしたいファイルを選択し「開く」をクリックします
  4. プログレスバーが表示され、完了するとファイル一覧に追加されます

3-3. 大容量ファイルのアップロード

Copypartyは大容量ファイルの中断・再開(レジューム)に対応しています。通信が切れた場合でも、続きからアップロードが再開されます。

💡 アップロード中はブラウザタブを閉じないようにしてください。バックグラウンドに切り替えても進行します。


4. ファイルのダウンロード方法

4-1. 単体ダウンロード

ファイル名をクリックするとプレビュー(対応ファイルの場合)またはダウンロードが始まります。ファイル右側の「…」メニューから「ダウンロード」を選択することもできます。

4-2. フォルダ一括ダウンロード(ZIP)

ツールバーの「⬇️ dl zip」ボタンをクリックすると、現在のフォルダの全内容をZIP圧縮してダウンロードできます。

4-3. 複数ファイルを選択してダウンロード

  1. ツールバーの「✅ sel」ボタンで選択モードを有効にします
  2. ダウンロードしたいファイルにチェックを入れます
  3. 「dl zip」で選択したファイルをまとめてZIPダウンロードします

5. メディアプレビュー機能

画像・音楽・動画ファイルはブラウザ上でインラインプレビューが可能です。

ファイル種別対応形式操作
画像JPG / PNG / GIF / WebP / SVG 等クリックで拡大表示。←→キーで前後の画像に移動
音楽MP3 / FLAC / OGG / AAC 等インラインプレイヤーで再生。プレイリスト連続再生可能
動画MP4 / WebM / MKV 等インラインプレイヤーで再生。ffmpeg導入時はトランスコード対応
PDFPDFブラウザのPDFビューアで表示
テキストTXT / MD / CSV 等ブラウザ上でテキスト表示

5-1. ギャラリーモード

ツールバーの「🖼️ gallery」ボタンをクリックすると、フォルダ内の画像・動画をサムネイル一覧で表示できます。大量の写真や動画を管理するのに便利です。


6. 各OS・デバイスからの接続方法

Copypartyには複数の接続方法があります。目的に合わせて使い分けてください。

6-1. ブラウザから接続(全OS共通)

最も手軽な方法です。インストール不要でどのOSからでも利用できます。

  1. Chrome・Firefox・Safari を開きます
  2. アドレスバーに以下を入力してアクセスします
http://[Tailscaleホスト名]:3321

💡 Tailscaleを使用している場合、接続できるのはTailscaleネットワークに参加しているデバイスのみです。


6-2. Windowsからの接続

ブラウザ(推奨)

Chrome / Edge / Firefox からブラウザでアクセスするのが最もシンプルです。

WebDAVでエクスプローラーからマウント

WebDAVを使うとWindowsのエクスプローラーから直接、ネットワークドライブとして操作できます。

  1. エクスプローラーを開き、左パネルの「PC」を右クリック →「ネットワーク ドライブの割り当て」を選択
  2. 「別のWebサイトやネットワークの場所に接続する」をクリック
  3. インターネットやネットワークのアドレスに以下を入力します
http://[Tailscaleホスト名]:3321/
  1. 資格情報の入力を求められた場合は、サーバーのアカウント情報を入力します(デフォルト設定では認証なし)

💡 Windows 10/11では、HTTP(非SSL)のWebDAVマウントに制限がある場合があります。接続できない場合はレジストリの「BasicAuthLevel」を2に設定するか、ブラウザ経由をご利用ください。

WinSCP(SFTPクライアント)

WinSCPを使ってSFTP/FTP接続することもできます。ポート番号はCopypartyのFTP/SFTPポートを確認してください(デフォルト設定によります)。


6-3. macOSからの接続

ブラウザ(推奨)

Safari / Chrome / Firefox からブラウザでアクセスします。

FinderからWebDAVマウント

macOSのFinderからネットワークドライブとしてマウントすることで、Finderから直接ファイル操作できます。

  1. Finderを開き、メニューバーから「移動」→「サーバーへ接続…」を選択(または ⌘K
  2. サーバーアドレス欄に以下を入力します
http://[Tailscaleホスト名]:3321/
  1. 「接続」をクリックします
  2. 接続方式の選択で「登録ユーザ」または「ゲスト」を選びます
  3. マウントが成功するとFinderのサイドバーに追加されます

💡 macOSのWebDAVはSSLを推奨します。HTTP接続が拒否される場合は「デフォルトのWebDAV接続にHTTPを許可する」設定が必要な場合があります。

ターミナルからcurlでファイル操作

アップロード:

curl -T ファイル名.txt http://[Tailscaleホスト名]:3321/

ダウンロード:

curl -O http://[Tailscaleホスト名]:3321/ファイル名.txt

6-4. Linuxからの接続

ブラウザ

任意のブラウザでアクセス可能です。

davfs2でWebDAVマウント

davfs2パッケージを使うとLinuxのディレクトリとしてマウントできます。

sudo apt install davfs2
sudo mount -t davfs http://[Tailscaleホスト名]:3321/ /mnt/copyparty

自動マウントする場合は /etc/fstab に追記します:

http://[Tailscaleホスト名]:3321/  /mnt/copyparty  davfs  user,noauto  0  0

curlでコマンドライン操作

アップロード:

curl -T ファイル名.txt http://[Tailscaleホスト名]:3321/

ダウンロード:

wget http://[Tailscaleホスト名]:3321/ファイル名.txt

rcloneでのアクセス

rcloneを使うとrsync感覚で同期や大量ファイル転送が行えます。

rclone copy ./local-folder :webdav,url=http://[Tailscaleホスト名]:3321/:/remote-folder

6-5. スマートフォン・タブレットからの接続

iOS(iPhone / iPad)

  • Safariまたは任意のブラウザでアクセス(ホーム画面に追加すればアプリ感覚で利用可)
  • 「ファイル」アプリでWebDAV接続:「ファイル」→「…」→「サーバーに接続」からアドレスを入力

Android

  • Chromeまたは任意のブラウザでアクセス
  • 公式Androidアプリ(Copyparty Port)をインストールすると、写真のアップロードなどが簡単になります
  • Solid ExplorerなどのファイルマネージャーからWebDAV接続も可能です

7. よくある操作 Q&A

Q: やりたいことA: 操作方法
フォルダを作りたいツールバーの「mkdir」ボタンをクリックしてフォルダ名を入力します
ファイルを検索したいツールバーの検索アイコンをクリックし、ファイル名やキーワードを入力します
ファイルを削除したいファイル右の「…」メニュー→「削除」を選択します(書き込み権限が必要)
フォルダ全体をダウンロードしたい対象フォルダを開き、ツールバーの「dl zip」ボタンをクリックします
ファイルリンクを共有したいファイルを選択し、「share」ボタンでURLをコピーします
表示順を変えたいツールバーの「sort」ボタンで名前・日時・サイズから選択できます
画像をまとめて見たい「gallery」ボタンでギャラリーモードに切り替えます
スマホから写真をアップしたいブラウザでアクセスし、アップロードボタンからカメラロールを選択します
ダークモードにしたいツールバーの「cfg」(設定)ボタンからテーマを変更できます

8. トラブルシューティング

症状対処法
ページが開けない①サービスが起動しているか確認 ②Tailscaleに接続しているか確認 ③ポート3321でアクセスしているか確認
アップロードできない書き込み権限を確認。デフォルト設定では全ユーザーに読み書き権限があります。ディスク容量も確認してください
動画が再生されないffmpegがインストールされているか確認。ブラウザの対応コーデックによっては再生できない形式もあります
WebDAVがマウントできないWindows:HTTP WebDAVの設定確認。macOS:「移動→サーバーへ接続」で http:// を含めて入力しているか確認
サムネイルが表示されないpython3-pillow(PIL)とffmpegがインストールされているか確認。インストール後はサービスを再起動してください

サービスの起動状態を確認するコマンド:

sudo systemctl status copyparty

9. サービス管理コマンド

サーバー管理者向けの基本コマンドです。

操作コマンド
起動状態の確認sudo systemctl status copyparty
サービスの再起動sudo systemctl restart copyparty
サービスの停止sudo systemctl stop copyparty
ログのリアルタイム確認journalctl -u copyparty -f
データフォルダの確認ls -la /opt/copyparty/data/
タイトルとURLをコピーしました