三年前, 我以一個伺服器新人使用者的身分寫下了關於 Seafile 的兩篇文章文章《在 CentOS 7 下安装 Seafile 社区版》《CentOS 7 与 MySQL 5.7 下搭建 Seafile 企业版》. 直到今天, Jonny'Blog 的訪問量中, 這幾篇關於私有雲的文章仍然佔有一些點擊率, 儘管它們已經不是最新的文章了. 在 CentOS 8 和 MySQL 8 已經發布的情況下, 我覺得有必要對文章進行更新

Seafile 專業版是面向個人、小型團隊和家庭的私有雲, 三個人以下的使用是免費的. 如果多於三個人使用則需要付費, 由於它的功能比社區版要多太多, 因此社區版的我不再另外撰寫教學

我們首先進入英文版的 Seafile 下載網站 https://www.seafile.com/en/download/, 中文版是找不到專業版這個版本的

然後把頁面拉到最下面找到

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

點擊 customer center. 如果你沒有帳號, 那麼需要註冊一個賬號. 註冊完畢或者已經持有帳號的話, 直接登陸就可以了

點擊最左側的 Downloads

然後右側有一個藍色的下載鏈接 https://download.seafile.com/d/你自己的編號/?p=/pro

中間的編號每個人都是不一樣的, 這個和社區版的下載是不同的

進入這個網頁之後, 我們可以看到 Seafile 的演示版本, 拉到最下面. 截止發文為止, 最新版本為

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡要注意的是, 從 Seafile 7.1 開始, Seafile 已經更改使用 Python 3 了, 因此依賴的套件會有些不同

由於我們是在 CentOS 下進行配置, 因此我們下載 CentOS 的版本. 這裡有兩種方法, 一種是下載到本機然後上載到伺服器, 另外一種是通過伺服器直接下載. 我們首先進入專門放置網站的檔案夾, 為 Seafile 創建一個專門的檔案夾

cd /www

mkdir seafile && cd seafile

然後下載

wget https://download.seafile.com/seafhttp/files/你的編號/seafile-pro-server_7.1.9_x86-64_CentOS.tar.gz

這個通過下載工具的查詢下載地址功能可以直接獲得

這裡要特別注意, Seafile 建議伺服器的記憶體至少有 2GB 的大小

直接解壓縮

tar -zxvf seafile-pro-server_7.1.9_x86-64_CentOS.tar.gz

上面的指令帶有版本號 7.1.9, 因此需要根據你下載的版本對指令進行修改. 後面所有帶有版本號的指令和這裡一樣需要進行修改

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

解壓縮之後, 我們得到了 seafile-pro-server-版本號 這個檔案夾, 進入這個檔案夾

cd seafile-pro-server-7.1.9

使用 ll 指令可以看到 Seafile 檔案夾的基本架構

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

在正式安裝之前, 我們需要安裝以來的套件 :

dnf install -y python3 python3-setuptools python3-pip poppler-utils java-1.8.0-openjdk

pip3 install Pillow pylibmc captcha jinja2 sqlalchemy django-pylibmc django-simple-captcha python3-ldap boto

然後就可以執行執行指令碼了 :

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這個指令碼首先會檢查所有依賴的套件是否已經安裝, 如果沒有問題, 那麼就會出現上述界面. 如果沒有問題, 直接按 ENTER 鍵進入安裝流程

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡是詢問伺服器的名稱

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡可以填寫繫結到伺服器的網域名稱或者 IP 地址

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡是詢問是否使用預設的 8082 連接埠, 如果沒有特殊需求, 那麼直接按 ENTER 鍵確認

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這一步是詢問是否為 Seafile 創建新的資料庫, 如果你自己已經創建, 而不是用指令碼的創建方式, 那麼需要輸入 2, 然後按照對應步驟輸入信息即可. 對於新手來說, 建議跟隨本文章給出的步驟, 輸入 1

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡是詢問 MySQL 的伺服器, 我們把 MySQL 已經安裝在本機上, 所以直接按 ENTER 鍵確認即可

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡是詢問 MySQL 的連接埠, 如果你按照本網誌之前給出的方式安裝的 MySQL, 那麼直接按 ENTER 鍵確認即可

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡是詢問 root 帳戶的密碼

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

安裝指令碼將為 Seafile 創建一個獨立的帳戶, 預設的名稱為 seafile, 我們直接按 ENTER 鍵確認

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這裡要求輸入 seafile 帳戶的密碼, 不建議和 root 帳戶相同. 需要注意的是, 密碼中不要包含 "%" 字元, 這會導致錯誤

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog 在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

