2026年3月14日 星期六

收集學生的作業? filebrowser 比教學資訊系統更好用

filebrowser 介面 我一直覺得各種教學資訊系統 (Learning Management System, 不論是否自由軟體, 例如 moodle 或 iLearning 等等) 的交作業功能都不好用。 Google drive 也許好一點; 但對老師最方便的方式, 還是讓學生把作業上傳到我的 linux 伺服器。 這樣, 我在可以直接用 grep 之類的指令批次處理所有作業, 比滑鼠點半天快太多了。 但除了幫學生開設 ssh 帳號、 教 (通識!) 學生採用 putty 跟 winscp 傳檔之外, 還有其他方式嗎? 詢問 gemini 🤖 的意見, 它推薦 File Browser

這是一個很簡單的雲端檔案服務: 從客戶端看, 每位同學可以有自己的帳號密碼, 用瀏覽器就可以上傳檔案。 在伺服器端, 所有的檔案都由啟動服務的那一個人所擁有。 我習慣讓同學們可以看到自己上傳過的檔案、 看到彼此的作業。 由我的帳號 ckhung 來啟動服務, 正好。

在 debian 裡面找不到 filebrowser 套件, 所以要從官網下載。 解壓縮後, 直接執行可執行檔, 它會抱怨找不到資料庫檔 filebrowser.db。 按照指示, 執行 filebrowser config init 之後, 會在 目前目錄 產生資料庫檔 filebrowser.db , 裡面也包含預設組態。 以後每次執行 filebrowser , 它都會在 你當時所在的目錄 裡面尋找 filebrowser.db 、 從裡面讀取設定值。

先不急著啟動服務。 先檢視當前組態: filebrowser config cat 或是存成 json 檔: filebrowser config export config.json 。 我喜歡手動編輯這個 config.json , 再把它讀回去/寫入 filebrowser.db : filebrowser config import config.json

一定要改的是 server.address , 要把 127.0.0.1 改成 0.0.0.0 才可以對外營業。 (但是就有風險, 所以要用 fail2ban 保護, 下詳。) 還有, server.root 指定所有上傳檔案存放的最上層目錄, 例如我把它設成 /var/www/html/fb 。 我也會去改 server.port , 避免放在熱門的 8080 port 吸引潰客。

注意 ⚠️ 一般啟動 filebrowser 時, 它只會去讀 filebrowser.db 而不會去讀任何文字設定檔, 除非在命令列上特別指定。 像上面匯出的 json 格式文字設定檔, 只是 filebrowser 跟使用者溝通的臨時檔案。

每個指令後面都可以加上 -h 獲得 help 訊息, 例如查詢如何匯入設定檔 filebrowser config import -h 或是查詢增刪修改使用者相關指令 filebrowser users -h 。 也可以用 filebrowser -h 列出所有指令摘要。

Gemini 教我建立 /etc/systemd/system/filebrowser.service 內容是:

[Unit]
Description=FileBrowser for Student Submissions
After=network.target

[Service]
User=ckhung
Group=ckhung
ExecStart=/opt/filebrowser/filebrowser --database /opt/filebrowser/filebrowser.db --log /var/log/filebrowser.log
Restart=on-failure

[Install]
WantedBy=multi-user.target

如此即可啟用服務: sudo systemctl start filebrowser 而啟用者身份是 ckhung, 所以所有人上傳的檔案都以他為 owner。

其中 log 檔很重要。 初次啟動時, 要以 admin 身份登入。 但是密碼呢? 以上面的設定為例, 在 /var/log/filebrowser.log 裡面就可以查到密碼。 當然應該要趕快登入、 修改密碼。

如果 admin 的密碼 🔑 忘掉了怎麼辦? filebrowser users update admin -p '不好猜的密碼' 但是! 如果 filebrowser 服務正在執行, 你又同時要在命令列上執行 filebrowser 指令, 就會看到 Error: timeout 的錯誤訊息, 因為 filebrowser.db 被鎖住。 也就是說, 必須把服務停掉, 才可以下 filebrowser 指令。

新增用戶時, 我會這樣下指令: filebrowser users add s1234567 's1234567的密碼' --scope s1234567 其中 --scope 選項用來指定此用戶的家目錄, 相對於先前 server.root 的路徑。 詳見 這則討論。 以稍早的設定加上上面的指令來說, 就是把 s1234567 這位新用戶的家目錄設定成 /var/www/html/fb/s1234567/ 。 這樣就很容易用 shell 迴圈 🔄 一口氣產生很多帳號, 各自有獨立的檔案儲存空間。

像這種登入服務, 一定要用 fail2ban 保護 🛡️。 我試過用 systemd-journald 的方式讓 fail2ban 去讀 log, 但失敗。 所以改成指定 log 檔。 (上面的 --log /var/log/filebrowser.log) 再建立 /etc/fail2ban/filter.d/filebrowser.conf 內容很簡單:

[Definition]

# log format:
# 2026/01/22 08:30:14 /api/login: 403 106.105.68.134 
failregex = /api/login: 403 
然後在 /etc/fail2ban/jail.local 裡面加上一段:
[filebrowser]
backend  = auto
logpath  = /var/log/filebrowser.log
enabled  = true
port     = xxxxx
filter   = filebrowser
maxretry = 8
findtime = 600
bantime  = 3600

最後, 重啟 fail2ban 服務, 即可測試。

* * * * *

是說, 因為溝通失誤, 電腦教室的 linux 虛擬機沒有設定好, 最終我還是回來教學生用 ssh。 反正 filebrowser 都已經學了, 就順便分享一下。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。