摘要訊息 : 在 CentOS 8, Nginx 和 MySQL 8 下配置 Seafile 專業版.

0. 前言

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

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

更新紀錄 :

  • 2022 年 5 月 31 日進行第一次更新和修正.

1. 下載

我們首先進入英文版的 Seafile 下載網站 https://www.seafile.com/en/download/, 中文版是找不到專業版這個版本的. 然後把頁面拉到最下面找到 Server Professional Edition, 再找到並且點擊 customer center. 如果你沒有帳號, 那麼需要註冊一個賬號. 註冊完畢或者已經持有帳號的話, 直接登陸就可以了. 登陸完畢之後點擊最左側的 Downloads, 然後右側有一個藍色的下載鏈接 https://download.seafile.com/d/你自己的編號/?p=/pro. 中間的編號每個人都是不一樣的, 這個和社區版的下載是不同的. 進入這個網頁之後, 我們可以看到 Seafile 的演示版本, 拉到最下面就可以看到最新的版本. 要注意我們下載的版本後綴是 _CentOS.tar.gz, 不是 .txt 結尾, 也不帶有 _Ubuntu 字樣. 直接點擊下載是下載到電腦上, 現在我們要下載到伺服器上, 所以可以停止下載, 複製下載連結即可. 然後在伺服器中為 Seafile 建立一個專門的檔案夾 : mkdir -p /www/seafile && cd /www/seafile. 最後通過 wget 指令 wget 下載連結, 即可把 Seafile 下載到伺服器中.

Figure 1. Seafile 下載頁面

從 Seafile 7.1 開始, Seafile 已經更改使用 Python 3 了, 因此依賴的套件會有些不同. 這裡要特別注意, Seafile 建議伺服器的記憶體至少有 2GB 的大小.

2. 安裝

下載完畢之後, 我們首先需要解壓縮 : tar -zxvf seafile-pro-server*.tar.gz. 解壓縮之後, 我們得到了 seafile-pro-server-版本號 這個檔案夾, 進入這個檔案夾 cd seafile-pro-server*. 使用 ll 指令可以看到 Seafile 檔案夾的基本架構 :

Figure 2. Seafile 基本架構

我們需要安裝 Seafile 依賴的套件 : dnf install -y python3 python3-setuptools python3-pip poppler-utils java-1.8.0-openjdk mysql-devel gcc. 除此之外, 還要安裝 Python 套件 : pip3 install Pillow pylibmc captcha jinja2 sqlalchemy django-pylibmc django-simple-captcha python3-ldap boto mysqlclient. 然後就可以運作安裝程式了 : ./setup-seafile-mysql.sh.

Figure 3-1. 開始安裝

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

  • server name : 填寫伺服器名稱;
  • This server's ip or domain : 填寫伺服器的網域名稱或者 IP;
  • Which port do you want to use for the seafile fileserver? : 預設 Seafile 檔案伺服器連接埠是 8082, 沒有衝突不建議更改;
  • Please choose a way to initialize seafile databases? : 有兩種方式, 第一種是由安裝程式來創建資料庫, 第二種是手動填寫資料庫信息. 如果閣下是第一次安裝請選 1, 如果有自訂要求可以選 2;
  • What is the host of mysql server? : 這裡填寫 MySQL 的伺服器, 如果安裝在了伺服器本機上, 可以直接回車確認, 否則需要自行確認 MySQL 伺服器;
  • What is the port of mysql server? : 這個問題是詢問 MySQL 的連接埠, 預設為 3306. 有更改的話填寫更改之後的連接埠;
  • What is the password of the mysql root user? : 這是詢問最高權限使用者 root 的密碼;
  • Enter the name for mysql user of seafile : 這是安裝程式正在為 Seafile 創建資料庫帳戶, 有需要的話自訂, 沒有的話按回車確認;
  • Enter the password for mysql user "seafile" : 這是為資料庫 seafile 設定密碼, 安全起見不建議和 root 使用者相同 (密碼中不要包含 % 字元, 這會導致錯誤);
  • Enter the database name for ccnet-server/seahub-db/seafile-db : 這三個問題是詢問和 Seafile 有關的資料庫的名稱是否需要自訂, 一般直接回車確認即可, 我們也沒有必要進行修改.