這幾步都是詢問和 Seafile 有關的資料庫名稱, 直接按 ENTER 鍵確認即可, 沒有必要進行修改

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

如上圖所示的話, 那麼就說明安裝成功

接下來, 我們在 Nginx 下啟用 Seafile. 首先需要創建 Seafile 的配置文件 :

vim /etc/nginx/conf.d/seafile.conf

將以下內容修改之後複製到這個配置檔案中

server {
	listen 80;
	server_name 你的網域名稱;
	rewrite ^ https://$http_host$request_uri? permanent;
	server_tokens off;
}
server {
	listen 443 ssl http2;
	server_name 你的網域名稱;
	ssl_certificate /SSL .crt 證書所在位置;
	ssl_certificate_key /SSL .key 證書所在位置;
	ssl_session_timeout 5m;
	ssl_session_cache shared:SSL:5m;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
	ssl_prefer_server_ciphers on;
	add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
	proxy_set_header X-Forwarded-For $remote_addr;
	location / {
		proxy_pass http://127.0.0.1:8000;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Host $server_name;
		proxy_set_header X-Forwarded-Proto https;
		proxy_read_timeout 1200s;
		client_max_body_size 0;
		access_log /var/log/nginx/seahub.access.log;
		error_log /var/log/nginx/seahub.error.log;
	}
	location /seafhttp {
		rewrite ^/seafhttp(.*)$ $1 break;
		proxy_pass http://127.0.0.1:8082;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		client_max_body_size 0;
		proxy_connect_timeout 36000s;
		proxy_read_timeout 36000s;
		proxy_send_timeout  36000s;
		send_timeout  36000s;
		proxy_request_buffering off;
	}
	location /media {
		root /Seafile 所在檔案夾/seafile-server-latest/seahub;
	}
}

請注意, 上述配置預設開啟了 SSL, 本網誌將棄用不使用 SSL 的連線方式. 對於 SSL 開啟的具體教學, 參考文章《Nginx 下实现 HTTPS》. 接下來使用 nginx -t 指令測試一下是否存在問題, 如圖所示的話, 就沒有問題. 否則, 你需要根據 Nginx 給出的提示, 進行修改

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

重新載入 Nginx 的配置檔案 :

systemctl reload nginx

在進行接下來的配置之前, 我們首先啟動 Seafile 來試一下. 回到 Seafile 所在檔案夾 :

cd /www/seafile/seafile-pro-server-7.1.9

./seafile.sh start

./seahub.sh start

在第一次啟動 Seahub 的時候, 會讓你創建一個管理員帳戶, 根據提示輸入郵箱、密碼和確認密碼即可

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

如果出現這種情況, 請檢查一下

location /media {
    root /Seafile 所在檔案夾/seafile-server-latest/seahub;
}

Seafile 的 Nginx 配置檔案中, 這裡的路徑是不是寫錯了

現在已經可以正常使用了, 接下來是進階教學

1. 開機啟動

創建 Seafile 服務檔案 :

vim /etc/systemd/system/seafile.service

將下列內容修改後複製入檔案中

[Unit]
Description=Seafile
After=network.target

[Service]
Type=oneshot
ExecStart=/Seafile 所在檔案夾/seafile-server-latest/seafile.sh start
ExecStop=/Seafile 所在檔案夾/seafile-server-latest/seafile.sh stop
RemainAfterExit=yes
User=seafile
Group=seafile

[Install]
WantedBy=multi-user.target

創建 Seahub 服務檔案 :

vim /etc/systemd/system/seahub.service

將下列內容修改後複製入檔案中

[Unit]
Description=Seafile hub
After=network.target seafile.service

[Service]
ExecStart=/Seafile 所在檔案夾/seafile-server-latest/seahub.sh start
ExecStop=/Seafile 所在檔案夾/seafile-server-latest/seahub.sh stop
User=seafile
Group=seafile
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

重新載入 systemd 設定檔

systemctl daemon-reload

然後就可以使用 systemd 指令啟動 Seafile 了

systemctl start seafile

systemctl start seahub

接著我們設定開機啟動

systemctl enable seafile

systemctl enable seahub

2. 設定 logrotate

這個功能允許你在剪切日誌檔案的時候無需關閉 Seafile

vim /etc/logrotate.d/seafile

將下列內容修改後複製入檔案即可

/opt/seafile/logs/seafile.log
{
        daily
        missingok
        rotate 15
        compress
        delaycompress
        notifempty
        sharedscripts
        postrotate
                [ ! -f /home/haiwen/pids/seaf-server.pid ] || kill -USR1 `cat /Seafile 所在檔案夾/pids/seaf-server.pid`
        endscript
}

