「FileBrowser」や「OxiCloud」、「nextExplorer」と紹介してきましたが、FileBrowserから派生した「FileBrowser Quantum」というのもあるので試してみました。GitHubで公開されています。

LXDコンテナにインストール
Dockerは使っていません。LXDコンテナへのセットアップを想定しています。
#!/usr/bin/env bash
# ============================================================
# FileBrowser Quantum — LXD コンテナ (Ubuntu 26.04) セットアップ
# 外部公開ポート: 3319
# ============================================================
set -euo pipefail
# ── 色付き出力 ───────────────────────────────────────────────
info() { echo -e "\e[32m[INFO]\e[0m $*"; }
warn() { echo -e "\e[33m[WARN]\e[0m $*"; }
error() { echo -e "\e[31m[ERROR]\e[0m $*" >&2; exit 1; }
section() { echo -e "\n\e[1;36m==== $* ====\e[0m"; }
# ── 定数 ────────────────────────────────────────────────────
INSTALL_DIR="/opt/filebrowser"
DATA_DIR="/var/lib/filebrowser"
CONFIG_FILE="${INSTALL_DIR}/config.yaml"
BIN_PATH="${INSTALL_DIR}/filebrowser"
SERVICE_NAME="filebrowser"
LISTEN_PORT=3319
# ── 前提チェック ─────────────────────────────────────────────
[[ $EUID -eq 0 ]] || error "root (または sudo) で実行してください"
# ── 管理者アカウント入力 ─────────────────────────────────────
section "管理者アカウント設定"
read -rp "管理者ユーザー名 [admin]: " FB_USER
FB_USER="${FB_USER:-admin}"
while true; do
read -rsp "パスワード (8文字以上): " FB_PASS
echo
if [[ ${#FB_PASS} -lt 8 ]]; then
warn "8文字以上で入力してください"
continue
fi
read -rsp "パスワード (確認): " FB_PASS2
echo
if [[ "$FB_PASS" != "$FB_PASS2" ]]; then
warn "パスワードが一致しません。再入力してください"
continue
fi
break
done
info "ユーザー名: ${FB_USER}"
# ── 依存パッケージ ───────────────────────────────────────────
section "依存パッケージ確認"
for cmd in curl jq; do
if ! command -v "$cmd" &>/dev/null; then
info "$cmd をインストール中..."
apt-get install -y -qq "$cmd"
fi
done
# ── アーキテクチャ判定 ───────────────────────────────────────
section "アーキテクチャ検出"
ARCH="$(uname -m)"
case "$ARCH" in
x86_64) ASSET_ARCH="linux-amd64" ;;
aarch64|arm64) ASSET_ARCH="linux-arm64" ;;
armv7l) ASSET_ARCH="linux-armv7" ;;
armv6l) ASSET_ARCH="linux-armv6" ;;
*) error "非対応アーキテクチャ: $ARCH" ;;
esac
info "アーキテクチャ: $ARCH → アセット: $ASSET_ARCH"
# ── 最新リリース取得 ─────────────────────────────────────────
section "最新リリース確認"
RELEASE_JSON="$(curl -fsSL --retry 3 \
"https://api.github.com/repos/gtsteffaniak/filebrowser/releases?per_page=10")"
# stable優先、なければ最新beta
DOWNLOAD_URL="$(echo "$RELEASE_JSON" | jq -r \
--arg arch "$ASSET_ARCH" '
( .[] | select(.prerelease == false) | .assets[]
| select(.name | test($arch + "-filebrowser$"))
| .browser_download_url ) // empty
' | head -1)"
if [[ -z "$DOWNLOAD_URL" ]]; then
info "stable リリースが見つからないため beta を使用します"
DOWNLOAD_URL="$(echo "$RELEASE_JSON" | jq -r \
--arg arch "$ASSET_ARCH" '
.[] | .assets[]
| select(.name | test($arch + "-filebrowser$"))
| .browser_download_url
' | head -1)"
fi
[[ -n "$DOWNLOAD_URL" ]] || error "ダウンロード URL が見つかりませんでした"
info "ダウンロード: $DOWNLOAD_URL"
# ── ディレクトリ作成 ─────────────────────────────────────────
section "ディレクトリ準備"
mkdir -p "$INSTALL_DIR" "$DATA_DIR"
# ── バイナリ取得 ─────────────────────────────────────────────
section "バイナリのダウンロード & インストール"
TMP_BIN="$(mktemp)"
curl -fsSL --retry 3 -o "$TMP_BIN" "$DOWNLOAD_URL"
chmod +x "$TMP_BIN"
mv "$TMP_BIN" "$BIN_PATH"
info "インストール先: $BIN_PATH"
info "バージョン: $("$BIN_PATH" version 2>/dev/null | grep -i version | head -1 || echo '不明')"
# ── config.yaml 生成 ─────────────────────────────────────────
section "設定ファイル生成"
[[ -f "$CONFIG_FILE" ]] && cp "$CONFIG_FILE" "${CONFIG_FILE}.bak" && \
warn "既存設定を ${CONFIG_FILE}.bak にバックアップしました"
cat > "$CONFIG_FILE" << EOF
server:
port: ${LISTEN_PORT}
listen: "0.0.0.0"
database: "${DATA_DIR}/filebrowser.db"
logging:
- output: "${DATA_DIR}/filebrowser.log"
sources:
- path: "/"
config:
defaultEnabled: true
auth:
methods:
password:
enabled: true
minLength: 8
frontend:
name: "FileBrowser Quantum"
EOF
info "設定ファイル: $CONFIG_FILE"
# ── systemd ユニット作成 ─────────────────────────────────────
section "systemd サービス登録"
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
[Unit]
Description=FileBrowser Quantum
Documentation=https://filebrowserquantum.com
After=network.target
[Service]
Type=simple
ExecStart=${BIN_PATH} -c ${CONFIG_FILE}
WorkingDirectory=${DATA_DIR}
Restart=on-failure
RestartSec=5s
User=root
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
# ── 管理者ユーザー作成 ───────────────────────────────────────
section "管理者ユーザー作成"
# サービスが既に動いていれば停止 (DBロック回避)
systemctl stop "$SERVICE_NAME" 2>/dev/null || true
FILEBROWSER_DATABASE="${DATA_DIR}/filebrowser.db" \
"$BIN_PATH" set -u "${FB_USER},${FB_PASS}" -a
info "ユーザー '${FB_USER}' を管理者として作成しました"
# ── サービス起動 ─────────────────────────────────────────────
section "サービス起動"
systemctl enable --now "$SERVICE_NAME"
info "サービス起動完了"
# ── ヘルスチェック ───────────────────────────────────────────
section "起動確認"
for i in $(seq 1 30); do
if curl -fsSo /dev/null "http://127.0.0.1:${LISTEN_PORT}" 2>/dev/null; then
info "ポート ${LISTEN_PORT} で応答確認 (${i}秒)"
break
fi
if [[ $i -eq 30 ]]; then
warn "タイムアウト: サービスログを確認してください"
journalctl -u "$SERVICE_NAME" --no-pager -n 20
fi
sleep 1
done
# ── 完了メッセージ ───────────────────────────────────────────
section "アクセス URL"
MAGIC_DNS=""
if command -v tailscale &>/dev/null; then
MAGIC_DNS="$(tailscale status --json 2>/dev/null \
| jq -r '.Self.DNSName // empty' | sed 's/\.$//')"
fi
echo ""
echo -e "\e[1;32m🎉 セットアップ完了!\e[0m"
if [[ -n "$MAGIC_DNS" ]]; then
echo -e "\e[1;36m http://${MAGIC_DNS}:${LISTEN_PORT}\e[0m"
else
LOCAL_IP="$(hostname -I | awk '{print $1}')"
warn "Tailscale MagicDNS 名が取得できませんでした"
echo -e "\e[1;36m http://${LOCAL_IP}:${LISTEN_PORT}\e[0m"
fi
echo ""
echo -e " ユーザー名 : \e[33m${FB_USER}\e[0m"
echo -e " 設定ファイル : ${CONFIG_FILE}"
echo -e " サービス管理 : systemctl {start|stop|restart|status} ${SERVICE_NAME}"
echo ""
オリジナルよりは見た目が整理されたデザイン
アクセスしたら、インストール時に設定したユーザー名やパスワードでログインします。

日本語に変更出来ます。試した環境では上位のフォルダへの移動が少し重かったような。メディアファイルへの扱いがよくなっているようですけれど、今の時点ではあえて使わなくてもよいかなという印象です。



