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

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

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
タイトルとURLをコピーしました