/opt/seafile/logs/ccnet.log
{
        daily
        missingok
        rotate 15
        compress
        delaycompress
        notifempty
        sharedscripts
        postrotate
                [ ! -f /home/haiwen/pids/ccnet.pid ] || kill -USR1 `cat /Seafile 所在檔案夾/pids/ccnet.pid`
        endscript
}

/opt/seafile/logs/index.log
{
        daily
        missingok
        rotate 15
        compress
        delaycompress
        notifempty
        sharedscripts
}

3. 配置 Memcached

Memcached 在多人使用的情況下 (特別是超過 50 人的情況下), 可以提高效能

dnf install -y memcached libmemcached

pip3 install pylibmc django-pylibmc

systemctl enable --now memcached

然後將以下內容加入到 /Seafile 所在檔案夾/conf/seahub_settings.py

CACHES = {
    'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    },
    'locmem': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
}
COMPRESS_CACHE_BACKEND = 'locmem'

4. 全文搜尋

Seafile 7 中, 全文搜尋和 PDF、Office 搜尋預設是開啟的

5. 斷點傳續

ENABLE_RESUMABLE_FILEUPLOAD = True 添加到 /Seafile 所在檔案夾/conf/seahub_settings.py

6. 用戶角色和管理員角色設定

下面是普通用戶角色的設定說明

can_add_repo                        # 允許創建資料庫
can_add_group                       # 允許創建群組
can_view_org                        # 允許閱覽組織
can_add_public_repo                 # 允許創建全員可見的公共資料庫
can_use_global_address_book         # 允許使用全域通訊錄 (比如共享時能搜索到其他的用戶)
can_use_wiki                        # 允許使用維基百科
can_publish_repo                    # 允許公開發佈資料庫
can_generate_share_link             # 允許創建共享外鏈
can_generate_upload_link            # 允許創建上載外鏈
can_invite_guest                    # 允許邀請訪客, 訪客不能擁有自己的文件
can_connect_with_android_clients    # 允許使用安卓客戶端登錄
can_connect_with_ios_clients        # 允許使用 iOS 客戶端登錄
can_connect_with_desktop_clients    # 允許使用桌面客戶端登錄

要添加一個新的角色, 只需要把以下內容按照你的要求作修改, 然後添加到 /Seafile 所在檔案夾/conf/seahub_settings.py 中即可

ENABLED_ROLE_PERMISSIONS = {
    '角色名稱': {
        'can_add_repo': True,
        'can_add_group': True,
        'can_view_org': True,
        'can_add_public_repo': True,
        'can_use_global_address_book': True,
        'can_use_wiki': True,
        'can_publish_repo': True,
        'can_generate_share_link': True,
        'can_generate_upload_link': True,
        'can_invite_guest': True,
        'can_connect_with_android_clients': True,
        'can_connect_with_ios_clients': True,
        'can_connect_with_desktop_clients': True,
    },
}

Seafile 內建了四種管理員角色 :

  • default_admin : 擁有所有權限
  • system_admin : 只能查看系統信息和系統配置
  • daily_admin : 只能查看系統信息、統計信息、用戶日誌以及管理資料庫/用戶/群組
  • audit_admin : 只能查看系統信息和管理員日誌

其對應的設定為

ENABLED_ADMIN_ROLE_PERMISSIONS = {
    'system_admin': {
        'can_view_system_info': True,
        'can_config_system': True,
    },
    'daily_admin': {
        'can_view_system_info': True,
        'can_view_statistic': True,
        'can_manage_library': True,
        'can_manage_user': True,
        'can_manage_group': True,
        'can_view_user_log': True,
    },
    'audit_admin': {
        'can_view_system_info': True,
        'can_view_admin_log': True,
    },
    'custom_admin': {
        'can_view_system_info': True,
        'can_config_system': True,
        'can_view_statistic': True,
        'can_manage_library': True,
        'can_manage_user': True,
        'can_manage_group': True,
        'can_view_user_log': True,
        'can_view_admin_log': True,
    },
}

可以看到, 上面不管是關於用戶還是關於管理員的設定全是 True, 如果你需要關閉某些功能, 把 True 改為 False 即可

7. 多機構支援

Seafile 支援添加機構, 每個機構下都可以有管理員

我們需要在 /Seafile 所在檔案夾/conf/seahub_settings.py 中添加下列程式碼

MULTI_INSTITUTION = True
EXTRA_MIDDLEWARE_CLASSES = (
    'seahub.institutions.middleware.InstitutionMiddleware',
)

8. 病毒掃描

