背景
有很多場景會用到類似seafile功能的需求,比如:
- 在內網中傳輸和共享文件
- 個人部署私人網盤
- 文檔協同在線編輯
- 寫筆記
- …
這些功能seafile均有實現,并且社區版提供的功能基本可以滿足個人或者小型團隊的日常需求
問題
由于主機的80和443端口屬于常用端口,且比較敏感,如果是公司內網環境下,基于安全考慮,大多時候是禁止開放這兩個端口的,但seafile提供的docker部署方式中,默認使用的端口恰好是80和443,以提供http和https訪問。因此,本文要解決的主要問題就是修改seafile的默認服務端口,以避免端口占用和端口沖突問題。
官方安裝文檔:https://cloud.seafile.com/wiki/publish/seafile-manual/hk5G/
環境
- 操作系統:CentOS 7
- seafile:12.0
docker和docker-compose的安裝過程不再贅述,沒安裝的可以參考官方安裝文檔
1.下載seafile鏡像
(注:如果是在線環境(即可以聯網)的情況下,此步驟可以跳過。)
在聯網環境中,拉取seafile的docker鏡像
docker pull seafileltd/seafile-mc:12.0-latest
docker pull mariadb:10.11
docker pull memcached:1.6.29
docker pull lucaslorentz/caddy-docker-proxy:2.9-alpine
docker pull seafileltd/sdoc-server:1.0-latest
docker pull seafileltd/notification-server:12.0-latest
docker pull docker.seafile.top/seafileltd/onlyoffice-documentserver:8.1
每個鏡像的作用:
- seafile-mc: seafile服務端
- mariadb: 數據存儲
- memcached: 數據緩存
- caddy: 反向代理
- sdoc-server: 輕量級在線協同文檔服務,主要用于渲染和編輯markdown文檔
- notification-server: 通知服務,提供文檔狀態的實時更新
- onlyoffice-document: office文檔在線預覽和協同編輯
2.打包鏡像
docker save -o seafile-mc.tar seafileltd/seafile-mc:12.0-latest
docker save -o mariadb.tar mariadb:10.11
docker save -o memcached.tar memcached:1.6.29
docker save -o caddy-proxy.tar lucaslorentz/caddy-docker-proxy:2.9-alpine
docker save -o seadoc-server.tar seafileltd/sdoc-server:1.0-latest
docker save -o notification-server.tar seafileltd/notification-server:12.0-latest
docker save -o onlyoffice-document.tar docker.seafile.top/seafileltd/onlyoffice-documentserver:8.1
3.配置文件
(1)下載配置文件
在終端執行如下命令:
# 配置文件存儲目錄
mkdir /opt/seafile
cd /opt/seafile# Seafile CE 12.0的docker-compose配置文件
wget -O .env https://manual.seafile.com/12.0/repo/docker/ce/env
wget https://manual.seafile.com/12.0/repo/docker/seadoc.yml
wget https://manual.seafile.com/12.0/repo/docker/ce/seafile-server.yml
wget https://manual.seafile.com/12.0/repo/docker/caddy.yml
(2)編輯配置文件
.env
文件說明:
# .env文件內容# 這里配置執行docker-compose up -d命令時,生效的yml
COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml'
COMPOSE_PATH_SEPARATOR=','SEAFILE_IMAGE=seafileltd/seafile-mc:12.0-latest
SEAFILE_DB_IMAGE=mariadb:10.11
SEAFILE_MEMCACHED_IMAGE=memcached:1.6.29
SEAFILE_CADDY_IMAGE=lucaslorentz/caddy-docker-proxy:2.9-alpine
# seafile服務的掛載目錄
SEAFILE_VOLUME=/opt/seafile-data
# mariadb數據存儲服務的掛載目錄
SEAFILE_MYSQL_VOLUME=/opt/seafile-mysql/db
# caddy反向代理的掛載目錄
SEAFILE_CADDY_VOLUME=/opt/seafile-caddySEAFILE_MYSQL_DB_HOST=db
# mariadb數據庫的root初始密碼,建議修改
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=ROOT_PASSWORD
SEAFILE_MYSQL_DB_USER=seafile
# mariadb數據庫seafile用戶的登錄密碼,建議修改
SEAFILE_MYSQL_DB_PASSWORD=PASSWORDTIME_ZONE=Etc/UTC
# jwt秘鑰,建議修改為32位-40位的復雜隨機字符串
JWT_PRIVATE_KEY=AbCdEfGhIjKlMnOpQrStUvWxYz1234567890
# seafile服務的主機名
SEAFILE_SERVER_HOSTNAME=seafile.example.com
# 訪問seafile使用的協議,我沒有配置https,此處不再贅述
SEAFILE_SERVER_PROTOCOL=http
# seafile的管理員賬號,修改為你容易記住的
INIT_SEAFILE_ADMIN_EMAIL=me@example.com
# seafile的管理員密碼,建議修改
INIT_SEAFILE_ADMIN_PASSWORD=asecret# 是否啟用seadoc服務,如果不需要可以設置為false
ENABLE_SEADOC=true
SEADOC_IMAGE=seafileltd/sdoc-server:1.0-latest
# 輕量級文檔在線協同服務的掛載目錄
SEADOC_VOLUME=/opt/seadoc-dataNOTIFICATION_SERVER_IMAGE=seafileltd/notification-server:12.0-latest
# 通知服務的掛載目錄
NOTIFICATION_SERVER_VOLUME=/opt/notification-data
關鍵配置都已經添加了注釋,按照注釋修改即可。
我這里將docker容器的掛載目錄設置為/root/docker-volumn/seafile
,請根據你的需求自行調整。調整后的.env
配置文件如下:
COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml'
COMPOSE_PATH_SEPARATOR=','SEAFILE_IMAGE=seafileltd/seafile-mc:12.0-latest
SEAFILE_DB_IMAGE=mariadb:10.11
SEAFILE_MEMCACHED_IMAGE=memcached:1.6.29
SEAFILE_CADDY_IMAGE=lucaslorentz/caddy-docker-proxy:2.9-alpineSEAFILE_VOLUME=/root/docker-volumn/seafile/seafile-data
SEAFILE_MYSQL_VOLUME=/root/docker-volumn/seafile/seafile-mysql/db
SEAFILE_CADDY_VOLUME=/root/docker-volumn/seafile/seafile-caddySEAFILE_MYSQL_DB_HOST=db
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=your_mysql_root_passwd
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=your_mysql_seafile_passwdTIME_ZONE=Etc/UTCJWT_PRIVATE_KEY=AbCdEfGhIjKlMnOpQrStUvWxYz1234567890
# 關鍵配置!!!!!!注意這里,hostname設置為192.168.44.46:8080,看后面說明
SEAFILE_SERVER_HOSTNAME=192.168.44.46:8080
SEAFILE_SERVER_PROTOCOL=httpINIT_SEAFILE_ADMIN_EMAIL=admin@example.com
INIT_SEAFILE_ADMIN_PASSWORD=your_admin_passwordSEADOC_IMAGE=seafileltd/sdoc-server:1.0-latest
SEADOC_VOLUME=/root/docker-volumn/seafile/seadoc-dataENABLE_SEADOC=trueNOTIFICATION_SERVER_IMAGE=seafileltd/notification-server:12.0-latest
NOTIFICATION_SERVER_VOLUME=/root/docker-volumn/seafile/notification-data
由于服務器的80和443端口已經被占用,并且沒有https需求,因此,我需要將seafile的默認服務端口80調整到8080端口,因此,需要在.env
配置文件中修改SEAFILE_SERVER_HOSTNAME
參數為192.168.44.46:8080
,其中192.168.44.46
為本機ip。
但是只修改這一個地方還不行,還需要修改caddy.yml
文件,將其中的端口映射全部注釋,然后添加8080到8080的端口映射。
# 編輯caddy.yml
services:caddy:image: ${SEAFILE_CADDY_IMAGE:-lucaslorentz/caddy-docker-proxy:2.9-alpine}restart: unless-stoppedcontainer_name: seafile-caddyports:- 8080:8080# - 80:80# - 8443:443environment:- CADDY_INGRESS_NETWORKS=seafile-netvolumes:- /var/run/docker.sock:/var/run/docker.sock- ${SEAFILE_CADDY_VOLUME:-/opt/seafile-caddy}:/data/caddynetworks:- seafile-nethealthcheck:test: ["CMD-SHELL", "curl --fail http://localhost:2019/metrics || exit 1"]start_period: 20sinterval: 20stimeout: 5sretries: 3networks:seafile-net:name: seafile-net
4.安裝seafile
(1)上傳配置文件和docker鏡像到服務器
將上述配置文件.env
、caddy.yml
、seafile-server.yml
、seadoc.yml
和打包好的docker鏡像上傳到要部署seafile的服務器
(2)加載鏡像
在docker鏡像所在目錄下執行如下命令:
docker load -i seafile-mc.tar
docker load -i mariadb.tar
docker load -i memcached.tar
docker load -i caddy-proxy.tar
docker load -i seadoc-server.tar
docker load -i notification-server.tar
docker load -i onlyoffice-document.tar
(3)安裝seafile
在配置文件所在目錄下執行如下命令:
docker-compose up -d
然后執行docker ps -a
或者docker-compose ps
查看容器狀態為up狀態并且沒有exited,則表示啟動成功。
然后在瀏覽器訪問http://192.168.44.46:8080
,并使用.env
中配置的seafile管理員賬號和密碼登錄即可。
至此,seafile基礎服務安裝完成
如果不需要office文檔在線編輯和協同編輯服務的話,到這里就算已經完成了,如果需要部署onlyoffice服務,請接著往下看。
5.安裝配置onlyoffice服務
(1)下載配置文件
wget https://manual.seafile.com/12.0/repo/docker/onlyoffice.yml
(2)編輯配置文件
在.env
配置文件中添加如下配置:
# 在COMPOSE_FILE參數后面添加onlyoffice.yml
COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml,onlyoffice.yml'
# 在文件末尾添加如下配置
# onlyoffice服務掛載目錄
ONLYOFFICE_VOLUME=/root/docker-volumn/seafile/seafile-onlyoffice
# onlyoffice服務端口
ONLYOFFICE_PORT=6233
# jwt秘鑰,和上面的JWT_PRIVATE_KEY復雜度要求相同
ONLYOFFICE_JWT_SECRET=AbCdEfGhIjKlMnOpQrStUvWxYz1234567890
# onlyoffice的主機名,這個是后加的參數
ONLYOFFICE_SERVER_HOSTNAME=192.168.44.46
注:我的onlyoffice和seafile部署在同一臺服務器上,因此ONLYOFFICE_SERVER_HOSTNAME
和SEAFILE_SERVER_HOSTNAME
使用相同的IP,但不同的是,ONLYOFFICE_SERVER_HOSTNAME
后面沒有端口號,因為我們修改了seafile的默認端口,因此,不能再通過SEAFILE_SERVER_HOSTNAME
來引用參數了。ONLYOFFICE_SERVER_HOSTNAME
這個參數在onlyoffice.yml
文件中被引用。
(3)修改onlyoffice.yml
---
services:caddy:ports:- ${ONLYOFFICE_PORT:-6233}:${ONLYOFFICE_PORT:-6233}onlyoffice:image: onlyoffice/documentserver:8.0restart: unless-stoppedcontainer_name: seafile-onlyofficeenvironment:#- DB_TYPE=${DB_TYPE:-mariadb}#- DB_HOST=${SEAFILE_MYSQL_DB_HOST:-db}#- DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile}#- DB_PWD=${SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty}- JWT_ENABLED=true- JWT_SECRET=${ONLYOFFICE_JWT_SECRET:?Variable is not set or empty}volumes:- ${ONLYOFFICE_VOLUME:-/opt/onlyoffice}/logs:/var/log/onlyoffice- ${ONLYOFFICE_VOLUME:-/opt/onlyoffice}/data:/var/www/onlyoffice/Data- ${ONLYOFFICE_VOLUME:-/opt/onlyoffice}/lib:/var/lib/onlyofficelabels:# 修改前# caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}:${ONLYOFFICE_PORT:-6233}# 修改后caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${ONLYOFFICE_SERVER_HOSTNAME:?Variable is not set or empty}:${ONLYOFFICE_PORT:-6233}caddy.reverse_proxy: "{{upstreams}}"networks:- seafile-netnetworks:seafile-net:name: seafile-net
從上述配置文件中的修改前后可以看到這里只是將SEAFILE_SERVER_HOSTNAME
引用修改為ONLYOFFICE_SERVER_HOSTNAME
了,因為如果按照原來的引用的話,那么在caddy中的onlyoffice代理配置將會轉發到192.168.44.46:8080:6233
,所以就會報錯。
(6)上傳配置文件和docker鏡像
此處參考第4章,不再贅述。
(7)重新安裝部署seafile+onlyoffice
在配置文件所在目錄執行:
# 停止并刪除原來的容器(此操作不會刪除掛載數據)
docker-compose down
等待執行完成后,重新執行:
docker-compose up -d
如果不出意外,應該可以正常使用seafile和onlyoffice的在線編輯功能了。至此,大功告成。
如果有報錯,建議先排查,如果實在排查不到問題所在,可以刪除掛載目錄下的文件,然后重新執行docker-compose up -d
進行部署。