Figure 3-2. 安裝完成

接下來, 我們在 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 給出的提示進行修改. 完成之後重新載入 Nginx 的配置檔案 : systemctl reload nginx.

在進行接下來的配置之前, 我們首先啟動 Seafile 來試一下. 回到 Seafile 所在檔案夾 : cd /www/seafile/seafile-pro-server*. 輸入 ./seafile.sh start && ./seahub.sh start 來啟動 Seafile. 在第一次啟動 Seahub 的時候, 會讓你創建一個管理員帳戶, 根據提示輸入郵箱、密碼和確認密碼即可. 如果出現

Figure 4. 沒有樣式的網頁

注意檢查一些 Nginx 配置中的 root /Seafile 所在檔案夾/seafile-server-latest/seahub; 這個檔案夾是否正確.

3. 配置

Seafile 的預設配置部分服務是沒有開啟的, 我們通過手動配置開啟這些服務以獲得更好的使用體驗.

3.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 stop seafile
systemctl stop seahub

# 開機啟動
systemctl enable seafile
systemctl enable seahub

# 取消開機啟動
systemctl disable seafile
systemctl disable seahub

3.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.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'

3.4 全文搜尋

Seafile 7 以上的版本中, 全文搜尋和 PDF 與 Office 搜尋預設是開啟的, 不需要配置.

3.5 斷點傳續

ENABLE_RESUMABLE_FILEUPLOAD = True 添加到 /Seafile 所在檔案夾/conf/seahub_settings.py 中即可開啟斷點傳續.

3.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 即可.

3.7 多機構支援

Seafile 支援添加機構, 每個機構下都可以有管理員. 我們需要在 /Seafile 所在檔案夾/conf/seahub_settings.py 中添加下列程式碼 :

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

3.8 病毒掃描

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

首先安裝依賴套件 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, 把後面的 <USER> 修改為 root. 搜尋 LocalSocket, 去掉最前面的 "#", 然後把後面修改為 /var/run/clamd.sock. 接下來我們要啟動 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 /你要掃描的檔案夾 測試一下病毒掃描. 最後, 我們在配置檔案 /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 是掃描的執行緒最大數量. 上面配置可以自訂.

3.9 LibreOffice 支援

LibreOffice 是對 Office 檔案的在線協作和預覽的工具. LibreOffice 我們採用手動安裝. 首先進入 https://www.libreoffice.org/download/download/?type=rpm-x86_64&lang=lt 查看最新版本的下載地址, 選擇之後記得選擇 RPM 檔案夾, 接下來還需要選擇 x86_64 檔案夾. 截止發文為止, 最新的版本下載地址為 https://www.libreoffice.org/donate/dl/rpm-x86_64/7.3.3/lt/LibreOffice_7.3.3_Linux_x86-64_rpm.tar.gz. 首先進入 Seafile 檔案夾中 cd /www/seafile, 然後下載 wget https://www.libreoffice.org/donate/dl/rpm-x86_64/7.3.3/lt/LibreOffice_7.3.3_Linux_x86-64_rpm.tar.gz. 解壓縮 tar -zxvf LibreOffice_7.0.3_Linux_x86-64_rpm.tar.gz 並且進入檔案夾 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 檔案轉換後臨時存放的位置.

3.10 其它一些設定

Seafile 版本不斷在更新, 部分功能已經不需要手動配置了, 所以其它一些設定可以參考文章《Seafile 进阶玩法》. 需要提醒大家的是, 每一次修改任何屬於 Seafile 的設定檔之後, 如果需要設定生效, 就必須重新啟動 Seafile 或者 Seahub 服務. 當然, 也可以在配置過程中不重啟, 在所有配置都完成之後才重啟.