我一直覺得各種教學資訊系統 (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然後在 /etc/fail2ban/jail.local 裡面加上一段:failregex = /api/login: 403
[filebrowser] backend = auto logpath = /var/log/filebrowser.log enabled = true port = xxxxx filter = filebrowser maxretry = 8 findtime = 600 bantime = 3600
最後, 重啟 fail2ban 服務, 即可測試。
* * * * *
是說, 因為溝通失誤, 電腦教室的 linux 虛擬機沒有設定好, 最終我還是回來教學生用 ssh。 反正 filebrowser 都已經學了, 就順便分享一下。
大人問小孩: 「全世界的玩具隨便你挑? 這怎麼可能?
如果我要的玩具只有一個, 正好又被別人借走了呢?」
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。