很好,那我們就把整個專案正式定案。我會以企業內部檔案伺服器的標準來設計,但保持簡單、容易維護。
FS2 專案 (go2see.me)
第一階段目標
取代目前
dav2.go2see.me
建立新的
fs2.go2see.me
驗證完成後,再決定是否切換成
fs.go2see.me
目錄架構
我建議直接用 Linux 標準:
/srv/fs2/
├── pub/
├── info/
├── share/
├── private/
│ ├── cyue/
│ ├── shari/
│ ├── johnny/
│ ├── tony/
│ ├── may/
│ ├── yuhan/
│ └── yuchen/
├── backup/
├── recycle/
├── temp/
└── lost+found/ (預留)
FS2 v1.0 最終網址
公用
https://fs2.go2see.me/
首頁
https://fs2.go2see.me/pub/
公開
https://fs2.go2see.me/info/
公告
https://fs2.go2see.me/share/
共用
個人
https://fs2.go2see.me/cyue/
https://fs2.go2see.me/shari/
https://fs2.go2see.me/johnny/
https://fs2.go2see.me/tony/
https://fs2.go2see.me/may/
https://fs2.go2see.me/yuhan/
https://fs2.go2see.me/yuchen/
完全沒有 private。
實際目錄
仍然保持:
/srv/fs2
pub/
info/
share/
private/
cyue/
shari/
johnny/
tony/
may/
yuhan/
yuchen/
Apache 只是 Alias。
因此以後搬家不用改資料。
權限模型
我們不要把權限寫死在 Apache,而是先定義一份「FS2 權限模型」。
| 資料夾 | Guest | Member | Maintainer |
|---|---|---|---|
| pub | R | R | RW |
| info | – | R | RW |
| share | – | RW | RW |
| private/自己 | – | RW | RW |
| private/別人 | – | – | – |
Maintainer(cyue)預設不直接存取其他人的 private。
這樣比較符合隱私原則。如果未來真的需要管理者緊急存取,我們可以另外建立一個受控的「Emergency Access」流程,而不是日常就有權限。
使用者
| 帳號 | 角色 |
|---|---|
| cyue | Maintainer |
| shari | Member |
| johnny | Member |
| tony | Member |
| may | Member |
| yuhan | Member |
| yuchen | Member |
Portal
首頁不是 Apache Directory Listing,而是:
FS2
Welcome cyue
📁 Public
📢 Information
👥 Shared Folder
🔒 My Folder
────────────
📰 Latest Announcement
────────────
👤 Profile
🚪 Logout
Admin(只有 cyue)
Dashboard
Users
Groups
Announcements
Logs
Storage
Settings
我希望加入的特色
① 最近公告
不用進 /info
直接首頁看到
2026-07-10
Server maintenance
Download PDF
② 容量
例如
Used
18.3 GB / 100 GB
███████░░░░
③ 最近登入
Last Login
2026-07-02 09:30
IP
192.168.xx.xx
④ 修改密碼
每個人都可以:
Old Password
New Password
Confirm
⑤ 管理者功能
可以:
- 新增使用者
- 停用帳號
- 重設密碼
- 修改容量
- 發布公告
我建議的開發順序
Milestone 1(基礎)
- 建立
/srv/fs2 - Apache HTTPS
- WebDAV
pub/info/share/private- 7 位使用者
這一步完成後就能投入使用。
Milestone 2(Portal)
- 首頁
- Login
- Profile
- Change Password
- Announcement
Milestone 3(Admin)
- User Management
- Group Management
- Logs
- Storage
Milestone 4(進階)
- 分享連結
- Web File Manager
- Recycle Bin
- Email 通知
- 全文搜尋
我想再加一個「企業級」功能
每位使用者都有自己的固定 Home:
/home
Portal 裡點擊 My Folder,會自動進入自己的私人空間。
而 WebDAV 仍保留:
/private/cyue
/private/johnny
...
這樣:
- Portal:使用者不用知道實際路徑,體驗更好。
- WebDAV:仍然使用標準 URL,相容 Windows、macOS、iPhone、Android。
我有一個最後的建議,也是整個專案最重要的一點:
我們不要一邊聊天一邊改設計。
建議先把整份 FS2 Design Specification v1.0 寫完整(架構圖、資料庫、Apache、權限、Portal 畫面、安裝流程),等規格確認後,再開始實作。這樣後面的 Apache 設定、PHP、MariaDB 都會依同一份設計文件進行,維護起來也容易得多。
OK。下一步先在 Ubuntu 22.04 / VM2 上做 FS2 Phase 1。
sudo -s 後工作,先做這三件:
mkdir -p /srv/fs2/{pub,info,share,backup,recycle,temp}
mkdir -p /srv/fs2/private/{cyue,shari,johnny,tony,may,yuhan,yuchen}
mkdir -p /opt/fs2
mkdir -p /etc/fs2
mkdir -p /var/log/fs2
chown -R www-data:www-data /srv/fs2
chmod -R 775 /srv/fs2
然後確認 Apache 模組:
a2enmod ssl dav dav_fs headers auth_basic authz_groupfile alias
apache2ctl configtest
systemctl reload apache2
接著我們做 fs2.go2see.me 的完整 Apache WebDAV 設定檔。
下面開始做 FS2 Phase 1:Apache WebDAV 版。
1. 建目錄
mkdir -p /srv/fs2/{pub,info,share,backup,recycle,temp}
mkdir -p /srv/fs2/private/{cyue,shari,johnny,tony,may,yuhan,yuchen}
mkdir -p /var/www/fs2-index
mkdir -p /var/www/apache/var
touch /var/www/apache/var/users.password
touch /var/www/apache/var/groups
touch /var/www/apache/var/DavLock
chown -R www-data:www-data /srv/fs2
chown -R root:www-data /var/www/apache/var
chmod -R 775 /srv/fs2
chmod 750 /var/www/apache/var
chmod 640 /var/www/apache/var/users.password /var/www/apache/var/groups
chmod 660 /var/www/apache/var/DavLock
2. 建使用者密碼
(一行一行輸入密碼, 第一個用 -c create. 密碼 enter 後再寫)
htpasswd -c /var/www/apache/var/users.password cyue ~316
htpasswd /var/www/apache/var/users.password shari ~316
htpasswd /var/www/apache/var/users.password johnny ~96Ab
htpasswd /var/www/apache/var/users.password tony ~96Ab
htpasswd /var/www/apache/var/users.password may ~228
htpasswd /var/www/apache/var/users.password yuhan ~96
htpasswd /var/www/apache/var/users.password yuchen ~96
3. 建群組
cat > /var/www/apache/var/groups <<'EOF'
members: cyue shari johnny tony may yuhan yuchen
maintainers: cyue
EOF
4. 建首頁
cat > /var/www/fs2-index/index.html <<'EOF'
FS2 go2see.me
FS2 - go2see.me File Server
EOF
5. Apache 設定檔
nano /etc/apache2/sites-available/fs2-le-ssl.conf
先貼這份:
ServerName fs2.go2see.me
Redirect permanent / https://fs2.go2see.me/
ServerName fs2.go2see.me
DocumentRoot /var/www/fs2-index
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/fs2.go2see.me/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/fs2.go2see.me/privkey.pem
DavLockDB /var/www/apache/var/DavLock
ErrorLog ${APACHE_LOG_DIR}/fs2_error.log
CustomLog ${APACHE_LOG_DIR}/fs2_access.log combined
Options -Indexes
AllowOverride None
Require all granted
Alias /pub /srv/fs2/pub
DAV On
Options Indexes
AllowOverride None
Require all granted
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
AuthGroupFile /var/www/apache/var/groups
Require group maintainers
Alias /info /srv/fs2/info
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
AuthGroupFile /var/www/apache/var/groups
Require group members
Require group maintainers
Alias /share /srv/fs2/share
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
AuthGroupFile /var/www/apache/var/groups
Require group members
Alias /cyue /srv/fs2/private/cyue
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user cyue
Alias /shari /srv/fs2/private/shari
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user shari
Alias /johnny /srv/fs2/private/johnny
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user johnny
Alias /tony /srv/fs2/private/tony
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user tony
Alias /may /srv/fs2/private/may
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user may
Alias /yuhan /srv/fs2/private/yuhan
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user yuhan
Alias /yuchen /srv/fs2/private/yuchen
DAV On
Options Indexes
AllowOverride None
AuthType Basic
AuthName "FS2"
AuthUserFile /var/www/apache/var/users.password
Require user yuchen
5. 然後申請憑證:
sudo certbot certonly --apache -d fs2.go2see.me
6. 啟用 FS2
a2enmod ssl dav dav_fs headers auth_basic authz_groupfile alias
a2ensite fs2-le-ssl.conf
apache2ctl configtest
systemctl reload apache2
7. 測試
curl -I https://fs2.go2see.me/
curl -I https://fs2.go2see.me/pub/
curl -u cyue https://fs2.go2see.me/info/
curl -u johnny https://fs2.go2see.me/share/
curl -u johnny https://fs2.go2see.me/private/johnny/
curl -u johnny https://fs2.go2see.me/private/cyue/
預期:
/ 200
/pub/ 200
/info/ 401 未登入
/info/ + cyue 200
/share/ + johnny 200
/private/johnny/ 200
/private/cyue/ 401 或 403
AH00558 只是警告,不影響運作。要消除可加:
echo "ServerName fs2.go2see.me" | sudo tee /etc/apache2/conf-available/servername.conf
sudo a2enconf servername
sudo apache2ctl configtest
sudo systemctl reload apache2
是,Phase 1 已經 OK。
你的結果符合預期:
/ 200 OK
/pub/ 200 OK
/info/ 未登入 401 OK
/info/ cyue 200 OK
/share/ johnny 200 OK
/johnny/ johnny 200 OK
/cyue/ johnny 401 OK
johnny 不能進 /cyue/,代表私人目錄隔離成功。
現在可以確認:
✅ HTTPS 正常
✅ 首頁正常
✅ pub 公開讀取正常
✅ info 需要登入
✅ share 成員可登入
✅ 個人目錄正常
✅ 其他人的個人目錄不能進
✅ Apache 設定 Syntax OK
下一步建議做 寫入測試:
curl -u johnny -T /etc/hostname https://fs2.go2see.me/share/test-johnny.txt
curl -u johnny -T /etc/hostname https://fs2.go2see.me/johnny/test-johnny.txt
curl -u johnny -T /etc/hostname https://fs2.go2see.me/info/test-johnny.txt
curl -u cyue -T /etc/hostname https://fs2.go2see.me/info/test-cyue.txt
預期:
johnny 寫 share 成功
johnny 寫 johnny 成功
johnny 寫 info 失敗
cyue 寫 info 成功
完全正確,FS2 Phase 1 通過。
結果確認:
✅ johnny 寫入 /share 成功
✅ johnny 寫入 /johnny 成功
✅ johnny 寫入 /info 失敗
✅ cyue 寫入 /info 成功
現在可以標記:
FS2 Phase 1:完成
建議清掉測試檔:
rm -f /srv/fs2/share/test-johnny.txt
rm -f /srv/fs2/private/johnny/test-johnny.txt
rm -f /srv/fs2/info/test-cyue.txt
下一步可以做:建立備份腳本 + 開始規劃 Phase 2 Portal / 改密碼功能。
先做 FS2 Phase 1 收尾:備份腳本。
1. 建備份目錄
sudo -s
mkdir -p /backup/fs2
mkdir -p /opt/fs2/tools
2. 建備份腳本
nano /opt/fs2/tools/backup_fs2.sh
貼上:
#!/bin/bash
set -e
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/backup/fs2/$DATE"
mkdir -p "$BACKUP_DIR"
tar czf "$BACKUP_DIR/fs2-storage.tar.gz" /srv/fs2
tar czf "$BACKUP_DIR/fs2-apache.tar.gz" \
/etc/apache2/sites-available/fs2-le-ssl.conf \
/var/www/fs2-index \
/var/www/apache/var/users.password \
/var/www/apache/var/groups \
/var/www/apache/var/DavLock
echo "FS2 backup completed:"
echo "$BACKUP_DIR"
3. 加執行權限
chmod +x /opt/fs2/tools/backup_fs2.sh
4. 測試備份
/opt/fs2/tools/backup_fs2.sh
ls -lh /backup/fs2/
5. 建每日自動備份
crontab -e
加入:
30 3 * * * /opt/fs2/tools/backup_fs2.sh >> /var/log/fs2/backup.log 2>&1
這樣每天凌晨 03:30 備份一次。