FileBrowserから派生した「FileBrowser Quantum」

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 ""

オリジナルよりは見た目が整理されたデザイン

アクセスしたら、インストール時に設定したユーザー名やパスワードでログインします。

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

タイトルとURLをコピーしました