個人使用的話, 不建議配置病毒掃描. 會導致伺服器極其緩慢, 而且會佔用大量的資源. 況且你自己也不會故意上傳一些病毒

首先安裝依賴套件

dnf install -y clamav-server clamav-data clamav-filesystem clamav-lib clamav-update clamav clamav-devel

配置 Freshclam 以支援定期更新病毒資料庫

cp /etc/freshclam.conf /etc/freshclam.conf.bak

sed -i '/^Example/d' /etc/freshclam.conf

令其可以開機啟動

vim /usr/lib/systemd/system/clam-freshclam.service

將以下內容複製到上述檔案中

[Unit]
Description = freshclam scanner
After = network.target

[Service]
Type = forking
ExecStart = /usr/bin/freshclam -d -c 4
Restart = on-failure
PrivateTmp = true

[Install]
WantedBy=multi-user.target

啟動

systemctl enable --now clam-freshclam

接下來配置 Clamd

cp /usr/share/doc/clamd/clamd.conf /etc/clamd.conf

sed -i '/^Example/d' /etc/clamd.conf

vim /clamd.conf

搜尋 User

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

把後面的 <USER> 修改為 root

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

搜尋 LocalSocket

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

去掉最前面的 "#", 然後把後面修改為 /var/run/clamd.sock

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

接下來我們要啟動 clamd 服務, 必須進行配置

vim /etc/init.d/clamd

加入下列內容

case "$1" in
  start)
    echo -n "Starting Clam AntiVirus Daemon... "
    /usr/sbin/clamd
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/clamd
    ;;
  stop)
    echo -n "Stopping Clam AntiVirus Daemon... "
    pkill clamd
    rm -f /var/run/clamav/clamd.sock
    rm -f /var/run/clamav/clamd.pid
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/clamd
    ;;
esac

執行指令 chmod +x /etc/init.d/clamd

service clamd on

然後我們利用指令 clamdscan /你要掃描的檔案夾 測試一下病毒掃描 :

在 CentOS 8 + Nginx + MySQL 8 下配置 Seafile 專業版-Jonny'Blog

最後, 我們在配置檔案 /Seafile 所在檔案夾/conf/seafile.conf 中, 將一下內容加入最後即可 :

[virus_scan]
scan_command = clamscan
virus_code = 1
nonvirus_code = 0
scan_interval = 60
scan_size_limit = 8192
scan_skip_ext = .bmp, .gif, .ico, .png, .jpg, .mp3, .mp4, .wav, .avi, .rmvb, .mkv
threads = 2

其中, scan_interval 是掃描間隔, 單位是分鐘. scan_size_limit 是掃描檔案的最大大小, 單位為 MB. scan_skip_ext 是後綴已經列出的檔案直接跳過掃描, 以 "," 隔開. threads 是掃描的執行緒最大數量. 上面配置可以自訂

9. LibreOffice 支援

LibreOffice 是對 Office 檔案的在線協作和預覽的工具. LibreOffice 我們採用手動安裝

首先進入 https://www.libreoffice.org/download/download/?type=rpm-x86_64&lang=lt 查看最新版本的下載地址, 選擇之後記得選擇 RPM 檔案夾, 接下來還需要選擇 x86_64 檔案夾. 截止發文為止, 最新的版本下載地址為

http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/7.0.3/rpm/x86_64/LibreOffice_7.0.3_Linux_x86-64_rpm.tar.gz

首先進入 Seafile 檔案夾中

cd /www/seafile

然後下載

wget http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/7.0.3/rpm/x86_64/LibreOffice_7.0.3_Linux_x86-64_rpm.tar.gz

解壓縮

tar -zxvf LibreOffice_7.0.3_Linux_x86-64_rpm.tar.gz

進入 RPM 包的檔案夾

cd LibreOffice_7.0.3.1_Linux_x86-64_rpm/RPMS

然後直接手動安裝即可

dnf localinstall -y *.rpm

對於中文, 需要安裝一些字體

dnf install -y install wqy-microhei-fonts wqy-zenhei-fonts wqy-unibit-fonts

接下來讓 Seafile 支援 LibreOffice. 在 /Seafile 所在檔案夾/conf/seafevents.conf 配置檔案的最後增加

[OFFICE CONVERTER]
enabled = true
workers = 1
outputdir = /tmp/

其中, workers 是同作處理的數量, outputdir 是 Office 及 PDF 檔案轉換後臨時存放的位置

10. 其它一些設定

其它一些設定可以參考文章《Seafile 进阶玩法》

 

需要提醒大家的是, 每一次修改任何屬於 Seafile 的設定檔之後, 都需要重新啟動 Seafile 或者 Seahub 服務