摘要訊息 : Seafile 新版本需要注意的一些問題.

0. 前言

文在 2022 年 4 月 16 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. MySQL 下安裝 Seafile

Seafile 老版本沒有支援 MySQL 8, 所以建議大家使用 MySQL 5.7 進行安裝. 但是有些版本在 MySQL 5.7 下安裝的時候也會有問題. MySQL 會回傳這樣一個錯誤 : 1193, "Unknown system variable 'tx_isolation'. 這個是因為 tx_isolation 在最新版本的 MySQL 5.7 (也包括 MySQL 8) 已經被遺棄了. 解決方案就是修改 Seafile 的程式碼, 修改之前需要進入 Seafile 的檔案夾中. 我們需要查找包含 tx_isolation 字串的檔案 : find . | xargs grep -ril "tx_isolation". 此時, 如果 Seafile 版本比較低, 一定查找成功, 因為在 Seafile 檔案夾下有這樣一個檔案包含這個字串 : ./seafile-pro-server-6.3.11/pro/python/SQLAlchemy-1.1.3-py2.6-linux-x86_64.egg/sqlalchemy/dialects/mysql/base.py.

那麼我們編輯這個 base.py : vim ./seafile-pro-server-6.3.11/pro/python/SQLAlchemy-1.1.3-py2.6-linux-x86_64.egg/sqlalchemy/dialects/mysql/base.py. 然後查找 tx_isolation, 修改為 transaction_isolation. 修改之後的陳述式結果為 : cursor.execute('SELECT @@transaction_isolation').

然後繼續進行安裝步驟就沒有問題了.

2. Seafile 6.3 下的 Nginx 配置

如果使用本網誌的安裝方法, 那麼使用的網頁伺服器為 Nginx. Seafile 6.3 對 Nginx 配置要求已經發生了改變, 最大的改變就是遺棄 FastCGI. 如果大家還是使用原來的命令 ./seahub.sh start-fastcgi, 可能會有這樣一個錯誤 : Unknown command: 'runfcgi'. 我們首先需要修改 Nginx 配置檔案 :

server {
	listen 80;
	server_name 填寫你的網域名稱;
	rewrite ^ https://$http_host$request_uri? permanent;
}
server {
	listen 443 ssl http2;
	server_name 填寫你的網域名稱;
	ssl on;
	ssl_certificate 填寫證書位置;
	ssl_certificate_key 填寫 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" 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 /www/cloud/seafile-server-latest/seahub;        #seahub 檔案夾
	}
}

之後 Seahub 的啟動不再需要額外加 start-fastcgi, 直接使用 ./seahub.sh start 就可以了.

《Seafile 進階玩法》開頭部分有提到開機啟動, 腳本中也需要去掉 start-fastcgi 才行 :

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

[Service]
ExecStart=/www/cloud/seafile-server-latest/seahub.sh start
ExecStop=/www/cloud/seafile-server-latest/seahub.sh stop
User=root
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target